diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-09-01 17:47:11 +0300 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2017-05-18 19:04:57 +0200 |
commit | 2379dc3f5b1c55d9e5cafcbd1a4df8ffb2de1c2a (patch) | |
tree | 8789bbc81fb62f38de09a40b53357fa2f71894a7 /ext/dash | |
parent | d8d1fc8bc4dc8605e961d9448185b9d27c15e641 (diff) | |
download | gstreamer-plugins-bad-2379dc3f5b1c55d9e5cafcbd1a4df8ffb2de1c2a.tar.gz |
dashdemux: Collect keyunit distance and size statistics
Diffstat (limited to 'ext/dash')
-rw-r--r-- | ext/dash/gstdashdemux.c | 85 | ||||
-rw-r--r-- | ext/dash/gstdashdemux.h | 4 |
2 files changed, 65 insertions, 24 deletions
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c index 43d5e3987..ac47103e5 100644 --- a/ext/dash/gstdashdemux.c +++ b/ext/dash/gstdashdemux.c @@ -2058,8 +2058,7 @@ gst_dash_demux_need_another_chunk (GstAdaptiveDemuxStream * stream) if (dashstream->isobmff_parser.current_fourcc == 0) { stream->fragment.chunk_size += dashstream->moof_average_size; if (dashstream->first_sync_sample_always_after_moof) - stream->fragment.chunk_size += - dashstream->first_sync_sample_average_size; + stream->fragment.chunk_size += dashstream->keyframe_average_size; } if (gst_mpd_client_has_isoff_ondemand_profile (dashdemux->client) && @@ -2516,31 +2515,71 @@ gst_dash_demux_find_sync_samples (GstAdaptiveDemux * demux, } { - GstDashStreamSyncSample *sync_sample = - &g_array_index (dash_stream->moof_sync_samples, GstDashStreamSyncSample, - 0); - guint size = sync_sample->end_offset + 1 - sync_sample->start_offset; - - if (dash_stream->first_sync_sample_average_size) { - if (dash_stream->first_sync_sample_average_size < size) - dash_stream->first_sync_sample_average_size = - (size * 3 + dash_stream->first_sync_sample_average_size) / 4; - else - dash_stream->first_sync_sample_average_size = - (size + dash_stream->first_sync_sample_average_size * 3) / 4; - } else { - dash_stream->first_sync_sample_average_size = size; + GstDashStreamSyncSample *sync_sample; + guint i; + guint size; + GstClockTime current_keyframe_distance; + + for (i = 0; i < dash_stream->moof_sync_samples->len; i++) { + sync_sample = + &g_array_index (dash_stream->moof_sync_samples, + GstDashStreamSyncSample, i); + size = sync_sample->end_offset + 1 - sync_sample->start_offset; + + if (dash_stream->keyframe_average_size) { + /* Over-estimate the keyframe size */ + if (dash_stream->keyframe_average_size < size) + dash_stream->keyframe_average_size = + (size * 3 + dash_stream->keyframe_average_size) / 4; + else + dash_stream->keyframe_average_size = + (size + dash_stream->keyframe_average_size * 3) / 4; + } else { + dash_stream->keyframe_average_size = size; + } + + if (i == 0) { + if (dash_stream->moof_offset + dash_stream->moof_size + 8 < + sync_sample->start_offset) { + dash_stream->first_sync_sample_after_moof = FALSE; + dash_stream->first_sync_sample_always_after_moof = FALSE; + } else { + dash_stream->first_sync_sample_after_moof = + (dash_stream->moof_sync_samples->len == 1 + || demux->segment.rate > 0.0); + } + } } - if (dash_stream->moof_offset + dash_stream->moof_size + 8 < - sync_sample->start_offset) { - dash_stream->first_sync_sample_after_moof = FALSE; - dash_stream->first_sync_sample_always_after_moof = FALSE; + g_assert (stream->fragment.duration != 0); + g_assert (stream->fragment.duration != GST_CLOCK_TIME_NONE); + + current_keyframe_distance = + stream->fragment.duration / dash_stream->moof_sync_samples->len; + + if (dash_stream->keyframe_average_distance) { + /* Under-estimate the keyframe distance */ + if (dash_stream->keyframe_average_distance > current_keyframe_distance) + dash_stream->keyframe_average_distance = + (dash_stream->keyframe_average_distance * 3 + + current_keyframe_distance) / 4; + else + dash_stream->keyframe_average_distance = + (dash_stream->keyframe_average_distance + + current_keyframe_distance * 3) / 4; } else { - dash_stream->first_sync_sample_after_moof = - (dash_stream->moof_sync_samples->len == 1 - || demux->segment.rate > 0.0); + dash_stream->keyframe_average_distance = current_keyframe_distance; } + + GST_DEBUG_OBJECT (stream->pad, + "average keyframe sample size: %" G_GUINT64_FORMAT, + dash_stream->keyframe_average_size); + GST_DEBUG_OBJECT (stream->pad, + "average keyframe distance: %" GST_TIME_FORMAT " (%" GST_TIME_FORMAT + ")", GST_TIME_ARGS (dash_stream->keyframe_average_distance), + GST_TIME_ARGS (current_keyframe_distance)); + GST_DEBUG_OBJECT (stream->pad, "first sync sample after moof: %d", + dash_stream->first_sync_sample_after_moof); } return TRUE; diff --git a/ext/dash/gstdashdemux.h b/ext/dash/gstdashdemux.h index d547d29ae..3d1d6bfab 100644 --- a/ext/dash/gstdashdemux.h +++ b/ext/dash/gstdashdemux.h @@ -94,7 +94,9 @@ struct _GstDashDemuxStream GArray *moof_sync_samples; guint current_sync_sample; - guint64 moof_average_size, first_sync_sample_average_size; + guint64 moof_average_size; + guint64 keyframe_average_size; + guint64 keyframe_average_distance; gboolean first_sync_sample_after_moof, first_sync_sample_always_after_moof; }; |