mxfdemux: Take temporal reordering from the index table into account
authorSebastian Dröge <sebastian@centricular.com>
Tue, 27 Jun 2017 07:47:44 +0000 (10:47 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 4 Jul 2017 06:16:26 +0000 (09:16 +0300)
This is needed to know the PTS, without that we only know the DTS and
using that also for the PTS is wrong unless we have an intra-only codec.

If we can't get the temporal reordering from the index table, don't set
any PTS for non-intra-only codecs and let decoders figure out something.

https://bugzilla.gnome.org/show_bug.cgi?id=784027

gst/mxf/mxfaes-bwf.c
gst/mxf/mxfalaw.c
gst/mxf/mxfd10.c
gst/mxf/mxfdemux.c
gst/mxf/mxfdemux.h
gst/mxf/mxfdv-dif.c
gst/mxf/mxfessence.h
gst/mxf/mxfjpeg2000.c
gst/mxf/mxfmpeg.c
gst/mxf/mxfup.c
gst/mxf/mxfvc3.c

index f92d682797fd101c722e5f711ad995605b9337c0..d128ab270a1dbbe9837fe2cd877aeb4f5e942077 100644 (file)
@@ -1233,6 +1233,7 @@ static const MXFUL mxf_sound_essence_compression_alaw =
 static GstCaps *
 mxf_bwf_create_caps (MXFMetadataTimelineTrack * track,
     MXFMetadataGenericSoundEssenceDescriptor * descriptor, GstTagList ** tags,
+    gboolean * intra_only,
     MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
 {
   GstCaps *ret = NULL;
@@ -1348,13 +1349,16 @@ mxf_bwf_create_caps (MXFMetadataTimelineTrack * track,
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE,
         wa_descriptor->avg_bps * 8, NULL);
 
+  *intra_only = TRUE;
+
   return ret;
 }
 
 static GstCaps *
 mxf_aes3_create_caps (MXFMetadataTimelineTrack * track,
     MXFMetadataGenericSoundEssenceDescriptor * descriptor, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   GstCaps *ret = NULL;
   MXFMetadataWaveAudioEssenceDescriptor *wa_descriptor = NULL;
@@ -1404,13 +1408,15 @@ mxf_aes3_create_caps (MXFMetadataTimelineTrack * track,
   g_free (codec_name);
 
   *handler = mxf_aes3_handle_essence_element;
+  *intra_only = TRUE;
 
   return ret;
 }
 
 static GstCaps *
 mxf_aes_bwf_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataGenericSoundEssenceDescriptor *s = NULL;
   gboolean bwf = FALSE;
@@ -1454,9 +1460,11 @@ mxf_aes_bwf_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
     GST_ERROR ("No descriptor found for this track");
     return NULL;
   } else if (bwf) {
-    return mxf_bwf_create_caps (track, s, tags, handler, mapping_data);
+    return mxf_bwf_create_caps (track, s, tags, intra_only, handler,
+        mapping_data);
   } else {
-    return mxf_aes3_create_caps (track, s, tags, handler, mapping_data);
+    return mxf_aes3_create_caps (track, s, tags, intra_only, handler,
+        mapping_data);
   }
 
   return NULL;
index 3ffce3ab3058918963b0eca064810398eddc8ea6..d490033e90979a0601ddf0efb3b4a7d05e352329 100644 (file)
@@ -119,7 +119,8 @@ mxf_alaw_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_alaw_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataGenericSoundEssenceDescriptor *s = NULL;
   guint i;
@@ -167,6 +168,8 @@ mxf_alaw_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
 
   }
 
+  *intra_only = TRUE;
+
   return caps;
 }
 
index b3833c56ee3deb286816c6f177e1c43dfc16911e..21401cf52541913e764b8c38f12d2cf2ebb48883 100644 (file)
@@ -174,7 +174,8 @@ mxf_d10_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_d10_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
   MXFMetadataGenericSoundEssenceDescriptor *s = NULL;
@@ -247,6 +248,8 @@ mxf_d10_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
 
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "SMPTE D-10 Audio", NULL);
+
+    *intra_only = TRUE;
   } else if (p) {
     caps =
         gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN,
@@ -256,6 +259,9 @@ mxf_d10_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
     *handler = mxf_d10_picture_handle_essence_element;
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "SMPTE D-10 Video", NULL);
+
+    /* Does not allow temporal reordering */
+    *intra_only = TRUE;
   }
 
   return caps;
