summaryrefslogtreecommitdiffstats
path: root/gst/mxf
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-02-07 09:27:13 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-02-07 09:27:13 +0100
commit6e392318c01394667578a09ba894184d356d9960 (patch)
tree1e63d76f2ea6f06754b17bc32dc92a8385064fa6 /gst/mxf
parent1822dc99d3ca39f8ca1f273aeb225687a7705406 (diff)
downloadgst-plugins-bad-6e392318c01394667578a09ba894184d356d9960.tar.gz
gst-plugins-bad-6e392318c01394667578a09ba894184d356d9960.tar.bz2
gst-plugins-bad-6e392318c01394667578a09ba894184d356d9960.zip
mxfdemux: Add support for non-standard Avid MXF files containing DV essence
Avid usually uses a custom essence container label for the essence descriptors and stores the actual codec that is used inside the picture essence coding field (and for sound probably in the sound essence coding field but I have no sample files with sound). Partially fixes bug #561922.
Diffstat (limited to 'gst/mxf')
-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);