2 * Copyright (C) 2008-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
28 #include "mxfmetadata.h"
31 GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
32 #define GST_CAT_DEFAULT mxf_debug
34 G_DEFINE_ABSTRACT_TYPE (MXFMetadataBase, mxf_metadata_base,
35 GST_TYPE_MINI_OBJECT);
38 mxf_metadata_base_finalize (GstMiniObject * object)
40 MXFMetadataBase *self = MXF_METADATA_BASE (object);
42 if (self->other_tags) {
43 g_hash_table_destroy (self->other_tags);
44 self->other_tags = NULL;
47 GST_MINI_OBJECT_CLASS (mxf_metadata_base_parent_class)->finalize (object);
51 mxf_metadata_base_handle_tag (MXFMetadataBase * self, MXFPrimerPack * primer,
52 guint16 tag, const guint8 * tag_data, guint tag_size)
54 return (mxf_local_tag_add_to_hash_table (primer, tag, tag_data, tag_size,
59 mxf_metadata_base_resolve_default (MXFMetadataBase * self,
60 GHashTable * metadata)
66 mxf_metadata_base_to_structure_default (MXFMetadataBase * self)
68 MXFMetadataBaseClass *klass = MXF_METADATA_BASE_GET_CLASS (self);
72 g_return_val_if_fail (klass->name_quark != 0, NULL);
74 ret = gst_structure_id_empty_new (klass->name_quark);
76 if (!mxf_uuid_is_zero (&self->instance_uid)) {
77 mxf_uuid_to_string (&self->instance_uid, str);
78 gst_structure_id_set (ret, MXF_QUARK (INSTANCE_UID), G_TYPE_STRING, str,
82 if (!mxf_uuid_is_zero (&self->generation_uid)) {
83 mxf_uuid_to_string (&self->generation_uid, str);
84 gst_structure_id_set (ret, MXF_QUARK (GENERATION_UID), G_TYPE_STRING, str,
88 if (self->other_tags) {
96 g_hash_table_iter_init (&iter, self->other_tags);
97 g_value_init (&va, GST_TYPE_ARRAY);
99 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & tag)) {
100 g_value_init (&v, GST_TYPE_STRUCTURE);
101 s = gst_structure_id_empty_new (MXF_QUARK (TAG));
103 mxf_ul_to_string (&tag->ul, str);
105 buf = gst_buffer_new_and_alloc (tag->size);
106 memcpy (GST_BUFFER_DATA (buf), tag->data, tag->size);
108 gst_structure_id_set (s, MXF_QUARK (NAME), G_TYPE_STRING, str,
109 MXF_QUARK (DATA), GST_TYPE_BUFFER, buf, NULL);
111 gst_value_set_structure (&v, s);
112 gst_structure_free (s);
113 gst_buffer_unref (buf);
114 gst_value_array_append_value (&va, &v);
118 gst_structure_id_set_value (ret, MXF_QUARK (OTHER_TAGS), &va);
126 mxf_metadata_base_init (MXFMetadataBase * self)
132 mxf_metadata_base_class_init (MXFMetadataBaseClass * klass)
134 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
136 miniobject_class->finalize = mxf_metadata_base_finalize;
137 klass->handle_tag = mxf_metadata_base_handle_tag;
138 klass->resolve = mxf_metadata_base_resolve_default;
139 klass->to_structure = mxf_metadata_base_to_structure_default;
143 mxf_metadata_base_parse (MXFMetadataBase * self, MXFPrimerPack * primer,
144 const guint8 * data, guint size)
146 guint16 tag, tag_size;
147 const guint8 *tag_data;
149 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), FALSE);
150 g_return_val_if_fail (data != NULL, FALSE);
151 g_return_val_if_fail (primer != NULL, FALSE);
153 while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) {
154 if (tag_size == 0 || tag == 0x0000)
157 if (!MXF_METADATA_BASE_GET_CLASS (self)->handle_tag (self, primer, tag,
161 data += 4 + tag_size;
162 size -= 4 + tag_size;
169 mxf_metadata_base_resolve (MXFMetadataBase * self, GHashTable * metadata)
171 MXFMetadataBaseClass *klass;
174 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), FALSE);
175 g_return_val_if_fail (metadata != NULL, FALSE);
177 if (self->resolved == MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS)
179 else if (self->resolved != MXF_METADATA_BASE_RESOLVE_STATE_NONE)
182 self->resolved = MXF_METADATA_BASE_RESOLVE_STATE_RUNNING;
184 klass = MXF_METADATA_BASE_GET_CLASS (self);
187 ret = klass->resolve (self, metadata);
190 (ret) ? MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS :
191 MXF_METADATA_BASE_RESOLVE_STATE_FAILURE;
197 mxf_metadata_base_to_structure (MXFMetadataBase * self)
199 MXFMetadataBaseClass *klass;
201 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), NULL);
203 g_return_val_if_fail (self->resolved ==
204 MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS, NULL);
206 klass = MXF_METADATA_BASE_GET_CLASS (self);
208 if (klass->to_structure)
209 return klass->to_structure (self);
215 mxf_metadata_base_to_buffer (MXFMetadataBase * self, MXFPrimerPack * primer)
217 MXFMetadataBaseClass *klass;
220 guint size = 0, slen;
222 MXFLocalTag *t, *last;
225 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), NULL);
226 g_return_val_if_fail (primer != NULL, NULL);
228 klass = MXF_METADATA_BASE_GET_CLASS (self);
229 g_return_val_if_fail (klass->write_tags, NULL);
231 tags = klass->write_tags (self, primer);
232 g_return_val_if_fail (tags != NULL, NULL);
234 /* Add unknown tags */
235 if (self->other_tags) {
239 g_hash_table_iter_init (&iter, self->other_tags);
241 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & t)) {
242 tmp = g_slice_dup (MXFLocalTag, t);
244 tmp->data = g_slice_alloc (t->size);
245 mxf_primer_pack_add_mapping (primer, 0x0000, &t->ul);
246 memcpy (tmp->data, t->data, t->size);
248 tmp->data = g_memdup (t->data, t->size);
250 tags = g_list_prepend (tags, tmp);
254 l = g_list_last (tags);
256 tags = g_list_delete_link (tags, l);
257 /* Last element contains the metadata UL */
258 g_return_val_if_fail (last->size == 0, NULL);
260 for (l = tags; l; l = l->next) {
262 g_assert (G_MAXUINT - t->size >= size);
266 slen = mxf_ber_encode_size (size, ber);
269 ret = gst_buffer_new_and_alloc (size);
271 memcpy (GST_BUFFER_DATA (ret), &last->ul, 16);
272 mxf_local_tag_free (last);
274 memcpy (GST_BUFFER_DATA (ret) + 16, ber, slen);
276 data = GST_BUFFER_DATA (ret) + 16 + slen;
279 for (l = tags; l; l = l->next) {
282 g_assert (size >= 4);
286 GPOINTER_TO_UINT (g_hash_table_lookup (primer->reverse_mappings,
288 g_assert (local_tag != 0);
290 GST_WRITE_UINT16_BE (data, local_tag);
291 GST_WRITE_UINT16_BE (data + 2, t->size);
294 g_assert (size >= t->size);
296 memcpy (data, t->data, t->size);
300 mxf_local_tag_free (t);
308 G_DEFINE_ABSTRACT_TYPE (MXFMetadata, mxf_metadata, MXF_TYPE_METADATA_BASE);
311 mxf_metadata_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
312 guint16 tag, const guint8 * tag_data, guint tag_size)
314 #ifndef GST_DISABLE_GST_DEBUG
317 MXFMetadata *self = MXF_METADATA (metadata);
324 memcpy (&self->parent.instance_uid, tag_data, 16);
325 GST_DEBUG (" instance uid = %s",
326 mxf_uuid_to_string (&self->parent.instance_uid, str));
331 memcpy (&self->parent.generation_uid, tag_data, 16);
332 GST_DEBUG (" generation uid = %s",
333 mxf_uuid_to_string (&self->parent.generation_uid, str));
337 MXF_METADATA_BASE_CLASS (mxf_metadata_parent_class)->handle_tag
338 (metadata, primer, tag, tag_data, tag_size);
346 GST_ERROR ("Invalid metadata local tag 0x%04x of size %u", tag, tag_size);
352 mxf_metadata_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
354 MXFMetadata *self = MXF_METADATA (m);
357 MXFMetadataClass *klass;
359 g_return_val_if_fail (MXF_IS_METADATA (self), NULL);
360 klass = MXF_METADATA_GET_CLASS (self);
362 /* Last element contains the metadata key */
363 t = g_slice_new0 (MXFLocalTag);
364 memcpy (&t->ul, MXF_UL (METADATA), 16);
365 GST_WRITE_UINT16_BE (&t->ul.u[13], klass->type);
366 ret = g_list_prepend (ret, t);
368 t = g_slice_new0 (MXFLocalTag);
369 memcpy (&t->ul, MXF_UL (INSTANCE_UID), 16);
371 t->data = g_slice_alloc (16);
373 memcpy (t->data, &self->parent.instance_uid, 16);
374 mxf_primer_pack_add_mapping (primer, 0x3c0a, &t->ul);
375 ret = g_list_prepend (ret, t);
377 if (!mxf_uuid_is_zero (&self->parent.generation_uid)) {
378 t = g_slice_new0 (MXFLocalTag);
379 memcpy (&t->ul, MXF_UL (GENERATION_UID), 16);
381 t->data = g_slice_alloc (16);
383 memcpy (t->data, &self->parent.generation_uid, 16);
384 mxf_primer_pack_add_mapping (primer, 0x0102, &t->ul);
385 ret = g_list_prepend (ret, t);
392 mxf_metadata_class_init (MXFMetadataClass * klass)
394 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
396 metadata_base_class->handle_tag = mxf_metadata_handle_tag;
397 metadata_base_class->write_tags = mxf_metadata_write_tags;
401 mxf_metadata_init (MXFMetadata * self)
405 static GArray *_mxf_metadata_registry = NULL;
407 #define _add_metadata_type(type) G_STMT_START { \
410 g_array_append_val (_mxf_metadata_registry, t); \
414 mxf_metadata_init_types (void)
416 g_return_if_fail (_mxf_metadata_registry == NULL);
418 _mxf_metadata_registry = g_array_new (FALSE, TRUE, sizeof (GType));
420 _add_metadata_type (MXF_TYPE_METADATA_PREFACE);
421 _add_metadata_type (MXF_TYPE_METADATA_IDENTIFICATION);
422 _add_metadata_type (MXF_TYPE_METADATA_CONTENT_STORAGE);
423 _add_metadata_type (MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA);
424 _add_metadata_type (MXF_TYPE_METADATA_MATERIAL_PACKAGE);
425 _add_metadata_type (MXF_TYPE_METADATA_SOURCE_PACKAGE);
426 _add_metadata_type (MXF_TYPE_METADATA_TIMELINE_TRACK);
427 _add_metadata_type (MXF_TYPE_METADATA_EVENT_TRACK);
428 _add_metadata_type (MXF_TYPE_METADATA_STATIC_TRACK);
429 _add_metadata_type (MXF_TYPE_METADATA_SEQUENCE);
430 _add_metadata_type (MXF_TYPE_METADATA_SOURCE_CLIP);
431 _add_metadata_type (MXF_TYPE_METADATA_TIMECODE_COMPONENT);
432 _add_metadata_type (MXF_TYPE_METADATA_DM_SEGMENT);
433 _add_metadata_type (MXF_TYPE_METADATA_DM_SOURCE_CLIP);
434 _add_metadata_type (MXF_TYPE_METADATA_FILE_DESCRIPTOR);
435 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
436 _add_metadata_type (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR);
437 _add_metadata_type (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR);
438 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR);
439 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR);
440 _add_metadata_type (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR);
441 _add_metadata_type (MXF_TYPE_METADATA_NETWORK_LOCATOR);
442 _add_metadata_type (MXF_TYPE_METADATA_TEXT_LOCATOR);
445 #undef _add_metadata_type
448 mxf_metadata_register (GType type)
450 g_return_if_fail (g_type_is_a (type, MXF_TYPE_METADATA));
452 g_array_append_val (_mxf_metadata_registry, type);
456 mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset,
457 const guint8 * data, guint size)
460 GType t = G_TYPE_INVALID;
461 MXFMetadata *ret = NULL;
463 g_return_val_if_fail (type != 0, NULL);
464 g_return_val_if_fail (primer != NULL, NULL);
465 g_return_val_if_fail (_mxf_metadata_registry != NULL, NULL);
467 for (i = 0; i < _mxf_metadata_registry->len; i++) {
468 GType tmp = g_array_index (_mxf_metadata_registry, GType, i);
469 MXFMetadataClass *klass = MXF_METADATA_CLASS (g_type_class_ref (tmp));
471 if (klass->type == type) {
472 g_type_class_unref (klass);
476 g_type_class_unref (klass);
479 if (t == G_TYPE_INVALID) {
481 ("No handler for type 0x%04x found -- using generic metadata parser",
487 GST_DEBUG ("Metadata type 0x%06x is handled by type %s", type,
490 ret = (MXFMetadata *) g_type_create_instance (t);
491 if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) {
492 GST_ERROR ("Parsing metadata failed");
493 gst_mini_object_unref ((GstMiniObject *) ret);
497 ret->parent.offset = offset;
501 G_DEFINE_TYPE (MXFMetadataPreface, mxf_metadata_preface, MXF_TYPE_METADATA);
504 mxf_metadata_preface_finalize (GstMiniObject * object)
506 MXFMetadataPreface *self = MXF_METADATA_PREFACE (object);
508 g_free (self->identifications_uids);
509 self->identifications_uids = NULL;
511 g_free (self->identifications);
512 self->identifications = NULL;
514 g_free (self->essence_containers);
515 self->essence_containers = NULL;
517 g_free (self->dm_schemes);
518 self->dm_schemes = NULL;
520 GST_MINI_OBJECT_CLASS (mxf_metadata_preface_parent_class)->finalize (object);
524 mxf_metadata_preface_handle_tag (MXFMetadataBase * metadata,
525 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
528 MXFMetadataPreface *self = MXF_METADATA_PREFACE (metadata);
529 #ifndef GST_DISABLE_GST_DEBUG
536 if (!mxf_timestamp_parse (&self->last_modified_date, tag_data, tag_size))
538 GST_DEBUG (" last modified date = %s",
539 mxf_timestamp_to_string (&self->last_modified_date, str));
544 self->version = GST_READ_UINT16_BE (tag_data);
545 GST_DEBUG (" version = %u.%u", (self->version >> 8),
546 (self->version & 0x0f));
551 self->object_model_version = GST_READ_UINT32_BE (tag_data);
552 GST_DEBUG (" object model version = %u", self->object_model_version);
557 memcpy (&self->primary_package_uid, tag_data, 16);
558 GST_DEBUG (" primary package = %s",
559 mxf_uuid_to_string (&self->primary_package_uid, str));
562 if (!mxf_uuid_array_parse (&self->identifications_uids,
563 &self->n_identifications, tag_data, tag_size))
566 GST_DEBUG (" number of identifications = %u", self->n_identifications);
567 #ifndef GST_DISABLE_GST_DEBUG
570 for (i = 0; i < self->n_identifications; i++) {
571 GST_DEBUG (" identification %u = %s", i,
572 mxf_uuid_to_string (&self->identifications_uids[i], str));
580 memcpy (&self->content_storage_uid, tag_data, 16);
581 GST_DEBUG (" content storage = %s",
582 mxf_uuid_to_string (&self->content_storage_uid, str));
587 memcpy (&self->operational_pattern, tag_data, 16);
588 GST_DEBUG (" operational pattern = %s",
589 mxf_ul_to_string (&self->operational_pattern, str));
592 if (!mxf_ul_array_parse (&self->essence_containers,
593 &self->n_essence_containers, tag_data, tag_size))
596 GST_DEBUG (" number of essence containers = %u",
597 self->n_essence_containers);
598 #ifndef GST_DISABLE_GST_DEBUG
601 for (i = 0; i < self->n_essence_containers; i++) {
602 GST_DEBUG (" essence container %u = %s", i,
603 mxf_ul_to_string (&self->essence_containers[i], str));
609 if (!mxf_ul_array_parse (&self->dm_schemes, &self->n_dm_schemes, tag_data,
612 GST_DEBUG (" number of DM schemes = %u", self->n_dm_schemes);
614 #ifndef GST_DISABLE_GST_DEBUG
617 for (i = 0; i < self->n_dm_schemes; i++) {
618 GST_DEBUG (" DM schemes %u = %s", i,
619 mxf_ul_to_string (&self->dm_schemes[i], str));
626 MXF_METADATA_BASE_CLASS
627 (mxf_metadata_preface_parent_class)->handle_tag (metadata, primer,
628 tag, tag_data, tag_size);
636 GST_ERROR ("Invalid preface local tag 0x%04x of size %u", tag, tag_size);
642 mxf_metadata_preface_resolve (MXFMetadataBase * m, GHashTable * metadata)
644 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
645 MXFMetadataBase *current = NULL;
648 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
649 current = g_hash_table_lookup (metadata, &self->primary_package_uid);
650 if (!current || !MXF_IS_METADATA_GENERIC_PACKAGE (current)) {
651 GST_ERROR ("Primary package not found");
653 if (mxf_metadata_base_resolve (current, metadata)) {
654 self->primary_package = MXF_METADATA_GENERIC_PACKAGE (current);
660 current = g_hash_table_lookup (metadata, &self->content_storage_uid);
661 if (!current || !MXF_IS_METADATA_CONTENT_STORAGE (current)) {
662 GST_ERROR ("Content storage not found");
665 if (mxf_metadata_base_resolve (current, metadata)) {
666 self->content_storage = MXF_METADATA_CONTENT_STORAGE (current);
668 GST_ERROR ("Couldn't resolve content storage");
674 if (self->identifications)
675 memset (self->identifications, 0,
676 sizeof (gpointer) * self->n_identifications);
678 self->identifications =
679 g_new0 (MXFMetadataIdentification *, self->n_identifications);
680 for (i = 0; i < self->n_identifications; i++) {
681 current = g_hash_table_lookup (metadata, &self->identifications_uids[i]);
682 if (current && MXF_IS_METADATA_IDENTIFICATION (current)) {
683 if (mxf_metadata_base_resolve (current, metadata))
684 self->identifications[i] = MXF_METADATA_IDENTIFICATION (current);
690 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->resolve (m,
694 static GstStructure *
695 mxf_metadata_preface_to_structure (MXFMetadataBase * m)
698 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->to_structure
700 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
704 if (!mxf_timestamp_is_unknown (&self->last_modified_date)) {
705 mxf_timestamp_to_string (&self->last_modified_date, str);
706 gst_structure_id_set (ret, MXF_QUARK (LAST_MODIFIED_DATE), G_TYPE_STRING,
710 if (self->version != 0)
711 gst_structure_id_set (ret, MXF_QUARK (VERSION), G_TYPE_UINT, self->version,
714 if (self->object_model_version != 0)
715 gst_structure_id_set (ret, MXF_QUARK (OBJECT_MODEL_VERSION), G_TYPE_UINT,
716 self->object_model_version, NULL);
718 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
719 mxf_uuid_to_string (&self->primary_package_uid, str);
720 gst_structure_id_set (ret, MXF_QUARK (PRIMARY_PACKAGE), G_TYPE_STRING, str,
724 if (self->n_identifications > 0) {
729 g_value_init (&arr, GST_TYPE_ARRAY);
731 for (i = 0; i < self->n_identifications; i++) {
734 if (self->identifications[i] == NULL)
737 g_value_init (&val, GST_TYPE_STRUCTURE);
739 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
740 (self->identifications[i]));
741 gst_value_set_structure (&val, s);
742 gst_structure_free (s);
743 gst_value_array_append_value (&arr, &val);
744 g_value_unset (&val);
747 if (gst_value_array_get_size (&arr) > 0)
748 gst_structure_id_set_value (ret, MXF_QUARK (IDENTIFICATIONS), &arr);
750 g_value_unset (&arr);
753 if (self->content_storage) {
755 mxf_metadata_base_to_structure (MXF_METADATA_BASE
756 (self->content_storage));
757 gst_structure_id_set (ret, MXF_QUARK (CONTENT_STORAGE), GST_TYPE_STRUCTURE,
759 gst_structure_free (s);
762 if (!mxf_ul_is_zero (&self->operational_pattern)) {
763 mxf_ul_to_string (&self->operational_pattern, str);
764 gst_structure_id_set (ret, MXF_QUARK (OPERATIONAL_PATTERN), G_TYPE_STRING,
768 if (self->n_essence_containers > 0) {
773 g_value_init (&arr, GST_TYPE_ARRAY);
775 for (i = 0; i < self->n_essence_containers; i++) {
776 if (mxf_ul_is_zero (&self->essence_containers[i]))
779 g_value_init (&val, G_TYPE_STRING);
781 mxf_ul_to_string (&self->essence_containers[i], str);
782 g_value_set_string (&val, str);
784 gst_value_array_append_value (&arr, &val);
785 g_value_unset (&val);
788 if (gst_value_array_get_size (&arr) > 0)
789 gst_structure_id_set_value (ret, MXF_QUARK (ESSENCE_CONTAINERS), &arr);
791 g_value_unset (&arr);
794 if (self->n_dm_schemes > 0) {
799 g_value_init (&arr, GST_TYPE_ARRAY);
801 for (i = 0; i < self->n_dm_schemes; i++) {
802 if (mxf_ul_is_zero (&self->dm_schemes[i]))
805 g_value_init (&val, G_TYPE_STRING);
807 mxf_ul_to_string (&self->dm_schemes[i], str);
808 g_value_set_string (&val, str);
810 gst_value_array_append_value (&arr, &val);
811 g_value_unset (&val);
814 if (gst_value_array_get_size (&arr) > 0)
815 gst_structure_id_set_value (ret, MXF_QUARK (DM_SCHEMES), &arr);
817 g_value_unset (&arr);
824 mxf_metadata_preface_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
826 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
828 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->write_tags
833 t = g_slice_new0 (MXFLocalTag);
834 memcpy (&t->ul, MXF_UL (LAST_MODIFIED_DATE), 16);
836 t->data = g_slice_alloc (8);
838 mxf_timestamp_write (&self->last_modified_date, t->data);
839 mxf_primer_pack_add_mapping (primer, 0x3b02, &t->ul);
840 ret = g_list_prepend (ret, t);
842 t = g_slice_new0 (MXFLocalTag);
843 memcpy (&t->ul, MXF_UL (VERSION), 16);
845 t->data = g_slice_alloc (2);
847 GST_WRITE_UINT16_BE (t->data, self->version);
848 mxf_primer_pack_add_mapping (primer, 0x3b05, &t->ul);
849 ret = g_list_prepend (ret, t);
851 if (self->object_model_version) {
852 t = g_slice_new0 (MXFLocalTag);
853 memcpy (&t->ul, MXF_UL (OBJECT_MODEL_VERSION), 16);
855 t->data = g_slice_alloc (4);
857 GST_WRITE_UINT32_BE (t->data, self->object_model_version);
858 mxf_primer_pack_add_mapping (primer, 0x3b07, &t->ul);
859 ret = g_list_prepend (ret, t);
862 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
863 t = g_slice_new0 (MXFLocalTag);
864 memcpy (&t->ul, MXF_UL (PRIMARY_PACKAGE), 16);
866 t->data = g_slice_alloc (16);
868 memcpy (t->data, &self->primary_package_uid, 16);
869 mxf_primer_pack_add_mapping (primer, 0x3b08, &t->ul);
870 ret = g_list_prepend (ret, t);
873 t = g_slice_new0 (MXFLocalTag);
874 memcpy (&t->ul, MXF_UL (IDENTIFICATIONS), 16);
875 t->size = 8 + 16 * self->n_identifications;
876 t->data = g_slice_alloc0 (t->size);
878 mxf_primer_pack_add_mapping (primer, 0x3b06, &t->ul);
879 GST_WRITE_UINT32_BE (t->data, self->n_identifications);
880 GST_WRITE_UINT32_BE (t->data + 4, 16);
881 for (i = 0; i < self->n_identifications; i++) {
882 if (!self->identifications[i])
885 memcpy (t->data + 8 + 16 * i,
886 &MXF_METADATA_BASE (self->identifications[i])->instance_uid, 16);
888 ret = g_list_prepend (ret, t);
890 t = g_slice_new0 (MXFLocalTag);
891 memcpy (&t->ul, MXF_UL (CONTENT_STORAGE), 16);
893 t->data = g_slice_alloc (t->size);
895 mxf_primer_pack_add_mapping (primer, 0x3b03, &t->ul);
896 memcpy (t->data, &MXF_METADATA_BASE (self->content_storage)->instance_uid,
898 ret = g_list_prepend (ret, t);
900 t = g_slice_new0 (MXFLocalTag);
901 memcpy (&t->ul, MXF_UL (OPERATIONAL_PATTERN), 16);
903 t->data = g_slice_alloc (t->size);
905 mxf_primer_pack_add_mapping (primer, 0x3b09, &t->ul);
906 memcpy (t->data, &self->operational_pattern, 16);
907 ret = g_list_prepend (ret, t);
909 t = g_slice_new0 (MXFLocalTag);
910 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINERS), 16);
911 t->size = 8 + 16 * self->n_essence_containers;
912 t->data = g_slice_alloc0 (t->size);
914 mxf_primer_pack_add_mapping (primer, 0x3b0a, &t->ul);
915 GST_WRITE_UINT32_BE (t->data, self->n_essence_containers);
916 GST_WRITE_UINT32_BE (t->data + 4, 16);
917 for (i = 0; i < self->n_essence_containers; i++) {
918 memcpy (t->data + 8 + 16 * i, &self->essence_containers[i], 16);
920 ret = g_list_prepend (ret, t);
922 if (self->dm_schemes) {
923 t = g_slice_new0 (MXFLocalTag);
924 memcpy (&t->ul, MXF_UL (DM_SCHEMES), 16);
925 t->size = 8 + 16 * self->n_dm_schemes;
926 t->data = g_slice_alloc0 (t->size);
928 mxf_primer_pack_add_mapping (primer, 0x3b0b, &t->ul);
929 GST_WRITE_UINT32_BE (t->data, self->n_dm_schemes);
930 GST_WRITE_UINT32_BE (t->data + 4, 16);
931 for (i = 0; i < self->n_dm_schemes; i++) {
932 memcpy (t->data + 8 + 16 * i, &self->dm_schemes[i], 16);
934 ret = g_list_prepend (ret, t);
941 mxf_metadata_preface_init (MXFMetadataPreface * self)
947 mxf_metadata_preface_class_init (MXFMetadataPrefaceClass * klass)
949 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
950 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
951 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
953 miniobject_class->finalize = mxf_metadata_preface_finalize;
954 metadata_base_class->handle_tag = mxf_metadata_preface_handle_tag;
955 metadata_base_class->resolve = mxf_metadata_preface_resolve;
956 metadata_base_class->to_structure = mxf_metadata_preface_to_structure;
957 metadata_base_class->write_tags = mxf_metadata_preface_write_tags;
958 metadata_base_class->name_quark = MXF_QUARK (PREFACE);
959 metadata_class->type = 0x012f;
962 G_DEFINE_TYPE (MXFMetadataIdentification, mxf_metadata_identification,
966 mxf_metadata_identification_finalize (GstMiniObject * object)
968 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (object);
970 g_free (self->company_name);
971 self->company_name = NULL;
973 g_free (self->product_name);
974 self->product_name = NULL;
976 g_free (self->version_string);
977 self->version_string = NULL;
979 g_free (self->platform);
980 self->platform = NULL;
982 GST_MINI_OBJECT_CLASS (mxf_metadata_identification_parent_class)->finalize
987 mxf_metadata_identification_handle_tag (MXFMetadataBase * metadata,
988 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
991 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (metadata);
993 #ifndef GST_DISABLE_GST_DEBUG
1001 memcpy (&self->this_generation_uid, tag_data, 16);
1002 GST_DEBUG (" this generation uid = %s",
1003 mxf_uuid_to_string (&self->this_generation_uid, str));
1006 self->company_name = mxf_utf16_to_utf8 (tag_data, tag_size);
1007 GST_DEBUG (" company name = %s", GST_STR_NULL (self->company_name));
1010 self->product_name = mxf_utf16_to_utf8 (tag_data, tag_size);
1011 GST_DEBUG (" product name = %s", GST_STR_NULL (self->product_name));
1014 if (!mxf_product_version_parse (&self->product_version,
1015 tag_data, tag_size))
1017 GST_DEBUG (" product version = %u.%u.%u.%u.%u",
1018 self->product_version.major,
1019 self->product_version.minor,
1020 self->product_version.patch,
1021 self->product_version.build, self->product_version.release);
1024 self->version_string = mxf_utf16_to_utf8 (tag_data, tag_size);
1025 GST_DEBUG (" version string = %s", GST_STR_NULL (self->version_string));
1030 memcpy (&self->product_uid, tag_data, 16);
1031 GST_DEBUG (" product uid = %s",
1032 mxf_uuid_to_string (&self->product_uid, str));
1035 if (!mxf_timestamp_parse (&self->modification_date, tag_data, tag_size))
1037 GST_DEBUG (" modification date = %s",
1038 mxf_timestamp_to_string (&self->modification_date, str));
1041 if (!mxf_product_version_parse (&self->toolkit_version,
1042 tag_data, tag_size))
1044 GST_DEBUG (" toolkit version = %u.%u.%u.%u.%u",
1045 self->toolkit_version.major,
1046 self->toolkit_version.minor,
1047 self->toolkit_version.patch,
1048 self->toolkit_version.build, self->toolkit_version.release);
1051 self->platform = mxf_utf16_to_utf8 (tag_data, tag_size);
1052 GST_DEBUG (" platform = %s", GST_STR_NULL (self->platform));
1056 MXF_METADATA_BASE_CLASS
1057 (mxf_metadata_identification_parent_class)->handle_tag (metadata,
1058 primer, tag, tag_data, tag_size);
1065 GST_ERROR ("Invalid identification local tag 0x%04x of size %u", tag,
1071 static GstStructure *
1072 mxf_metadata_identification_to_structure (MXFMetadataBase * m)
1075 MXF_METADATA_BASE_CLASS
1076 (mxf_metadata_identification_parent_class)->to_structure (m);
1077 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (m);
1080 if (!mxf_uuid_is_zero (&self->this_generation_uid)) {
1081 mxf_uuid_to_string (&self->this_generation_uid, str);
1082 gst_structure_id_set (ret, MXF_QUARK (THIS_GENERATION_UID), G_TYPE_STRING,
1086 if (self->company_name)
1087 gst_structure_id_set (ret, MXF_QUARK (COMPANY_NAME), G_TYPE_STRING,
1088 self->company_name, NULL);
1090 if (self->product_name)
1091 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_NAME), G_TYPE_STRING,
1092 self->product_name, NULL);
1094 if (self->product_version.major ||
1095 self->product_version.minor ||
1096 self->product_version.patch ||
1097 self->product_version.build || self->product_version.release) {
1098 g_snprintf (str, 48, "%u.%u.%u.%u.%u", self->product_version.major,
1099 self->product_version.minor,
1100 self->product_version.patch,
1101 self->product_version.build, self->product_version.release);
1102 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_VERSION), G_TYPE_STRING, str,
1106 if (self->version_string)
1107 gst_structure_id_set (ret, MXF_QUARK (VERSION_STRING), G_TYPE_STRING,
1108 self->version_string, NULL);
1110 if (!mxf_uuid_is_zero (&self->product_uid)) {
1111 mxf_uuid_to_string (&self->product_uid, str);
1112 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_UID), G_TYPE_STRING, str,
1116 if (!mxf_timestamp_is_unknown (&self->modification_date)) {
1117 mxf_timestamp_to_string (&self->modification_date, str);
1118 gst_structure_id_set (ret, MXF_QUARK (MODIFICATION_DATE), G_TYPE_STRING,
1122 if (self->toolkit_version.major ||
1123 self->toolkit_version.minor ||
1124 self->toolkit_version.patch ||
1125 self->toolkit_version.build || self->toolkit_version.release) {
1126 g_snprintf (str, 48, "%u.%u.%u.%u.%u", self->toolkit_version.major,
1127 self->toolkit_version.minor,
1128 self->toolkit_version.patch,
1129 self->toolkit_version.build, self->toolkit_version.release);
1130 gst_structure_id_set (ret, MXF_QUARK (TOOLKIT_VERSION), G_TYPE_STRING, str,
1135 gst_structure_id_set (ret, MXF_QUARK (PLATFORM), G_TYPE_STRING,
1136 self->platform, NULL);
1142 mxf_metadata_identification_write_tags (MXFMetadataBase * m,
1143 MXFPrimerPack * primer)
1145 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (m);
1147 MXF_METADATA_BASE_CLASS
1148 (mxf_metadata_identification_parent_class)->write_tags (m, primer);
1151 if (self->company_name) {
1152 t = g_slice_new0 (MXFLocalTag);
1153 memcpy (&t->ul, MXF_UL (COMPANY_NAME), 16);
1154 t->data = mxf_utf8_to_utf16 (self->company_name, &t->size);
1155 mxf_primer_pack_add_mapping (primer, 0x3c01, &t->ul);
1156 ret = g_list_prepend (ret, t);
1159 if (self->product_name) {
1160 t = g_slice_new0 (MXFLocalTag);
1161 memcpy (&t->ul, MXF_UL (PRODUCT_NAME), 16);
1162 t->data = mxf_utf8_to_utf16 (self->product_name, &t->size);
1163 mxf_primer_pack_add_mapping (primer, 0x3c02, &t->ul);
1164 ret = g_list_prepend (ret, t);
1167 if (!mxf_product_version_is_valid (&self->product_version)) {
1168 t = g_slice_new0 (MXFLocalTag);
1169 memcpy (&t->ul, MXF_UL (PRODUCT_VERSION), 16);
1171 t->data = g_slice_alloc (t->size);
1173 mxf_product_version_write (&self->product_version, t->data);
1174 mxf_primer_pack_add_mapping (primer, 0x3c03, &t->ul);
1175 ret = g_list_prepend (ret, t);
1178 if (self->version_string) {
1179 t = g_slice_new0 (MXFLocalTag);
1180 memcpy (&t->ul, MXF_UL (VERSION_STRING), 16);
1181 t->data = mxf_utf8_to_utf16 (self->version_string, &t->size);
1182 mxf_primer_pack_add_mapping (primer, 0x3c04, &t->ul);
1183 ret = g_list_prepend (ret, t);
1186 if (!mxf_uuid_is_zero (&self->product_uid)) {
1187 t = g_slice_new0 (MXFLocalTag);
1188 memcpy (&t->ul, MXF_UL (PRODUCT_UID), 16);
1190 t->data = g_slice_alloc (t->size);
1192 memcpy (t->data, &self->product_uid, 16);
1193 mxf_primer_pack_add_mapping (primer, 0x3c05, &t->ul);
1194 ret = g_list_prepend (ret, t);
1197 if (!mxf_timestamp_is_unknown (&self->modification_date)) {
1198 t = g_slice_new0 (MXFLocalTag);
1199 memcpy (&t->ul, MXF_UL (MODIFICATION_DATE), 16);
1201 t->data = g_slice_alloc (t->size);
1203 mxf_timestamp_write (&self->modification_date, t->data);
1204 mxf_primer_pack_add_mapping (primer, 0x3c06, &t->ul);
1205 ret = g_list_prepend (ret, t);
1208 if (!mxf_product_version_is_valid (&self->toolkit_version)) {
1209 t = g_slice_new0 (MXFLocalTag);
1210 memcpy (&t->ul, MXF_UL (TOOLKIT_VERSION), 16);
1212 t->data = g_slice_alloc (t->size);
1214 mxf_product_version_write (&self->toolkit_version, t->data);
1215 mxf_primer_pack_add_mapping (primer, 0x3c07, &t->ul);
1216 ret = g_list_prepend (ret, t);
1219 if (self->platform) {
1220 t = g_slice_new0 (MXFLocalTag);
1221 memcpy (&t->ul, MXF_UL (PLATFORM), 16);
1222 t->data = mxf_utf8_to_utf16 (self->platform, &t->size);
1223 mxf_primer_pack_add_mapping (primer, 0x3c08, &t->ul);
1224 ret = g_list_prepend (ret, t);
1231 mxf_metadata_identification_init (MXFMetadataIdentification * self)
1237 mxf_metadata_identification_class_init (MXFMetadataIdentificationClass * klass)
1239 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1240 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
1241 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1243 miniobject_class->finalize = mxf_metadata_identification_finalize;
1244 metadata_base_class->handle_tag = mxf_metadata_identification_handle_tag;
1245 metadata_base_class->name_quark = MXF_QUARK (IDENTIFICATION);
1246 metadata_base_class->to_structure = mxf_metadata_identification_to_structure;
1247 metadata_base_class->write_tags = mxf_metadata_identification_write_tags;
1248 metadata_class->type = 0x0130;
1251 G_DEFINE_TYPE (MXFMetadataContentStorage, mxf_metadata_content_storage,
1255 mxf_metadata_content_storage_finalize (GstMiniObject * object)
1257 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (object);
1259 g_free (self->packages);
1260 self->packages = NULL;
1261 g_free (self->packages_uids);
1262 self->packages_uids = NULL;
1263 g_free (self->essence_container_data);
1264 self->essence_container_data = NULL;
1265 g_free (self->essence_container_data_uids);
1266 self->essence_container_data_uids = NULL;
1268 GST_MINI_OBJECT_CLASS (mxf_metadata_content_storage_parent_class)->finalize
1273 mxf_metadata_content_storage_handle_tag (MXFMetadataBase * metadata,
1274 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1277 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (metadata);
1278 gboolean ret = TRUE;
1279 #ifndef GST_DISABLE_GST_DEBUG
1285 if (!mxf_uuid_array_parse (&self->packages_uids, &self->n_packages,
1286 tag_data, tag_size))
1288 GST_DEBUG (" number of packages = %u", self->n_packages);
1289 #ifndef GST_DISABLE_GST_DEBUG
1292 for (i = 0; i < self->n_packages; i++) {
1293 GST_DEBUG (" package %u = %s", i,
1294 mxf_uuid_to_string (&self->packages_uids[i], str));
1300 if (!mxf_uuid_array_parse (&self->essence_container_data_uids,
1301 &self->n_essence_container_data, tag_data, tag_size))
1304 GST_DEBUG (" number of essence container data = %u",
1305 self->n_essence_container_data);
1306 #ifndef GST_DISABLE_GST_DEBUG
1309 for (i = 0; i < self->n_essence_container_data; i++) {
1310 GST_DEBUG (" essence container data %u = %s", i,
1311 mxf_uuid_to_string (&self->essence_container_data_uids[i], str));
1318 MXF_METADATA_BASE_CLASS
1319 (mxf_metadata_content_storage_parent_class)->handle_tag (metadata,
1320 primer, tag, tag_data, tag_size);
1328 GST_ERROR ("Invalid content storage local tag 0x%04x of size %u", tag,
1335 mxf_metadata_content_storage_resolve (MXFMetadataBase * m,
1336 GHashTable * metadata)
1338 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1339 MXFMetadataBase *current = NULL;
1341 gboolean have_package = FALSE;
1342 gboolean have_ecd = FALSE;
1345 memset (self->packages, 0, sizeof (gpointer) * self->n_packages);
1347 self->packages = g_new0 (MXFMetadataGenericPackage *, self->n_packages);
1349 for (i = 0; i < self->n_packages; i++) {
1350 current = g_hash_table_lookup (metadata, &self->packages_uids[i]);
1351 if (current && MXF_IS_METADATA_GENERIC_PACKAGE (current)) {
1352 if (mxf_metadata_base_resolve (current, metadata)) {
1353 self->packages[i] = MXF_METADATA_GENERIC_PACKAGE (current);
1354 have_package = TRUE;
1356 GST_ERROR ("Couldn't resolve package");
1359 GST_ERROR ("Package not found");
1363 if (self->essence_container_data)
1364 memset (self->essence_container_data, 0,
1365 sizeof (gpointer) * self->n_essence_container_data);
1367 self->essence_container_data =
1368 g_new0 (MXFMetadataEssenceContainerData *,
1369 self->n_essence_container_data);
1370 for (i = 0; i < self->n_essence_container_data; i++) {
1372 g_hash_table_lookup (metadata, &self->essence_container_data_uids[i]);
1373 if (current && MXF_IS_METADATA_ESSENCE_CONTAINER_DATA (current)) {
1374 if (mxf_metadata_base_resolve (current, metadata)) {
1375 self->essence_container_data[i] =
1376 MXF_METADATA_ESSENCE_CONTAINER_DATA (current);
1379 GST_ERROR ("Couldn't resolve essence container data");
1382 GST_ERROR ("Essence container data not found");
1386 if (!have_package) {
1387 GST_ERROR ("Couldn't resolve any package");
1389 } else if (!have_ecd) {
1390 GST_ERROR ("Couldn't resolve any essence container data");
1395 MXF_METADATA_BASE_CLASS
1396 (mxf_metadata_content_storage_parent_class)->resolve (m, metadata);
1399 static GstStructure *
1400 mxf_metadata_content_storage_to_structure (MXFMetadataBase * m)
1403 MXF_METADATA_BASE_CLASS
1404 (mxf_metadata_content_storage_parent_class)->to_structure (m);
1405 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1408 if (self->n_packages > 0) {
1413 g_value_init (&arr, GST_TYPE_ARRAY);
1415 for (i = 0; i < self->n_packages; i++) {
1418 if (self->packages[i] == NULL)
1421 g_value_init (&val, GST_TYPE_STRUCTURE);
1423 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->packages
1425 gst_value_set_structure (&val, s);
1426 gst_structure_free (s);
1427 gst_value_array_append_value (&arr, &val);
1428 g_value_unset (&val);
1431 if (gst_value_array_get_size (&arr) > 0)
1432 gst_structure_id_set_value (ret, MXF_QUARK (PACKAGES), &arr);
1434 g_value_unset (&arr);
1437 if (self->n_essence_container_data > 0) {
1442 g_value_init (&arr, GST_TYPE_ARRAY);
1444 for (i = 0; i < self->n_essence_container_data; i++) {
1447 if (self->essence_container_data[i] == NULL)
1450 g_value_init (&val, GST_TYPE_STRUCTURE);
1452 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
1453 (self->essence_container_data[i]));
1454 gst_value_set_structure (&val, s);
1455 gst_structure_free (s);
1456 gst_value_array_append_value (&arr, &val);
1457 g_value_unset (&val);
1460 if (gst_value_array_get_size (&arr) > 0)
1461 gst_structure_id_set_value (ret, MXF_QUARK (ESSENCE_CONTAINER_DATA),
1464 g_value_unset (&arr);
1471 mxf_metadata_content_storage_write_tags (MXFMetadataBase * m,
1472 MXFPrimerPack * primer)
1474 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1476 MXF_METADATA_BASE_CLASS
1477 (mxf_metadata_content_storage_parent_class)->write_tags (m, primer);
1481 if (self->packages) {
1482 t = g_slice_new0 (MXFLocalTag);
1483 memcpy (&t->ul, MXF_UL (PACKAGES), 16);
1484 t->size = 8 + 16 * self->n_packages;
1485 t->data = g_slice_alloc0 (t->size);
1487 GST_WRITE_UINT32_BE (t->data, self->n_packages);
1488 GST_WRITE_UINT32_BE (t->data + 4, 16);
1489 for (i = 0; i < self->n_packages; i++) {
1490 if (!self->packages[i])
1493 memcpy (t->data + 8 + i * 16,
1494 &MXF_METADATA_BASE (self->packages[i])->instance_uid, 16);
1497 mxf_primer_pack_add_mapping (primer, 0x1901, &t->ul);
1498 ret = g_list_prepend (ret, t);
1501 if (self->essence_container_data) {
1502 t = g_slice_new0 (MXFLocalTag);
1503 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINER_DATA), 16);
1504 t->size = 8 + 16 * self->n_essence_container_data;
1505 t->data = g_slice_alloc0 (t->size);
1507 GST_WRITE_UINT32_BE (t->data, self->n_essence_container_data);
1508 GST_WRITE_UINT32_BE (t->data + 4, 16);
1509 for (i = 0; i < self->n_essence_container_data; i++) {
1510 if (!self->essence_container_data[i])
1513 memcpy (t->data + 8 + i * 16,
1514 &MXF_METADATA_BASE (self->essence_container_data[i])->instance_uid,
1518 mxf_primer_pack_add_mapping (primer, 0x1902, &t->ul);
1519 ret = g_list_prepend (ret, t);
1526 mxf_metadata_content_storage_init (MXFMetadataContentStorage * self)
1532 mxf_metadata_content_storage_class_init (MXFMetadataContentStorageClass * klass)
1534 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1535 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
1536 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1538 miniobject_class->finalize = mxf_metadata_content_storage_finalize;
1539 metadata_base_class->handle_tag = mxf_metadata_content_storage_handle_tag;
1540 metadata_base_class->resolve = mxf_metadata_content_storage_resolve;
1541 metadata_base_class->name_quark = MXF_QUARK (CONTENT_STORAGE);
1542 metadata_base_class->to_structure = mxf_metadata_content_storage_to_structure;
1543 metadata_base_class->write_tags = mxf_metadata_content_storage_write_tags;
1544 metadata_class->type = 0x0118;
1547 G_DEFINE_TYPE (MXFMetadataEssenceContainerData,
1548 mxf_metadata_essence_container_data, MXF_TYPE_METADATA);
1551 mxf_metadata_essence_container_data_handle_tag (MXFMetadataBase * metadata,
1552 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1555 MXFMetadataEssenceContainerData *self =
1556 MXF_METADATA_ESSENCE_CONTAINER_DATA (metadata);
1557 gboolean ret = TRUE;
1558 #ifndef GST_DISABLE_GST_DEBUG
1566 memcpy (&self->linked_package_uid, tag_data, 32);
1567 GST_DEBUG (" linked package = %s",
1568 mxf_umid_to_string (&self->linked_package_uid, str));
1573 self->index_sid = GST_READ_UINT32_BE (tag_data);
1574 GST_DEBUG (" index sid = %u", self->index_sid);
1579 self->body_sid = GST_READ_UINT32_BE (tag_data);
1580 GST_DEBUG (" body sid = %u", self->body_sid);
1584 MXF_METADATA_BASE_CLASS
1585 (mxf_metadata_essence_container_data_parent_class)->handle_tag
1586 (metadata, primer, tag, tag_data, tag_size);
1594 GST_ERROR ("Invalid essence container data local tag 0x%04x of size %u", tag,
1601 mxf_metadata_essence_container_data_resolve (MXFMetadataBase * m,
1602 GHashTable * metadata)
1604 MXFMetadataEssenceContainerData *self =
1605 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1606 MXFMetadataBase *current = NULL;
1607 GHashTableIter iter;
1609 g_hash_table_iter_init (&iter, metadata);
1611 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & current)) {
1612 if (MXF_IS_METADATA_SOURCE_PACKAGE (current)) {
1613 MXFMetadataSourcePackage *package = MXF_METADATA_SOURCE_PACKAGE (current);
1615 if (mxf_umid_is_equal (&package->parent.package_uid,
1616 &self->linked_package_uid)) {
1617 if (mxf_metadata_base_resolve (current, metadata)) {
1618 self->linked_package = package;
1625 if (!self->linked_package) {
1626 GST_ERROR ("Couldn't resolve a package");
1631 MXF_METADATA_BASE_CLASS
1632 (mxf_metadata_essence_container_data_parent_class)->resolve (m, metadata);
1635 static GstStructure *
1636 mxf_metadata_essence_container_data_to_structure (MXFMetadataBase * m)
1639 MXF_METADATA_BASE_CLASS
1640 (mxf_metadata_essence_container_data_parent_class)->to_structure (m);
1641 MXFMetadataEssenceContainerData *self =
1642 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1645 if (!mxf_umid_is_zero (&self->linked_package_uid)) {
1646 mxf_umid_to_string (&self->linked_package_uid, str);
1647 gst_structure_id_set (ret, MXF_QUARK (LINKED_PACKAGE), G_TYPE_STRING, str,
1651 gst_structure_id_set (ret, MXF_QUARK (INDEX_SID), G_TYPE_UINT,
1652 self->index_sid, MXF_QUARK (BODY_SID), G_TYPE_UINT, self->body_sid, NULL);
1659 mxf_metadata_essence_container_data_write_tags (MXFMetadataBase * m,
1660 MXFPrimerPack * primer)
1662 MXFMetadataEssenceContainerData *self =
1663 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1665 MXF_METADATA_BASE_CLASS
1666 (mxf_metadata_essence_container_data_parent_class)->write_tags (m,
1670 t = g_slice_new0 (MXFLocalTag);
1671 memcpy (&t->ul, MXF_UL (LINKED_PACKAGE_UID), 16);
1673 t->data = g_slice_alloc0 (32);
1675 if (self->linked_package)
1676 memcpy (t->data, &self->linked_package->parent.package_uid, 32);
1677 mxf_primer_pack_add_mapping (primer, 0x2701, &t->ul);
1678 ret = g_list_prepend (ret, t);
1680 t = g_slice_new0 (MXFLocalTag);
1681 memcpy (&t->ul, MXF_UL (BODY_SID), 16);
1683 t->data = g_slice_alloc (4);
1685 GST_WRITE_UINT32_BE (t->data, self->body_sid);
1686 mxf_primer_pack_add_mapping (primer, 0x3f07, &t->ul);
1687 ret = g_list_prepend (ret, t);
1689 if (self->index_sid) {
1690 t = g_slice_new0 (MXFLocalTag);
1691 memcpy (&t->ul, MXF_UL (INDEX_SID), 16);
1693 t->data = g_slice_alloc (4);
1695 GST_WRITE_UINT32_BE (t->data, self->index_sid);
1696 mxf_primer_pack_add_mapping (primer, 0x3f07, &t->ul);
1697 ret = g_list_prepend (ret, t);
1704 mxf_metadata_essence_container_data_init (MXFMetadataEssenceContainerData *
1711 mxf_metadata_essence_container_data_class_init
1712 (MXFMetadataEssenceContainerDataClass * klass)
1714 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1715 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1717 metadata_base_class->handle_tag =
1718 mxf_metadata_essence_container_data_handle_tag;
1719 metadata_base_class->resolve = mxf_metadata_essence_container_data_resolve;
1720 metadata_base_class->name_quark = MXF_QUARK (ESSENCE_CONTAINER_DATA);
1721 metadata_base_class->to_structure =
1722 mxf_metadata_essence_container_data_to_structure;
1723 metadata_base_class->write_tags =
1724 mxf_metadata_essence_container_data_write_tags;
1725 metadata_class->type = 0x0123;
1728 G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericPackage, mxf_metadata_generic_package,
1732 mxf_metadata_generic_package_finalize (GstMiniObject * object)
1734 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (object);
1736 g_free (self->name);
1738 g_free (self->tracks_uids);
1739 self->tracks_uids = NULL;
1741 g_free (self->tracks);
1742 self->tracks = NULL;
1744 GST_MINI_OBJECT_CLASS (mxf_metadata_generic_package_parent_class)->finalize
1749 mxf_metadata_generic_package_handle_tag (MXFMetadataBase * metadata,
1750 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1753 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (metadata);
1754 gboolean ret = TRUE;
1755 #ifndef GST_DISABLE_GST_DEBUG
1763 memcpy (&self->package_uid, tag_data, 32);
1764 GST_DEBUG (" UMID = %s", mxf_umid_to_string (&self->package_uid, str));
1767 self->name = mxf_utf16_to_utf8 (tag_data, tag_size);
1768 GST_DEBUG (" name = %s", GST_STR_NULL (self->name));
1771 if (!mxf_timestamp_parse (&self->package_creation_date,
1772 tag_data, tag_size))
1774 GST_DEBUG (" creation date = %s",
1775 mxf_timestamp_to_string (&self->package_creation_date, str));
1778 if (!mxf_timestamp_parse (&self->package_modified_date,
1779 tag_data, tag_size))
1781 GST_DEBUG (" modification date = %s",
1782 mxf_timestamp_to_string (&self->package_modified_date, str));
1785 if (!mxf_uuid_array_parse (&self->tracks_uids, &self->n_tracks, tag_data,
1789 GST_DEBUG (" number of tracks = %u", self->n_tracks);
1790 #ifndef GST_DISABLE_GST_DEBUG
1793 for (i = 0; i < self->n_tracks; i++) {
1794 GST_DEBUG (" track %u = %s", i,
1795 mxf_uuid_to_string (&self->tracks_uids[i], str));
1802 MXF_METADATA_BASE_CLASS
1803 (mxf_metadata_generic_package_parent_class)->handle_tag (metadata,
1804 primer, tag, tag_data, tag_size);
1812 GST_ERROR ("Invalid generic package local tag 0x%04x of size %u", tag,
1819 mxf_metadata_generic_package_resolve (MXFMetadataBase * m,
1820 GHashTable * metadata)
1822 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1823 MXFMetadataBase *current = NULL;
1825 gboolean have_track = FALSE;
1828 memset (self->tracks, 0, sizeof (gpointer) * self->n_tracks);
1830 self->tracks = g_new0 (MXFMetadataTrack *, self->n_tracks);
1831 for (i = 0; i < self->n_tracks; i++) {
1832 current = g_hash_table_lookup (metadata, &self->tracks_uids[i]);
1833 if (current && MXF_IS_METADATA_TRACK (current)) {
1834 if (mxf_metadata_base_resolve (current, metadata)) {
1835 MXFMetadataTrack *track = MXF_METADATA_TRACK (current);
1837 self->tracks[i] = track;
1839 if ((track->type & 0xf0) == 0x10)
1840 self->n_timecode_tracks++;
1841 else if ((track->type & 0xf0) == 0x20)
1842 self->n_metadata_tracks++;
1843 else if ((track->type & 0xf0) == 0x30)
1844 self->n_essence_tracks++;
1845 else if ((track->type & 0xf0) == 0x40)
1846 self->n_other_tracks++;
1848 GST_ERROR ("Track couldn't be resolved");
1851 GST_ERROR ("Track not found");
1856 GST_ERROR ("Couldn't resolve a track");
1861 MXF_METADATA_BASE_CLASS
1862 (mxf_metadata_generic_package_parent_class)->resolve (m, metadata);
1865 static GstStructure *
1866 mxf_metadata_generic_package_to_structure (MXFMetadataBase * m)
1869 MXF_METADATA_BASE_CLASS
1870 (mxf_metadata_generic_package_parent_class)->to_structure (m);
1871 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1875 mxf_umid_to_string (&self->package_uid, str);
1876 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_UID), G_TYPE_STRING, str, NULL);
1879 gst_structure_id_set (ret, MXF_QUARK (NAME), G_TYPE_STRING, self->name,
1882 if (!mxf_timestamp_is_unknown (&self->package_creation_date)) {
1883 mxf_timestamp_to_string (&self->package_creation_date, str);
1884 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_CREATION_DATE), G_TYPE_STRING,
1888 if (!mxf_timestamp_is_unknown (&self->package_modified_date)) {
1889 mxf_timestamp_to_string (&self->package_modified_date, str);
1890 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_MODIFIED_DATE), G_TYPE_STRING,
1894 if (self->n_tracks > 0) {
1899 g_value_init (&arr, GST_TYPE_ARRAY);
1901 for (i = 0; i < self->n_tracks; i++) {
1904 if (self->tracks[i] == NULL)
1907 g_value_init (&val, GST_TYPE_STRUCTURE);
1909 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->tracks[i]));
1910 gst_value_set_structure (&val, s);
1911 gst_structure_free (s);
1912 gst_value_array_append_value (&arr, &val);
1913 g_value_unset (&val);
1916 if (gst_value_array_get_size (&arr) > 0)
1917 gst_structure_id_set_value (ret, MXF_QUARK (TRACKS), &arr);
1919 g_value_unset (&arr);
1926 mxf_metadata_generic_package_write_tags (MXFMetadataBase * m,
1927 MXFPrimerPack * primer)
1929 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1931 MXF_METADATA_BASE_CLASS
1932 (mxf_metadata_generic_package_parent_class)->write_tags (m, primer);
1935 t = g_slice_new0 (MXFLocalTag);
1936 memcpy (&t->ul, MXF_UL (PACKAGE_UID), 16);
1938 t->data = g_slice_alloc (t->size);
1940 memcpy (t->data, &self->package_uid, 32);
1941 mxf_primer_pack_add_mapping (primer, 0x4401, &t->ul);
1942 ret = g_list_prepend (ret, t);
1945 t = g_slice_new0 (MXFLocalTag);
1946 memcpy (&t->ul, MXF_UL (PACKAGE_NAME), 16);
1947 t->data = mxf_utf8_to_utf16 (self->name, &t->size);
1948 mxf_primer_pack_add_mapping (primer, 0x4402, &t->ul);
1949 ret = g_list_prepend (ret, t);
1952 t = g_slice_new0 (MXFLocalTag);
1953 memcpy (&t->ul, MXF_UL (PACKAGE_CREATION_DATE), 16);
1955 t->data = g_slice_alloc (t->size);
1957 mxf_timestamp_write (&self->package_creation_date, t->data);
1958 mxf_primer_pack_add_mapping (primer, 0x4405, &t->ul);
1959 ret = g_list_prepend (ret, t);
1961 t = g_slice_new0 (MXFLocalTag);
1962 memcpy (&t->ul, MXF_UL (PACKAGE_MODIFIED_DATE), 16);
1964 t->data = g_slice_alloc (t->size);
1966 mxf_timestamp_write (&self->package_modified_date, t->data);
1967 mxf_primer_pack_add_mapping (primer, 0x4404, &t->ul);
1968 ret = g_list_prepend (ret, t);
1973 t = g_slice_new0 (MXFLocalTag);
1974 memcpy (&t->ul, MXF_UL (TRACKS), 16);
1975 t->size = 8 + 16 * self->n_tracks;
1976 t->data = g_slice_alloc0 (t->size);
1978 GST_WRITE_UINT32_BE (t->data, self->n_tracks);
1979 GST_WRITE_UINT32_BE (t->data + 4, 16);
1980 for (i = 0; i < self->n_tracks; i++) {
1981 if (!self->tracks[i])
1984 memcpy (t->data + 8 + 16 * i,
1985 &MXF_METADATA_BASE (self->tracks[i])->instance_uid, 16);
1987 mxf_primer_pack_add_mapping (primer, 0x4403, &t->ul);
1988 ret = g_list_prepend (ret, t);
1995 mxf_metadata_generic_package_init (MXFMetadataGenericPackage * self)
2001 mxf_metadata_generic_package_class_init (MXFMetadataGenericPackageClass * klass)
2003 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2004 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
2006 miniobject_class->finalize = mxf_metadata_generic_package_finalize;
2007 metadata_base_class->handle_tag = mxf_metadata_generic_package_handle_tag;
2008 metadata_base_class->resolve = mxf_metadata_generic_package_resolve;
2009 metadata_base_class->to_structure = mxf_metadata_generic_package_to_structure;
2010 metadata_base_class->write_tags = mxf_metadata_generic_package_write_tags;
2013 G_DEFINE_TYPE (MXFMetadataMaterialPackage, mxf_metadata_material_package,
2014 MXF_TYPE_METADATA_GENERIC_PACKAGE);
2017 mxf_metadata_material_package_resolve (MXFMetadataBase * m,
2018 GHashTable * metadata)
2021 MXF_METADATA_BASE_CLASS
2022 (mxf_metadata_material_package_parent_class)->resolve (m, metadata);
2023 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
2030 for (i = 0; i < self->n_tracks; i++) {
2031 MXFMetadataTrack *track = self->tracks[i];
2032 MXFMetadataSequence *sequence;
2038 sequence = track->sequence;
2040 if (!sequence || !sequence->structural_components)
2043 for (j = 0; j < sequence->n_structural_components; j++) {
2044 MXFMetadataSourceClip *sc;
2045 MXFMetadataTimelineTrack *st = NULL;
2048 if (!sequence->structural_components[j]
2049 || !MXF_IS_METADATA_SOURCE_CLIP (sequence->structural_components[j]))
2052 sc = MXF_METADATA_SOURCE_CLIP (sequence->structural_components[j]);
2054 if (!sc->source_package) {
2055 GST_ERROR ("Material package track %u without resolved source package",
2061 if (!mxf_metadata_base_resolve (MXF_METADATA_BASE (sc->source_package),
2063 GST_ERROR ("Couldn't resolve source package for track %u", i);
2068 sc->source_package->top_level = TRUE;
2069 for (k = 0; k < sc->source_package->parent.n_tracks; k++) {
2070 MXFMetadataTimelineTrack *tmp;
2072 if (!sc->source_package->parent.tracks[k] ||
2073 !MXF_IS_METADATA_TIMELINE_TRACK (sc->source_package->parent.
2078 MXF_METADATA_TIMELINE_TRACK (sc->source_package->parent.tracks[k]);
2079 if (tmp->parent.track_id == sc->source_track_id) {
2086 GST_ERROR ("Material package track %u without resolved source track",
2095 self->tracks[i] = NULL;
2099 GST_ERROR ("No tracks could be resolved");
2101 } else if (ntracks != self->n_tracks) {
2102 GST_WARNING ("Not all tracks could be resolved");
2109 mxf_metadata_material_package_init (MXFMetadataMaterialPackage * self)
2114 mxf_metadata_material_package_class_init (MXFMetadataMaterialPackageClass *
2117 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2118 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2120 metadata_base_class->resolve = mxf_metadata_material_package_resolve;
2121 metadata_base_class->name_quark = MXF_QUARK (MATERIAL_PACKAGE);
2122 metadata_class->type = 0x0136;
2125 G_DEFINE_TYPE (MXFMetadataSourcePackage, mxf_metadata_source_package,
2126 MXF_TYPE_METADATA_GENERIC_PACKAGE);
2129 mxf_metadata_source_package_handle_tag (MXFMetadataBase * metadata,
2130 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2133 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (metadata);
2134 gboolean ret = TRUE;
2135 #ifndef GST_DISABLE_GST_DEBUG
2144 memcpy (&self->descriptor_uid, tag_data, 16);
2145 GST_DEBUG (" descriptor = %s",
2146 mxf_uuid_to_string (&self->descriptor_uid, str));
2150 MXF_METADATA_BASE_CLASS
2151 (mxf_metadata_source_package_parent_class)->handle_tag (metadata,
2152 primer, tag, tag_data, tag_size);
2160 GST_ERROR ("Invalid source package local tag 0x%04x of size %u", tag,
2167 mxf_metadata_source_package_resolve (MXFMetadataBase * m, GHashTable * metadata)
2169 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2170 MXFMetadataGenericPackage *package = MXF_METADATA_GENERIC_PACKAGE (m);
2171 MXFMetadataBase *current = NULL;
2174 MXFMetadataFileDescriptor *d;
2176 if (mxf_uuid_is_zero (&self->descriptor_uid))
2178 MXF_METADATA_BASE_CLASS
2179 (mxf_metadata_source_package_parent_class)->resolve (m, metadata);
2181 current = g_hash_table_lookup (metadata, &self->descriptor_uid);
2183 GST_ERROR ("Descriptor not found");
2187 if (!mxf_metadata_base_resolve (MXF_METADATA_BASE (current), metadata)) {
2188 GST_ERROR ("Couldn't resolve descriptor");
2192 self->descriptor = MXF_METADATA_GENERIC_DESCRIPTOR (current);
2195 MXF_METADATA_BASE_CLASS
2196 (mxf_metadata_source_package_parent_class)->resolve (m, metadata);
2198 if (!MXF_IS_METADATA_FILE_DESCRIPTOR (self->descriptor))
2201 d = MXF_METADATA_FILE_DESCRIPTOR (current);
2203 for (i = 0; i < package->n_tracks; i++) {
2204 if (!MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (d)) {
2205 if (d->linked_track_id == package->tracks[i]->track_id ||
2206 (d->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2207 (package->tracks[i]->type & 0xf0) == 0x30)) {
2208 package->tracks[i]->descriptor =
2209 g_new0 (MXFMetadataFileDescriptor *, 1);
2210 package->tracks[i]->descriptor[0] = d;
2211 package->tracks[i]->n_descriptor = 1;
2215 guint n_descriptor = 0, j, k = 0;
2216 MXFMetadataMultipleDescriptor *md = MXF_METADATA_MULTIPLE_DESCRIPTOR (d);
2218 for (j = 0; j < md->n_sub_descriptors; j++) {
2219 MXFMetadataFileDescriptor *fd;
2221 if (!md->sub_descriptors[j] ||
2222 !MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]))
2225 fd = MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]);
2227 if (fd->linked_track_id == package->tracks[i]->track_id ||
2228 (fd->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2229 (package->tracks[i]->type & 0xf0) == 0x30))
2233 package->tracks[i]->descriptor =
2234 g_new0 (MXFMetadataFileDescriptor *, n_descriptor);
2235 package->tracks[i]->n_descriptor = n_descriptor;
2237 for (j = 0; j < md->n_sub_descriptors; j++) {
2238 MXFMetadataFileDescriptor *fd;
2240 if (!md->sub_descriptors[j] ||
2241 !MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]))
2244 fd = MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]);
2246 if (fd->linked_track_id == package->tracks[i]->track_id ||
2247 (fd->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2248 (package->tracks[i]->type & 0xf0) == 0x30)) {
2249 package->tracks[i]->descriptor[k] = fd;
2259 static GstStructure *
2260 mxf_metadata_source_package_to_structure (MXFMetadataBase * m)
2263 MXF_METADATA_BASE_CLASS
2264 (mxf_metadata_source_package_parent_class)->to_structure (m);
2265 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2268 if (!self->descriptor)
2271 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->descriptor));
2272 gst_structure_id_set (ret, MXF_QUARK (DESCRIPTOR), GST_TYPE_STRUCTURE, s,
2274 gst_structure_free (s);
2280 mxf_metadata_source_package_write_tags (MXFMetadataBase * m,
2281 MXFPrimerPack * primer)
2283 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2285 MXF_METADATA_BASE_CLASS
2286 (mxf_metadata_source_package_parent_class)->write_tags (m, primer);
2289 if (self->descriptor) {
2290 t = g_slice_new0 (MXFLocalTag);
2291 memcpy (&t->ul, MXF_UL (DESCRIPTOR), 16);
2293 t->data = g_slice_alloc (t->size);
2295 memcpy (t->data, &MXF_METADATA_BASE (self->descriptor)->instance_uid, 16);
2296 mxf_primer_pack_add_mapping (primer, 0x4701, &t->ul);
2297 ret = g_list_prepend (ret, t);
2304 mxf_metadata_source_package_init (MXFMetadataSourcePackage * self)
2310 mxf_metadata_source_package_class_init (MXFMetadataSourcePackageClass * klass)
2312 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2313 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2315 metadata_base_class->handle_tag = mxf_metadata_source_package_handle_tag;
2316 metadata_base_class->resolve = mxf_metadata_source_package_resolve;
2317 metadata_base_class->name_quark = MXF_QUARK (SOURCE_PACKAGE);
2318 metadata_base_class->to_structure = mxf_metadata_source_package_to_structure;
2319 metadata_base_class->write_tags = mxf_metadata_source_package_write_tags;
2320 metadata_class->type = 0x0137;
2323 G_DEFINE_ABSTRACT_TYPE (MXFMetadataTrack, mxf_metadata_track,
2327 mxf_metadata_track_finalize (GstMiniObject * object)
2329 MXFMetadataTrack *self = MXF_METADATA_TRACK (object);
2331 g_free (self->track_name);
2332 self->track_name = NULL;
2333 g_free (self->descriptor);
2334 self->descriptor = NULL;
2336 GST_MINI_OBJECT_CLASS (mxf_metadata_track_parent_class)->finalize (object);
2340 mxf_metadata_track_handle_tag (MXFMetadataBase * metadata,
2341 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2344 MXFMetadataTrack *self = MXF_METADATA_TRACK (metadata);
2345 gboolean ret = TRUE;
2346 #ifndef GST_DISABLE_GST_DEBUG
2354 self->track_id = GST_READ_UINT32_BE (tag_data);
2355 GST_DEBUG (" track id = %u", self->track_id);
2360 self->track_number = GST_READ_UINT32_BE (tag_data);
2361 GST_DEBUG (" track number = %u", self->track_number);
2364 self->track_name = mxf_utf16_to_utf8 (tag_data, tag_size);
2365 GST_DEBUG (" track name = %s", GST_STR_NULL (self->track_name));
2370 memcpy (&self->sequence_uid, tag_data, 16);
2371 GST_DEBUG (" sequence uid = %s",
2372 mxf_uuid_to_string (&self->sequence_uid, str));
2376 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->handle_tag
2377 (metadata, primer, tag, tag_data, tag_size);
2385 GST_ERROR ("Invalid track local tag 0x%04x of size %u", tag, tag_size);
2391 mxf_metadata_track_resolve (MXFMetadataBase * m, GHashTable * metadata)
2393 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2394 MXFMetadataBase *current = NULL;
2397 current = g_hash_table_lookup (metadata, &self->sequence_uid);
2398 if (current && MXF_IS_METADATA_SEQUENCE (current)) {
2399 if (mxf_metadata_base_resolve (current, metadata)) {
2400 self->sequence = MXF_METADATA_SEQUENCE (current);
2402 GST_ERROR ("Couldn't resolve sequence");
2406 GST_ERROR ("Couldn't find sequence");
2411 mxf_metadata_track_identifier_parse (&self->sequence->data_definition);
2412 if (self->type == MXF_METADATA_TRACK_UNKNOWN) {
2413 MXFMetadataSequence *sequence = self->sequence;
2415 for (i = 0; i < sequence->n_structural_components; i++) {
2416 MXFMetadataStructuralComponent *component =
2417 sequence->structural_components[i];
2423 mxf_metadata_track_identifier_parse (&component->data_definition);
2424 if (self->type != MXF_METADATA_TRACK_UNKNOWN)
2429 return MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->resolve (m,
2433 static GstStructure *
2434 mxf_metadata_track_to_structure (MXFMetadataBase * m)
2437 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->to_structure
2439 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2441 gst_structure_id_set (ret, MXF_QUARK (TRACK_ID), G_TYPE_UINT, self->track_id,
2442 MXF_QUARK (TRACK_NUMBER), G_TYPE_UINT, self->track_number, NULL);
2444 if (self->track_name)
2445 gst_structure_id_set (ret, MXF_QUARK (TRACK_NAME), G_TYPE_STRING,
2446 self->track_name, NULL);
2448 if (self->sequence) {
2450 mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->sequence));
2452 gst_structure_id_set (ret, MXF_QUARK (SEQUENCE), GST_TYPE_STRUCTURE, s,
2454 gst_structure_free (s);
2462 mxf_metadata_track_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
2464 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2466 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->write_tags (m,
2470 t = g_slice_new0 (MXFLocalTag);
2471 memcpy (&t->ul, MXF_UL (TRACK_ID), 16);
2473 t->data = g_slice_alloc (t->size);
2475 GST_WRITE_UINT32_BE (t->data, self->track_id);
2476 mxf_primer_pack_add_mapping (primer, 0x4801, &t->ul);
2477 ret = g_list_prepend (ret, t);
2479 t = g_slice_new0 (MXFLocalTag);
2480 memcpy (&t->ul, MXF_UL (TRACK_NUMBER), 16);
2482 t->data = g_slice_alloc (t->size);
2484 GST_WRITE_UINT32_BE (t->data, self->track_number);
2485 mxf_primer_pack_add_mapping (primer, 0x4804, &t->ul);
2486 ret = g_list_prepend (ret, t);
2488 if (self->track_name) {
2489 t = g_slice_new0 (MXFLocalTag);
2490 memcpy (&t->ul, MXF_UL (TRACK_NAME), 16);
2491 t->data = mxf_utf8_to_utf16 (self->track_name, &t->size);
2492 mxf_primer_pack_add_mapping (primer, 0x4802, &t->ul);
2493 ret = g_list_prepend (ret, t);
2496 t = g_slice_new0 (MXFLocalTag);
2497 memcpy (&t->ul, MXF_UL (SEQUENCE), 16);
2499 t->data = g_slice_alloc (t->size);
2501 memcpy (t->data, &MXF_METADATA_BASE (self->sequence)->instance_uid, 16);
2502 mxf_primer_pack_add_mapping (primer, 0x4803, &t->ul);
2503 ret = g_list_prepend (ret, t);
2509 mxf_metadata_track_init (MXFMetadataTrack * self)
2515 mxf_metadata_track_class_init (MXFMetadataTrackClass * klass)
2517 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2518 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
2520 miniobject_class->finalize = mxf_metadata_track_finalize;
2521 metadata_base_class->handle_tag = mxf_metadata_track_handle_tag;
2522 metadata_base_class->resolve = mxf_metadata_track_resolve;
2523 metadata_base_class->to_structure = mxf_metadata_track_to_structure;
2524 metadata_base_class->write_tags = mxf_metadata_track_write_tags;
2531 const MXFMetadataTrackType type;
2532 } mxf_metadata_track_identifier[] = {
2534 MXF_UL (TRACK_TIMECODE_12M_INACTIVE),
2535 MXF_METADATA_TRACK_TIMECODE_12M_INACTIVE}, {
2536 MXF_UL (TRACK_TIMECODE_12M_ACTIVE), MXF_METADATA_TRACK_TIMECODE_12M_ACTIVE}, {
2537 MXF_UL (TRACK_TIMECODE_309M), MXF_METADATA_TRACK_TIMECODE_309M}, {
2538 MXF_UL (TRACK_METADATA), MXF_METADATA_TRACK_METADATA}, {
2539 MXF_UL (TRACK_PICTURE_ESSENCE), MXF_METADATA_TRACK_PICTURE_ESSENCE}, {
2540 MXF_UL (TRACK_SOUND_ESSENCE), MXF_METADATA_TRACK_SOUND_ESSENCE}, {
2541 MXF_UL (TRACK_DATA_ESSENCE), MXF_METADATA_TRACK_DATA_ESSENCE}, {
2542 MXF_UL (TRACK_AUXILIARY_DATA), MXF_METADATA_TRACK_AUXILIARY_DATA}, {
2543 MXF_UL (TRACK_PARSED_TEXT), MXF_METADATA_TRACK_PARSED_TEXT},
2546 MXF_UL (TRACK_AVID_PICTURE_ESSENCE), MXF_METADATA_TRACK_PICTURE_ESSENCE}
2549 MXFMetadataTrackType
2550 mxf_metadata_track_identifier_parse (const MXFUL * track_identifier)
2554 for (i = 0; i < G_N_ELEMENTS (mxf_metadata_track_identifier); i++)
2555 if (mxf_ul_is_equal (mxf_metadata_track_identifier[i].ul, track_identifier))
2556 return mxf_metadata_track_identifier[i].type;
2558 return MXF_METADATA_TRACK_UNKNOWN;
2562 mxf_metadata_track_identifier_get (MXFMetadataTrackType type)
2566 for (i = 0; i < G_N_ELEMENTS (mxf_metadata_track_identifier); i++)
2567 if (mxf_metadata_track_identifier[i].type == type)
2568 return mxf_metadata_track_identifier[i].ul;
2573 G_DEFINE_TYPE (MXFMetadataTimelineTrack, mxf_metadata_timeline_track,
2574 MXF_TYPE_METADATA_TRACK);
2577 mxf_metadata_timeline_track_handle_tag (MXFMetadataBase * metadata,
2578 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2581 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (metadata);
2582 gboolean ret = TRUE;
2586 if (!mxf_fraction_parse (&self->edit_rate, tag_data, tag_size))
2588 GST_DEBUG (" edit rate = %d/%d", self->edit_rate.n, self->edit_rate.d);
2593 self->origin = GST_READ_UINT64_BE (tag_data);
2594 GST_DEBUG (" origin = %" G_GINT64_FORMAT, self->origin);
2598 MXF_METADATA_BASE_CLASS
2599 (mxf_metadata_timeline_track_parent_class)->handle_tag (metadata,
2600 primer, tag, tag_data, tag_size);
2608 GST_ERROR ("Invalid timeline track local tag 0x%04x of size %u", tag,
2614 static GstStructure *
2615 mxf_metadata_timeline_track_to_structure (MXFMetadataBase * m)
2618 MXF_METADATA_BASE_CLASS
2619 (mxf_metadata_timeline_track_parent_class)->to_structure (m);
2620 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (m);
2622 gst_structure_id_set (ret, MXF_QUARK (EDIT_RATE), GST_TYPE_FRACTION,
2623 self->edit_rate.n, self->edit_rate.d, MXF_QUARK (ORIGIN), G_TYPE_INT64,
2624 self->origin, NULL);
2630 mxf_metadata_timeline_track_write_tags (MXFMetadataBase * m,
2631 MXFPrimerPack * primer)
2633 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (m);
2635 MXF_METADATA_BASE_CLASS
2636 (mxf_metadata_timeline_track_parent_class)->write_tags (m, primer);
2639 t = g_slice_new0 (MXFLocalTag);
2640 memcpy (&t->ul, MXF_UL (EDIT_RATE), 16);
2642 t->data = g_slice_alloc (t->size);
2644 GST_WRITE_UINT32_BE (t->data, self->edit_rate.n);
2645 GST_WRITE_UINT32_BE (t->data + 4, self->edit_rate.d);
2646 mxf_primer_pack_add_mapping (primer, 0x4b01, &t->ul);
2647 ret = g_list_prepend (ret, t);
2649 t = g_slice_new0 (MXFLocalTag);
2650 memcpy (&t->ul, MXF_UL (ORIGIN), 16);
2652 t->data = g_slice_alloc (t->size);
2654 GST_WRITE_UINT64_BE (t->data, self->origin);
2655 mxf_primer_pack_add_mapping (primer, 0x4b02, &t->ul);
2656 ret = g_list_prepend (ret, t);
2662 mxf_metadata_timeline_track_init (MXFMetadataTimelineTrack * self)
2668 mxf_metadata_timeline_track_class_init (MXFMetadataTimelineTrackClass * klass)
2670 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2671 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2673 metadata_base_class->handle_tag = mxf_metadata_timeline_track_handle_tag;
2674 metadata_base_class->name_quark = MXF_QUARK (TIMELINE_TRACK);
2675 metadata_base_class->to_structure = mxf_metadata_timeline_track_to_structure;
2676 metadata_base_class->write_tags = mxf_metadata_timeline_track_write_tags;
2677 metadata_class->type = 0x013b;
2680 G_DEFINE_TYPE (MXFMetadataEventTrack, mxf_metadata_event_track,
2681 MXF_TYPE_METADATA_TRACK);
2684 mxf_metadata_event_track_handle_tag (MXFMetadataBase * metadata,
2685 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2688 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (metadata);
2689 gboolean ret = TRUE;
2693 if (!mxf_fraction_parse (&self->event_edit_rate, tag_data, tag_size))
2695 GST_DEBUG (" event edit rate = %d/%d", self->event_edit_rate.n,
2696 self->event_edit_rate.d);
2701 self->event_origin = GST_READ_UINT64_BE (tag_data);
2702 GST_DEBUG (" event origin = %" G_GINT64_FORMAT, self->event_origin);
2706 MXF_METADATA_BASE_CLASS
2707 (mxf_metadata_event_track_parent_class)->handle_tag (metadata, primer,
2708 tag, tag_data, tag_size);
2716 GST_ERROR ("Invalid event track local tag 0x%04x of size %u", tag, tag_size);
2721 static GstStructure *
2722 mxf_metadata_event_track_to_structure (MXFMetadataBase * m)
2725 MXF_METADATA_BASE_CLASS
2726 (mxf_metadata_event_track_parent_class)->to_structure (m);
2727 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (m);
2729 gst_structure_id_set (ret, MXF_QUARK (EVENT_EDIT_RATE), GST_TYPE_FRACTION,
2730 self->event_edit_rate.n, self->event_edit_rate.d,
2731 MXF_QUARK (EVENT_ORIGIN), G_TYPE_INT64, self->event_origin, NULL);
2737 mxf_metadata_event_track_write_tags (MXFMetadataBase * m,
2738 MXFPrimerPack * primer)
2740 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (m);
2742 MXF_METADATA_BASE_CLASS
2743 (mxf_metadata_event_track_parent_class)->write_tags (m, primer);
2746 t = g_slice_new0 (MXFLocalTag);
2747 memcpy (&t->ul, MXF_UL (EVENT_EDIT_RATE), 16);
2749 t->data = g_slice_alloc (t->size);
2751 GST_WRITE_UINT32_BE (t->data, self->event_edit_rate.n);
2752 GST_WRITE_UINT32_BE (t->data + 4, self->event_edit_rate.d);
2753 mxf_primer_pack_add_mapping (primer, 0x4901, &t->ul);
2754 ret = g_list_prepend (ret, t);
2756 t = g_slice_new0 (MXFLocalTag);
2757 memcpy (&t->ul, MXF_UL (EVENT_ORIGIN), 16);
2759 t->data = g_slice_alloc (t->size);
2761 GST_WRITE_UINT64_BE (t->data, self->event_origin);
2762 mxf_primer_pack_add_mapping (primer, 0x4902, &t->ul);
2763 ret = g_list_prepend (ret, t);
2769 mxf_metadata_event_track_init (MXFMetadataEventTrack * self)
2775 mxf_metadata_event_track_class_init (MXFMetadataEventTrackClass * klass)
2777 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2778 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2780 metadata_base_class->handle_tag = mxf_metadata_event_track_handle_tag;
2781 metadata_base_class->name_quark = MXF_QUARK (EVENT_TRACK);
2782 metadata_base_class->to_structure = mxf_metadata_event_track_to_structure;
2783 metadata_base_class->write_tags = mxf_metadata_event_track_write_tags;
2784 metadata_class->type = 0x0139;
2787 G_DEFINE_TYPE (MXFMetadataStaticTrack, mxf_metadata_static_track,
2788 MXF_TYPE_METADATA_TRACK);
2791 mxf_metadata_static_track_init (MXFMetadataStaticTrack * self)
2796 mxf_metadata_static_track_class_init (MXFMetadataStaticTrackClass * klass)
2798 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2799 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2801 metadata_base_class->name_quark = MXF_QUARK (STATIC_TRACK);
2802 metadata_class->type = 0x013a;
2805 G_DEFINE_TYPE (MXFMetadataSequence, mxf_metadata_sequence, MXF_TYPE_METADATA);
2808 mxf_metadata_sequence_finalize (GstMiniObject * object)
2810 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (object);
2812 g_free (self->structural_components_uids);
2813 self->structural_components_uids = NULL;
2814 g_free (self->structural_components);
2815 self->structural_components = NULL;
2817 GST_MINI_OBJECT_CLASS (mxf_metadata_sequence_parent_class)->finalize (object);
2821 mxf_metadata_sequence_handle_tag (MXFMetadataBase * metadata,
2822 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2825 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (metadata);
2826 gboolean ret = TRUE;
2827 #ifndef GST_DISABLE_GST_DEBUG
2835 memcpy (&self->data_definition, tag_data, 16);
2836 GST_DEBUG (" data definition = %s",
2837 mxf_ul_to_string (&self->data_definition, str));
2842 self->duration = GST_READ_UINT64_BE (tag_data);
2843 GST_DEBUG (" duration = %" G_GINT64_FORMAT, self->duration);
2846 if (!mxf_uuid_array_parse (&self->structural_components_uids,
2847 &self->n_structural_components, tag_data, tag_size))
2850 GST_DEBUG (" number of structural components = %u",
2851 self->n_structural_components);
2852 #ifndef GST_DISABLE_GST_DEBUG
2855 for (i = 0; i < self->n_structural_components; i++) {
2856 GST_DEBUG (" structural component %u = %s", i,
2857 mxf_uuid_to_string (&self->structural_components_uids[i], str));
2864 MXF_METADATA_BASE_CLASS
2865 (mxf_metadata_sequence_parent_class)->handle_tag (metadata, primer,
2866 tag, tag_data, tag_size);
2874 GST_ERROR ("Invalid sequence local tag 0x%04x of size %u", tag, tag_size);
2880 mxf_metadata_sequence_resolve (MXFMetadataBase * m, GHashTable * metadata)
2882 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2883 MXFMetadataBase *current = NULL;
2886 if (self->structural_components)
2887 memset (self->structural_components, 0,
2888 sizeof (gpointer) * self->n_structural_components);
2890 self->structural_components =
2891 g_new0 (MXFMetadataStructuralComponent *,
2892 self->n_structural_components);
2893 for (i = 0; i < self->n_structural_components; i++) {
2895 g_hash_table_lookup (metadata, &self->structural_components_uids[i]);
2896 if (current && MXF_IS_METADATA_STRUCTURAL_COMPONENT (current)) {
2897 if (mxf_metadata_base_resolve (current, metadata)) {
2898 self->structural_components[i] =
2899 MXF_METADATA_STRUCTURAL_COMPONENT (current);
2901 GST_ERROR ("Couldn't resolve structural component");
2905 GST_ERROR ("Structural component not found");
2911 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->resolve (m,
2916 static GstStructure *
2917 mxf_metadata_sequence_to_structure (MXFMetadataBase * m)
2920 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->to_structure
2922 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2926 mxf_ul_to_string (&self->data_definition, str);
2927 gst_structure_id_set (ret, MXF_QUARK (DATA_DEFINITION), G_TYPE_STRING, str,
2928 MXF_QUARK (DURATION), G_TYPE_INT64, self->duration, NULL);
2930 if (self->n_structural_components > 0) {
2935 g_value_init (&arr, GST_TYPE_ARRAY);
2937 for (i = 0; i < self->n_structural_components; i++) {
2940 if (self->structural_components[i] == NULL)
2943 g_value_init (&val, GST_TYPE_STRUCTURE);
2945 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
2946 (self->structural_components[i]));
2947 gst_value_set_structure (&val, s);
2948 gst_structure_free (s);
2949 gst_value_array_append_value (&arr, &val);
2950 g_value_unset (&val);
2953 if (gst_value_array_get_size (&arr) > 0)
2954 gst_structure_id_set_value (ret, MXF_QUARK (STRUCTURAL_COMPONENTS), &arr);
2956 g_value_unset (&arr);
2963 mxf_metadata_sequence_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
2965 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2967 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->write_tags
2971 t = g_slice_new0 (MXFLocalTag);
2972 memcpy (&t->ul, MXF_UL (DATA_DEFINITION), 16);
2974 t->data = g_slice_alloc (t->size);
2976 memcpy (t->data, &self->data_definition, 16);
2977 mxf_primer_pack_add_mapping (primer, 0x0201, &t->ul);
2978 ret = g_list_prepend (ret, t);
2980 t = g_slice_new0 (MXFLocalTag);
2981 memcpy (&t->ul, MXF_UL (DURATION), 16);
2983 t->data = g_slice_alloc (t->size);
2985 GST_WRITE_UINT64_BE (t->data, self->duration);
2986 mxf_primer_pack_add_mapping (primer, 0x0202, &t->ul);
2987 ret = g_list_prepend (ret, t);
2989 if (self->structural_components) {
2991 t = g_slice_new0 (MXFLocalTag);
2992 memcpy (&t->ul, MXF_UL (STRUCTURAL_COMPONENTS), 16);
2993 t->size = 8 + 16 * self->n_structural_components;
2994 t->data = g_slice_alloc0 (t->size);
2997 GST_WRITE_UINT32_BE (t->data, self->n_structural_components);
2998 GST_WRITE_UINT32_BE (t->data + 4, 16);
2999 for (i = 0; i < self->n_structural_components; i++) {
3000 if (!self->structural_components[i])
3003 memcpy (t->data + 8 + i * 16,
3004 &MXF_METADATA_BASE (self->structural_components[i])->instance_uid,
3008 mxf_primer_pack_add_mapping (primer, 0x1001, &t->ul);
3009 ret = g_list_prepend (ret, t);
3016 mxf_metadata_sequence_init (MXFMetadataSequence * self)
3018 self->duration = -1;
3022 mxf_metadata_sequence_class_init (MXFMetadataSequenceClass * klass)
3024 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3025 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
3026 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3028 miniobject_class->finalize = mxf_metadata_sequence_finalize;
3029 metadata_base_class->handle_tag = mxf_metadata_sequence_handle_tag;
3030 metadata_base_class->resolve = mxf_metadata_sequence_resolve;
3031 metadata_base_class->name_quark = MXF_QUARK (SEQUENCE);
3032 metadata_base_class->to_structure = mxf_metadata_sequence_to_structure;
3033 metadata_base_class->write_tags = mxf_metadata_sequence_write_tags;
3034 metadata_class->type = 0x010f;
3037 G_DEFINE_TYPE (MXFMetadataStructuralComponent,
3038 mxf_metadata_structural_component, MXF_TYPE_METADATA);
3041 mxf_metadata_structural_component_handle_tag (MXFMetadataBase * metadata,
3042 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3045 MXFMetadataStructuralComponent *self =
3046 MXF_METADATA_STRUCTURAL_COMPONENT (metadata);
3047 gboolean ret = TRUE;
3048 #ifndef GST_DISABLE_GST_DEBUG
3056 memcpy (&self->data_definition, tag_data, 16);
3057 GST_DEBUG (" data definition = %s",
3058 mxf_ul_to_string (&self->data_definition, str));
3063 self->duration = GST_READ_UINT64_BE (tag_data);
3064 GST_DEBUG (" duration = %" G_GINT64_FORMAT, self->duration);
3068 MXF_METADATA_BASE_CLASS
3069 (mxf_metadata_structural_component_parent_class)->handle_tag
3070 (metadata, primer, tag, tag_data, tag_size);
3078 GST_ERROR ("Invalid structural component local tag 0x%04x of size %u", tag,
3084 static GstStructure *
3085 mxf_metadata_structural_component_to_structure (MXFMetadataBase * m)
3088 MXF_METADATA_BASE_CLASS
3089 (mxf_metadata_structural_component_parent_class)->to_structure (m);
3090 MXFMetadataStructuralComponent *self = MXF_METADATA_STRUCTURAL_COMPONENT (m);
3093 mxf_ul_to_string (&self->data_definition, str);
3094 gst_structure_id_set (ret, MXF_QUARK (DATA_DEFINITION), G_TYPE_STRING, str,
3095 MXF_QUARK (DURATION), G_TYPE_INT64, self->duration, NULL);
3101 mxf_metadata_structural_component_write_tags (MXFMetadataBase * m,
3102 MXFPrimerPack * primer)
3104 MXFMetadataStructuralComponent *self = MXF_METADATA_STRUCTURAL_COMPONENT (m);
3106 MXF_METADATA_BASE_CLASS
3107 (mxf_metadata_structural_component_parent_class)->write_tags (m, primer);
3110 t = g_slice_new0 (MXFLocalTag);
3111 memcpy (&t->ul, MXF_UL (DATA_DEFINITION), 16);
3113 t->data = g_slice_alloc (t->size);
3115 memcpy (t->data, &self->data_definition, 16);
3116 mxf_primer_pack_add_mapping (primer, 0x0201, &t->ul);
3117 ret = g_list_prepend (ret, t);
3119 t = g_slice_new0 (MXFLocalTag);
3120 memcpy (&t->ul, MXF_UL (DURATION), 16);
3122 t->data = g_slice_alloc (t->size);
3124 GST_WRITE_UINT64_BE (t->data, self->duration);
3125 mxf_primer_pack_add_mapping (primer, 0x0202, &t->ul);
3126 ret = g_list_prepend (ret, t);
3132 mxf_metadata_structural_component_init (MXFMetadataStructuralComponent * self)
3134 self->duration = -1;
3138 mxf_metadata_structural_component_class_init
3139 (MXFMetadataStructuralComponentClass * klass)
3141 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3143 metadata_base_class->handle_tag =
3144 mxf_metadata_structural_component_handle_tag;
3145 metadata_base_class->to_structure =
3146 mxf_metadata_structural_component_to_structure;
3147 metadata_base_class->write_tags =
3148 mxf_metadata_structural_component_write_tags;
3151 G_DEFINE_TYPE (MXFMetadataTimecodeComponent, mxf_metadata_timecode_component,
3152 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3155 mxf_metadata_timecode_component_handle_tag (MXFMetadataBase * metadata,
3156 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3159 MXFMetadataTimecodeComponent *self =
3160 MXF_METADATA_TIMECODE_COMPONENT (metadata);
3161 gboolean ret = TRUE;
3167 self->rounded_timecode_base = GST_READ_UINT16_BE (tag_data);
3168 GST_DEBUG (" rounded timecode base = %u", self->rounded_timecode_base);
3173 self->start_timecode = GST_READ_UINT64_BE (tag_data);
3174 GST_DEBUG (" start timecode = %" G_GINT64_FORMAT, self->start_timecode);
3179 self->drop_frame = (GST_READ_UINT8 (tag_data) != 0);
3180 GST_DEBUG (" drop frame = %s", (self->drop_frame) ? "yes" : "no");
3184 MXF_METADATA_BASE_CLASS
3185 (mxf_metadata_timecode_component_parent_class)->handle_tag (metadata,
3186 primer, tag, tag_data, tag_size);
3194 GST_ERROR ("Invalid timecode component local tag 0x%04x of size %u", tag,
3200 static GstStructure *
3201 mxf_metadata_timecode_component_to_structure (MXFMetadataBase * m)
3204 MXF_METADATA_BASE_CLASS
3205 (mxf_metadata_timecode_component_parent_class)->to_structure (m);
3206 MXFMetadataTimecodeComponent *self = MXF_METADATA_TIMECODE_COMPONENT (m);
3208 gst_structure_id_set (ret, MXF_QUARK (START_TIMECODE), G_TYPE_INT64,
3209 self->start_timecode, MXF_QUARK (ROUNDED_TIMECODE_BASE), G_TYPE_UINT,
3210 self->rounded_timecode_base, MXF_QUARK (DROP_FRAME), G_TYPE_BOOLEAN,
3211 self->drop_frame, NULL);
3217 mxf_metadata_timecode_component_write_tags (MXFMetadataBase * m,
3218 MXFPrimerPack * primer)
3220 MXFMetadataTimecodeComponent *self = MXF_METADATA_TIMECODE_COMPONENT (m);
3222 MXF_METADATA_BASE_CLASS
3223 (mxf_metadata_timecode_component_parent_class)->write_tags (m, primer);
3226 t = g_slice_new0 (MXFLocalTag);
3227 memcpy (&t->ul, MXF_UL (ROUNDED_TIMECODE_BASE), 16);
3229 t->data = g_slice_alloc (t->size);
3231 GST_WRITE_UINT16_BE (t->data, self->rounded_timecode_base);
3232 mxf_primer_pack_add_mapping (primer, 0x1502, &t->ul);
3233 ret = g_list_prepend (ret, t);
3235 t = g_slice_new0 (MXFLocalTag);
3236 memcpy (&t->ul, MXF_UL (START_TIMECODE), 16);
3238 t->data = g_slice_alloc (t->size);
3240 GST_WRITE_UINT64_BE (t->data, self->start_timecode);
3241 mxf_primer_pack_add_mapping (primer, 0x1501, &t->ul);
3242 ret = g_list_prepend (ret, t);
3244 t = g_slice_new0 (MXFLocalTag);
3245 memcpy (&t->ul, MXF_UL (DROP_FRAME), 16);
3247 t->data = g_slice_alloc (t->size);
3249 GST_WRITE_UINT8 (t->data, (self->drop_frame) ? 1 : 0);
3250 mxf_primer_pack_add_mapping (primer, 0x1503, &t->ul);
3251 ret = g_list_prepend (ret, t);
3257 mxf_metadata_timecode_component_init (MXFMetadataTimecodeComponent * self)
3263 mxf_metadata_timecode_component_class_init (MXFMetadataTimecodeComponentClass *
3266 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3267 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3269 metadata_base_class->handle_tag = mxf_metadata_timecode_component_handle_tag;
3270 metadata_base_class->name_quark = MXF_QUARK (TIMECODE_COMPONENT);
3271 metadata_base_class->to_structure =
3272 mxf_metadata_timecode_component_to_structure;
3273 metadata_base_class->write_tags = mxf_metadata_timecode_component_write_tags;
3274 metadata_class->type = 0x0114;
3277 G_DEFINE_TYPE (MXFMetadataSourceClip, mxf_metadata_source_clip,
3278 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3281 mxf_metadata_source_clip_handle_tag (MXFMetadataBase * metadata,
3282 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3285 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (metadata);
3286 gboolean ret = TRUE;
3287 #ifndef GST_DISABLE_GST_DEBUG
3296 self->start_position = GST_READ_UINT64_BE (tag_data);
3297 GST_DEBUG (" start position = %" G_GINT64_FORMAT, self->start_position);
3303 memcpy (&self->source_package_id, tag_data, 32);
3304 GST_DEBUG (" source package id = %s",
3305 mxf_umid_to_string (&self->source_package_id, str));
3311 self->source_track_id = GST_READ_UINT32_BE (tag_data);
3312 GST_DEBUG (" source track id = %u", self->source_track_id);
3316 MXF_METADATA_BASE_CLASS
3317 (mxf_metadata_source_clip_parent_class)->handle_tag (metadata, primer,
3318 tag, tag_data, tag_size);
3326 GST_ERROR ("Invalid source clip local tag 0x%04x of size %u", tag, tag_size);
3332 mxf_metadata_source_clip_resolve (MXFMetadataBase * m, GHashTable * metadata)
3334 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3335 MXFMetadataBase *current = NULL;
3336 GHashTableIter iter;
3338 g_hash_table_iter_init (&iter, metadata);
3340 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & current)) {
3341 if (MXF_IS_METADATA_SOURCE_PACKAGE (current)) {
3342 MXFMetadataGenericPackage *p = MXF_METADATA_GENERIC_PACKAGE (current);
3344 if (mxf_umid_is_equal (&p->package_uid, &self->source_package_id)) {
3345 self->source_package = MXF_METADATA_SOURCE_PACKAGE (current);
3352 MXF_METADATA_BASE_CLASS (mxf_metadata_source_clip_parent_class)->resolve
3356 static GstStructure *
3357 mxf_metadata_source_clip_to_structure (MXFMetadataBase * m)
3360 MXF_METADATA_BASE_CLASS
3361 (mxf_metadata_source_clip_parent_class)->to_structure (m);
3362 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3365 mxf_umid_to_string (&self->source_package_id, str);
3366 gst_structure_id_set (ret, MXF_QUARK (START_POSITION), G_TYPE_INT64,
3367 self->start_position, MXF_QUARK (SOURCE_PACKAGE), G_TYPE_STRING, str,
3368 MXF_QUARK (SOURCE_TRACK_ID), G_TYPE_UINT, self->source_track_id, NULL);
3374 mxf_metadata_source_clip_write_tags (MXFMetadataBase * m,
3375 MXFPrimerPack * primer)
3377 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3379 MXF_METADATA_BASE_CLASS
3380 (mxf_metadata_source_clip_parent_class)->write_tags (m, primer);
3383 t = g_slice_new0 (MXFLocalTag);
3384 memcpy (&t->ul, MXF_UL (START_POSITION), 16);
3386 t->data = g_slice_alloc (t->size);
3388 GST_WRITE_UINT64_BE (t->data, self->start_position);
3389 mxf_primer_pack_add_mapping (primer, 0x1201, &t->ul);
3390 ret = g_list_prepend (ret, t);
3392 t = g_slice_new0 (MXFLocalTag);
3393 memcpy (&t->ul, MXF_UL (SOURCE_PACKAGE_ID), 16);
3395 t->data = g_slice_alloc (t->size);
3397 memcpy (t->data, &self->source_package_id, 32);
3398 mxf_primer_pack_add_mapping (primer, 0x1101, &t->ul);
3399 ret = g_list_prepend (ret, t);
3401 t = g_slice_new0 (MXFLocalTag);
3402 memcpy (&t->ul, MXF_UL (SOURCE_TRACK_ID), 16);
3404 t->data = g_slice_alloc (t->size);
3406 GST_WRITE_UINT32_BE (t->data, self->source_track_id);
3407 mxf_primer_pack_add_mapping (primer, 0x1102, &t->ul);
3408 ret = g_list_prepend (ret, t);
3414 mxf_metadata_source_clip_init (MXFMetadataSourceClip * self)
3420 mxf_metadata_source_clip_class_init (MXFMetadataSourceClipClass * klass)
3422 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3423 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3425 metadata_base_class->handle_tag = mxf_metadata_source_clip_handle_tag;
3426 metadata_base_class->resolve = mxf_metadata_source_clip_resolve;
3427 metadata_base_class->name_quark = MXF_QUARK (SOURCE_CLIP);
3428 metadata_base_class->to_structure = mxf_metadata_source_clip_to_structure;
3429 metadata_base_class->write_tags = mxf_metadata_source_clip_write_tags;
3430 metadata_class->type = 0x0111;
3433 G_DEFINE_TYPE (MXFMetadataDMSourceClip, mxf_metadata_dm_source_clip,
3434 MXF_TYPE_METADATA_SOURCE_CLIP);
3437 mxf_metadata_dm_source_clip_finalize (GstMiniObject * object)
3439 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (object);
3441 g_free (self->track_ids);
3442 self->track_ids = NULL;
3444 GST_MINI_OBJECT_CLASS (mxf_metadata_dm_source_clip_parent_class)->finalize
3449 mxf_metadata_dm_source_clip_handle_tag (MXFMetadataBase * metadata,
3450 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3453 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (metadata);
3454 gboolean ret = TRUE;
3465 len = GST_READ_UINT32_BE (tag_data);
3466 GST_DEBUG (" number of track ids = %u", len);
3470 if (GST_READ_UINT32_BE (tag_data + 4) != 4)
3473 if (tag_size < 8 + 4 * len)
3479 self->n_track_ids = len;
3480 self->track_ids = g_new0 (guint32, len);
3482 for (i = 0; i < len; i++) {
3483 self->track_ids[i] = GST_READ_UINT32_BE (tag_data);
3484 GST_DEBUG (" track id %u = %u", i, self->track_ids[i]);
3492 MXF_METADATA_BASE_CLASS
3493 (mxf_metadata_dm_source_clip_parent_class)->handle_tag (metadata,
3494 primer, tag, tag_data, tag_size);
3502 GST_ERROR ("Invalid DM source clip local tag 0x%04x of size %u", tag,
3508 static GstStructure *
3509 mxf_metadata_dm_source_clip_to_structure (MXFMetadataBase * m)
3512 MXF_METADATA_BASE_CLASS
3513 (mxf_metadata_dm_source_clip_parent_class)->to_structure (m);
3514 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (m);
3517 if (self->n_track_ids > 0) {
3522 g_value_init (&arr, GST_TYPE_ARRAY);
3524 for (i = 0; i < self->n_track_ids; i++) {
3525 g_value_init (&val, G_TYPE_UINT);
3527 g_value_set_uint (&val, self->track_ids[i]);
3528 gst_value_array_append_value (&arr, &val);
3529 g_value_unset (&val);
3532 if (gst_value_array_get_size (&arr) > 0)
3533 gst_structure_id_set_value (ret, MXF_QUARK (TRACK_IDS), &arr);
3535 g_value_unset (&arr);
3542 mxf_metadata_dm_source_clip_write_tags (MXFMetadataBase * m,
3543 MXFPrimerPack * primer)
3545 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (m);
3547 MXF_METADATA_BASE_CLASS
3548 (mxf_metadata_dm_source_clip_parent_class)->write_tags (m, primer);
3551 if (self->track_ids) {
3554 t = g_slice_new0 (MXFLocalTag);
3555 memcpy (&t->ul, MXF_UL (DM_SOURCECLIP_TRACK_IDS), 16);
3556 t->size = 8 + 4 * self->n_track_ids;
3557 t->data = g_slice_alloc (t->size);
3559 GST_WRITE_UINT32_BE (t->data, self->n_track_ids);
3560 GST_WRITE_UINT32_BE (t->data + 4, 4);
3561 for (i = 0; i < self->n_track_ids; i++)
3562 GST_WRITE_UINT32_BE (t->data + 8 + i * 4, self->track_ids[i]);
3563 mxf_primer_pack_add_mapping (primer, 0x6103, &t->ul);
3564 ret = g_list_prepend (ret, t);
3571 mxf_metadata_dm_source_clip_init (MXFMetadataDMSourceClip * self)
3577 mxf_metadata_dm_source_clip_class_init (MXFMetadataDMSourceClipClass * klass)
3579 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3580 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
3581 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3583 miniobject_class->finalize = mxf_metadata_dm_source_clip_finalize;
3584 metadata_base_class->handle_tag = mxf_metadata_dm_source_clip_handle_tag;
3585 metadata_base_class->name_quark = MXF_QUARK (DM_SOURCE_CLIP);
3586 metadata_base_class->to_structure = mxf_metadata_dm_source_clip_to_structure;
3587 metadata_base_class->write_tags = mxf_metadata_dm_source_clip_write_tags;
3588 metadata_class->type = 0x0145;
3591 G_DEFINE_TYPE (MXFMetadataDMSegment, mxf_metadata_dm_segment,
3592 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3595 mxf_metadata_dm_segment_finalize (GstMiniObject * object)
3597 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (object);
3599 g_free (self->track_ids);
3600 self->track_ids = NULL;
3602 g_free (self->event_comment);
3603 self->event_comment = NULL;
3605 GST_MINI_OBJECT_CLASS (mxf_metadata_dm_segment_parent_class)->finalize
3610 mxf_metadata_dm_segment_handle_tag (MXFMetadataBase * metadata,
3611 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3614 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (metadata);
3615 gboolean ret = TRUE;
3616 #ifndef GST_DISABLE_GST_DEBUG
3624 self->event_start_position = GST_READ_UINT64_BE (tag_data);
3625 GST_DEBUG (" event start position = %" G_GINT64_FORMAT,
3626 self->event_start_position);
3629 self->event_comment = mxf_utf16_to_utf8 (tag_data, tag_size);
3630 GST_DEBUG (" event comment = %s", GST_STR_NULL (self->event_comment));
3639 len = GST_READ_UINT32_BE (tag_data);
3640 GST_DEBUG (" number of track ids = %u", len);
3644 if (GST_READ_UINT32_BE (tag_data + 4) != 4)
3647 if (len * 4 + 8 < tag_size)
3650 self->n_track_ids = len;
3651 self->track_ids = g_new0 (guint32, len);
3656 for (i = 0; i < len; i++) {
3657 self->track_ids[i] = GST_READ_UINT32_BE (tag_data);
3658 GST_DEBUG (" track id %u = %u", i, self->track_ids[i]);
3668 memcpy (&self->dm_framework_uid, tag_data, 16);
3669 GST_DEBUG (" DM framework = %s",
3670 mxf_uuid_to_string (&self->dm_framework_uid, str));
3674 MXF_METADATA_BASE_CLASS
3675 (mxf_metadata_dm_segment_parent_class)->handle_tag (metadata, primer,
3676 tag, tag_data, tag_size);
3684 GST_ERROR ("Invalid DM segment local tag 0x%04x of size %u", tag, tag_size);
3690 mxf_metadata_dm_segment_resolve (MXFMetadataBase * m, GHashTable * metadata)
3692 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3693 MXFMetadataBase *current = NULL;
3695 current = g_hash_table_lookup (metadata, &self->dm_framework_uid);
3696 if (current && MXF_IS_DESCRIPTIVE_METADATA_FRAMEWORK (current)) {
3697 if (mxf_metadata_base_resolve (current, metadata)) {
3698 self->dm_framework = MXF_DESCRIPTIVE_METADATA_FRAMEWORK (current);
3700 GST_ERROR ("Couldn't resolve DM framework");
3704 GST_ERROR ("Couldn't find DM framework");
3710 MXF_METADATA_BASE_CLASS (mxf_metadata_dm_segment_parent_class)->resolve
3714 static GstStructure *
3715 mxf_metadata_dm_segment_to_structure (MXFMetadataBase * m)
3718 MXF_METADATA_BASE_CLASS
3719 (mxf_metadata_dm_segment_parent_class)->to_structure (m);
3720 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3723 gst_structure_id_set (ret, MXF_QUARK (EVENT_START_POSITION), G_TYPE_INT64,
3724 self->event_start_position, NULL);
3726 if (self->event_comment)
3727 gst_structure_id_set (ret, MXF_QUARK (EVENT_COMMENT), G_TYPE_STRING,
3728 self->event_comment, NULL);
3729 /* FIXME: DMS1 doesn't support serializing to a structure yet */
3731 if (self->dm_framework) {
3733 mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->dm_framework));
3735 gst_structure_id_set (ret, MXF_QUARK (DM_FRAMEWORK), GST_TYPE_STRUCTURE,
3737 gst_structure_free (s);
3741 if (self->n_track_ids > 0) {
3746 g_value_init (&arr, GST_TYPE_ARRAY);
3748 for (i = 0; i < self->n_track_ids; i++) {
3749 g_value_init (&val, G_TYPE_UINT);
3751 g_value_set_uint (&val, self->track_ids[i]);
3752 gst_value_array_append_value (&arr, &val);
3753 g_value_unset (&val);
3756 if (gst_value_array_get_size (&arr) > 0)
3757 gst_structure_id_set_value (ret, MXF_QUARK (TRACK_IDS), &arr);
3759 g_value_unset (&arr);
3766 mxf_metadata_dm_segment_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
3768 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3770 MXF_METADATA_BASE_CLASS (mxf_metadata_dm_segment_parent_class)->write_tags
3774 if (self->event_start_position != -1) {
3775 t = g_slice_new0 (MXFLocalTag);
3776 memcpy (&t->ul, MXF_UL (EVENT_START_POSITION), 16);
3778 t->data = g_slice_alloc (t->size);
3780 GST_WRITE_UINT64_BE (t->data, self->event_start_position);
3781 mxf_primer_pack_add_mapping (primer, 0x0601, &t->ul);
3782 ret = g_list_prepend (ret, t);
3785 if (self->event_comment) {
3786 t = g_slice_new0 (MXFLocalTag);
3787 memcpy (&t->ul, MXF_UL (EVENT_COMMENT), 16);
3788 t->data = mxf_utf8_to_utf16 (self->event_comment, &t->size);
3789 mxf_primer_pack_add_mapping (primer, 0x0602, &t->ul);
3790 ret = g_list_prepend (ret, t);
3793 if (self->track_ids) {
3796 t = g_slice_new0 (MXFLocalTag);
3797 memcpy (&t->ul, MXF_UL (DM_SEGMENT_TRACK_IDS), 16);
3798 t->size = 8 + 4 * self->n_track_ids;
3799 t->data = g_slice_alloc (t->size);
3801 GST_WRITE_UINT32_BE (t->data, self->n_track_ids);
3802 GST_WRITE_UINT32_BE (t->data + 4, 4);
3803 for (i = 0; i < self->n_track_ids; i++)
3804 GST_WRITE_UINT32_BE (t->data + 8 + i * 4, self->track_ids[i]);
3805 mxf_primer_pack_add_mapping (primer, 0x6102, &t->ul);
3806 ret = g_list_prepend (ret, t);
3809 if (self->dm_framework) {
3810 t = g_slice_new0 (MXFLocalTag);
3811 memcpy (&t->ul, MXF_UL (DM_FRAMEWORK), 16);
3813 t->data = g_slice_alloc (t->size);
3815 memcpy (t->data, &MXF_METADATA_BASE (self->dm_framework)->instance_uid, 16);
3816 mxf_primer_pack_add_mapping (primer, 0x6101, &t->ul);
3817 ret = g_list_prepend (ret, t);
3824 mxf_metadata_dm_segment_init (MXFMetadataDMSegment * self)
3826 self->event_start_position = -1;
3830 mxf_metadata_dm_segment_class_init (MXFMetadataDMSegmentClass * klass)
3832 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3833 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
3834 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3836 miniobject_class->finalize = mxf_metadata_dm_segment_finalize;
3837 metadata_base_class->handle_tag = mxf_metadata_dm_segment_handle_tag;
3838 metadata_base_class->resolve = mxf_metadata_dm_segment_resolve;
3839 metadata_base_class->name_quark = MXF_QUARK (DM_SEGMENT);
3840 metadata_base_class->to_structure = mxf_metadata_dm_segment_to_structure;
3841 metadata_base_class->write_tags = mxf_metadata_dm_segment_write_tags;
3842 metadata_class->type = 0x0141;
3845 G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericDescriptor,
3846 mxf_metadata_generic_descriptor, MXF_TYPE_METADATA);
3849 mxf_metadata_generic_descriptor_finalize (GstMiniObject * object)
3851 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (object);
3853 g_free (self->locators_uids);
3854 self->locators_uids = NULL;
3856 g_free (self->locators);
3857 self->locators = NULL;
3859 GST_MINI_OBJECT_CLASS (mxf_metadata_generic_descriptor_parent_class)->finalize
3864 mxf_metadata_generic_descriptor_handle_tag (MXFMetadataBase * metadata,
3865 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3868 MXFMetadataGenericDescriptor *self =
3869 MXF_METADATA_GENERIC_DESCRIPTOR (metadata);
3870 gboolean ret = TRUE;
3871 #ifndef GST_DISABLE_GST_DEBUG
3877 if (!mxf_uuid_array_parse (&self->locators_uids, &self->n_locators,
3878 tag_data, tag_size))
3881 GST_DEBUG (" number of locators = %u", self->n_locators);
3882 #ifndef GST_DISABLE_GST_DEBUG
3885 for (i = 0; i < self->n_locators; i++) {
3886 GST_DEBUG (" locator %u = %s", i,
3887 mxf_uuid_to_string (&self->locators_uids[i], str));
3894 MXF_METADATA_BASE_CLASS
3895 (mxf_metadata_generic_descriptor_parent_class)->handle_tag (metadata,
3896 primer, tag, tag_data, tag_size);
3904 GST_ERROR ("Invalid generic descriptor local tag 0x%04x of size %u", tag,
3911 mxf_metadata_generic_descriptor_resolve (MXFMetadataBase * m,
3912 GHashTable * metadata)
3914 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3915 MXFMetadataBase *current = NULL;
3917 gboolean have_locator = FALSE;
3920 memset (self->locators, 0, sizeof (gpointer) * self->n_locators);
3922 self->locators = g_new0 (MXFMetadataLocator *, self->n_locators);
3923 for (i = 0; i < self->n_locators; i++) {
3924 current = g_hash_table_lookup (metadata, &self->locators_uids[i]);
3925 if (current && MXF_IS_METADATA_LOCATOR (current)) {
3926 if (mxf_metadata_base_resolve (current, metadata)) {
3927 self->locators[i] = MXF_METADATA_LOCATOR (current);
3928 have_locator = TRUE;
3930 GST_ERROR ("Couldn't resolve locator");
3933 GST_ERROR ("Locator not found");
3937 if (!have_locator && self->n_locators > 0) {
3938 GST_ERROR ("Couldn't resolve a locator");
3943 MXF_METADATA_BASE_CLASS
3944 (mxf_metadata_generic_descriptor_parent_class)->resolve (m, metadata);
3947 static GstStructure *
3948 mxf_metadata_generic_descriptor_to_structure (MXFMetadataBase * m)
3951 MXF_METADATA_BASE_CLASS
3952 (mxf_metadata_generic_descriptor_parent_class)->to_structure (m);
3953 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3956 if (self->n_locators > 0) {
3961 g_value_init (&arr, GST_TYPE_ARRAY);
3963 for (i = 0; i < self->n_locators; i++) {
3966 if (self->locators[i] == NULL)
3969 g_value_init (&val, GST_TYPE_STRUCTURE);
3971 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->locators
3973 gst_value_set_structure (&val, s);
3974 gst_structure_free (s);
3975 gst_value_array_append_value (&arr, &val);
3976 g_value_unset (&val);
3979 if (gst_value_array_get_size (&arr) > 0)
3980 gst_structure_id_set_value (ret, MXF_QUARK (LOCATORS), &arr);
3982 g_value_unset (&arr);
3989 mxf_metadata_generic_descriptor_write_tags (MXFMetadataBase * m,
3990 MXFPrimerPack * primer)
3992 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3994 MXF_METADATA_BASE_CLASS
3995 (mxf_metadata_generic_descriptor_parent_class)->write_tags (m, primer);
3998 if (self->locators) {
4001 t = g_slice_new0 (MXFLocalTag);
4002 memcpy (&t->ul, MXF_UL (LOCATORS), 16);
4003 t->size = 8 + 16 * self->n_locators;;
4004 t->data = g_slice_alloc0 (t->size);
4006 GST_WRITE_UINT32_BE (t->data, self->n_locators);
4007 GST_WRITE_UINT32_BE (t->data + 4, 16);
4008 for (i = 0; i < self->n_locators; i++) {
4009 if (!self->locators[i])
4011 memcpy (t->data + 8 + 16 * i,
4012 &MXF_METADATA_BASE (self->locators[i])->instance_uid, 16);
4014 mxf_primer_pack_add_mapping (primer, 0x2f01, &t->ul);
4015 ret = g_list_prepend (ret, t);
4022 mxf_metadata_generic_descriptor_init (MXFMetadataGenericDescriptor * self)
4028 mxf_metadata_generic_descriptor_class_init (MXFMetadataGenericDescriptorClass *
4031 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4032 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
4034 miniobject_class->finalize = mxf_metadata_generic_descriptor_finalize;
4035 metadata_base_class->handle_tag = mxf_metadata_generic_descriptor_handle_tag;
4036 metadata_base_class->resolve = mxf_metadata_generic_descriptor_resolve;
4037 metadata_base_class->to_structure =
4038 mxf_metadata_generic_descriptor_to_structure;
4039 metadata_base_class->write_tags = mxf_metadata_generic_descriptor_write_tags;
4042 G_DEFINE_TYPE (MXFMetadataFileDescriptor, mxf_metadata_file_descriptor,
4043 MXF_TYPE_METADATA_GENERIC_DESCRIPTOR);
4046 mxf_metadata_file_descriptor_handle_tag (MXFMetadataBase * metadata,
4047 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4050 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (metadata);
4051 gboolean ret = TRUE;
4052 #ifndef GST_DISABLE_GST_DEBUG
4060 self->linked_track_id = GST_READ_UINT32_BE (tag_data);
4061 GST_DEBUG (" linked track id = %u", self->linked_track_id);
4064 if (!mxf_fraction_parse (&self->sample_rate, tag_data, tag_size))
4066 GST_DEBUG (" sample rate = %d/%d", self->sample_rate.n,
4067 self->sample_rate.d);
4072 self->container_duration = GST_READ_UINT64_BE (tag_data);
4073 GST_DEBUG (" container duration = %" G_GINT64_FORMAT,
4074 self->container_duration);
4079 memcpy (&self->essence_container, tag_data, 16);
4080 GST_DEBUG (" essence container = %s",
4081 mxf_ul_to_string (&self->essence_container, str));
4086 memcpy (&self->codec, tag_data, 16);
4087 GST_DEBUG (" codec = %s", mxf_ul_to_string (&self->codec, str));
4091 MXF_METADATA_BASE_CLASS
4092 (mxf_metadata_file_descriptor_parent_class)->handle_tag (metadata,
4093 primer, tag, tag_data, tag_size);
4101 GST_ERROR ("Invalid file descriptor local tag 0x%04x of size %u", tag,
4107 static GstStructure *
4108 mxf_metadata_file_descriptor_to_structure (MXFMetadataBase * m)
4111 MXF_METADATA_BASE_CLASS
4112 (mxf_metadata_file_descriptor_parent_class)->to_structure (m);
4113 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (m);
4116 if (self->linked_track_id)
4117 gst_structure_id_set (ret, MXF_QUARK (LINKED_TRACK_ID), G_TYPE_UINT,
4118 self->linked_track_id, NULL);
4120 if (self->sample_rate.n && self->sample_rate.d)
4121 gst_structure_id_set (ret, MXF_QUARK (SAMPLE_RATE), GST_TYPE_FRACTION,
4122 self->sample_rate.n, self->sample_rate.d, NULL);
4124 if (self->container_duration)
4125 gst_structure_id_set (ret, MXF_QUARK (CONTAINER_DURATION), G_TYPE_INT64,
4126 self->container_duration, NULL);
4128 mxf_ul_to_string (&self->essence_container, str);
4129 gst_structure_id_set (ret, MXF_QUARK (ESSENCE_CONTAINER), G_TYPE_STRING, str,
4132 if (!mxf_ul_is_zero (&self->codec)) {
4133 mxf_ul_to_string (&self->codec, str);
4134 gst_structure_id_set (ret, MXF_QUARK (CODEC), G_TYPE_STRING, str, NULL);
4141 mxf_metadata_file_descriptor_write_tags (MXFMetadataBase * m,
4142 MXFPrimerPack * primer)
4144 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (m);
4146 MXF_METADATA_BASE_CLASS
4147 (mxf_metadata_file_descriptor_parent_class)->write_tags (m, primer);
4150 if (self->linked_track_id) {
4151 t = g_slice_new0 (MXFLocalTag);
4152 memcpy (&t->ul, MXF_UL (LINKED_TRACK_ID), 16);
4154 t->data = g_slice_alloc (t->size);
4156 GST_WRITE_UINT32_BE (t->data, self->linked_track_id);
4157 mxf_primer_pack_add_mapping (primer, 0x3006, &t->ul);
4158 ret = g_list_prepend (ret, t);
4161 t = g_slice_new0 (MXFLocalTag);
4162 memcpy (&t->ul, MXF_UL (SAMPLE_RATE), 16);
4164 t->data = g_slice_alloc (t->size);
4166 GST_WRITE_UINT32_BE (t->data, self->sample_rate.n);
4167 GST_WRITE_UINT32_BE (t->data + 4, self->sample_rate.d);
4168 mxf_primer_pack_add_mapping (primer, 0x3001, &t->ul);
4169 ret = g_list_prepend (ret, t);
4171 if (self->container_duration > 0) {
4172 t = g_slice_new0 (MXFLocalTag);
4173 memcpy (&t->ul, MXF_UL (CONTAINER_DURATION), 16);
4175 t->data = g_slice_alloc (t->size);
4177 GST_WRITE_UINT64_BE (t->data, self->container_duration);
4178 mxf_primer_pack_add_mapping (primer, 0x3002, &t->ul);
4179 ret = g_list_prepend (ret, t);
4182 t = g_slice_new0 (MXFLocalTag);
4183 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINER), 16);
4185 t->data = g_slice_alloc (t->size);
4187 memcpy (t->data, &self->essence_container, 16);
4188 mxf_primer_pack_add_mapping (primer, 0x3004, &t->ul);
4189 ret = g_list_prepend (ret, t);
4191 if (!mxf_ul_is_zero (&self->codec)) {
4192 t = g_slice_new0 (MXFLocalTag);
4193 memcpy (&t->ul, MXF_UL (CODEC), 16);
4195 t->data = g_slice_alloc (t->size);
4197 memcpy (t->data, &self->codec, 16);
4198 mxf_primer_pack_add_mapping (primer, 0x3005, &t->ul);
4199 ret = g_list_prepend (ret, t);
4206 mxf_metadata_file_descriptor_init (MXFMetadataFileDescriptor * self)
4212 mxf_metadata_file_descriptor_class_init (MXFMetadataFileDescriptorClass * klass)
4214 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4215 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
4217 metadata_base_class->handle_tag = mxf_metadata_file_descriptor_handle_tag;
4218 metadata_base_class->name_quark = MXF_QUARK (FILE_DESCRIPTOR);
4219 metadata_base_class->to_structure = mxf_metadata_file_descriptor_to_structure;
4220 metadata_base_class->write_tags = mxf_metadata_file_descriptor_write_tags;
4221 metadata_class->type = 0x0125;
4224 G_DEFINE_TYPE (MXFMetadataGenericPictureEssenceDescriptor,
4225 mxf_metadata_generic_picture_essence_descriptor,
4226 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
4229 mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataBase *
4230 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4233 MXFMetadataGenericPictureEssenceDescriptor *self =
4234 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (metadata);
4235 gboolean ret = TRUE;
4236 #ifndef GST_DISABLE_GST_DEBUG
4244 self->signal_standard = GST_READ_UINT8 (tag_data);
4245 GST_DEBUG (" signal standard = %u", self->signal_standard);
4250 self->frame_layout = GST_READ_UINT8 (tag_data);
4251 GST_DEBUG (" frame layout = %u", self->frame_layout);
4256 self->stored_width = GST_READ_UINT32_BE (tag_data);
4257 GST_DEBUG (" stored width = %u", self->stored_width);
4262 self->stored_height = GST_READ_UINT32_BE (tag_data);
4263 GST_DEBUG (" stored height = %u", self->stored_height);
4268 self->stored_f2_offset = GST_READ_UINT32_BE (tag_data);
4269 GST_DEBUG (" stored f2 offset = %d", self->stored_f2_offset);
4274 self->sampled_width = GST_READ_UINT32_BE (tag_data);
4275 GST_DEBUG (" sampled width = %u", self->sampled_width);
4280 self->sampled_height = GST_READ_UINT32_BE (tag_data);
4281 GST_DEBUG (" sampled height = %u", self->sampled_height);
4286 self->sampled_x_offset = GST_READ_UINT32_BE (tag_data);
4287 GST_DEBUG (" sampled x offset = %d", self->sampled_x_offset);
4292 self->sampled_y_offset = GST_READ_UINT32_BE (tag_data);
4293 GST_DEBUG (" sampled y offset = %d", self->sampled_y_offset);
4298 self->display_height = GST_READ_UINT32_BE (tag_data);
4299 GST_DEBUG (" display height = %u", self->display_height);
4304 self->display_width = GST_READ_UINT32_BE (tag_data);
4305 GST_DEBUG (" display width = %u", self->display_width);
4310 self->display_x_offset = GST_READ_UINT32_BE (tag_data);
4311 GST_DEBUG (" display x offset = %d", self->display_x_offset);
4316 self->display_y_offset = GST_READ_UINT32_BE (tag_data);
4317 GST_DEBUG (" display y offset = %d", self->display_y_offset);
4322 self->display_f2_offset = GST_READ_UINT32_BE (tag_data);
4323 GST_DEBUG (" display f2 offset = %d", self->display_f2_offset);
4326 if (!mxf_fraction_parse (&self->aspect_ratio, tag_data, tag_size))
4328 GST_DEBUG (" aspect ratio = %d/%d", self->aspect_ratio.n,
4329 self->aspect_ratio.d);
4334 self->active_format_descriptor = GST_READ_UINT8 (tag_data);
4335 GST_DEBUG (" active format descriptor = %u",
4336 self->active_format_descriptor);
4342 if (GST_READ_UINT32_BE (tag_data) == 0)
4345 if (GST_READ_UINT32_BE (tag_data) != 2 &&
4346 GST_READ_UINT32_BE (tag_data + 4) != 4)
4352 self->video_line_map[0] = GST_READ_UINT32_BE (tag_data + 8);
4353 self->video_line_map[1] = GST_READ_UINT32_BE (tag_data + 12);
4354 GST_DEBUG (" video line map = {%i, %i}", self->video_line_map[0],
4355 self->video_line_map[1]);
4360 self->alpha_transparency = GST_READ_UINT8 (tag_data);
4361 GST_DEBUG (" alpha transparency = %u", self->alpha_transparency);
4366 memcpy (&self->capture_gamma, tag_data, 16);
4367 GST_DEBUG (" capture gamma = %s",
4368 mxf_ul_to_string (&self->capture_gamma, str));
4373 self->image_alignment_offset = GST_READ_UINT32_BE (tag_data);
4374 GST_DEBUG (" image alignment offset = %u", self->image_alignment_offset);
4379 self->image_start_offset = GST_READ_UINT32_BE (tag_data);
4380 GST_DEBUG (" image start offset = %u", self->image_start_offset);
4385 self->image_end_offset = GST_READ_UINT32_BE (tag_data);
4386 GST_DEBUG (" image end offset = %u", self->image_end_offset);
4391 self->field_dominance = GST_READ_UINT8 (tag_data);
4392 GST_DEBUG (" field dominance = %u", self->field_dominance);
4397 memcpy (&self->picture_essence_coding, tag_data, 16);
4398 GST_DEBUG (" picture essence coding = %s",
4399 mxf_ul_to_string (&self->picture_essence_coding, str));
4403 MXF_METADATA_BASE_CLASS
4404 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->handle_tag
4405 (metadata, primer, tag, tag_data, tag_size);
4414 ("Invalid generic picture essence descriptor local tag 0x%04x of size %u",
4420 static GstStructure *
4421 mxf_metadata_generic_picture_essence_descriptor_to_structure (MXFMetadataBase *
4425 MXF_METADATA_BASE_CLASS
4426 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->to_structure
4428 MXFMetadataGenericPictureEssenceDescriptor *self =
4429 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (m);
4432 gst_structure_id_set (ret, MXF_QUARK (SIGNAL_STANDARD), G_TYPE_UCHAR,
4433 self->signal_standard, NULL);
4435 if (self->frame_layout != 255)
4436 gst_structure_id_set (ret, MXF_QUARK (FRAME_LAYOUT), G_TYPE_UCHAR,
4437 self->frame_layout, NULL);
4439 if (self->stored_width != 0 && self->stored_height != 0)
4440 gst_structure_id_set (ret, MXF_QUARK (STORED_WIDTH), G_TYPE_UINT,
4441 self->stored_width, MXF_QUARK (STORED_HEIGHT), G_TYPE_UINT,
4442 self->stored_height, NULL);
4444 if (self->stored_f2_offset != 0)
4445 gst_structure_id_set (ret, MXF_QUARK (STORED_F2_OFFSET), G_TYPE_INT,
4446 self->stored_f2_offset, NULL);
4448 if (self->sampled_width != 0 && self->sampled_height != 0)
4449 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_WIDTH), G_TYPE_UINT,
4450 self->sampled_width, MXF_QUARK (SAMPLED_HEIGHT), G_TYPE_UINT,
4451 self->sampled_height, NULL);
4453 if (self->sampled_x_offset != 0)
4454 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_X_OFFSET), G_TYPE_INT,
4455 self->sampled_x_offset, NULL);
4457 if (self->sampled_y_offset != 0)
4458 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_Y_OFFSET), G_TYPE_INT,
4459 self->sampled_y_offset, NULL);
4461 if (self->display_width != 0 && self->display_height != 0)
4462 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_WIDTH), G_TYPE_UINT,
4463 self->display_width, MXF_QUARK (DISPLAY_HEIGHT), G_TYPE_UINT,
4464 self->display_height, NULL);
4466 if (self->display_x_offset != 0)
4467 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_X_OFFSET), G_TYPE_INT,
4468 self->display_x_offset, NULL);
4470 if (self->display_y_offset != 0)
4471 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_Y_OFFSET), G_TYPE_INT,
4472 self->display_y_offset, NULL);
4474 if (self->display_f2_offset != 0)
4475 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_F2_OFFSET), G_TYPE_INT,
4476 self->display_f2_offset, NULL);
4478 if (self->aspect_ratio.n != 0 && self->aspect_ratio.d != 0)
4479 gst_structure_id_set (ret, MXF_QUARK (ASPECT_RATIO), GST_TYPE_FRACTION,
4480 self->aspect_ratio.n, self->aspect_ratio.d, NULL);
4482 if (self->active_format_descriptor)
4483 gst_structure_id_set (ret, MXF_QUARK (ACTIVE_FORMAT_DESCRIPTOR),
4484 G_TYPE_UCHAR, self->active_format_descriptor, NULL);
4486 if (self->video_line_map[0] != 0 && self->video_line_map[1] != 0)
4487 gst_structure_id_set (ret, MXF_QUARK (VIDEO_LINE_MAP_0), G_TYPE_UINT,
4488 self->video_line_map[0], MXF_QUARK (VIDEO_LINE_MAP_1), G_TYPE_UINT,
4489 self->video_line_map[1], NULL);
4491 if (self->alpha_transparency != 0)
4492 gst_structure_id_set (ret, MXF_QUARK (ALPHA_TRANSPARENCY), G_TYPE_UCHAR,
4493 self->alpha_transparency, NULL);
4495 if (!mxf_ul_is_zero (&self->capture_gamma)) {
4496 mxf_ul_to_string (&self->capture_gamma, str);
4497 gst_structure_id_set (ret, MXF_QUARK (CAPTURE_GAMMA), G_TYPE_STRING, str,
4501 if (self->image_alignment_offset != 0)
4502 gst_structure_id_set (ret, MXF_QUARK (IMAGE_ALIGNMENT_OFFSET), G_TYPE_UINT,
4503 self->image_alignment_offset, NULL);
4505 if (self->image_start_offset != 0)
4506 gst_structure_id_set (ret, MXF_QUARK (IMAGE_START_OFFSET), G_TYPE_UINT,
4507 self->image_start_offset, NULL);
4509 if (self->image_end_offset != 0)
4510 gst_structure_id_set (ret, MXF_QUARK (IMAGE_END_OFFSET), G_TYPE_UINT,
4511 self->image_end_offset, NULL);
4513 if (self->field_dominance != 0)
4514 gst_structure_id_set (ret, MXF_QUARK (FIELD_DOMINANCE), G_TYPE_UCHAR,
4515 self->field_dominance, NULL);
4517 if (!mxf_ul_is_zero (&self->picture_essence_coding)) {
4518 mxf_ul_to_string (&self->picture_essence_coding, str);
4519 gst_structure_id_set (ret, MXF_QUARK (PICTURE_ESSENCE_CODING),
4520 G_TYPE_STRING, str, NULL);
4527 mxf_metadata_generic_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
4528 MXFPrimerPack * primer)
4530 MXFMetadataGenericPictureEssenceDescriptor *self =
4531 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (m);
4533 MXF_METADATA_BASE_CLASS
4534 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->write_tags
4538 if (self->signal_standard != 1) {
4539 t = g_slice_new0 (MXFLocalTag);
4540 memcpy (&t->ul, MXF_UL (SIGNAL_STANDARD), 16);
4542 t->data = g_slice_alloc (t->size);
4544 GST_WRITE_UINT8 (t->data, self->signal_standard);
4545 mxf_primer_pack_add_mapping (primer, 0x3215, &t->ul);
4546 ret = g_list_prepend (ret, t);
4549 if (self->frame_layout != 255) {
4550 t = g_slice_new0 (MXFLocalTag);
4551 memcpy (&t->ul, MXF_UL (FRAME_LAYOUT), 16);
4553 t->data = g_slice_alloc (t->size);
4555 GST_WRITE_UINT8 (t->data, self->frame_layout);
4556 mxf_primer_pack_add_mapping (primer, 0x320c, &t->ul);
4557 ret = g_list_prepend (ret, t);
4560 if (self->stored_width != 0) {
4561 t = g_slice_new0 (MXFLocalTag);
4562 memcpy (&t->ul, MXF_UL (STORED_WIDTH), 16);
4564 t->data = g_slice_alloc (t->size);
4566 GST_WRITE_UINT32_BE (t->data, self->stored_width);
4567 mxf_primer_pack_add_mapping (primer, 0x3203, &t->ul);
4568 ret = g_list_prepend (ret, t);
4571 if (self->stored_height != 0) {
4572 t = g_slice_new0 (MXFLocalTag);
4573 memcpy (&t->ul, MXF_UL (STORED_HEIGHT), 16);
4575 t->data = g_slice_alloc (t->size);
4577 GST_WRITE_UINT32_BE (t->data, self->stored_height);
4578 mxf_primer_pack_add_mapping (primer, 0x3202, &t->ul);
4579 ret = g_list_prepend (ret, t);
4582 if (self->stored_f2_offset != 0) {
4583 t = g_slice_new0 (MXFLocalTag);
4584 memcpy (&t->ul, MXF_UL (STORED_F2_OFFSET), 16);
4586 t->data = g_slice_alloc (t->size);
4588 GST_WRITE_UINT32_BE (t->data, self->stored_f2_offset);
4589 mxf_primer_pack_add_mapping (primer, 0x3216, &t->ul);
4590 ret = g_list_prepend (ret, t);
4593 if (self->sampled_width != 0) {
4594 t = g_slice_new0 (MXFLocalTag);
4595 memcpy (&t->ul, MXF_UL (SAMPLED_WIDTH), 16);
4597 t->data = g_slice_alloc (t->size);
4599 GST_WRITE_UINT32_BE (t->data, self->sampled_width);
4600 mxf_primer_pack_add_mapping (primer, 0x3205, &t->ul);
4601 ret = g_list_prepend (ret, t);
4604 if (self->sampled_height != 0) {
4605 t = g_slice_new0 (MXFLocalTag);
4606 memcpy (&t->ul, MXF_UL (SAMPLED_HEIGHT), 16);
4608 t->data = g_slice_alloc (t->size);
4610 GST_WRITE_UINT32_BE (t->data, self->sampled_height);
4611 mxf_primer_pack_add_mapping (primer, 0x3204, &t->ul);
4612 ret = g_list_prepend (ret, t);
4615 if (self->sampled_x_offset != 0) {
4616 t = g_slice_new0 (MXFLocalTag);
4617 memcpy (&t->ul, MXF_UL (SAMPLED_X_OFFSET), 16);
4619 t->data = g_slice_alloc (t->size);
4621 GST_WRITE_UINT32_BE (t->data, self->sampled_x_offset);
4622 mxf_primer_pack_add_mapping (primer, 0x3206, &t->ul);
4623 ret = g_list_prepend (ret, t);
4626 if (self->sampled_y_offset != 0) {
4627 t = g_slice_new0 (MXFLocalTag);
4628 memcpy (&t->ul, MXF_UL (SAMPLED_Y_OFFSET), 16);
4630 t->data = g_slice_alloc (t->size);
4632 GST_WRITE_UINT32_BE (t->data, self->sampled_y_offset);
4633 mxf_primer_pack_add_mapping (primer, 0x3207, &t->ul);
4634 ret = g_list_prepend (ret, t);
4637 if (self->display_height != 0) {
4638 t = g_slice_new0 (MXFLocalTag);
4639 memcpy (&t->ul, MXF_UL (DISPLAY_HEIGHT), 16);
4641 t->data = g_slice_alloc (t->size);
4643 GST_WRITE_UINT32_BE (t->data, self->display_height);
4644 mxf_primer_pack_add_mapping (primer, 0x3208, &t->ul);
4645 ret = g_list_prepend (ret, t);
4648 if (self->display_width != 0) {
4649 t = g_slice_new0 (MXFLocalTag);
4650 memcpy (&t->ul, MXF_UL (DISPLAY_WIDTH), 16);
4652 t->data = g_slice_alloc (t->size);
4654 GST_WRITE_UINT32_BE (t->data, self->display_width);
4655 mxf_primer_pack_add_mapping (primer, 0x3209, &t->ul);
4656 ret = g_list_prepend (ret, t);
4659 if (self->display_x_offset != 0) {
4660 t = g_slice_new0 (MXFLocalTag);
4661 memcpy (&t->ul, MXF_UL (DISPLAY_X_OFFSET), 16);
4663 t->data = g_slice_alloc (t->size);
4665 GST_WRITE_UINT32_BE (t->data, self->display_x_offset);
4666 mxf_primer_pack_add_mapping (primer, 0x320a, &t->ul);
4667 ret = g_list_prepend (ret, t);
4670 if (self->display_y_offset != 0) {
4671 t = g_slice_new0 (MXFLocalTag);
4672 memcpy (&t->ul, MXF_UL (DISPLAY_Y_OFFSET), 16);
4674 t->data = g_slice_alloc (t->size);
4676 GST_WRITE_UINT32_BE (t->data, self->display_y_offset);
4677 mxf_primer_pack_add_mapping (primer, 0x320b, &t->ul);
4678 ret = g_list_prepend (ret, t);
4681 if (self->display_f2_offset != 0) {
4682 t = g_slice_new0 (MXFLocalTag);
4683 memcpy (&t->ul, MXF_UL (DISPLAY_F2_OFFSET), 16);
4685 t->data = g_slice_alloc (t->size);
4687 GST_WRITE_UINT32_BE (t->data, self->display_f2_offset);
4688 mxf_primer_pack_add_mapping (primer, 0x3217, &t->ul);
4689 ret = g_list_prepend (ret, t);
4692 if (self->aspect_ratio.n != 0 && self->aspect_ratio.d != 0) {
4693 t = g_slice_new0 (MXFLocalTag);
4694 memcpy (&t->ul, MXF_UL (ASPECT_RATIO), 16);
4696 t->data = g_slice_alloc (t->size);
4698 GST_WRITE_UINT32_BE (t->data, self->aspect_ratio.n);
4699 GST_WRITE_UINT32_BE (t->data + 4, self->aspect_ratio.d);
4700 mxf_primer_pack_add_mapping (primer, 0x320e, &t->ul);
4701 ret = g_list_prepend (ret, t);
4704 if (self->active_format_descriptor != 0) {
4705 t = g_slice_new0 (MXFLocalTag);
4706 memcpy (&t->ul, MXF_UL (ACTIVE_FORMAT_DESCRIPTOR), 16);
4708 t->data = g_slice_alloc (t->size);
4710 GST_WRITE_UINT8 (t->data, self->active_format_descriptor);
4711 mxf_primer_pack_add_mapping (primer, 0x3218, &t->ul);
4712 ret = g_list_prepend (ret, t);
4715 if (self->video_line_map[0] != 0 || self->video_line_map[1] != 0) {
4716 t = g_slice_new0 (MXFLocalTag);
4717 memcpy (&t->ul, MXF_UL (VIDEO_LINE_MAP), 16);
4719 t->data = g_slice_alloc (t->size);
4721 GST_WRITE_UINT64_BE (t->data, self->video_line_map[0]);
4722 GST_WRITE_UINT64_BE (t->data + 8, self->video_line_map[1]);
4723 mxf_primer_pack_add_mapping (primer, 0x320d, &t->ul);
4724 ret = g_list_prepend (ret, t);
4727 if (self->alpha_transparency != 0) {
4728 t = g_slice_new0 (MXFLocalTag);
4729 memcpy (&t->ul, MXF_UL (ALPHA_TRANSPARENCY), 16);
4731 t->data = g_slice_alloc (t->size);
4733 GST_WRITE_UINT8 (t->data, self->alpha_transparency);
4734 mxf_primer_pack_add_mapping (primer, 0x320f, &t->ul);
4735 ret = g_list_prepend (ret, t);
4738 if (!mxf_ul_is_zero (&self->capture_gamma)) {
4739 t = g_slice_new0 (MXFLocalTag);
4740 memcpy (&t->ul, MXF_UL (CAPTURE_GAMMA), 16);
4742 t->data = g_slice_alloc (t->size);
4744 memcpy (t->data, &self->capture_gamma, 16);
4745 mxf_primer_pack_add_mapping (primer, 0x3210, &t->ul);
4746 ret = g_list_prepend (ret, t);
4749 if (self->image_alignment_offset != 0) {
4750 t = g_slice_new0 (MXFLocalTag);
4751 memcpy (&t->ul, MXF_UL (IMAGE_ALIGNMENT_OFFSET), 16);
4753 t->data = g_slice_alloc (t->size);
4755 GST_WRITE_UINT32_BE (t->data, self->image_alignment_offset);
4756 mxf_primer_pack_add_mapping (primer, 0x3211, &t->ul);
4757 ret = g_list_prepend (ret, t);
4760 if (self->image_start_offset != 0) {
4761 t = g_slice_new0 (MXFLocalTag);
4762 memcpy (&t->ul, MXF_UL (IMAGE_START_OFFSET), 16);
4764 t->data = g_slice_alloc (t->size);
4766 GST_WRITE_UINT32_BE (t->data, self->image_start_offset);
4767 mxf_primer_pack_add_mapping (primer, 0x3213, &t->ul);
4768 ret = g_list_prepend (ret, t);
4771 if (self->image_end_offset != 0) {
4772 t = g_slice_new0 (MXFLocalTag);
4773 memcpy (&t->ul, MXF_UL (IMAGE_END_OFFSET), 16);
4775 t->data = g_slice_alloc (t->size);
4777 GST_WRITE_UINT32_BE (t->data, self->image_end_offset);
4778 mxf_primer_pack_add_mapping (primer, 0x3214, &t->ul);
4779 ret = g_list_prepend (ret, t);
4782 if (self->field_dominance != 0) {
4783 t = g_slice_new0 (MXFLocalTag);
4784 memcpy (&t->ul, MXF_UL (FIELD_DOMINANCE), 16);
4786 t->data = g_slice_alloc (t->size);
4788 GST_WRITE_UINT8 (t->data, self->field_dominance);
4789 mxf_primer_pack_add_mapping (primer, 0x3212, &t->ul);
4790 ret = g_list_prepend (ret, t);
4793 if (!mxf_ul_is_zero (&self->picture_essence_coding)) {
4794 t = g_slice_new0 (MXFLocalTag);
4795 memcpy (&t->ul, MXF_UL (PICTURE_ESSENCE_CODING), 16);
4797 t->data = g_slice_alloc (t->size);
4799 memcpy (t->data, &self->picture_essence_coding, 16);
4800 mxf_primer_pack_add_mapping (primer, 0x3201, &t->ul);
4801 ret = g_list_prepend (ret, t);
4808 mxf_metadata_generic_picture_essence_descriptor_init
4809 (MXFMetadataGenericPictureEssenceDescriptor * self)
4811 self->signal_standard = 1;
4812 self->frame_layout = 255;
4816 mxf_metadata_generic_picture_essence_descriptor_class_init
4817 (MXFMetadataGenericPictureEssenceDescriptorClass * klass)
4819 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4820 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
4822 metadata_base_class->handle_tag =
4823 mxf_metadata_generic_picture_essence_descriptor_handle_tag;
4824 metadata_base_class->name_quark =
4825 MXF_QUARK (GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
4826 metadata_base_class->to_structure =
4827 mxf_metadata_generic_picture_essence_descriptor_to_structure;
4828 metadata_base_class->write_tags =
4829 mxf_metadata_generic_picture_essence_descriptor_write_tags;
4830 metadata_class->type = 0x0127;
4833 void mxf_metadata_generic_picture_essence_descriptor_set_caps
4834 (MXFMetadataGenericPictureEssenceDescriptor * self, GstCaps * caps)
4837 guint width, height;
4838 MXFMetadataFileDescriptor *f = (MXFMetadataFileDescriptor *) self;
4840 g_return_if_fail (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (self));
4841 g_return_if_fail (GST_IS_CAPS (caps));
4843 if (f->sample_rate.d == 0) {
4844 GST_ERROR ("Invalid framerate");
4846 gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, f->sample_rate.n,
4847 f->sample_rate.d, NULL);
4850 width = self->stored_width;
4851 height = self->stored_height;
4853 /* If the video is stored as separate fields the
4854 * height is only the height of one field, i.e.
4855 * half the height of the frame.
4857 * See SMPTE 377M E2.2 and E1.2
4859 if (self->frame_layout == 1 || self->frame_layout == 2
4860 || self->frame_layout == 4) {
4862 gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL);
4865 if (width == 0 || height == 0) {
4866 GST_ERROR ("Invalid width/height");
4870 gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height", G_TYPE_INT,
4873 if (self->aspect_ratio.n == 0 || self->aspect_ratio.d == 0) {
4874 GST_ERROR ("Invalid aspect ratio");
4878 par_n = height * self->aspect_ratio.n;
4879 par_d = width * self->aspect_ratio.d;
4881 gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION,
4882 par_n, par_d, NULL);
4886 gst_greatest_common_divisor (gint a, gint b)
4899 mxf_metadata_generic_picture_essence_descriptor_from_caps
4900 (MXFMetadataGenericPictureEssenceDescriptor * self, GstCaps * caps) {
4901 gint par_n, par_d, gcd;
4904 MXFMetadataFileDescriptor *f = (MXFMetadataFileDescriptor *) self;
4906 gboolean interlaced;
4908 g_return_val_if_fail (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR
4910 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
4912 s = gst_caps_get_structure (caps, 0);
4914 if (!gst_structure_get_boolean (s, "interlaced", &interlaced) || !interlaced)
4915 self->frame_layout = 0;
4917 self->frame_layout = 3;
4919 if (!gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) {
4920 GST_ERROR ("Invalid framerate");
4923 f->sample_rate.n = fps_n;
4924 f->sample_rate.d = fps_d;
4926 if (!gst_structure_get_int (s, "width", &width) ||
4927 !gst_structure_get_int (s, "height", &height)) {
4928 GST_ERROR ("Invalid width/height");
4932 self->stored_width = width;
4933 self->stored_height = height;
4935 if (!gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_n, &par_d)) {
4940 self->aspect_ratio.n = par_n * width;
4941 self->aspect_ratio.d = par_d * height;
4943 gst_greatest_common_divisor (self->aspect_ratio.n, self->aspect_ratio.d);
4944 self->aspect_ratio.n /= gcd;
4945 self->aspect_ratio.d /= gcd;
4951 G_DEFINE_TYPE (MXFMetadataGenericSoundEssenceDescriptor,
4952 mxf_metadata_generic_sound_essence_descriptor,
4953 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
4956 mxf_metadata_generic_sound_essence_descriptor_handle_tag (MXFMetadataBase *
4957 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4960 MXFMetadataGenericSoundEssenceDescriptor *self =
4961 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (metadata);
4962 gboolean ret = TRUE;
4963 #ifndef GST_DISABLE_GST_DEBUG
4969 if (!mxf_fraction_parse (&self->audio_sampling_rate, tag_data, tag_size))
4971 GST_DEBUG (" audio sampling rate = %d/%d",
4972 self->audio_sampling_rate.n, self->audio_sampling_rate.d);
4977 self->locked = (GST_READ_UINT8 (tag_data) != 0);
4978 GST_DEBUG (" locked = %s", (self->locked) ? "yes" : "no");
4983 self->audio_ref_level = GST_READ_UINT8 (tag_data);
4984 GST_DEBUG (" audio ref level = %d", self->audio_ref_level);
4989 self->electro_spatial_formulation = GST_READ_UINT8 (tag_data);
4990 GST_DEBUG (" electro spatial formulation = %u",
4991 self->electro_spatial_formulation);
4996 self->channel_count = GST_READ_UINT32_BE (tag_data);
4997 GST_DEBUG (" channel count = %u", self->channel_count);
5002 self->quantization_bits = GST_READ_UINT32_BE (tag_data);
5003 GST_DEBUG (" quantization bits = %u", self->quantization_bits);
5008 self->dial_norm = GST_READ_UINT8 (tag_data);
5009 GST_DEBUG (" dial norm = %d", self->dial_norm);
5014 memcpy (&self->sound_essence_compression, tag_data, 16);
5015 GST_DEBUG (" sound essence compression = %s",
5016 mxf_ul_to_string (&self->sound_essence_compression, str));
5020 MXF_METADATA_BASE_CLASS
5021 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->handle_tag
5022 (metadata, primer, tag, tag_data, tag_size);
5031 ("Invalid generic sound essence descriptor local tag 0x%04x of size %u",
5037 static GstStructure *
5038 mxf_metadata_generic_sound_essence_descriptor_to_structure (MXFMetadataBase * m)
5041 MXF_METADATA_BASE_CLASS
5042 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->to_structure
5044 MXFMetadataGenericSoundEssenceDescriptor *self =
5045 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (m);
5047 gst_structure_id_set (ret, MXF_QUARK (AUDIO_SAMPLING_RATE), GST_TYPE_FRACTION,
5048 self->audio_sampling_rate.n, self->audio_sampling_rate.d, NULL);
5050 gst_structure_id_set (ret, MXF_QUARK (LOCKED), G_TYPE_BOOLEAN, self->locked,
5053 if (self->electro_spatial_formulation != 0)
5054 gst_structure_id_set (ret, MXF_QUARK (ELECTRO_SPATIAL_FORMULATION),
5055 G_TYPE_UCHAR, self->electro_spatial_formulation, NULL);
5057 if (self->channel_count != 0)
5058 gst_structure_id_set (ret, MXF_QUARK (CHANNEL_COUNT), G_TYPE_UINT,
5059 self->channel_count, NULL);
5061 if (self->quantization_bits != 0)
5062 gst_structure_id_set (ret, MXF_QUARK (QUANTIZATION_BITS), G_TYPE_UINT,
5063 self->quantization_bits, NULL);
5065 if (self->dial_norm != 0)
5066 gst_structure_id_set (ret, MXF_QUARK (DIAL_NORM), G_TYPE_CHAR,
5067 self->dial_norm, NULL);
5069 if (!mxf_ul_is_zero (&self->sound_essence_compression)) {
5072 mxf_ul_to_string (&self->sound_essence_compression, str);
5073 gst_structure_id_set (ret, MXF_QUARK (SOUND_ESSENCE_COMPRESSION),
5074 G_TYPE_STRING, str, NULL);
5081 mxf_metadata_generic_sound_essence_descriptor_write_tags (MXFMetadataBase * m,
5082 MXFPrimerPack * primer)
5084 MXFMetadataGenericSoundEssenceDescriptor *self =
5085 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (m);
5087 MXF_METADATA_BASE_CLASS
5088 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->write_tags
5092 if (self->audio_sampling_rate.d && self->audio_sampling_rate.n) {
5093 t = g_slice_new0 (MXFLocalTag);
5094 memcpy (&t->ul, MXF_UL (AUDIO_SAMPLING_RATE), 16);
5096 t->data = g_slice_alloc (t->size);
5098 GST_WRITE_UINT32_BE (t->data, self->audio_sampling_rate.n);
5099 GST_WRITE_UINT32_BE (t->data + 4, self->audio_sampling_rate.d);
5100 mxf_primer_pack_add_mapping (primer, 0x3d03, &t->ul);
5101 ret = g_list_prepend (ret, t);
5104 t = g_slice_new0 (MXFLocalTag);
5105 memcpy (&t->ul, MXF_UL (LOCKED), 16);
5107 t->data = g_slice_alloc (t->size);
5109 GST_WRITE_UINT8 (t->data, (self->locked) ? 1 : 0);
5110 mxf_primer_pack_add_mapping (primer, 0x3d02, &t->ul);
5111 ret = g_list_prepend (ret, t);
5113 if (self->audio_ref_level) {
5114 t = g_slice_new0 (MXFLocalTag);
5115 memcpy (&t->ul, MXF_UL (AUDIO_REF_LEVEL), 16);
5117 t->data = g_slice_alloc (t->size);
5119 GST_WRITE_UINT8 (t->data, self->audio_ref_level);
5120 mxf_primer_pack_add_mapping (primer, 0x3d04, &t->ul);
5121 ret = g_list_prepend (ret, t);
5124 if (self->electro_spatial_formulation != 255) {
5125 t = g_slice_new0 (MXFLocalTag);
5126 memcpy (&t->ul, MXF_UL (ELECTRO_SPATIAL_FORMULATION), 16);
5128 t->data = g_slice_alloc (t->size);
5130 GST_WRITE_UINT8 (t->data, self->electro_spatial_formulation);
5131 mxf_primer_pack_add_mapping (primer, 0x3d05, &t->ul);
5132 ret = g_list_prepend (ret, t);
5135 if (self->channel_count) {
5136 t = g_slice_new0 (MXFLocalTag);
5137 memcpy (&t->ul, MXF_UL (CHANNEL_COUNT), 16);
5139 t->data = g_slice_alloc (t->size);
5141 GST_WRITE_UINT32_BE (t->data, self->channel_count);
5142 mxf_primer_pack_add_mapping (primer, 0x3d07, &t->ul);
5143 ret = g_list_prepend (ret, t);
5146 if (self->quantization_bits) {
5147 t = g_slice_new0 (MXFLocalTag);
5148 memcpy (&t->ul, MXF_UL (QUANTIZATION_BITS), 16);
5150 t->data = g_slice_alloc (t->size);
5152 GST_WRITE_UINT32_BE (t->data, self->quantization_bits);
5153 mxf_primer_pack_add_mapping (primer, 0x3d01, &t->ul);
5154 ret = g_list_prepend (ret, t);
5157 if (self->dial_norm != 0) {
5158 t = g_slice_new0 (MXFLocalTag);
5159 memcpy (&t->ul, MXF_UL (DIAL_NORM), 16);
5161 t->data = g_slice_alloc (t->size);
5163 GST_WRITE_UINT8 (t->data, self->dial_norm);
5164 mxf_primer_pack_add_mapping (primer, 0x3d0c, &t->ul);
5165 ret = g_list_prepend (ret, t);
5168 if (!mxf_ul_is_zero (&self->sound_essence_compression)) {
5169 t = g_slice_new0 (MXFLocalTag);
5170 memcpy (&t->ul, MXF_UL (SOUND_ESSENCE_COMPRESSION), 16);
5172 t->data = g_slice_alloc (t->size);
5174 memcpy (t->data, &self->sound_essence_compression, 16);
5175 mxf_primer_pack_add_mapping (primer, 0x3d06, &t->ul);
5176 ret = g_list_prepend (ret, t);
5183 mxf_metadata_generic_sound_essence_descriptor_init
5184 (MXFMetadataGenericSoundEssenceDescriptor * self)
5186 self->audio_sampling_rate.n = 48000;
5187 self->audio_sampling_rate.d = 1;
5188 self->electro_spatial_formulation = 255;
5192 mxf_metadata_generic_sound_essence_descriptor_class_init
5193 (MXFMetadataGenericSoundEssenceDescriptorClass * klass)
5195 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5196 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5198 metadata_base_class->handle_tag =
5199 mxf_metadata_generic_sound_essence_descriptor_handle_tag;
5200 metadata_base_class->name_quark =
5201 MXF_QUARK (GENERIC_SOUND_ESSENCE_DESCRIPTOR);
5202 metadata_base_class->to_structure =
5203 mxf_metadata_generic_sound_essence_descriptor_to_structure;
5204 metadata_base_class->write_tags =
5205 mxf_metadata_generic_sound_essence_descriptor_write_tags;
5206 metadata_class->type = 0x0142;
5209 void mxf_metadata_generic_sound_essence_descriptor_set_caps
5210 (MXFMetadataGenericSoundEssenceDescriptor * self, GstCaps * caps)
5212 g_return_if_fail (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (self));
5213 g_return_if_fail (GST_IS_CAPS (caps));
5215 if (self->audio_sampling_rate.n == 0 || self->audio_sampling_rate.d == 0) {
5216 GST_ERROR ("Invalid audio sampling rate");
5218 gst_caps_set_simple (caps,
5220 (gint) (mxf_fraction_to_double (&self->audio_sampling_rate)
5224 if (self->channel_count == 0) {
5225 GST_ERROR ("Invalid number of channels (0)");
5227 gst_caps_set_simple (caps, "channels", G_TYPE_INT, self->channel_count,
5233 mxf_metadata_generic_sound_essence_descriptor_from_caps
5234 (MXFMetadataGenericSoundEssenceDescriptor * self, GstCaps * caps) {
5239 g_return_val_if_fail (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (self),
5241 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
5243 s = gst_caps_get_structure (caps, 0);
5245 if (!gst_structure_get_int (s, "rate", &rate) || rate == 0) {
5246 GST_WARNING ("No samplerate");
5249 self->audio_sampling_rate.n = rate;
5250 self->audio_sampling_rate.d = 1;
5253 if (!gst_structure_get_int (s, "channels", &channels) || channels == 0) {
5254 GST_WARNING ("No channels");
5257 self->channel_count = channels;
5264 G_DEFINE_TYPE (MXFMetadataCDCIPictureEssenceDescriptor,
5265 mxf_metadata_cdci_picture_essence_descriptor,
5266 MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
5269 mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataBase *
5270 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5273 MXFMetadataCDCIPictureEssenceDescriptor *self =
5274 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (metadata);
5275 gboolean ret = TRUE;
5281 self->component_depth = GST_READ_UINT32_BE (tag_data);
5282 GST_DEBUG (" component depth = %u", self->component_depth);
5287 self->horizontal_subsampling = GST_READ_UINT32_BE (tag_data);
5288 GST_DEBUG (" horizontal subsampling = %u", self->horizontal_subsampling);
5293 self->vertical_subsampling = GST_READ_UINT32_BE (tag_data);
5294 GST_DEBUG (" vertical subsampling = %u", self->vertical_subsampling);
5299 self->color_siting = GST_READ_UINT8 (tag_data);
5300 GST_DEBUG (" color siting = %u", self->color_siting);
5305 self->reversed_byte_order = GST_READ_UINT8 (tag_data);
5306 GST_DEBUG (" reversed byte order = %s",
5307 (self->reversed_byte_order) ? "yes" : "no");
5312 self->padding_bits = GST_READ_UINT16_BE (tag_data);
5313 GST_DEBUG (" padding bits = %d", self->padding_bits);
5318 self->alpha_sample_depth = GST_READ_UINT32_BE (tag_data);
5319 GST_DEBUG (" alpha sample depth = %u", self->alpha_sample_depth);
5324 self->black_ref_level = GST_READ_UINT32_BE (tag_data);
5325 GST_DEBUG (" black ref level = %u", self->black_ref_level);
5330 self->white_ref_level = GST_READ_UINT32_BE (tag_data);
5331 GST_DEBUG (" white ref level = %u", self->white_ref_level);
5336 self->color_range = GST_READ_UINT32_BE (tag_data);
5337 GST_DEBUG (" color range = %u", self->color_range);
5341 MXF_METADATA_BASE_CLASS
5342 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->handle_tag
5343 (metadata, primer, tag, tag_data, tag_size);
5352 ("Invalid CDCI picture essence descriptor local tag 0x%04x of size %u",
5358 static GstStructure *
5359 mxf_metadata_cdci_picture_essence_descriptor_to_structure (MXFMetadataBase * m)
5362 MXF_METADATA_BASE_CLASS
5363 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->to_structure
5365 MXFMetadataCDCIPictureEssenceDescriptor *self =
5366 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (m);
5368 if (self->component_depth != 0)
5369 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_DEPTH), G_TYPE_UINT,
5370 self->component_depth, NULL);
5372 if (self->horizontal_subsampling != 0)
5373 gst_structure_id_set (ret, MXF_QUARK (HORIZONTAL_SUBSAMPLING), G_TYPE_UINT,
5374 self->horizontal_subsampling, NULL);
5376 if (self->vertical_subsampling != 0)
5377 gst_structure_id_set (ret, MXF_QUARK (VERTICAL_SUBSAMPLING), G_TYPE_UINT,
5378 self->vertical_subsampling, NULL);
5380 if (self->color_siting != 255)
5381 gst_structure_id_set (ret, MXF_QUARK (COLOR_SITING), G_TYPE_UCHAR,
5382 self->color_siting, NULL);
5384 gst_structure_id_set (ret, MXF_QUARK (REVERSED_BYTE_ORDER), G_TYPE_BOOLEAN,
5385 self->reversed_byte_order, NULL);
5387 if (self->padding_bits != 0)
5388 gst_structure_id_set (ret, MXF_QUARK (PADDING_BITS), G_TYPE_INT,
5389 self->padding_bits, NULL);
5391 if (self->alpha_sample_depth != 0)
5392 gst_structure_id_set (ret, MXF_QUARK (ALPHA_SAMPLE_DEPTH), G_TYPE_UINT,
5393 self->alpha_sample_depth, NULL);
5395 if (self->black_ref_level != 0)
5396 gst_structure_id_set (ret, MXF_QUARK (BLACK_REF_LEVEL), G_TYPE_UINT,
5397 self->black_ref_level, NULL);
5399 if (self->white_ref_level != 0)
5400 gst_structure_id_set (ret, MXF_QUARK (WHITE_REF_LEVEL), G_TYPE_UINT,
5401 self->white_ref_level, NULL);
5403 if (self->color_range != 0)
5404 gst_structure_id_set (ret, MXF_QUARK (COLOR_RANGE), G_TYPE_UINT,
5405 self->color_range, NULL);
5411 mxf_metadata_cdci_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
5412 MXFPrimerPack * primer)
5414 MXFMetadataCDCIPictureEssenceDescriptor *self =
5415 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (m);
5417 MXF_METADATA_BASE_CLASS
5418 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->write_tags
5422 if (self->component_depth) {
5423 t = g_slice_new0 (MXFLocalTag);
5424 memcpy (&t->ul, MXF_UL (COMPONENT_DEPTH), 16);
5426 t->data = g_slice_alloc (t->size);
5428 GST_WRITE_UINT32_BE (t->data, self->component_depth);
5429 mxf_primer_pack_add_mapping (primer, 0x3301, &t->ul);
5430 ret = g_list_prepend (ret, t);
5433 if (self->horizontal_subsampling) {
5434 t = g_slice_new0 (MXFLocalTag);
5435 memcpy (&t->ul, MXF_UL (HORIZONTAL_SUBSAMPLING), 16);
5437 t->data = g_slice_alloc (t->size);
5439 GST_WRITE_UINT32_BE (t->data, self->horizontal_subsampling);
5440 mxf_primer_pack_add_mapping (primer, 0x3302, &t->ul);
5441 ret = g_list_prepend (ret, t);
5444 if (self->vertical_subsampling) {
5445 t = g_slice_new0 (MXFLocalTag);
5446 memcpy (&t->ul, MXF_UL (VERTICAL_SUBSAMPLING), 16);
5448 t->data = g_slice_alloc (t->size);
5450 GST_WRITE_UINT32_BE (t->data, self->vertical_subsampling);
5451 mxf_primer_pack_add_mapping (primer, 0x3308, &t->ul);
5452 ret = g_list_prepend (ret, t);
5455 if (self->color_siting != 0xff) {
5456 t = g_slice_new0 (MXFLocalTag);
5457 memcpy (&t->ul, MXF_UL (COLOR_SITING), 16);
5459 t->data = g_slice_alloc (t->size);
5461 GST_WRITE_UINT8 (t->data, self->color_siting);
5462 mxf_primer_pack_add_mapping (primer, 0x3303, &t->ul);
5463 ret = g_list_prepend (ret, t);
5466 if (self->reversed_byte_order) {
5467 t = g_slice_new0 (MXFLocalTag);
5468 memcpy (&t->ul, MXF_UL (REVERSED_BYTE_ORDER), 16);
5470 t->data = g_slice_alloc (t->size);
5472 GST_WRITE_UINT8 (t->data, (self->reversed_byte_order) ? 1 : 0);
5473 mxf_primer_pack_add_mapping (primer, 0x330b, &t->ul);
5474 ret = g_list_prepend (ret, t);
5477 if (self->padding_bits) {
5478 t = g_slice_new0 (MXFLocalTag);
5479 memcpy (&t->ul, MXF_UL (PADDING_BITS), 16);
5481 t->data = g_slice_alloc (t->size);
5483 GST_WRITE_UINT16_BE (t->data, self->padding_bits);
5484 mxf_primer_pack_add_mapping (primer, 0x3307, &t->ul);
5485 ret = g_list_prepend (ret, t);
5488 if (self->alpha_sample_depth) {
5489 t = g_slice_new0 (MXFLocalTag);
5490 memcpy (&t->ul, MXF_UL (ALPHA_SAMPLE_DEPTH), 16);
5492 t->data = g_slice_alloc (t->size);
5494 GST_WRITE_UINT32_BE (t->data, self->alpha_sample_depth);
5495 mxf_primer_pack_add_mapping (primer, 0x3309, &t->ul);
5496 ret = g_list_prepend (ret, t);
5499 if (self->black_ref_level) {
5500 t = g_slice_new0 (MXFLocalTag);
5501 memcpy (&t->ul, MXF_UL (BLACK_REF_LEVEL), 16);
5503 t->data = g_slice_alloc (t->size);
5505 GST_WRITE_UINT32_BE (t->data, self->black_ref_level);
5506 mxf_primer_pack_add_mapping (primer, 0x3304, &t->ul);
5507 ret = g_list_prepend (ret, t);
5510 if (self->white_ref_level) {
5511 t = g_slice_new0 (MXFLocalTag);
5512 memcpy (&t->ul, MXF_UL (WHITE_REF_LEVEL), 16);
5514 t->data = g_slice_alloc (t->size);
5516 GST_WRITE_UINT32_BE (t->data, self->white_ref_level);
5517 mxf_primer_pack_add_mapping (primer, 0x3305, &t->ul);
5518 ret = g_list_prepend (ret, t);
5521 if (self->color_range) {
5522 t = g_slice_new0 (MXFLocalTag);
5523 memcpy (&t->ul, MXF_UL (COLOR_RANGE), 16);
5525 t->data = g_slice_alloc (t->size);
5527 GST_WRITE_UINT32_BE (t->data, self->color_range);
5528 mxf_primer_pack_add_mapping (primer, 0x3306, &t->ul);
5529 ret = g_list_prepend (ret, t);
5536 mxf_metadata_cdci_picture_essence_descriptor_init
5537 (MXFMetadataCDCIPictureEssenceDescriptor * self)
5539 self->color_siting = 0xff;
5543 mxf_metadata_cdci_picture_essence_descriptor_class_init
5544 (MXFMetadataCDCIPictureEssenceDescriptorClass * klass)
5546 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5547 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5549 metadata_base_class->handle_tag =
5550 mxf_metadata_cdci_picture_essence_descriptor_handle_tag;
5551 metadata_base_class->name_quark = MXF_QUARK (CDCI_PICTURE_ESSENCE_DESCRIPTOR);
5552 metadata_base_class->to_structure =
5553 mxf_metadata_cdci_picture_essence_descriptor_to_structure;
5554 metadata_base_class->write_tags =
5555 mxf_metadata_cdci_picture_essence_descriptor_write_tags;
5556 metadata_class->type = 0x0128;
5559 G_DEFINE_TYPE (MXFMetadataRGBAPictureEssenceDescriptor,
5560 mxf_metadata_rgba_picture_essence_descriptor,
5561 MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
5564 mxf_metadata_rgba_picture_essence_descriptor_finalize (GstMiniObject * object)
5566 MXFMetadataRGBAPictureEssenceDescriptor *self =
5567 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (object);
5569 g_free (self->pixel_layout);
5570 self->pixel_layout = NULL;
5572 GST_MINI_OBJECT_CLASS
5573 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->finalize
5578 mxf_metadata_rgba_picture_essence_descriptor_handle_tag (MXFMetadataBase *
5579 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5582 MXFMetadataRGBAPictureEssenceDescriptor *self =
5583 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (metadata);
5584 gboolean ret = TRUE;
5590 self->component_max_ref = GST_READ_UINT32_BE (tag_data);
5591 GST_DEBUG (" component max ref = %u", self->component_max_ref);
5596 self->component_min_ref = GST_READ_UINT32_BE (tag_data);
5597 GST_DEBUG (" component min ref = %u", self->component_min_ref);
5602 self->alpha_max_ref = GST_READ_UINT32_BE (tag_data);
5603 GST_DEBUG (" alpha max ref = %u", self->alpha_max_ref);
5608 self->alpha_min_ref = GST_READ_UINT32_BE (tag_data);
5609 GST_DEBUG (" alpha min ref = %u", self->alpha_min_ref);
5614 self->scanning_direction = GST_READ_UINT8 (tag_data);
5615 GST_DEBUG (" scanning direction = %u", self->scanning_direction);
5620 if (tag_size % 2 != 0)
5624 while (tag_data[i] != 0 && tag_data[i + 1] != 0 && i + 2 <= tag_size)
5628 self->n_pixel_layout = len;
5629 GST_DEBUG (" number of pixel layouts = %u", len);
5633 self->pixel_layout = g_malloc0 (2 * len);
5635 for (i = 0; i < len; i++) {
5636 self->pixel_layout[2 * i] = tag_data[2 * i];
5637 self->pixel_layout[2 * i + 1] = tag_data[2 * i + 1];
5638 GST_DEBUG (" pixel layout %u = %c : %u", i,
5639 (gchar) self->pixel_layout[2 * i], self->pixel_layout[2 * i + 1]);
5646 /* TODO: handle this */
5647 GST_WARNING (" tag 0x%04x not implemented yet", tag);
5651 MXF_METADATA_BASE_CLASS
5652 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->handle_tag
5653 (metadata, primer, tag, tag_data, tag_size);
5662 ("Invalid RGBA picture essence descriptor local tag 0x%04x of size %u",
5668 static GstStructure *
5669 mxf_metadata_rgba_picture_essence_descriptor_to_structure (MXFMetadataBase * m)
5672 MXF_METADATA_BASE_CLASS
5673 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->to_structure
5675 MXFMetadataRGBAPictureEssenceDescriptor *self =
5676 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (m);
5678 if (self->component_max_ref != 255)
5679 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_MAX_REF), G_TYPE_UINT,
5680 self->component_max_ref, NULL);
5682 if (self->component_min_ref != 0)
5683 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_MIN_REF), G_TYPE_UINT,
5684 self->component_min_ref, NULL);
5686 if (self->alpha_max_ref != 255)
5687 gst_structure_id_set (ret, MXF_QUARK (ALPHA_MAX_REF), G_TYPE_UINT,
5688 self->alpha_max_ref, NULL);
5690 if (self->alpha_min_ref != 0)
5691 gst_structure_id_set (ret, MXF_QUARK (ALPHA_MIN_REF), G_TYPE_UINT,
5692 self->alpha_min_ref, NULL);
5694 if (self->scanning_direction != 0)
5695 gst_structure_id_set (ret, MXF_QUARK (SCANNING_DIRECTION), G_TYPE_UCHAR,
5696 self->scanning_direction, NULL);
5698 if (self->n_pixel_layout != 0) {
5699 gchar *pl = g_new0 (gchar, self->n_pixel_layout * 2 + 1);
5701 memcpy (pl, self->pixel_layout, self->n_pixel_layout * 2);
5703 gst_structure_id_set (ret, MXF_QUARK (PIXEL_LAYOUT), G_TYPE_STRING, pl,
5713 mxf_metadata_rgba_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
5714 MXFPrimerPack * primer)
5716 MXFMetadataRGBAPictureEssenceDescriptor *self =
5717 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (m);
5719 MXF_METADATA_BASE_CLASS
5720 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->write_tags
5724 if (self->component_max_ref != 255) {
5725 t = g_slice_new0 (MXFLocalTag);
5726 memcpy (&t->ul, MXF_UL (COMPONENT_MAX_REF), 16);
5728 t->data = g_slice_alloc (t->size);
5730 GST_WRITE_UINT32_BE (t->data, self->component_max_ref);
5731 mxf_primer_pack_add_mapping (primer, 0x3406, &t->ul);
5732 ret = g_list_prepend (ret, t);
5735 if (self->component_min_ref) {
5736 t = g_slice_new0 (MXFLocalTag);
5737 memcpy (&t->ul, MXF_UL (COMPONENT_MIN_REF), 16);
5739 t->data = g_slice_alloc (t->size);
5741 GST_WRITE_UINT32_BE (t->data, self->component_min_ref);
5742 mxf_primer_pack_add_mapping (primer, 0x3407, &t->ul);
5743 ret = g_list_prepend (ret, t);
5746 if (self->alpha_max_ref != 255) {
5747 t = g_slice_new0 (MXFLocalTag);
5748 memcpy (&t->ul, MXF_UL (ALPHA_MAX_REF), 16);
5750 t->data = g_slice_alloc (t->size);
5752 GST_WRITE_UINT32_BE (t->data, self->alpha_max_ref);
5753 mxf_primer_pack_add_mapping (primer, 0x3408, &t->ul);
5754 ret = g_list_prepend (ret, t);
5757 if (self->alpha_min_ref) {
5758 t = g_slice_new0 (MXFLocalTag);
5759 memcpy (&t->ul, MXF_UL (ALPHA_MIN_REF), 16);
5761 t->data = g_slice_alloc (t->size);
5763 GST_WRITE_UINT32_BE (t->data, self->alpha_min_ref);
5764 mxf_primer_pack_add_mapping (primer, 0x3409, &t->ul);
5765 ret = g_list_prepend (ret, t);
5768 if (self->scanning_direction) {
5769 t = g_slice_new0 (MXFLocalTag);
5770 memcpy (&t->ul, MXF_UL (SCANNING_DIRECTION), 16);
5772 t->data = g_slice_alloc (t->size);
5774 GST_WRITE_UINT8 (t->data, self->scanning_direction);
5775 mxf_primer_pack_add_mapping (primer, 0x3405, &t->ul);
5776 ret = g_list_prepend (ret, t);
5779 if (self->pixel_layout) {
5780 t = g_slice_new0 (MXFLocalTag);
5781 memcpy (&t->ul, MXF_UL (PIXEL_LAYOUT), 16);
5782 t->size = 2 * self->n_pixel_layout + 2;
5783 t->data = g_slice_alloc0 (t->size);
5785 memcpy (t->data, self->pixel_layout, self->n_pixel_layout * 2);
5786 mxf_primer_pack_add_mapping (primer, 0x3401, &t->ul);
5787 ret = g_list_prepend (ret, t);
5795 mxf_metadata_rgba_picture_essence_descriptor_init
5796 (MXFMetadataRGBAPictureEssenceDescriptor * self)
5798 self->component_max_ref = 255;
5799 self->alpha_max_ref = 255;
5803 mxf_metadata_rgba_picture_essence_descriptor_class_init
5804 (MXFMetadataRGBAPictureEssenceDescriptorClass * klass)
5806 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5807 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
5808 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5810 miniobject_class->finalize =
5811 mxf_metadata_rgba_picture_essence_descriptor_finalize;
5812 metadata_base_class->handle_tag =
5813 mxf_metadata_rgba_picture_essence_descriptor_handle_tag;
5814 metadata_base_class->name_quark = MXF_QUARK (RGBA_PICTURE_ESSENCE_DESCRIPTOR);
5815 metadata_base_class->to_structure =
5816 mxf_metadata_rgba_picture_essence_descriptor_to_structure;
5817 metadata_base_class->write_tags =
5818 mxf_metadata_rgba_picture_essence_descriptor_write_tags;
5819 metadata_class->type = 0x0129;
5822 G_DEFINE_TYPE (MXFMetadataGenericDataEssenceDescriptor,
5823 mxf_metadata_generic_data_essence_descriptor,
5824 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
5827 mxf_metadata_generic_data_essence_descriptor_handle_tag (MXFMetadataBase *
5828 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5831 MXFMetadataGenericDataEssenceDescriptor *self =
5832 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (metadata);
5833 gboolean ret = TRUE;
5834 #ifndef GST_DISABLE_GST_DEBUG
5842 memcpy (&self->data_essence_coding, tag_data, 16);
5843 GST_DEBUG (" data essence coding = %s",
5844 mxf_ul_to_string (&self->data_essence_coding, str));
5848 MXF_METADATA_BASE_CLASS
5849 (mxf_metadata_generic_data_essence_descriptor_parent_class)->handle_tag
5850 (metadata, primer, tag, tag_data, tag_size);
5859 ("Invalid generic data essence descriptor local tag 0x%04x of size %u",
5865 static GstStructure *
5866 mxf_metadata_generic_data_essence_descriptor_to_structure (MXFMetadataBase * m)
5869 MXF_METADATA_BASE_CLASS
5870 (mxf_metadata_generic_data_essence_descriptor_parent_class)->to_structure
5872 MXFMetadataGenericDataEssenceDescriptor *self =
5873 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (m);
5876 if (!mxf_ul_is_zero (&self->data_essence_coding)) {
5877 mxf_ul_to_string (&self->data_essence_coding, str);
5878 gst_structure_id_set (ret, MXF_QUARK (DATA_ESSENCE_CODING), G_TYPE_STRING,
5886 mxf_metadata_generic_data_essence_descriptor_write_tags (MXFMetadataBase * m,
5887 MXFPrimerPack * primer)
5889 MXFMetadataGenericDataEssenceDescriptor *self =
5890 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (m);
5892 MXF_METADATA_BASE_CLASS
5893 (mxf_metadata_generic_data_essence_descriptor_parent_class)->write_tags
5897 if (!mxf_ul_is_zero (&self->data_essence_coding)) {
5898 t = g_slice_new0 (MXFLocalTag);
5899 memcpy (&t->ul, MXF_UL (DATA_ESSENCE_CODING), 16);
5901 t->data = g_slice_alloc (t->size);
5903 memcpy (t->data, &self->data_essence_coding, 16);
5904 mxf_primer_pack_add_mapping (primer, 0x3e01, &t->ul);
5905 ret = g_list_prepend (ret, t);
5912 mxf_metadata_generic_data_essence_descriptor_init
5913 (MXFMetadataGenericDataEssenceDescriptor * self)
5919 mxf_metadata_generic_data_essence_descriptor_class_init
5920 (MXFMetadataGenericDataEssenceDescriptorClass * klass)
5922 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5923 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5925 metadata_base_class->handle_tag =
5926 mxf_metadata_generic_data_essence_descriptor_handle_tag;
5927 metadata_base_class->name_quark = MXF_QUARK (GENERIC_DATA_ESSENCE_DESCRIPTOR);
5928 metadata_base_class->to_structure =
5929 mxf_metadata_generic_data_essence_descriptor_to_structure;
5930 metadata_base_class->write_tags =
5931 mxf_metadata_generic_data_essence_descriptor_write_tags;
5932 metadata_class->type = 0x0143;
5935 G_DEFINE_TYPE (MXFMetadataMultipleDescriptor, mxf_metadata_multiple_descriptor,
5936 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
5939 mxf_metadata_multiple_descriptor_finalize (GstMiniObject * object)
5941 MXFMetadataMultipleDescriptor *self =
5942 MXF_METADATA_MULTIPLE_DESCRIPTOR (object);
5944 g_free (self->sub_descriptors_uids);
5945 self->sub_descriptors_uids = NULL;
5946 g_free (self->sub_descriptors);
5947 self->sub_descriptors = NULL;
5949 GST_MINI_OBJECT_CLASS
5950 (mxf_metadata_multiple_descriptor_parent_class)->finalize (object);
5954 mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataBase * metadata,
5955 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5958 MXFMetadataMultipleDescriptor *self =
5959 MXF_METADATA_MULTIPLE_DESCRIPTOR (metadata);
5960 gboolean ret = TRUE;
5961 #ifndef GST_DISABLE_GST_DEBUG
5967 if (!mxf_uuid_array_parse (&self->sub_descriptors_uids,
5968 &self->n_sub_descriptors, tag_data, tag_size))
5971 GST_DEBUG (" number of sub descriptors = %u", self->n_sub_descriptors);
5972 #ifndef GST_DISABLE_GST_DEBUG
5975 for (i = 0; i < self->n_sub_descriptors; i++) {
5976 GST_DEBUG (" sub descriptor %u = %s", i,
5977 mxf_uuid_to_string (&self->sub_descriptors_uids[i], str));
5985 MXF_METADATA_BASE_CLASS
5986 (mxf_metadata_multiple_descriptor_parent_class)->handle_tag (metadata,
5987 primer, tag, tag_data, tag_size);
5995 GST_ERROR ("Invalid multiple descriptor local tag 0x%04x of size %u", tag,
6002 mxf_metadata_multiple_descriptor_resolve (MXFMetadataBase * m,
6003 GHashTable * metadata)
6005 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6006 MXFMetadataBase *current = NULL;
6007 guint i, have_subdescriptors = 0;
6009 if (self->sub_descriptors)
6010 memset (self->sub_descriptors, 0,
6011 sizeof (gpointer) * self->n_sub_descriptors);
6013 self->sub_descriptors =
6014 g_new0 (MXFMetadataGenericDescriptor *, self->n_sub_descriptors);
6015 for (i = 0; i < self->n_sub_descriptors; i++) {
6016 current = g_hash_table_lookup (metadata, &self->sub_descriptors_uids[i]);
6017 if (current && MXF_IS_METADATA_GENERIC_DESCRIPTOR (current)) {
6018 if (mxf_metadata_base_resolve (current, metadata)) {
6019 self->sub_descriptors[i] = MXF_METADATA_GENERIC_DESCRIPTOR (current);
6020 have_subdescriptors++;
6022 GST_ERROR ("Couldn't resolve descriptor");
6026 GST_ERROR ("Descriptor not found");
6032 MXF_METADATA_BASE_CLASS
6033 (mxf_metadata_multiple_descriptor_parent_class)->resolve (m, metadata);
6036 static GstStructure *
6037 mxf_metadata_multiple_descriptor_to_structure (MXFMetadataBase * m)
6040 MXF_METADATA_BASE_CLASS
6041 (mxf_metadata_multiple_descriptor_parent_class)->to_structure (m);
6042 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6045 if (self->n_sub_descriptors > 0) {
6050 g_value_init (&arr, GST_TYPE_ARRAY);
6052 for (i = 0; i < self->n_sub_descriptors; i++) {
6055 if (self->sub_descriptors[i] == NULL)
6058 g_value_init (&val, GST_TYPE_STRUCTURE);
6060 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
6061 (self->sub_descriptors[i]));
6062 gst_value_set_structure (&val, s);
6063 gst_structure_free (s);
6064 gst_value_array_append_value (&arr, &val);
6065 g_value_unset (&val);
6068 if (gst_value_array_get_size (&arr) > 0)
6069 gst_structure_id_set_value (ret, MXF_QUARK (SUB_DESCRIPTORS), &arr);
6071 g_value_unset (&arr);
6078 mxf_metadata_multiple_descriptor_write_tags (MXFMetadataBase * m,
6079 MXFPrimerPack * primer)
6081 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6083 MXF_METADATA_BASE_CLASS
6084 (mxf_metadata_multiple_descriptor_parent_class)->write_tags (m, primer);
6087 if (self->sub_descriptors) {
6090 t = g_slice_new0 (MXFLocalTag);
6091 memcpy (&t->ul, MXF_UL (SUB_DESCRIPTORS), 16);
6092 t->size = 8 + 16 * self->n_sub_descriptors;
6093 t->data = g_slice_alloc0 (t->size);
6095 GST_WRITE_UINT32_BE (t->data, self->n_sub_descriptors);
6096 GST_WRITE_UINT32_BE (t->data + 4, 16);
6097 for (i = 0; i < self->n_sub_descriptors; i++) {
6098 if (!self->sub_descriptors[i])
6101 memcpy (t->data + 8 + 16 * i,
6102 &MXF_METADATA_BASE (self->sub_descriptors[i])->instance_uid, 16);
6104 mxf_primer_pack_add_mapping (primer, 0x3f01, &t->ul);
6105 ret = g_list_prepend (ret, t);
6112 mxf_metadata_multiple_descriptor_init (MXFMetadataMultipleDescriptor * self)
6118 mxf_metadata_multiple_descriptor_class_init (MXFMetadataMultipleDescriptorClass
6121 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6122 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
6123 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6125 miniobject_class->finalize = mxf_metadata_multiple_descriptor_finalize;
6126 metadata_base_class->handle_tag = mxf_metadata_multiple_descriptor_handle_tag;
6127 metadata_base_class->resolve = mxf_metadata_multiple_descriptor_resolve;
6128 metadata_base_class->name_quark = MXF_QUARK (MULTIPLE_DESCRIPTOR);
6129 metadata_base_class->to_structure =
6130 mxf_metadata_multiple_descriptor_to_structure;
6131 metadata_base_class->write_tags = mxf_metadata_multiple_descriptor_write_tags;
6132 metadata_class->type = 0x0144;
6135 G_DEFINE_ABSTRACT_TYPE (MXFMetadataLocator, mxf_metadata_locator,
6139 mxf_metadata_locator_init (MXFMetadataLocator * self)
6144 mxf_metadata_locator_class_init (MXFMetadataLocatorClass * klass)
6148 G_DEFINE_TYPE (MXFMetadataTextLocator, mxf_metadata_text_locator,
6149 MXF_TYPE_METADATA_LOCATOR);
6152 mxf_metadata_text_locator_finalize (GstMiniObject * object)
6154 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (object);
6156 g_free (self->locator_name);
6157 self->locator_name = NULL;
6159 GST_MINI_OBJECT_CLASS (mxf_metadata_text_locator_parent_class)->finalize
6164 mxf_metadata_text_locator_handle_tag (MXFMetadataBase * metadata,
6165 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
6168 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (metadata);
6169 gboolean ret = TRUE;
6173 self->locator_name = mxf_utf16_to_utf8 (tag_data, tag_size);
6174 GST_DEBUG (" text locator = %s", GST_STR_NULL (self->locator_name));
6178 MXF_METADATA_BASE_CLASS
6179 (mxf_metadata_text_locator_parent_class)->handle_tag (metadata,
6180 primer, tag, tag_data, tag_size);
6187 static GstStructure *
6188 mxf_metadata_text_locator_to_structure (MXFMetadataBase * m)
6191 MXF_METADATA_BASE_CLASS
6192 (mxf_metadata_text_locator_parent_class)->to_structure (m);
6193 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (m);
6195 gst_structure_id_set (ret, MXF_QUARK (LOCATOR_NAME), G_TYPE_STRING,
6196 self->locator_name, NULL);
6202 mxf_metadata_text_locator_write_tags (MXFMetadataBase * m,
6203 MXFPrimerPack * primer)
6205 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (m);
6207 MXF_METADATA_BASE_CLASS
6208 (mxf_metadata_text_locator_parent_class)->write_tags (m, primer);
6211 if (self->locator_name) {
6212 t = g_slice_new0 (MXFLocalTag);
6213 memcpy (&t->ul, MXF_UL (LOCATOR_NAME), 16);
6214 t->data = mxf_utf8_to_utf16 (self->locator_name, &t->size);
6215 mxf_primer_pack_add_mapping (primer, 0x4101, &t->ul);
6216 ret = g_list_prepend (ret, t);
6223 mxf_metadata_text_locator_init (MXFMetadataTextLocator * self)
6229 mxf_metadata_text_locator_class_init (MXFMetadataTextLocatorClass * klass)
6231 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6232 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
6233 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6235 miniobject_class->finalize = mxf_metadata_text_locator_finalize;
6236 metadata_base_class->handle_tag = mxf_metadata_text_locator_handle_tag;
6237 metadata_base_class->name_quark = MXF_QUARK (TEXT_LOCATOR);
6238 metadata_base_class->to_structure = mxf_metadata_text_locator_to_structure;
6239 metadata_base_class->write_tags = mxf_metadata_text_locator_write_tags;
6240 metadata_class->type = 0x0133;
6243 G_DEFINE_TYPE (MXFMetadataNetworkLocator, mxf_metadata_network_locator,
6244 MXF_TYPE_METADATA_LOCATOR);
6247 mxf_metadata_network_locator_finalize (GstMiniObject * object)
6249 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (object);
6251 g_free (self->url_string);
6252 self->url_string = NULL;
6254 GST_MINI_OBJECT_CLASS (mxf_metadata_network_locator_parent_class)->finalize
6259 mxf_metadata_network_locator_handle_tag (MXFMetadataBase * metadata,
6260 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
6263 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (metadata);
6264 gboolean ret = TRUE;
6268 self->url_string = mxf_utf16_to_utf8 (tag_data, tag_size);
6269 GST_DEBUG (" url string = %s", GST_STR_NULL (self->url_string));
6273 MXF_METADATA_BASE_CLASS
6274 (mxf_metadata_network_locator_parent_class)->handle_tag (metadata,
6275 primer, tag, tag_data, tag_size);
6282 static GstStructure *
6283 mxf_metadata_network_locator_to_structure (MXFMetadataBase * m)
6286 MXF_METADATA_BASE_CLASS
6287 (mxf_metadata_network_locator_parent_class)->to_structure (m);
6288 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (m);
6290 gst_structure_id_set (ret, MXF_QUARK (URL_STRING), G_TYPE_STRING,
6291 self->url_string, NULL);
6297 mxf_metadata_network_locator_write_tags (MXFMetadataBase * m,
6298 MXFPrimerPack * primer)
6300 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (m);
6302 MXF_METADATA_BASE_CLASS
6303 (mxf_metadata_network_locator_parent_class)->write_tags (m, primer);
6306 if (self->url_string) {
6307 t = g_slice_new0 (MXFLocalTag);
6308 memcpy (&t->ul, MXF_UL (URL_STRING), 16);
6309 t->data = mxf_utf8_to_utf16 (self->url_string, &t->size);
6310 mxf_primer_pack_add_mapping (primer, 0x4001, &t->ul);
6311 ret = g_list_prepend (ret, t);
6318 mxf_metadata_network_locator_init (MXFMetadataNetworkLocator * self)
6323 mxf_metadata_network_locator_class_init (MXFMetadataNetworkLocatorClass * klass)
6325 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6326 GstMiniObjectClass *miniobject_class = (GstMiniObjectClass *) klass;
6327 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6329 miniobject_class->finalize = mxf_metadata_network_locator_finalize;
6330 metadata_base_class->handle_tag = mxf_metadata_network_locator_handle_tag;
6331 metadata_base_class->name_quark = MXF_QUARK (NETWORK_LOCATOR);
6332 metadata_base_class->to_structure = mxf_metadata_network_locator_to_structure;
6333 metadata_base_class->write_tags = mxf_metadata_network_locator_write_tags;
6334 metadata_class->type = 0x0133;
6337 G_DEFINE_ABSTRACT_TYPE (MXFDescriptiveMetadata, mxf_descriptive_metadata,
6338 MXF_TYPE_METADATA_BASE);
6341 mxf_descriptive_metadata_init (MXFDescriptiveMetadata * self)
6346 mxf_descriptive_metadata_class_init (MXFDescriptiveMetadataClass * klass)
6354 } _MXFDescriptiveMetadataScheme;
6356 static GArray *_dm_schemes = NULL;
6359 mxf_descriptive_metadata_register (guint8 scheme, GType * types)
6361 _MXFDescriptiveMetadataScheme s;
6365 g_array_new (FALSE, TRUE, sizeof (_MXFDescriptiveMetadataScheme));
6370 g_array_append_val (_dm_schemes, s);
6373 MXFDescriptiveMetadata *
6374 mxf_descriptive_metadata_new (guint8 scheme, guint32 type,
6375 MXFPrimerPack * primer, guint64 offset, const guint8 * data, guint size)
6378 GType t = G_TYPE_INVALID, *p;
6379 _MXFDescriptiveMetadataScheme *s = NULL;
6380 MXFDescriptiveMetadata *ret = NULL;
6382 g_return_val_if_fail (primer != NULL, NULL);
6384 if (G_UNLIKELY (type == 0)) {
6385 GST_WARNING ("Type 0 is invalid");
6389 for (i = 0; i < _dm_schemes->len; i++) {
6390 _MXFDescriptiveMetadataScheme *data =
6391 &g_array_index (_dm_schemes, _MXFDescriptiveMetadataScheme, i);
6393 if (data->scheme == scheme) {
6400 GST_WARNING ("Descriptive metadata scheme 0x%02x not supported", scheme);
6407 MXFDescriptiveMetadataClass *klass =
6408 MXF_DESCRIPTIVE_METADATA_CLASS (g_type_class_ref (tmp));
6410 if (klass->type == type) {
6411 g_type_class_unref (klass);
6415 g_type_class_unref (klass);
6419 if (t == G_TYPE_INVALID) {
6421 ("No handler for type 0x%06x of descriptive metadata scheme 0x%02x found",
6426 GST_DEBUG ("DM scheme 0x%02x type 0x%06x is handled by type %s", scheme, type,
6429 ret = (MXFDescriptiveMetadata *) g_type_create_instance (t);
6430 if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) {
6431 GST_ERROR ("Parsing metadata failed");
6432 gst_mini_object_unref ((GstMiniObject *) ret);
6436 ret->parent.offset = offset;
6442 mxf_descriptive_metadata_framework_get_type (void)
6444 static volatile gsize type = 0;
6445 if (g_once_init_enter (&type)) {
6447 static const GTypeInfo info = {
6448 sizeof (MXFDescriptiveMetadataFrameworkInterface),
6449 NULL, /* base_init */
6450 NULL, /* base_finalize */
6451 NULL, /* class_init */
6452 NULL, /* class_finalize */
6453 NULL, /* class_data */
6454 0, /* instance_size */
6455 0, /* n_preallocs */
6456 NULL /* instance_init */
6458 _type = g_type_register_static (G_TYPE_INTERFACE,
6459 "MXFDescriptiveMetadataFrameworkInterface", &info, 0);
6461 g_type_interface_add_prerequisite (_type, MXF_TYPE_DESCRIPTIVE_METADATA);
6463 g_once_init_leave (&type, (gsize) _type);
6466 return (GType) type;
6470 mxf_metadata_hash_table_new (void)
6472 return g_hash_table_new_full ((GHashFunc) mxf_uuid_hash,
6473 (GEqualFunc) mxf_uuid_is_equal, (GDestroyNotify) NULL,
6474 (GDestroyNotify) gst_mini_object_unref);