Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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;
}
Esempio n. 7
0
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;
}