diff options
-rw-r--r-- | gst/mxf/mxfdv-dif.c | 51 | ||||
-rw-r--r-- | gst/mxf/mxfparse.c | 12 | ||||
-rw-r--r-- | gst/mxf/mxfparse.h | 1 |
3 files changed, 36 insertions, 28 deletions
diff --git a/gst/mxf/mxfdv-dif.c b/gst/mxf/mxfdv-dif.c index 256bddac..10e71b78 100644 --- a/gst/mxf/mxfdv-dif.c +++ b/gst/mxf/mxfdv-dif.c @@ -39,6 +39,10 @@ GST_DEBUG_CATEGORY_EXTERN (mxf_debug); #define GST_CAT_DEFAULT mxf_debug +static const guint8 picture_essence_coding_dv[13] = { + 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x01, 0x04, 0x01, 0x02, 0x02, 0x02 +}; + static gboolean mxf_is_dv_dif_essence_track (const MXFMetadataTimelineTrack * track) { @@ -59,8 +63,19 @@ mxf_is_dv_dif_essence_track (const MXFMetadataTimelineTrack * track) key = &d->essence_container; /* SMPTE 383M 8 */ if (mxf_is_generic_container_essence_container_label (key) && - key->u[12] == 0x02 && key->u[13] == 0x02) + key->u[12] == 0x02 && key->u[13] == 0x02) { return TRUE; + } else if (mxf_is_avid_essence_container_label (key)) { + MXFMetadataGenericPictureEssenceDescriptor *p; + + if (!MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (d)) + return FALSE; + p = MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (d); + + key = &p->picture_essence_coding; + if (memcmp (key, &picture_essence_coding_dv, 13) == 0) + return TRUE; + } } return FALSE; @@ -88,8 +103,6 @@ static GstCaps * mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags, MXFEssenceElementHandleFunc * handler, gpointer * mapping_data) { - MXFMetadataFileDescriptor *f = NULL; - guint i; GstCaps *caps = NULL; g_return_val_if_fail (track != NULL, NULL); @@ -99,39 +112,21 @@ mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags, return NULL; } - for (i = 0; i < track->parent.n_descriptor; i++) { - if (!track->parent.descriptor[i]) - continue; - - if (MXF_IS_METADATA_FILE_DESCRIPTOR (track->parent.descriptor[i]) && - !MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (track->parent.descriptor[i])) { - f = track->parent.descriptor[i]; - } - } - - if (!f) { - GST_ERROR ("No descriptor found for this track"); - return NULL; - } - *handler = mxf_dv_dif_handle_essence_element; /* SMPTE 383M 8 */ /* TODO: might be video or audio only, use values of the generic sound/picture * descriptor in the caps in that case */ - if (f->essence_container.u[13] == 0x02) { - GST_DEBUG ("Found DV-DIF stream"); - caps = - gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, - NULL); + GST_DEBUG ("Found DV-DIF stream"); + caps = + gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, + NULL); - if (!*tags) - *tags = gst_tag_list_new (); + if (!*tags) + *tags = gst_tag_list_new (); - gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", - NULL); - } + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", NULL); return caps; } diff --git a/gst/mxf/mxfparse.c b/gst/mxf/mxfparse.c index 91fbda57..70b98c85 100644 --- a/gst/mxf/mxfparse.c +++ b/gst/mxf/mxfparse.c @@ -203,6 +203,18 @@ mxf_is_generic_container_essence_container_label (const MXFUL * key) key->u[11] == 0x01 && (key->u[12] == 0x01 || key->u[12] == 0x02)); } +/* Essence container label found in files generated by Avid */ +static const guint8 avid_essence_container_label[] = { + 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0xff, 0x4b, 0x46, 0x41, 0x41, 0x00, + 0x0d, 0x4d, 0x4f +}; + +gboolean +mxf_is_avid_essence_container_label (const MXFUL * key) +{ + return (memcmp (&key->u, avid_essence_container_label, 16) == 0); +} + gboolean mxf_ul_is_equal (const MXFUL * a, const MXFUL * b) { diff --git a/gst/mxf/mxfparse.h b/gst/mxf/mxfparse.h index 9c024803..b4e4cc26 100644 --- a/gst/mxf/mxfparse.h +++ b/gst/mxf/mxfparse.h @@ -63,6 +63,7 @@ gboolean mxf_is_generic_container_system_item (const MXFUL *key); gboolean mxf_is_generic_container_essence_element (const MXFUL *key); gboolean mxf_is_generic_container_essence_container_label (const MXFUL *key); +gboolean mxf_is_avid_essence_container_label (const MXFUL *key); gboolean mxf_is_fill (const MXFUL *key); |