index 677c0677bdca7f708d37057b3ada68c98dffa343..9bfb6ec59803e674f22843702df1d2803d741981 100644 (file)
@@ -821,10 +821,11 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
 
         caps = gst_caps_new_empty_simple (name);
         g_free (name);
+        etrack->intra_only = FALSE;
       } else {
         caps =
             etrack->handler->create_caps (track, &etrack->tags,
-            &etrack->handle_func, &etrack->mapping_data);
+            &etrack->intra_only, &etrack->handle_func, &etrack->mapping_data);
       }
 
       GST_DEBUG_OBJECT (demux, "Created caps %" GST_PTR_FORMAT, caps);
@@ -1622,6 +1623,8 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
   GstBuffer *outbuf = NULL;
   GstMXFDemuxEssenceTrack *etrack = NULL;
   gboolean keyframe = TRUE;
+  /* As in GstMXFDemuxIndex */
+  guint64 pts = G_MAXUINT64, dts = G_MAXUINT64;
 
   GST_DEBUG_OBJECT (demux,
       "Handling generic container essence element of size %" G_GSIZE_FORMAT
@@ -1680,7 +1683,8 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
         GstMXFDemuxIndex *idx =
             &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
 
-        if (idx->offset != 0 && idx->offset == demux->offset - demux->run_in) {
+        if (idx->initialized && idx->offset != 0
+            && idx->offset == demux->offset - demux->run_in) {
           etrack->position = i;
           break;
         }
@@ -1696,8 +1700,12 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
   if (etrack->offsets && etrack->offsets->len > etrack->position) {
     GstMXFDemuxIndex *index =
         &g_array_index (etrack->offsets, GstMXFDemuxIndex, etrack->position);
-    if (index->offset != 0)
+    if (index->initialized && index->offset != 0)
       keyframe = index->keyframe;
+    if (index->initialized && index->pts != G_MAXUINT64)
+      pts = index->pts;
+    if (index->initialized && index->dts != G_MAXUINT64)
+      dts = index->dts;
   }
 
   /* Create subbuffer to be able to change metadata */
@@ -1733,7 +1741,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
     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) {
+  if (demux->index_tables) {
     GList *l;
     GstMXFDemuxIndexTable *index_table = NULL;
 
@@ -1751,14 +1759,21 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
       GstMXFDemuxIndex *index =
           &g_array_index (index_table->offsets, GstMXFDemuxIndex,
           etrack->position);
-      if (index->offset != 0) {
+      if (index->initialized && 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 (outbuf) {
+          if (keyframe)
+            GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+          else
+            GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+        }
       }
+
+      if (index->initialized && index->pts != G_MAXUINT64)
+        pts = index->pts;
+      if (index->initialized && index->dts != G_MAXUINT64)
+        dts = index->dts;
     }
   }
 
@@ -1776,6 +1791,9 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
       GstMXFDemuxIndex index;
 
       index.offset = demux->offset - demux->run_in;
+      index.initialized = TRUE;
+      index.pts = pts;
+      index.dts = dts;
       index.keyframe = keyframe;
       if (etrack->offsets->len < etrack->position)
         g_array_set_size (etrack->offsets, etrack->position);
@@ -1826,7 +1844,15 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
         gst_buffer_get_size (inbuf));
 
     GST_BUFFER_DTS (outbuf) = pad->position;
-    GST_BUFFER_PTS (outbuf) = pad->position;
+    if (pts != G_MAXUINT64)
+      GST_BUFFER_PTS (outbuf) = gst_util_uint64_scale (pts * GST_SECOND,
+          pad->current_essence_track->source_track->edit_rate.d,
+          pad->current_essence_track->source_track->edit_rate.n);
+    else if (etrack->intra_only)
+      GST_BUFFER_PTS (outbuf) = pad->position;
+    else
+      GST_BUFFER_PTS (outbuf) = GST_CLOCK_TIME_NONE;
+
     GST_BUFFER_DURATION (outbuf) =
         gst_util_uint64_scale (GST_SECOND,
         pad->current_essence_track->source_track->edit_rate.d,
@@ -3575,8 +3601,6 @@ collect_index_table_segments (GstMXFDemux * demux)
 
     for (i = 0; i < segment->n_index_entries && start + i < t->offsets->len;
         i++) {
-      GstMXFDemuxIndex *index =
-          &g_array_index (t->offsets, GstMXFDemuxIndex, start + i);
       guint64 offset = segment->index_entries[i].stream_offset;
       GList *m;
       GstMXFDemuxPartition *offset_partition = NULL, *next_partition = NULL;
@@ -3596,8 +3620,7 @@ collect_index_table_segments (GstMXFDemux * demux)
         next_partition = NULL;
       }
 
-      if (offset_partition && offset >= offset_partition->partition.body_offset
-          && (offset - offset_partition->partition.body_offset)) {
+      if (offset_partition && offset >= offset_partition->partition.body_offset) {
         offset =
             offset_partition->partition.this_partition +
             offset_partition->essence_container_offset + (offset -
@@ -3608,9 +3631,42 @@ collect_index_table_segments (GstMXFDemux * demux)
           GST_ERROR_OBJECT (demux,
               "Invalid index table segment going into next unrelated partition");
         } else {
+          GstMXFDemuxIndex *index;
+          gint8 temporal_offset = segment->index_entries[i].temporal_offset;
+          guint64 pts_i = G_MAXUINT64;
+
+          if (temporal_offset > 0 ||
+              (temporal_offset < 0 && start + i >= -(gint) temporal_offset)) {
+            pts_i = start + i + temporal_offset;
+
+            if (t->offsets->len < pts_i)
+              g_array_set_size (t->offsets, pts_i);
+
+            index = &g_array_index (t->offsets, GstMXFDemuxIndex, pts_i);
+            if (!index->initialized) {
+              index->initialized = TRUE;
+              index->offset = 0;
+              index->pts = G_MAXUINT64;
+              index->dts = G_MAXUINT64;
+              index->keyframe = FALSE;
+            }
+
+            index->pts = start + i;
+          }
+
+          index = &g_array_index (t->offsets, GstMXFDemuxIndex, start + i);
+          if (!index->initialized) {
+            index->initialized = TRUE;
+            index->offset = 0;
+            index->pts = G_MAXUINT64;
+            index->dts = G_MAXUINT64;
+            index->keyframe = FALSE;
+          }
+
           index->offset = offset;
           index->keyframe = ! !(segment->index_entries[i].flags & 0x80)
               || (segment->index_entries[i].key_frame_offset == 0);
+          index->dts = pts_i;
         }
       }
     }
index b4d7242a8cf83824bc8dd8408553852d8ff4871f..48cf9e8630764756832b96edf08e4d1aa83ec110 100644 (file)
@@ -56,12 +56,6 @@ typedef struct
   guint64 essence_container_offset;
 } GstMXFDemuxPartition;
 
-typedef struct
-{
-  guint64 offset;
-  gboolean keyframe;
-} GstMXFDemuxIndex;
-
 typedef struct
 {
   guint32 body_sid;
@@ -86,12 +80,30 @@ typedef struct
   GstTagList *tags;
 
   GstCaps *caps;
+  gboolean intra_only;
 } GstMXFDemuxEssenceTrack;
 
+typedef struct
+{
+  /* 0 if uninitialized */
+  guint64 offset;
+
+  /* PTS edit unit number or G_MAXUINT64 */
+  guint64 pts;
+
+  /* DTS edit unit number if we got here via PTS */
+  guint64 dts;
+
+  gboolean keyframe;
+  gboolean initialized;
+} GstMXFDemuxIndex;
+
 typedef struct
 {
   guint32 body_sid;
   guint32 index_sid;
+
+  /* offsets indexed by DTS */
   GArray *offsets;
 } GstMXFDemuxIndexTable;
 
index 6f72c902af7e901d91790af6690d5583db274e77..dbfe3490a319767f6cbeb6bc1f28fb8b30971978 100644 (file)
@@ -140,7 +140,8 @@ mxf_dv_dif_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   GstCaps *caps = NULL;
   guint i;
@@ -181,6 +182,8 @@ mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
 
   gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", NULL);
 
+  *intra_only = TRUE;
+
   return caps;
 }
 
