summaryrefslogtreecommitdiff
path: root/gst/mxf
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2015-12-09 16:28:53 +0200
committerSebastian Dröge <sebastian@centricular.com>2015-12-09 16:49:30 +0200
commit6e06f8c93642d92e5cc4b769defb97df1897e791 (patch)
tree447c7d4c987e80798fdb99a17b0beacc3b263780 /gst/mxf
parentb504672fc460089b09d6f406c3fdf618153902dd (diff)
downloadgstreamer-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.c33
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;
}