Пример #1
0
vod_status_t
segmenter_get_segment_durations_estimate(
	request_context_t* request_context,
	segmenter_conf_t* conf,
	media_set_t* media_set,
	media_sequence_t* sequence,
	uint32_t media_type,
	segment_durations_t* result)
{
	media_track_t** longest_track;
	media_sequence_t* sequences_end;
	media_sequence_t* cur_sequence;
	uint64_t duration_millis;
	uint32_t cur_media_type;

	SEGMENT_CHOOSE_HEADER(conf);

	if (sequence != NULL)
	{
		sequences_end = sequence + 1;
	}
	else
	{
		sequence = media_set->sequences;
		sequences_end = media_set->sequences_end;
	}

	if (media_set->durations != NULL)
	{
		duration_millis = media_set->total_duration;

		if (media_set->use_discontinuity)
		{
			result->start_time = media_set->first_clip_time;
			result->end_time = media_set->first_clip_time + duration_millis;

			return segmenter_get_segment_durations_estimate_internal(
				request_context,
				conf,
				media_set,
				sequence,
				media_set->durations,
				media_set->total_clip_count,
				media_set->durations[0],
				result);
		}

		// no discontinuity - treat it like a single clip
	}
	else
	{
		duration_millis = 0;

		for (cur_sequence = sequence; cur_sequence < sequences_end; cur_sequence++)
		{
			longest_track = cur_sequence->filtered_clips[0].longest_track;

			if (media_type != MEDIA_TYPE_NONE)
			{
				if (longest_track[media_type] != NULL &&
					longest_track[media_type]->media_info.duration_millis > duration_millis)
				{
					duration_millis = longest_track[media_type]->media_info.duration_millis;
				}
				continue;
			}

			for (cur_media_type = 0; cur_media_type < MEDIA_TYPE_COUNT; cur_media_type++)
			{
				if (longest_track[cur_media_type] != NULL &&
					longest_track[cur_media_type]->media_info.duration_millis > duration_millis)
				{
					duration_millis = longest_track[cur_media_type]->media_info.duration_millis;
				}
			}
		}
	}

	result->start_time = media_set->first_clip_time;
	result->end_time = media_set->first_clip_time + duration_millis;

	return segmenter_get_segment_durations_estimate_internal(
		request_context,
		conf,
		media_set,
		sequence,
		NULL,
		1,
		duration_millis,
		result);
}
Пример #2
0
vod_status_t
segmenter_get_segment_durations_estimate(
	request_context_t* request_context,
	segmenter_conf_t* conf,
	media_set_t* media_set,
	media_sequence_t* sequence,
	uint32_t media_type,
	segment_durations_t* result)
{
	media_track_t** longest_track;
	media_sequence_t* sequences_end;
	media_sequence_t* cur_sequence;
	uint32_t duration_millis;

	if (media_set->total_clip_count > 1)
	{
		result->duration_millis = media_set->total_duration;

		if (media_set->use_discontinuity)
		{
			return segmenter_get_segment_durations_estimate_internal(
				request_context,
				conf,
				media_set->durations,
				media_set->total_clip_count,
				result);
		}

		// no discontinuity - treat it like a single clip
	}
	else
	{
		result->duration_millis = 0;

		if (sequence != NULL)
		{
			cur_sequence = sequence;
			sequences_end = sequence + 1;
		}
		else
		{
			cur_sequence = media_set->sequences;
			sequences_end = media_set->sequences_end;
		}

		for (; cur_sequence < sequences_end; cur_sequence++)
		{
			longest_track = cur_sequence->filtered_clips[0].longest_track;

			if (longest_track[MEDIA_TYPE_VIDEO] != NULL && 
				longest_track[MEDIA_TYPE_VIDEO]->media_info.duration_millis > result->duration_millis &&
				(media_type == MEDIA_TYPE_NONE || media_type == MEDIA_TYPE_VIDEO))
			{
				result->duration_millis = longest_track[MEDIA_TYPE_VIDEO]->media_info.duration_millis;
			}

			if (longest_track[MEDIA_TYPE_AUDIO] != NULL &&
				longest_track[MEDIA_TYPE_AUDIO]->media_info.duration_millis > result->duration_millis &&
				(media_type == MEDIA_TYPE_NONE || media_type == MEDIA_TYPE_AUDIO))
			{
				result->duration_millis = longest_track[MEDIA_TYPE_AUDIO]->media_info.duration_millis;
			}
		}
	}

	duration_millis = result->duration_millis;
	return segmenter_get_segment_durations_estimate_internal(
		request_context,
		conf,
		&duration_millis,
		1,
		result);
}