index 97feab624bd65b70274e5b29650f61010ef123e2..57a57a3b2dd4ca678d7edb9bbf3d46eea51eb2cb 100644 (file)
@@ -37,7 +37,7 @@ typedef GstFlowReturn (*MXFEssenceElementHandleFunc) (const MXFUL *key, GstBuffe
 typedef struct {
   gboolean (*handles_track) (const MXFMetadataTimelineTrack *track);
   MXFEssenceWrapping (*get_track_wrapping) (const MXFMetadataTimelineTrack *track);
-  GstCaps * (*create_caps) (MXFMetadataTimelineTrack *track, GstTagList **tags, MXFEssenceElementHandleFunc *handler, gpointer *mapping_data);
+  GstCaps * (*create_caps) (MXFMetadataTimelineTrack *track, GstTagList **tags, gboolean * intra_only, MXFEssenceElementHandleFunc *handler, gpointer *mapping_data);
 } MXFEssenceElementHandler;
 
 typedef GstFlowReturn (*MXFEssenceElementWriteFunc) (GstBuffer *buffer, gpointer mapping_data, GstAdapter *adapter, GstBuffer **outbuf, gboolean flush);
index 35df1ba069caeb96bfab07999144f3a0d3947901..5d084f24f89ccc29c4d7154b1ccb814f37314291 100644 (file)
@@ -126,7 +126,8 @@ mxf_jpeg2000_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_jpeg2000_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataFileDescriptor *f = NULL;
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
@@ -234,6 +235,8 @@ mxf_jpeg2000_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
       "JPEG 2000", NULL);
 
