From 62dbf4b9bc32d6367ff770644e2f023d662426bc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 2 Mar 2009 17:00:41 +0100 Subject: [PATCH] mxfdemux: Use arrays instead of lists for the metadata registries --- gst/mxf/mxfdms1.c | 98 +++++++++++++++----------------- gst/mxf/mxfmetadata.c | 154 +++++++++++++++++++------------------------------- gst/mxf/mxfmetadata.h | 2 +- 3 files changed, 106 insertions(+), 148 deletions(-) diff --git a/gst/mxf/mxfdms1.c b/gst/mxf/mxfdms1.c index 083e6a0..704d846 100644 --- a/gst/mxf/mxfdms1.c +++ b/gst/mxf/mxfdms1.c @@ -5613,60 +5613,54 @@ mxf_dms1_cue_words_class_init (MXFDMS1CueWordsClass * klass) dm_class->type = 0x170800; } +#define _add_dm_type(type) G_STMT_START { \ + GType tmp = type; \ + \ + g_array_append_val (dms1_sets, tmp); \ +} G_STMT_END + void mxf_dms1_initialize (void) { - GSList *dms1_sets = NULL; - - dms1_sets = - g_slist_prepend (dms1_sets, - (gpointer) MXF_TYPE_DMS1_PRODUCTION_FRAMEWORK); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_CLIP_FRAMEWORK); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_SCENE_FRAMEWORK); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_TITLES); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_IDENTIFICATION); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_GROUP_RELATIONSHIP); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_BRANDING); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_EVENT); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PUBLICATION); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_AWARD); - dms1_sets = - g_slist_prepend (dms1_sets, - (gpointer) MXF_TYPE_DMS1_CAPTIONS_DESCRIPTION); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_ANNOTATION); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_SETTING_PERIOD); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_SCRIPTING); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_CLASSIFICATION); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_SHOT); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_KEY_POINT); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PARTICIPANT); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PERSON); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_ORGANISATION); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_LOCATION); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_ADDRESS); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_COMMUNICATIONS); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_CONTRACT); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_RIGHTS); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PICTURE_FORMAT); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_DEVICE_PARAMETERS); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_NAME_VALUE); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PROCESSING); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_PROJECT); - dms1_sets = - g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_CONTACTS_LIST); - dms1_sets = g_slist_prepend (dms1_sets, (gpointer) MXF_TYPE_DMS1_CUE_WORDS); - - mxf_descriptive_metadata_register (0x01, dms1_sets); -} + GArray *dms1_sets = g_array_new (TRUE, TRUE, sizeof (GType)); + + _add_dm_type (MXF_TYPE_DMS1_PRODUCTION_FRAMEWORK); + _add_dm_type (MXF_TYPE_DMS1_CLIP_FRAMEWORK); + _add_dm_type (MXF_TYPE_DMS1_SCENE_FRAMEWORK); + _add_dm_type (MXF_TYPE_DMS1_TITLES); + _add_dm_type (MXF_TYPE_DMS1_IDENTIFICATION); + _add_dm_type (MXF_TYPE_DMS1_GROUP_RELATIONSHIP); + _add_dm_type (MXF_TYPE_DMS1_BRANDING); + _add_dm_type (MXF_TYPE_DMS1_EVENT); + _add_dm_type (MXF_TYPE_DMS1_PUBLICATION); + _add_dm_type (MXF_TYPE_DMS1_AWARD); + _add_dm_type (MXF_TYPE_DMS1_CAPTIONS_DESCRIPTION); + _add_dm_type (MXF_TYPE_DMS1_ANNOTATION); + _add_dm_type (MXF_TYPE_DMS1_SETTING_PERIOD); + _add_dm_type (MXF_TYPE_DMS1_SCRIPTING); + _add_dm_type (MXF_TYPE_DMS1_CLASSIFICATION); + _add_dm_type (MXF_TYPE_DMS1_SHOT); + _add_dm_type (MXF_TYPE_DMS1_KEY_POINT); + _add_dm_type (MXF_TYPE_DMS1_PARTICIPANT); + _add_dm_type (MXF_TYPE_DMS1_PERSON); + _add_dm_type (MXF_TYPE_DMS1_ORGANISATION); + _add_dm_type (MXF_TYPE_DMS1_LOCATION); + _add_dm_type (MXF_TYPE_DMS1_ADDRESS); + _add_dm_type (MXF_TYPE_DMS1_COMMUNICATIONS); + _add_dm_type (MXF_TYPE_DMS1_CONTRACT); + _add_dm_type (MXF_TYPE_DMS1_RIGHTS); + _add_dm_type (MXF_TYPE_DMS1_PICTURE_FORMAT); + _add_dm_type (MXF_TYPE_DMS1_DEVICE_PARAMETERS); + _add_dm_type (MXF_TYPE_DMS1_NAME_VALUE); + _add_dm_type (MXF_TYPE_DMS1_PROCESSING); + _add_dm_type (MXF_TYPE_DMS1_PROJECT); + _add_dm_type (MXF_TYPE_DMS1_CONTACTS_LIST); + _add_dm_type (MXF_TYPE_DMS1_CUE_WORDS); + + mxf_descriptive_metadata_register (0x01, (GType *) g_array_free (dms1_sets, + FALSE)); +} + +#undef _add_dm_type #undef ADD_SET diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c index 6dcce04..687165c 100644 --- a/gst/mxf/mxfmetadata.c +++ b/gst/mxf/mxfmetadata.c @@ -284,104 +284,61 @@ mxf_metadata_init (MXFMetadata * self) { } -static GSList *_mxf_metadata_registry = NULL; +static GArray *_mxf_metadata_registry = NULL; -typedef struct -{ - guint16 type_id; - GType type; -} _MXFMetadataType; +#define _add_metadata_type(type) G_STMT_START { \ + GType t = type; \ + \ + g_array_append_val (_mxf_metadata_registry, t); \ +} G_STMT_END void mxf_metadata_init_types (void) { g_return_if_fail (_mxf_metadata_registry == NULL); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_PREFACE); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_IDENTIFICATION); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_CONTENT_STORAGE); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_MATERIAL_PACKAGE); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_SOURCE_PACKAGE); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_TIMELINE_TRACK); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_EVENT_TRACK); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_STATIC_TRACK); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_SEQUENCE); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_SOURCE_CLIP); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_TIMECODE_COMPONENT); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_DM_SEGMENT); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_DM_SOURCE_CLIP); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_FILE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_NETWORK_LOCATOR); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, - (gpointer) MXF_TYPE_METADATA_TEXT_LOCATOR); -} + _mxf_metadata_registry = g_array_new (FALSE, TRUE, sizeof (GType)); + + _add_metadata_type (MXF_TYPE_METADATA_PREFACE); + _add_metadata_type (MXF_TYPE_METADATA_IDENTIFICATION); + _add_metadata_type (MXF_TYPE_METADATA_CONTENT_STORAGE); + _add_metadata_type (MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA); + _add_metadata_type (MXF_TYPE_METADATA_MATERIAL_PACKAGE); + _add_metadata_type (MXF_TYPE_METADATA_SOURCE_PACKAGE); + _add_metadata_type (MXF_TYPE_METADATA_TIMELINE_TRACK); + _add_metadata_type (MXF_TYPE_METADATA_EVENT_TRACK); + _add_metadata_type (MXF_TYPE_METADATA_STATIC_TRACK); + _add_metadata_type (MXF_TYPE_METADATA_SEQUENCE); + _add_metadata_type (MXF_TYPE_METADATA_SOURCE_CLIP); + _add_metadata_type (MXF_TYPE_METADATA_TIMECODE_COMPONENT); + _add_metadata_type (MXF_TYPE_METADATA_DM_SEGMENT); + _add_metadata_type (MXF_TYPE_METADATA_DM_SOURCE_CLIP); + _add_metadata_type (MXF_TYPE_METADATA_FILE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR); + _add_metadata_type (MXF_TYPE_METADATA_NETWORK_LOCATOR); + _add_metadata_type (MXF_TYPE_METADATA_TEXT_LOCATOR); +} + +#undef _add_metadata_type void mxf_metadata_register (GType type) { g_return_if_fail (g_type_is_a (type, MXF_TYPE_METADATA)); - _mxf_metadata_registry = - g_slist_prepend (_mxf_metadata_registry, (gpointer) type); + g_array_append_val (_mxf_metadata_registry, type); } MXFMetadata * mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset, const guint8 * data, guint size) { - GSList *l; + guint i; GType t = G_TYPE_INVALID; MXFMetadata *ret = NULL; @@ -389,8 +346,8 @@ mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset, g_return_val_if_fail (primer != NULL, NULL); g_return_val_if_fail (_mxf_metadata_registry != NULL, NULL); - for (l = _mxf_metadata_registry; l; l = l->next) { - GType tmp = (GType) l->data; + for (i = 0; i < _mxf_metadata_registry->len; i++) { + GType tmp = g_array_index (_mxf_metadata_registry, GType, i); MXFMetadataClass *klass = MXF_METADATA_CLASS (g_type_class_ref (tmp)); if (klass->type == type) { @@ -4619,36 +4576,41 @@ mxf_descriptive_metadata_class_init (MXFDescriptiveMetadataClass * klass) typedef struct { guint8 scheme; - GSList *sets; + GType *types; } _MXFDescriptiveMetadataScheme; -static GSList *_dm_schemes = NULL; +static GArray *_dm_schemes = NULL; void -mxf_descriptive_metadata_register (guint8 scheme, GSList * sets) +mxf_descriptive_metadata_register (guint8 scheme, GType * types) { - _MXFDescriptiveMetadataScheme *s = - g_slice_new (_MXFDescriptiveMetadataScheme); + _MXFDescriptiveMetadataScheme s; - s->scheme = scheme; - s->sets = sets; - _dm_schemes = g_slist_prepend (_dm_schemes, s); + if (!_dm_schemes) + _dm_schemes = + g_array_new (FALSE, TRUE, sizeof (_MXFDescriptiveMetadataScheme)); + + s.scheme = scheme; + s.types = types; + + g_array_append_val (_dm_schemes, s); } MXFDescriptiveMetadata * mxf_descriptive_metadata_new (guint8 scheme, guint32 type, MXFPrimerPack * primer, guint64 offset, const guint8 * data, guint size) { - GSList *l; - GType t = G_TYPE_INVALID; + guint i; + GType t = G_TYPE_INVALID, *p; _MXFDescriptiveMetadataScheme *s = NULL; MXFDescriptiveMetadata *ret = NULL; g_return_val_if_fail (type != 0, NULL); g_return_val_if_fail (primer != NULL, NULL); - for (l = _dm_schemes; l; l = l->next) { - _MXFDescriptiveMetadataScheme *data = l->data; + for (i = 0; i < _dm_schemes->len; i++) { + _MXFDescriptiveMetadataScheme *data = + &g_array_index (_dm_schemes, _MXFDescriptiveMetadataScheme, i); if (data->scheme == scheme) { s = data; @@ -4661,8 +4623,9 @@ mxf_descriptive_metadata_new (guint8 scheme, guint32 type, return NULL; } - for (l = s->sets; l; l = l->next) { - GType tmp = (GType) l->data; + p = s->types; + while (*p) { + GType tmp = *p; MXFDescriptiveMetadataClass *klass = MXF_DESCRIPTIVE_METADATA_CLASS (g_type_class_ref (tmp)); @@ -4672,6 +4635,7 @@ mxf_descriptive_metadata_new (guint8 scheme, guint32 type, break; } g_type_class_unref (klass); + p++; } if (t == G_TYPE_INVALID) { diff --git a/gst/mxf/mxfmetadata.h b/gst/mxf/mxfmetadata.h index d3a9a3e..635c6e0 100644 --- a/gst/mxf/mxfmetadata.h +++ b/gst/mxf/mxfmetadata.h @@ -761,7 +761,7 @@ MXFMetadataTrackType mxf_metadata_track_identifier_parse (const MXFUL * track_id void mxf_metadata_generic_picture_essence_descriptor_set_caps (MXFMetadataGenericPictureEssenceDescriptor * self, GstCaps * caps); void mxf_metadata_generic_sound_essence_descriptor_set_caps (MXFMetadataGenericSoundEssenceDescriptor * self, GstCaps * caps); -void mxf_descriptive_metadata_register (guint8 scheme, GSList *sets); +void mxf_descriptive_metadata_register (guint8 scheme, GType *types); MXFDescriptiveMetadata * mxf_descriptive_metadata_new (guint8 scheme, guint32 type, MXFPrimerPack * primer, guint64 offset, const guint8 * data, guint size); GHashTable *mxf_metadata_hash_table_new (void); -- 2.7.4