mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-14 12:04:11 +00:00
gst/mxf/: Add initial parsing of RGBA descriptors.
Original commit message from CVS: * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), (gst_mxf_demux_handle_metadata_generic_descriptor), (gst_mxf_demux_handle_metadata_file_descriptor), (gst_mxf_demux_handle_metadata_multiple_descriptor), (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), (gst_mxf_demux_handle_header_metadata_resolve_references), (gst_mxf_demux_handle_metadata): * gst/mxf/mxfdemux.h: * gst/mxf/mxfparse.c: (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), (mxf_metadata_rgba_picture_essence_descriptor_reset): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Add initial parsing of RGBA descriptors. Don't initialize descriptor GArray with zeroes.
This commit is contained in:
parent
fb8d2b901d
commit
4f365b391e
6 changed files with 182 additions and 11 deletions
24
ChangeLog
24
ChangeLog
|
@ -1,3 +1,27 @@
|
|||
2008-11-25 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
|
||||
(gst_mxf_demux_handle_metadata_generic_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_file_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_multiple_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_mpeg_video_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor),
|
||||
(gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor),
|
||||
(gst_mxf_demux_handle_header_metadata_resolve_references),
|
||||
(gst_mxf_demux_handle_metadata):
|
||||
* gst/mxf/mxfdemux.h:
|
||||
* gst/mxf/mxfparse.c:
|
||||
(mxf_metadata_rgba_picture_essence_descriptor_handle_tag),
|
||||
(mxf_metadata_rgba_picture_essence_descriptor_reset):
|
||||
* gst/mxf/mxfparse.h:
|
||||
* gst/mxf/mxftypes.h:
|
||||
Add initial parsing of RGBA descriptors.
|
||||
|
||||
Don't initialize descriptor GArray with zeroes.
|
||||
|
||||
2008-11-25 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
* gst/mxf/mxfaes-bwf.c:
|
||||
|
|
|
@ -289,6 +289,15 @@ gst_mxf_demux_reset_metadata (GstMXFDemux * demux)
|
|||
demux->cdci_picture_essence_descriptor = NULL;
|
||||
}
|
||||
|
||||
if (demux->rgba_picture_essence_descriptor) {
|
||||
for (i = 0; i < demux->rgba_picture_essence_descriptor->len; i++)
|
||||
mxf_metadata_rgba_picture_essence_descriptor_reset (&g_array_index
|
||||
(demux->rgba_picture_essence_descriptor,
|
||||
MXFMetadataRGBAPictureEssenceDescriptor, i));
|
||||
g_array_free (demux->rgba_picture_essence_descriptor, TRUE);
|
||||
demux->rgba_picture_essence_descriptor = NULL;
|
||||
}
|
||||
|
||||
if (demux->mpeg_video_descriptor) {
|
||||
for (i = 0; i < demux->mpeg_video_descriptor->len; i++)
|
||||
mxf_metadata_mpeg_video_descriptor_reset (&g_array_index
|
||||
|
@ -722,7 +731,7 @@ gst_mxf_demux_handle_metadata_generic_descriptor (GstMXFDemux * demux,
|
|||
|
||||
if (!demux->generic_descriptor)
|
||||
demux->generic_descriptor =
|
||||
g_array_new (FALSE, TRUE, sizeof (MXFMetadataGenericDescriptor));
|
||||
g_array_new (FALSE, FALSE, sizeof (MXFMetadataGenericDescriptor));
|
||||
|
||||
g_array_append_val (demux->generic_descriptor, descriptor);
|
||||
|
||||
|
@ -754,7 +763,7 @@ gst_mxf_demux_handle_metadata_file_descriptor (GstMXFDemux * demux,
|
|||
|
||||
if (!demux->file_descriptor)
|
||||
demux->file_descriptor =
|
||||
g_array_new (FALSE, TRUE, sizeof (MXFMetadataFileDescriptor));
|
||||
g_array_new (FALSE, FALSE, sizeof (MXFMetadataFileDescriptor));
|
||||
|
||||
g_array_append_val (demux->file_descriptor, descriptor);
|
||||
|
||||
|
@ -787,7 +796,7 @@ gst_mxf_demux_handle_metadata_multiple_descriptor (GstMXFDemux * demux,
|
|||
|
||||
if (!demux->multiple_descriptor)
|
||||
demux->multiple_descriptor =
|
||||
g_array_new (FALSE, TRUE, sizeof (MXFMetadataMultipleDescriptor));
|
||||
g_array_new (FALSE, FALSE, sizeof (MXFMetadataMultipleDescriptor));
|
||||
|
||||
g_array_append_val (demux->multiple_descriptor, descriptor);
|
||||
|
||||
|
@ -821,7 +830,7 @@ gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor (GstMXFDemux *
|
|||
|
||||
if (!demux->generic_picture_essence_descriptor)
|
||||
demux->generic_picture_essence_descriptor =
|
||||
g_array_new (FALSE, TRUE,
|
||||
g_array_new (FALSE, FALSE,
|
||||
sizeof (MXFMetadataGenericPictureEssenceDescriptor));
|
||||
|
||||
g_array_append_val (demux->generic_picture_essence_descriptor, descriptor);
|
||||
|
@ -856,7 +865,7 @@ gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor (GstMXFDemux *
|
|||
|
||||
if (!demux->cdci_picture_essence_descriptor)
|
||||
demux->cdci_picture_essence_descriptor =
|
||||
g_array_new (FALSE, TRUE,
|
||||
g_array_new (FALSE, FALSE,
|
||||
sizeof (MXFMetadataCDCIPictureEssenceDescriptor));
|
||||
|
||||
g_array_append_val (demux->cdci_picture_essence_descriptor, descriptor);
|
||||
|
@ -864,6 +873,41 @@ gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor (GstMXFDemux *
|
|||
return GST_FLOW_OK;
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor (GstMXFDemux *
|
||||
demux, const MXFUL * key, guint16 type, GstBuffer * buffer)
|
||||
{
|
||||
MXFMetadataRGBAPictureEssenceDescriptor descriptor;
|
||||
|
||||
memset (&descriptor, 0, sizeof (descriptor));
|
||||
|
||||
GST_DEBUG_OBJECT (demux,
|
||||
"Handling metadata RGBA picture essence descriptor of size %u"
|
||||
" at offset %" G_GUINT64_FORMAT " with type 0x%04d",
|
||||
GST_BUFFER_SIZE (buffer), demux->offset, type);
|
||||
|
||||
if (!mxf_metadata_descriptor_parse (key,
|
||||
(MXFMetadataGenericDescriptor *) & descriptor, &demux->primer,
|
||||
type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer),
|
||||
(MXFMetadataDescriptorHandleTag)
|
||||
mxf_metadata_rgba_picture_essence_descriptor_handle_tag,
|
||||
(MXFMetadataDescriptorReset)
|
||||
mxf_metadata_rgba_picture_essence_descriptor_reset)) {
|
||||
GST_ERROR_OBJECT (demux,
|
||||
"Parsing metadata RGBA picture essence descriptor failed");
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
if (!demux->rgba_picture_essence_descriptor)
|
||||
demux->rgba_picture_essence_descriptor =
|
||||
g_array_new (FALSE, FALSE,
|
||||
sizeof (MXFMetadataRGBAPictureEssenceDescriptor));
|
||||
|
||||
g_array_append_val (demux->rgba_picture_essence_descriptor, descriptor);
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
||||
static GstFlowReturn
|
||||
gst_mxf_demux_handle_metadata_mpeg_video_descriptor (GstMXFDemux * demux,
|
||||
const MXFUL * key, guint16 type, GstBuffer * buffer)
|
||||
|
@ -890,7 +934,7 @@ gst_mxf_demux_handle_metadata_mpeg_video_descriptor (GstMXFDemux * demux,
|
|||
|
||||
if (!demux->mpeg_video_descriptor)
|
||||
demux->mpeg_video_descriptor =
|
||||
g_array_new (FALSE, TRUE, sizeof (MXFMetadataMPEGVideoDescriptor));
|
||||
g_array_new (FALSE, FALSE, sizeof (MXFMetadataMPEGVideoDescriptor));
|
||||
|
||||
g_array_append_val (demux->mpeg_video_descriptor, descriptor);
|
||||
|
||||
|
@ -924,7 +968,7 @@ gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor (GstMXFDemux *
|
|||
|
||||
if (!demux->generic_sound_essence_descriptor)
|
||||
demux->generic_sound_essence_descriptor =
|
||||
g_array_new (FALSE, TRUE,
|
||||
g_array_new (FALSE, FALSE,
|
||||
sizeof (MXFMetadataGenericSoundEssenceDescriptor));
|
||||
|
||||
g_array_append_val (demux->generic_sound_essence_descriptor, descriptor);
|
||||
|
@ -959,7 +1003,7 @@ gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor (GstMXFDemux *
|
|||
|
||||
if (!demux->wave_audio_essence_descriptor)
|
||||
demux->wave_audio_essence_descriptor =
|
||||
g_array_new (FALSE, TRUE,
|
||||
g_array_new (FALSE, FALSE,
|
||||
sizeof (MXFMetadataWaveAudioEssenceDescriptor));
|
||||
|
||||
g_array_append_val (demux->wave_audio_essence_descriptor, descriptor);
|
||||
|
@ -1033,6 +1077,13 @@ gst_mxf_demux_handle_header_metadata_resolve_references (GstMXFDemux * demux)
|
|||
MXFMetadataCDCIPictureEssenceDescriptor, i));
|
||||
}
|
||||
}
|
||||
if (demux->rgba_picture_essence_descriptor) {
|
||||
for (i = 0; i < demux->rgba_picture_essence_descriptor->len; i++) {
|
||||
g_ptr_array_add (demux->descriptor,
|
||||
&g_array_index (demux->rgba_picture_essence_descriptor,
|
||||
MXFMetadataRGBAPictureEssenceDescriptor, i));
|
||||
}
|
||||
}
|
||||
if (demux->mpeg_video_descriptor) {
|
||||
for (i = 0; i < demux->mpeg_video_descriptor->len; i++) {
|
||||
g_ptr_array_add (demux->descriptor,
|
||||
|
@ -1173,8 +1224,9 @@ gst_mxf_demux_handle_header_metadata_resolve_references (GstMXFDemux * demux)
|
|||
MXFMetadataEssenceContainerData, i);
|
||||
|
||||
for (j = 0; j < demux->content_storage.n_essence_container_data; j++) {
|
||||
if (mxf_ul_is_equal (&demux->content_storage.
|
||||
essence_container_data_uids[j], &data->instance_uid)) {
|
||||
if (mxf_ul_is_equal (&demux->
|
||||
content_storage.essence_container_data_uids[j],
|
||||
&data->instance_uid)) {
|
||||
demux->content_storage.essence_container_data[j] = data;
|
||||
break;
|
||||
}
|
||||
|
@ -1827,7 +1879,6 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key,
|
|||
gst_mxf_demux_handle_metadata_structural_component (demux,
|
||||
key, type, buffer);
|
||||
break;
|
||||
case MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR:
|
||||
case MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR:
|
||||
ret =
|
||||
gst_mxf_demux_handle_metadata_generic_descriptor (demux,
|
||||
|
@ -1848,6 +1899,11 @@ gst_mxf_demux_handle_metadata (GstMXFDemux * demux, const MXFUL * key,
|
|||
gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor (demux,
|
||||
key, type, buffer);
|
||||
break;
|
||||
case MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR:
|
||||
ret =
|
||||
gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor (demux,
|
||||
key, type, buffer);
|
||||
break;
|
||||
case MXF_METADATA_MPEG_VIDEO_DESCRIPTOR:
|
||||
ret =
|
||||
gst_mxf_demux_handle_metadata_mpeg_video_descriptor (demux,
|
||||
|
|
|
@ -88,6 +88,7 @@ struct _GstMXFDemux
|
|||
GArray *generic_sound_essence_descriptor;
|
||||
GArray *generic_picture_essence_descriptor;
|
||||
GArray *cdci_picture_essence_descriptor;
|
||||
GArray *rgba_picture_essence_descriptor;
|
||||
GArray *mpeg_video_descriptor;
|
||||
GArray *wave_audio_essence_descriptor;
|
||||
GArray *multiple_descriptor;
|
||||
|
|
|
@ -2388,6 +2388,79 @@ void mxf_metadata_cdci_picture_essence_descriptor_reset
|
|||
memset (descriptor, 0, sizeof (MXFMetadataCDCIPictureEssenceDescriptor));
|
||||
}
|
||||
|
||||
gboolean
|
||||
mxf_metadata_rgba_picture_essence_descriptor_handle_tag
|
||||
(MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer,
|
||||
guint16 tag, const guint8 * tag_data, guint16 tag_size)
|
||||
{
|
||||
MXFMetadataRGBAPictureEssenceDescriptor *descriptor =
|
||||
(MXFMetadataRGBAPictureEssenceDescriptor *) d;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
switch (tag) {
|
||||
case 0x3406:
|
||||
if (tag_size != 4)
|
||||
goto error;
|
||||
descriptor->component_max_ref = GST_READ_UINT32_BE (tag_data);
|
||||
GST_DEBUG (" component max ref = %u", descriptor->component_max_ref);
|
||||
break;
|
||||
case 0x3407:
|
||||
if (tag_size != 4)
|
||||
goto error;
|
||||
descriptor->component_min_ref = GST_READ_UINT32_BE (tag_data);
|
||||
GST_DEBUG (" component min ref = %u", descriptor->component_min_ref);
|
||||
break;
|
||||
case 0x3408:
|
||||
if (tag_size != 4)
|
||||
goto error;
|
||||
descriptor->alpha_max_ref = GST_READ_UINT32_BE (tag_data);
|
||||
GST_DEBUG (" alpha max ref = %u", descriptor->alpha_max_ref);
|
||||
break;
|
||||
case 0x3409:
|
||||
if (tag_size != 4)
|
||||
goto error;
|
||||
descriptor->alpha_min_ref = GST_READ_UINT32_BE (tag_data);
|
||||
GST_DEBUG (" alpha min ref = %u", descriptor->alpha_min_ref);
|
||||
break;
|
||||
case 0x3405:
|
||||
if (tag_size != 1)
|
||||
goto error;
|
||||
descriptor->scanning_direction = GST_READ_UINT8 (tag_data);
|
||||
GST_DEBUG (" scanning direction = %u", descriptor->scanning_direction);
|
||||
break;
|
||||
case 0x3401:
|
||||
case 0x3403:
|
||||
case 0x3404:
|
||||
/* TODO: handle this */
|
||||
GST_WARNING (" tag 0x%04x not implemented yet", tag);
|
||||
break;
|
||||
default:
|
||||
ret =
|
||||
mxf_metadata_generic_picture_essence_descriptor_handle_tag (d, primer,
|
||||
tag, tag_data, tag_size);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
error:
|
||||
GST_ERROR ("Invalid RGBA picture essence descriptor tag 0x%04x of size %u",
|
||||
tag, tag_size);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void mxf_metadata_rgba_picture_essence_descriptor_reset
|
||||
(MXFMetadataRGBAPictureEssenceDescriptor * descriptor)
|
||||
{
|
||||
g_return_if_fail (descriptor != NULL);
|
||||
|
||||
mxf_metadata_generic_picture_essence_descriptor_reset (
|
||||
(MXFMetadataGenericPictureEssenceDescriptor *) descriptor);
|
||||
|
||||
memset (descriptor, 0, sizeof (MXFMetadataRGBAPictureEssenceDescriptor));
|
||||
}
|
||||
|
||||
gboolean
|
||||
mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor * d,
|
||||
const MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
||||
|
|
|
@ -131,6 +131,10 @@ gboolean mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataGen
|
|||
const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size);
|
||||
void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor);
|
||||
|
||||
gboolean mxf_metadata_rgba_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
|
||||
const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size);
|
||||
void mxf_metadata_rgba_picture_essence_descriptor_reset (MXFMetadataRGBAPictureEssenceDescriptor *descriptor);
|
||||
|
||||
gboolean mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor,
|
||||
const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size);
|
||||
void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor);
|
||||
|
|
|
@ -149,6 +149,7 @@ typedef struct _MXFMetadataGenericDescriptor MXFMetadataGenericDescriptor;
|
|||
typedef struct _MXFMetadataFileDescriptor MXFMetadataFileDescriptor;
|
||||
typedef struct _MXFMetadataGenericPictureEssenceDescriptor MXFMetadataGenericPictureEssenceDescriptor;
|
||||
typedef struct _MXFMetadataCDCIPictureEssenceDescriptor MXFMetadataCDCIPictureEssenceDescriptor;
|
||||
typedef struct _MXFMetadataRGBAPictureEssenceDescriptor MXFMetadataRGBAPictureEssenceDescriptor;
|
||||
typedef struct _MXFMetadataGenericSoundEssenceDescriptor MXFMetadataGenericSoundEssenceDescriptor;
|
||||
typedef struct _MXFMetadataMultipleDescriptor MXFMetadataMultipleDescriptor;
|
||||
typedef struct _MXFMetadataLocator MXFMetadataLocator;
|
||||
|
@ -422,6 +423,18 @@ struct _MXFMetadataCDCIPictureEssenceDescriptor {
|
|||
guint32 color_range;
|
||||
};
|
||||
|
||||
struct _MXFMetadataRGBAPictureEssenceDescriptor {
|
||||
MXFMetadataGenericPictureEssenceDescriptor parent;
|
||||
|
||||
guint32 component_max_ref;
|
||||
guint32 component_min_ref;
|
||||
guint32 alpha_max_ref;
|
||||
guint32 alpha_min_ref;
|
||||
guint8 scanning_direction;
|
||||
|
||||
/* TODO: pixel layout, palette & palette layout */
|
||||
};
|
||||
|
||||
struct _MXFMetadataGenericSoundEssenceDescriptor {
|
||||
MXFMetadataFileDescriptor parent;
|
||||
|
||||
|
|
Loading…
Reference in a new issue