+  *intra_only = TRUE;
+
   return caps;
 }
 
index 30ba9cfc004f2f9524220ecde7987e2834acea85..57dd75d07dceb6128b02ddf3caa2c700ed5acc43 100644 (file)
@@ -627,8 +627,8 @@ static const MXFUL sound_essence_compression_aac = { {
 
 static GstCaps *
 mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data,
-    MXFMetadataGenericPictureEssenceDescriptor * p,
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data, MXFMetadataGenericPictureEssenceDescriptor * p,
     MXFMetadataGenericSoundEssenceDescriptor * s)
 {
   GstCaps *caps = NULL;
@@ -648,6 +648,7 @@ mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       codec_name = "MPEG-2 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_MPEG2;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
+      *intra_only = FALSE;
     } else if (p->picture_essence_coding.u[0] != 0x06
         || p->picture_essence_coding.u[1] != 0x0e
         || p->picture_essence_coding.u[2] != 0x2b
@@ -669,12 +670,14 @@ mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       codec_name = "MPEG-2 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_MPEG2;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
+      *intra_only = FALSE;
     } else if (p->picture_essence_coding.u[13] == 0x10) {
       caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1,
           "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
       codec_name = "MPEG-1 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_MPEG2;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
+      *intra_only = TRUE;
     } else if (p->picture_essence_coding.u[13] == 0x20) {
       MXFLocalTag *local_tag =
           (((MXFMetadataBase *) p)->other_tags) ?
@@ -698,6 +701,7 @@ mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       codec_name = "MPEG-4 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_MPEG4;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
+      *intra_only = FALSE;
     } else if ((p->picture_essence_coding.u[13] >> 4) == 0x03) {
       /* RP 2008 */
 
@@ -707,6 +711,7 @@ mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       codec_name = "h.264 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_AVC;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
+      *intra_only = FALSE;
     } else {
       GST_ERROR ("Unsupported MPEG picture essence coding 0x%02x",
           p->picture_essence_coding.u[13]);
@@ -764,6 +769,7 @@ mxf_mpeg_es_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       mxf_metadata_generic_sound_essence_descriptor_set_caps (s, caps);
       *handler = mxf_mpeg_audio_handle_essence_element;
     }
+    *intra_only = TRUE;
   }
 
   if (caps) {
@@ -823,7 +829,8 @@ mxf_mpeg_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataFileDescriptor *f = NULL;
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
@@ -866,7 +873,9 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   if (f->essence_container.u[13] == 0x04) {
     GST_DEBUG ("Found MPEG ES stream");
 
-    caps = mxf_mpeg_es_create_caps (track, tags, handler, mapping_data, p, s);
+    caps =
+        mxf_mpeg_es_create_caps (track, tags, intra_only, handler, mapping_data,
+        p, s);
   } else if (f->essence_container.u[13] == 0x07) {
     GST_ERROR ("MPEG PES streams not supported yet");
     return NULL;
@@ -880,6 +889,7 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       *tags = gst_tag_list_new_empty ();
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "MPEG PS", NULL);
+    *intra_only = FALSE;
   } else if (f->essence_container.u[13] == 0x09) {
     GST_DEBUG ("Found MPEG TS stream");
     caps = gst_caps_new_empty_simple ("video/mpegts");
@@ -888,6 +898,7 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       *tags = gst_tag_list_new_empty ();
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "MPEG TS", NULL);
+    *intra_only = FALSE;
   } else if (f->essence_container.u[13] == 0x0f) {
     GST_DEBUG ("Found h264 NAL unit stream");
     /* RP 2008 */
@@ -899,6 +910,7 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       *tags = gst_tag_list_new_empty ();
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "h.264 Video", NULL);
+    *intra_only = FALSE;
   } else if (f->essence_container.u[13] == 0x10) {
     GST_DEBUG ("Found h264 byte-stream stream");
     /* RP 2008 */
@@ -910,6 +922,7 @@ mxf_mpeg_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
       *tags = gst_tag_list_new_empty ();
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "h.264 Video", NULL);
+    *intra_only = FALSE;
   }
 
   if (p && caps)
