summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
Diffstat (limited to 'gst')
-rw-r--r--gst/mxf/mxfdv-dif.c51
-rw-r--r--gst/mxf/mxfparse.c12
-rw-r--r--gst/mxf/mxfparse.h1
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);