static u_char* hds_write_afra_atom_entry(u_char* p, uint64_t time, uint64_t offset) { write_qword(p, time); write_qword(p, offset); return p; }
static u_char* mss_write_uuid_tfxd_atom(u_char* p, mpeg_stream_metadata_t* stream_metadata) { size_t atom_size = ATOM_HEADER_SIZE + sizeof(uuid_tfxd_atom_t); uint64_t timestamp = rescale_time(stream_metadata->first_frame_time_offset, stream_metadata->media_info.timescale, MSS_TIMESCALE); uint64_t duration = rescale_time(stream_metadata->total_frames_duration, stream_metadata->media_info.timescale, MSS_TIMESCALE); write_atom_header(p, atom_size, 'u', 'u', 'i', 'd'); p = vod_copy(p, tfxd_uuid, sizeof(tfxd_uuid)); write_dword(p, 0x01000000); // version / flags write_qword(p, timestamp); write_qword(p, duration); return p; }
static u_char* dash_packager_write_mvhd64_atom(u_char* p, uint32_t timescale, uint64_t duration) { size_t atom_size = ATOM_HEADER_SIZE + sizeof(mvhd64_atom_t); write_atom_header(p, atom_size, 'm', 'v', 'h', 'd'); write_dword(p, 0x01000000); // version + flags write_qword(p, 0LL); // creation time write_qword(p, 0LL); // modification time write_dword(p, timescale); // timescale write_qword(p, duration); // duration p = dash_packager_write_mvhd_constants(p); write_dword(p, 0xffffffff); // next track id return p; }
static u_char* dash_packager_write_tfdt64_atom(u_char* p, uint64_t earliest_pres_time) { size_t atom_size = ATOM_HEADER_SIZE + sizeof(tfdt64_atom_t); write_atom_header(p, atom_size, 't', 'f', 'd', 't'); write_dword(p, 0x01000000); // version = 1 write_qword(p, earliest_pres_time); return p; }
static u_char* dash_packager_write_sidx64_atom( u_char* p, sidx_params_t* sidx_params, uint32_t reference_size) { size_t atom_size = ATOM_HEADER_SIZE + sizeof(sidx64_atom_t); write_atom_header(p, atom_size, 's', 'i', 'd', 'x'); write_dword(p, 0x01000000); // version + flags write_dword(p, 1); // reference id write_dword(p, sidx_params->timescale); // timescale write_qword(p, sidx_params->earliest_pres_time); // earliest presentation time write_qword(p, 0LL); // first offset write_dword(p, 1); // reserved + reference count write_dword(p, reference_size); // referenced size write_dword(p, sidx_params->total_frames_duration); // subsegment duration write_dword(p, 0x90000000); // starts with SAP / SAP type return p; }
static u_char* hds_write_tfhd_atom(u_char* p, uint32_t track_id, uint64_t base_data_offset) { size_t atom_size = ATOM_HEADER_SIZE + sizeof(tfhd_atom_t); write_atom_header(p, atom_size, 't', 'f', 'h', 'd'); write_dword(p, 3); // flags - base data offset | sample description write_dword(p, track_id); write_qword(p, base_data_offset); write_dword(p, 1); // sample_desc_index return p; }
static u_char* hds_write_abst_atom( u_char* p, segment_durations_t* segment_durations) { segment_duration_item_t* cur_item; segment_duration_item_t* last_item = segment_durations->items + segment_durations->item_count; uint64_t start_offset = 0; uint64_t timestamp; uint32_t duration; size_t afrt_atom_size = AFRT_BASE_ATOM_SIZE; size_t asrt_atom_size = ASRT_ATOM_SIZE; size_t abst_atom_size = ABST_BASE_ATOM_SIZE; afrt_atom_size += (segment_durations->item_count + 1) * sizeof(afrt_entry_t); abst_atom_size += (segment_durations->item_count + 1) * sizeof(afrt_entry_t); // abst write_atom_header(p, abst_atom_size, 'a', 'b', 's', 't'); write_dword(p, 0); // version + flags write_dword(p, 1); // bootstrap info version *p++ = 0; // profile, live, update write_dword(p, HDS_TIMESCALE); // timescale write_dword(p, 0); // current media time - high write_dword(p, segment_durations->duration_millis); // current media time - low write_qword(p, 0LL); // smpte offset *p++ = 0; // movie identifier *p++ = 0; // server entries *p++ = 0; // quality entries *p++ = 0; // drm data *p++ = 0; // metadata *p++ = 1; // segment run table count // abst.asrt write_atom_header(p, asrt_atom_size, 'a', 's', 'r', 't'); write_dword(p, 0); // version + flags *p++ = 0; // quality entries write_dword(p, 1); // segment run entries // entry #1 write_dword(p, 1); // first segment write_dword(p, segment_durations->segment_count); // fragments per segment // abst *p++ = 1; // fragment run table count // abst.afrt write_atom_header(p, afrt_atom_size, 'a', 'f', 'r', 't'); write_dword(p, 0); // version + flags write_dword(p, HDS_TIMESCALE); // timescale *p++ = 0; // quality entries write_dword(p, segment_durations->item_count + 1); // fragment run entries // write the afrt entries for (cur_item = segment_durations->items; cur_item < last_item; cur_item++) { timestamp = rescale_time(start_offset, segment_durations->timescale, HDS_TIMESCALE); duration = rescale_time(cur_item->duration, segment_durations->timescale, HDS_TIMESCALE); write_dword(p, cur_item->segment_index + 1); // first fragment write_qword(p, timestamp); // first fragment timestamp write_dword(p, duration); // fragment duration start_offset += cur_item->duration * cur_item->repeat_count; } // last entry write_dword(p, 0); // first fragment write_qword(p, 0LL); // first fragment timestamp write_dword(p, 0); // fragment duration *p++ = 0; // discontinuity indicator (0 = end of presentation) return p; }