index afb6d950f5afcab66704d71ecd10ec910388fbfb..d8b6664dab67efc5d48e05f14143a55e1df20e9d 100644 (file)
@@ -240,7 +240,8 @@ mxf_up_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 static GstCaps *
 mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
     MXFMetadataRGBAPictureEssenceDescriptor * d, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   GstCaps *caps = NULL;
   guint i;
@@ -280,6 +281,7 @@ mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
         ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_end_offset;
 
     *mapping_data = data;
+    *intra_only = TRUE;
   } else {
     GST_WARNING ("Unsupported pixel layout");
   }
@@ -290,7 +292,8 @@ mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
 static GstCaps *
 mxf_up_cdci_create_caps (MXFMetadataTimelineTrack * track,
     MXFMetadataCDCIPictureEssenceDescriptor * d, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   GstCaps *caps = NULL;
   guint i;
@@ -326,6 +329,7 @@ mxf_up_cdci_create_caps (MXFMetadataTimelineTrack * track,
         ((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_end_offset;
 
     *mapping_data = data;
+    *intra_only = TRUE;
   } else {
     GST_WARNING ("Unsupported CDCI format");
   }
@@ -335,7 +339,8 @@ mxf_up_cdci_create_caps (MXFMetadataTimelineTrack * track,
 
 static GstCaps *
 mxf_up_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
   MXFMetadataCDCIPictureEssenceDescriptor *c = NULL;
@@ -378,9 +383,13 @@ mxf_up_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
   *handler = mxf_up_handle_essence_element;
 
   if (r) {
-    caps = mxf_up_rgba_create_caps (track, r, tags, handler, mapping_data);
+    caps =
+        mxf_up_rgba_create_caps (track, r, tags, intra_only, handler,
+        mapping_data);
   } else if (c) {
-    caps = mxf_up_cdci_create_caps (track, c, tags, handler, mapping_data);
+    caps =
+        mxf_up_cdci_create_caps (track, c, tags, intra_only, handler,
+        mapping_data);
   } else {
     return NULL;
   }
index 2f2e5b074b944b749ad78ed230b414718a34697d..638cffa3aa8aa457251db3b0c22312e136b4dd8a 100644 (file)
@@ -138,7 +138,8 @@ mxf_vc3_get_track_wrapping (const MXFMetadataTimelineTrack * track)
 
 static GstCaps *
 mxf_vc3_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
-    MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
+    gboolean * intra_only, MXFEssenceElementHandleFunc * handler,
+    gpointer * mapping_data)
 {
   MXFMetadataFileDescriptor *f = NULL;
   MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
@@ -186,6 +187,7 @@ mxf_vc3_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
     *tags = gst_tag_list_new_empty ();
   gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
       "VC-3 Video", NULL);
+  *intra_only = TRUE;
 
   return caps;
 }