mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 08:46:40 +00:00
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.
This commit is contained in:
parent
1822dc99d3
commit
6e392318c0
3 changed files with 36 additions and 28 deletions
|
@ -39,6 +39,10 @@
|
||||||
GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
|
GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
|
||||||
#define GST_CAT_DEFAULT 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
|
static gboolean
|
||||||
mxf_is_dv_dif_essence_track (const MXFMetadataTimelineTrack * track)
|
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;
|
key = &d->essence_container;
|
||||||
/* SMPTE 383M 8 */
|
/* SMPTE 383M 8 */
|
||||||
if (mxf_is_generic_container_essence_container_label (key) &&
|
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;
|
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;
|
return FALSE;
|
||||||
|
@ -88,8 +103,6 @@ static GstCaps *
|
||||||
mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
|
mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
|
||||||
MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
|
MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
|
||||||
{
|
{
|
||||||
MXFMetadataFileDescriptor *f = NULL;
|
|
||||||
guint i;
|
|
||||||
GstCaps *caps = NULL;
|
GstCaps *caps = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (track != NULL, NULL);
|
g_return_val_if_fail (track != NULL, NULL);
|
||||||
|
@ -99,39 +112,21 @@ mxf_dv_dif_create_caps (MXFMetadataTimelineTrack * track, GstTagList ** tags,
|
||||||
return NULL;
|
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;
|
*handler = mxf_dv_dif_handle_essence_element;
|
||||||
/* SMPTE 383M 8 */
|
/* SMPTE 383M 8 */
|
||||||
|
|
||||||
/* TODO: might be video or audio only, use values of the generic sound/picture
|
/* TODO: might be video or audio only, use values of the generic sound/picture
|
||||||
* descriptor in the caps in that case
|
* descriptor in the caps in that case
|
||||||
*/
|
*/
|
||||||
if (f->essence_container.u[13] == 0x02) {
|
GST_DEBUG ("Found DV-DIF stream");
|
||||||
GST_DEBUG ("Found DV-DIF stream");
|
caps =
|
||||||
caps =
|
gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE,
|
||||||
gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE,
|
NULL);
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (!*tags)
|
if (!*tags)
|
||||||
*tags = gst_tag_list_new ();
|
*tags = gst_tag_list_new ();
|
||||||
|
|
||||||
gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF",
|
gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", NULL);
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return caps;
|
return caps;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
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
|
gboolean
|
||||||
mxf_ul_is_equal (const MXFUL * a, const MXFUL * b)
|
mxf_ul_is_equal (const MXFUL * a, const MXFUL * b)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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_element (const MXFUL *key);
|
||||||
|
|
||||||
gboolean mxf_is_generic_container_essence_container_label (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);
|
gboolean mxf_is_fill (const MXFUL *key);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue