diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-12-09 16:28:53 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-12-09 16:49:30 +0200 |
commit | 6e06f8c93642d92e5cc4b769defb97df1897e791 (patch) | |
tree | 447c7d4c987e80798fdb99a17b0beacc3b263780 /gst/mxf | |
parent | b504672fc460089b09d6f406c3fdf618153902dd (diff) | |
download | gstreamer-plugins-bad-6e06f8c93642d92e5cc4b769defb97df1897e791.tar.gz |
mxfdemux: Use keyframe information from index table segments if available
We don't implement keyframe detection for all codecs and this will allow us to
implement better seeking.
Diffstat (limited to 'gst/mxf')
-rw-r--r-- | gst/mxf/mxfdemux.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index b72ed64b7..8f04741dd 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -1728,6 +1728,36 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux, if (outbuf) keyframe = !GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + /* Prefer keyframe information from index tables over everything else */ + if (demux->index_tables && outbuf) { + GList *l; + GstMXFDemuxIndexTable *index_table = NULL; + + for (l = demux->index_tables; l; l = l->next) { + GstMXFDemuxIndexTable *tmp = l->data; + + if (tmp->body_sid == etrack->body_sid + && tmp->index_sid == etrack->index_sid) { + index_table = tmp; + break; + } + } + + if (index_table) { + GstMXFDemuxIndex *index = + &g_array_index (index_table->offsets, GstMXFDemuxIndex, + etrack->position); + if (index->offset != 0) { + keyframe = index->keyframe; + + if (keyframe) + GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + else + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT); + } + } + } + if (!etrack->offsets) etrack->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex)); @@ -2495,7 +2525,8 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key, } else if (mxf_is_random_index_pack (key)) { ret = gst_mxf_demux_handle_random_index_pack (demux, key, buffer); - if (ret == GST_FLOW_OK && !demux->index_table_segments_collected) { + if (ret == GST_FLOW_OK && demux->random_access + && !demux->index_table_segments_collected) { collect_index_table_segments (demux); demux->index_table_segments_collected = TRUE; } |