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, G_TYPE_OBJECT);
37 mxf_metadata_base_finalize (GObject * object)
39 MXFMetadataBase *self = MXF_METADATA_BASE (object);
41 if (self->other_tags) {
42 g_hash_table_destroy (self->other_tags);
43 self->other_tags = NULL;
46 G_OBJECT_CLASS (mxf_metadata_base_parent_class)->finalize (object);
50 mxf_metadata_base_handle_tag (MXFMetadataBase * self, MXFPrimerPack * primer,
51 guint16 tag, const guint8 * tag_data, guint tag_size)
53 return (mxf_local_tag_add_to_hash_table (primer, tag, tag_data, tag_size,
58 mxf_metadata_base_resolve_default (MXFMetadataBase * self,
59 GHashTable * metadata)
65 mxf_metadata_base_to_structure_default (MXFMetadataBase * self)
67 MXFMetadataBaseClass *klass = MXF_METADATA_BASE_GET_CLASS (self);
71 g_return_val_if_fail (klass->name_quark != 0, NULL);
73 ret = gst_structure_id_empty_new (klass->name_quark);
75 if (!mxf_uuid_is_zero (&self->instance_uid)) {
76 mxf_uuid_to_string (&self->instance_uid, str);
77 gst_structure_id_set (ret, MXF_QUARK (INSTANCE_UID), G_TYPE_STRING, str,
81 if (!mxf_uuid_is_zero (&self->generation_uid)) {
82 mxf_uuid_to_string (&self->generation_uid, str);
83 gst_structure_id_set (ret, MXF_QUARK (GENERATION_UID), G_TYPE_STRING, str,
87 if (self->other_tags) {
95 g_hash_table_iter_init (&iter, self->other_tags);
96 g_value_init (&va, GST_TYPE_ARRAY);
98 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & tag)) {
99 g_value_init (&v, GST_TYPE_STRUCTURE);
100 s = gst_structure_id_empty_new (MXF_QUARK (TAG));
102 mxf_ul_to_string (&tag->ul, str);
104 buf = gst_buffer_new_and_alloc (tag->size);
105 memcpy (GST_BUFFER_DATA (buf), tag->data, tag->size);
107 gst_structure_id_set (s, MXF_QUARK (NAME), G_TYPE_STRING, str,
108 MXF_QUARK (DATA), GST_TYPE_BUFFER, buf, NULL);
110 gst_value_set_structure (&v, s);
111 gst_structure_free (s);
112 gst_buffer_unref (buf);
113 gst_value_array_append_value (&va, &v);
117 gst_structure_id_set_value (ret, MXF_QUARK (OTHER_TAGS), &va);
125 mxf_metadata_base_init (MXFMetadataBase * self)
131 mxf_metadata_base_class_init (MXFMetadataBaseClass * klass)
133 GObjectClass *object_class = (GObjectClass *) klass;
135 object_class->finalize = mxf_metadata_base_finalize;
136 klass->handle_tag = mxf_metadata_base_handle_tag;
137 klass->resolve = mxf_metadata_base_resolve_default;
138 klass->to_structure = mxf_metadata_base_to_structure_default;
142 mxf_metadata_base_parse (MXFMetadataBase * self, MXFPrimerPack * primer,
143 const guint8 * data, guint size)
145 guint16 tag, tag_size;
146 const guint8 *tag_data;
148 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), FALSE);
149 g_return_val_if_fail (data != NULL, FALSE);
150 g_return_val_if_fail (primer != NULL, FALSE);
152 while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) {
153 if (tag_size == 0 || tag == 0x0000)
156 if (!MXF_METADATA_BASE_GET_CLASS (self)->handle_tag (self, primer, tag,
160 data += 4 + tag_size;
161 size -= 4 + tag_size;
168 mxf_metadata_base_resolve (MXFMetadataBase * self, GHashTable * metadata)
170 MXFMetadataBaseClass *klass;
173 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), FALSE);
174 g_return_val_if_fail (metadata != NULL, FALSE);
176 if (self->resolved == MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS)
178 else if (self->resolved != MXF_METADATA_BASE_RESOLVE_STATE_NONE)
181 self->resolved = MXF_METADATA_BASE_RESOLVE_STATE_RUNNING;
183 klass = MXF_METADATA_BASE_GET_CLASS (self);
186 ret = klass->resolve (self, metadata);
189 (ret) ? MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS :
190 MXF_METADATA_BASE_RESOLVE_STATE_FAILURE;
196 mxf_metadata_base_to_structure (MXFMetadataBase * self)
198 MXFMetadataBaseClass *klass;
200 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), NULL);
202 g_return_val_if_fail (self->resolved ==
203 MXF_METADATA_BASE_RESOLVE_STATE_SUCCESS, NULL);
205 klass = MXF_METADATA_BASE_GET_CLASS (self);
207 if (klass->to_structure)
208 return klass->to_structure (self);
214 mxf_metadata_base_to_buffer (MXFMetadataBase * self, MXFPrimerPack * primer)
216 MXFMetadataBaseClass *klass;
219 guint size = 0, slen;
221 MXFLocalTag *t, *last;
224 g_return_val_if_fail (MXF_IS_METADATA_BASE (self), NULL);
225 g_return_val_if_fail (primer != NULL, NULL);
227 klass = MXF_METADATA_BASE_GET_CLASS (self);
228 g_return_val_if_fail (klass->write_tags, NULL);
230 tags = klass->write_tags (self, primer);
231 g_return_val_if_fail (tags != NULL, NULL);
233 /* Add unknown tags */
234 if (self->other_tags) {
238 g_hash_table_iter_init (&iter, self->other_tags);
240 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & t)) {
241 tmp = g_slice_dup (MXFLocalTag, t);
243 tmp->data = g_slice_alloc (t->size);
244 mxf_primer_pack_add_mapping (primer, 0x0000, &t->ul);
245 memcpy (tmp->data, t->data, t->size);
247 tmp->data = g_memdup (t->data, t->size);
249 tags = g_list_prepend (tags, tmp);
253 l = g_list_last (tags);
255 tags = g_list_delete_link (tags, l);
256 /* Last element contains the metadata UL */
257 g_return_val_if_fail (last->size == 0, NULL);
259 for (l = tags; l; l = l->next) {
261 g_assert (G_MAXUINT - t->size >= size);
265 slen = mxf_ber_encode_size (size, ber);
268 ret = gst_buffer_new_and_alloc (size);
270 memcpy (GST_BUFFER_DATA (ret), &last->ul, 16);
271 mxf_local_tag_free (last);
273 memcpy (GST_BUFFER_DATA (ret) + 16, ber, slen);
275 data = GST_BUFFER_DATA (ret) + 16 + slen;
278 for (l = tags; l; l = l->next) {
281 g_assert (size >= 4);
285 GPOINTER_TO_UINT (g_hash_table_lookup (primer->reverse_mappings,
287 g_assert (local_tag != 0);
289 GST_WRITE_UINT16_BE (data, local_tag);
290 GST_WRITE_UINT16_BE (data + 2, t->size);
293 g_assert (size >= t->size);
295 memcpy (data, t->data, t->size);
299 mxf_local_tag_free (t);
307 G_DEFINE_ABSTRACT_TYPE (MXFMetadata, mxf_metadata, MXF_TYPE_METADATA_BASE);
310 mxf_metadata_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
311 guint16 tag, const guint8 * tag_data, guint tag_size)
313 #ifndef GST_DISABLE_GST_DEBUG
316 MXFMetadata *self = MXF_METADATA (metadata);
323 memcpy (&self->parent.instance_uid, tag_data, 16);
324 GST_DEBUG (" instance uid = %s",
325 mxf_uuid_to_string (&self->parent.instance_uid, str));
330 memcpy (&self->parent.generation_uid, tag_data, 16);
331 GST_DEBUG (" generation uid = %s",
332 mxf_uuid_to_string (&self->parent.generation_uid, str));
336 MXF_METADATA_BASE_CLASS (mxf_metadata_parent_class)->handle_tag
337 (metadata, primer, tag, tag_data, tag_size);
345 GST_ERROR ("Invalid metadata local tag 0x%04x of size %u", tag, tag_size);
351 mxf_metadata_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
353 MXFMetadata *self = MXF_METADATA (m);
356 MXFMetadataClass *klass;
358 g_return_val_if_fail (MXF_IS_METADATA (self), NULL);
359 klass = MXF_METADATA_GET_CLASS (self);
361 /* Last element contains the metadata key */
362 t = g_slice_new0 (MXFLocalTag);
363 memcpy (&t->ul, MXF_UL (METADATA), 16);
364 GST_WRITE_UINT16_BE (&t->ul.u[13], klass->type);
365 ret = g_list_prepend (ret, t);
367 t = g_slice_new0 (MXFLocalTag);
368 memcpy (&t->ul, MXF_UL (INSTANCE_UID), 16);
370 t->data = g_slice_alloc (16);
372 memcpy (t->data, &self->parent.instance_uid, 16);
373 mxf_primer_pack_add_mapping (primer, 0x3c0a, &t->ul);
374 ret = g_list_prepend (ret, t);
376 if (!mxf_uuid_is_zero (&self->parent.generation_uid)) {
377 t = g_slice_new0 (MXFLocalTag);
378 memcpy (&t->ul, MXF_UL (GENERATION_UID), 16);
380 t->data = g_slice_alloc (16);
382 memcpy (t->data, &self->parent.generation_uid, 16);
383 mxf_primer_pack_add_mapping (primer, 0x0102, &t->ul);
384 ret = g_list_prepend (ret, t);
391 mxf_metadata_class_init (MXFMetadataClass * klass)
393 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
395 metadata_base_class->handle_tag = mxf_metadata_handle_tag;
396 metadata_base_class->write_tags = mxf_metadata_write_tags;
400 mxf_metadata_init (MXFMetadata * self)
404 static GArray *_mxf_metadata_registry = NULL;
406 #define _add_metadata_type(type) G_STMT_START { \
409 g_array_append_val (_mxf_metadata_registry, t); \
413 mxf_metadata_init_types (void)
415 g_return_if_fail (_mxf_metadata_registry == NULL);
417 _mxf_metadata_registry = g_array_new (FALSE, TRUE, sizeof (GType));
419 _add_metadata_type (MXF_TYPE_METADATA_PREFACE);
420 _add_metadata_type (MXF_TYPE_METADATA_IDENTIFICATION);
421 _add_metadata_type (MXF_TYPE_METADATA_CONTENT_STORAGE);
422 _add_metadata_type (MXF_TYPE_METADATA_ESSENCE_CONTAINER_DATA);
423 _add_metadata_type (MXF_TYPE_METADATA_MATERIAL_PACKAGE);
424 _add_metadata_type (MXF_TYPE_METADATA_SOURCE_PACKAGE);
425 _add_metadata_type (MXF_TYPE_METADATA_TIMELINE_TRACK);
426 _add_metadata_type (MXF_TYPE_METADATA_EVENT_TRACK);
427 _add_metadata_type (MXF_TYPE_METADATA_STATIC_TRACK);
428 _add_metadata_type (MXF_TYPE_METADATA_SEQUENCE);
429 _add_metadata_type (MXF_TYPE_METADATA_SOURCE_CLIP);
430 _add_metadata_type (MXF_TYPE_METADATA_TIMECODE_COMPONENT);
431 _add_metadata_type (MXF_TYPE_METADATA_DM_SEGMENT);
432 _add_metadata_type (MXF_TYPE_METADATA_DM_SOURCE_CLIP);
433 _add_metadata_type (MXF_TYPE_METADATA_FILE_DESCRIPTOR);
434 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
435 _add_metadata_type (MXF_TYPE_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR);
436 _add_metadata_type (MXF_TYPE_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR);
437 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR);
438 _add_metadata_type (MXF_TYPE_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR);
439 _add_metadata_type (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR);
440 _add_metadata_type (MXF_TYPE_METADATA_NETWORK_LOCATOR);
441 _add_metadata_type (MXF_TYPE_METADATA_TEXT_LOCATOR);
444 #undef _add_metadata_type
447 mxf_metadata_register (GType type)
449 g_return_if_fail (g_type_is_a (type, MXF_TYPE_METADATA));
451 g_array_append_val (_mxf_metadata_registry, type);
455 mxf_metadata_new (guint16 type, MXFPrimerPack * primer, guint64 offset,
456 const guint8 * data, guint size)
459 GType t = G_TYPE_INVALID;
460 MXFMetadata *ret = NULL;
462 g_return_val_if_fail (type != 0, NULL);
463 g_return_val_if_fail (primer != NULL, NULL);
464 g_return_val_if_fail (_mxf_metadata_registry != NULL, NULL);
466 for (i = 0; i < _mxf_metadata_registry->len; i++) {
467 GType tmp = g_array_index (_mxf_metadata_registry, GType, i);
468 MXFMetadataClass *klass = MXF_METADATA_CLASS (g_type_class_ref (tmp));
470 if (klass->type == type) {
471 g_type_class_unref (klass);
475 g_type_class_unref (klass);
478 if (t == G_TYPE_INVALID) {
480 ("No handler for type 0x%04x found -- using generic metadata parser",
486 GST_DEBUG ("Metadata type 0x%06x is handled by type %s", type,
489 ret = (MXFMetadata *) g_type_create_instance (t);
490 if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) {
491 GST_ERROR ("Parsing metadata failed");
492 g_object_unref (ret);
496 ret->parent.offset = offset;
500 G_DEFINE_TYPE (MXFMetadataPreface, mxf_metadata_preface, MXF_TYPE_METADATA);
503 mxf_metadata_preface_finalize (GObject * object)
505 MXFMetadataPreface *self = MXF_METADATA_PREFACE (object);
507 g_free (self->identifications_uids);
508 self->identifications_uids = NULL;
510 g_free (self->identifications);
511 self->identifications = NULL;
513 g_free (self->essence_containers);
514 self->essence_containers = NULL;
516 g_free (self->dm_schemes);
517 self->dm_schemes = NULL;
519 G_OBJECT_CLASS (mxf_metadata_preface_parent_class)->finalize (object);
523 mxf_metadata_preface_handle_tag (MXFMetadataBase * metadata,
524 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
527 MXFMetadataPreface *self = MXF_METADATA_PREFACE (metadata);
528 #ifndef GST_DISABLE_GST_DEBUG
535 if (!mxf_timestamp_parse (&self->last_modified_date, tag_data, tag_size))
537 GST_DEBUG (" last modified date = %s",
538 mxf_timestamp_to_string (&self->last_modified_date, str));
543 self->version = GST_READ_UINT16_BE (tag_data);
544 GST_DEBUG (" version = %u.%u", (self->version >> 8),
545 (self->version & 0x0f));
550 self->object_model_version = GST_READ_UINT32_BE (tag_data);
551 GST_DEBUG (" object model version = %u", self->object_model_version);
556 memcpy (&self->primary_package_uid, tag_data, 16);
557 GST_DEBUG (" primary package = %s",
558 mxf_uuid_to_string (&self->primary_package_uid, str));
561 if (!mxf_uuid_array_parse (&self->identifications_uids,
562 &self->n_identifications, tag_data, tag_size))
565 GST_DEBUG (" number of identifications = %u", self->n_identifications);
566 #ifndef GST_DISABLE_GST_DEBUG
569 for (i = 0; i < self->n_identifications; i++) {
570 GST_DEBUG (" identification %u = %s", i,
571 mxf_uuid_to_string (&self->identifications_uids[i], str));
579 memcpy (&self->content_storage_uid, tag_data, 16);
580 GST_DEBUG (" content storage = %s",
581 mxf_uuid_to_string (&self->content_storage_uid, str));
586 memcpy (&self->operational_pattern, tag_data, 16);
587 GST_DEBUG (" operational pattern = %s",
588 mxf_ul_to_string (&self->operational_pattern, str));
591 if (!mxf_ul_array_parse (&self->essence_containers,
592 &self->n_essence_containers, tag_data, tag_size))
595 GST_DEBUG (" number of essence containers = %u",
596 self->n_essence_containers);
597 #ifndef GST_DISABLE_GST_DEBUG
600 for (i = 0; i < self->n_essence_containers; i++) {
601 GST_DEBUG (" essence container %u = %s", i,
602 mxf_ul_to_string (&self->essence_containers[i], str));
608 if (!mxf_ul_array_parse (&self->dm_schemes, &self->n_dm_schemes, tag_data,
611 GST_DEBUG (" number of DM schemes = %u", self->n_dm_schemes);
613 #ifndef GST_DISABLE_GST_DEBUG
616 for (i = 0; i < self->n_dm_schemes; i++) {
617 GST_DEBUG (" DM schemes %u = %s", i,
618 mxf_ul_to_string (&self->dm_schemes[i], str));
625 MXF_METADATA_BASE_CLASS
626 (mxf_metadata_preface_parent_class)->handle_tag (metadata, primer,
627 tag, tag_data, tag_size);
635 GST_ERROR ("Invalid preface local tag 0x%04x of size %u", tag, tag_size);
641 mxf_metadata_preface_resolve (MXFMetadataBase * m, GHashTable * metadata)
643 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
644 MXFMetadataBase *current = NULL;
647 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
648 current = g_hash_table_lookup (metadata, &self->primary_package_uid);
649 if (!current || !MXF_IS_METADATA_GENERIC_PACKAGE (current)) {
650 GST_ERROR ("Primary package not found");
652 if (mxf_metadata_base_resolve (current, metadata)) {
653 self->primary_package = MXF_METADATA_GENERIC_PACKAGE (current);
659 current = g_hash_table_lookup (metadata, &self->content_storage_uid);
660 if (!current || !MXF_IS_METADATA_CONTENT_STORAGE (current)) {
661 GST_ERROR ("Content storage not found");
664 if (mxf_metadata_base_resolve (current, metadata)) {
665 self->content_storage = MXF_METADATA_CONTENT_STORAGE (current);
667 GST_ERROR ("Couldn't resolve content storage");
673 if (self->identifications)
674 memset (self->identifications, 0,
675 sizeof (gpointer) * self->n_identifications);
677 self->identifications =
678 g_new0 (MXFMetadataIdentification *, self->n_identifications);
679 for (i = 0; i < self->n_identifications; i++) {
680 current = g_hash_table_lookup (metadata, &self->identifications_uids[i]);
681 if (current && MXF_IS_METADATA_IDENTIFICATION (current)) {
682 if (mxf_metadata_base_resolve (current, metadata))
683 self->identifications[i] = MXF_METADATA_IDENTIFICATION (current);
689 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->resolve (m,
693 static GstStructure *
694 mxf_metadata_preface_to_structure (MXFMetadataBase * m)
697 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->to_structure
699 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
703 if (!mxf_timestamp_is_unknown (&self->last_modified_date)) {
704 mxf_timestamp_to_string (&self->last_modified_date, str);
705 gst_structure_id_set (ret, MXF_QUARK (LAST_MODIFIED_DATE), G_TYPE_STRING,
709 if (self->version != 0)
710 gst_structure_id_set (ret, MXF_QUARK (VERSION), G_TYPE_UINT, self->version,
713 if (self->object_model_version != 0)
714 gst_structure_id_set (ret, MXF_QUARK (OBJECT_MODEL_VERSION), G_TYPE_UINT,
715 self->object_model_version, NULL);
717 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
718 mxf_uuid_to_string (&self->primary_package_uid, str);
719 gst_structure_id_set (ret, MXF_QUARK (PRIMARY_PACKAGE), G_TYPE_STRING, str,
723 if (self->n_identifications > 0) {
728 g_value_init (&arr, GST_TYPE_ARRAY);
730 for (i = 0; i < self->n_identifications; i++) {
733 if (self->identifications[i] == NULL)
736 g_value_init (&val, GST_TYPE_STRUCTURE);
738 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
739 (self->identifications[i]));
740 gst_value_set_structure (&val, s);
741 gst_structure_free (s);
742 gst_value_array_append_value (&arr, &val);
743 g_value_unset (&val);
746 if (gst_value_array_get_size (&arr) > 0)
747 gst_structure_id_set_value (ret, MXF_QUARK (IDENTIFICATIONS), &arr);
749 g_value_unset (&arr);
752 if (self->content_storage) {
754 mxf_metadata_base_to_structure (MXF_METADATA_BASE
755 (self->content_storage));
756 gst_structure_id_set (ret, MXF_QUARK (CONTENT_STORAGE), GST_TYPE_STRUCTURE,
758 gst_structure_free (s);
761 if (!mxf_ul_is_zero (&self->operational_pattern)) {
762 mxf_ul_to_string (&self->operational_pattern, str);
763 gst_structure_id_set (ret, MXF_QUARK (OPERATIONAL_PATTERN), G_TYPE_STRING,
767 if (self->n_essence_containers > 0) {
772 g_value_init (&arr, GST_TYPE_ARRAY);
774 for (i = 0; i < self->n_essence_containers; i++) {
775 if (mxf_ul_is_zero (&self->essence_containers[i]))
778 g_value_init (&val, G_TYPE_STRING);
780 mxf_ul_to_string (&self->essence_containers[i], str);
781 g_value_set_string (&val, str);
783 gst_value_array_append_value (&arr, &val);
784 g_value_unset (&val);
787 if (gst_value_array_get_size (&arr) > 0)
788 gst_structure_id_set_value (ret, MXF_QUARK (ESSENCE_CONTAINERS), &arr);
790 g_value_unset (&arr);
793 if (self->n_dm_schemes > 0) {
798 g_value_init (&arr, GST_TYPE_ARRAY);
800 for (i = 0; i < self->n_dm_schemes; i++) {
801 if (mxf_ul_is_zero (&self->dm_schemes[i]))
804 g_value_init (&val, G_TYPE_STRING);
806 mxf_ul_to_string (&self->dm_schemes[i], str);
807 g_value_set_string (&val, str);
809 gst_value_array_append_value (&arr, &val);
810 g_value_unset (&val);
813 if (gst_value_array_get_size (&arr) > 0)
814 gst_structure_id_set_value (ret, MXF_QUARK (DM_SCHEMES), &arr);
816 g_value_unset (&arr);
823 mxf_metadata_preface_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
825 MXFMetadataPreface *self = MXF_METADATA_PREFACE (m);
827 MXF_METADATA_BASE_CLASS (mxf_metadata_preface_parent_class)->write_tags
832 t = g_slice_new0 (MXFLocalTag);
833 memcpy (&t->ul, MXF_UL (LAST_MODIFIED_DATE), 16);
835 t->data = g_slice_alloc (8);
837 mxf_timestamp_write (&self->last_modified_date, t->data);
838 mxf_primer_pack_add_mapping (primer, 0x3b02, &t->ul);
839 ret = g_list_prepend (ret, t);
841 t = g_slice_new0 (MXFLocalTag);
842 memcpy (&t->ul, MXF_UL (VERSION), 16);
844 t->data = g_slice_alloc (2);
846 GST_WRITE_UINT16_BE (t->data, self->version);
847 mxf_primer_pack_add_mapping (primer, 0x3b05, &t->ul);
848 ret = g_list_prepend (ret, t);
850 if (self->object_model_version) {
851 t = g_slice_new0 (MXFLocalTag);
852 memcpy (&t->ul, MXF_UL (OBJECT_MODEL_VERSION), 16);
854 t->data = g_slice_alloc (4);
856 GST_WRITE_UINT32_BE (t->data, self->object_model_version);
857 mxf_primer_pack_add_mapping (primer, 0x3b07, &t->ul);
858 ret = g_list_prepend (ret, t);
861 if (!mxf_uuid_is_zero (&self->primary_package_uid)) {
862 t = g_slice_new0 (MXFLocalTag);
863 memcpy (&t->ul, MXF_UL (PRIMARY_PACKAGE), 16);
865 t->data = g_slice_alloc (16);
867 memcpy (t->data, &self->primary_package_uid, 16);
868 mxf_primer_pack_add_mapping (primer, 0x3b08, &t->ul);
869 ret = g_list_prepend (ret, t);
872 t = g_slice_new0 (MXFLocalTag);
873 memcpy (&t->ul, MXF_UL (IDENTIFICATIONS), 16);
874 t->size = 8 + 16 * self->n_identifications;
875 t->data = g_slice_alloc0 (t->size);
877 mxf_primer_pack_add_mapping (primer, 0x3b06, &t->ul);
878 GST_WRITE_UINT32_BE (t->data, self->n_identifications);
879 GST_WRITE_UINT32_BE (t->data + 4, 16);
880 for (i = 0; i < self->n_identifications; i++) {
881 if (!self->identifications[i])
884 memcpy (t->data + 8 + 16 * i,
885 &MXF_METADATA_BASE (self->identifications[i])->instance_uid, 16);
887 ret = g_list_prepend (ret, t);
889 t = g_slice_new0 (MXFLocalTag);
890 memcpy (&t->ul, MXF_UL (CONTENT_STORAGE), 16);
892 t->data = g_slice_alloc (t->size);
894 mxf_primer_pack_add_mapping (primer, 0x3b03, &t->ul);
895 memcpy (t->data, &MXF_METADATA_BASE (self->content_storage)->instance_uid,
897 ret = g_list_prepend (ret, t);
899 t = g_slice_new0 (MXFLocalTag);
900 memcpy (&t->ul, MXF_UL (OPERATIONAL_PATTERN), 16);
902 t->data = g_slice_alloc (t->size);
904 mxf_primer_pack_add_mapping (primer, 0x3b09, &t->ul);
905 memcpy (t->data, &self->operational_pattern, 16);
906 ret = g_list_prepend (ret, t);
908 t = g_slice_new0 (MXFLocalTag);
909 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINERS), 16);
910 t->size = 8 + 16 * self->n_essence_containers;
911 t->data = g_slice_alloc0 (t->size);
913 mxf_primer_pack_add_mapping (primer, 0x3b0a, &t->ul);
914 GST_WRITE_UINT32_BE (t->data, self->n_essence_containers);
915 GST_WRITE_UINT32_BE (t->data + 4, 16);
916 for (i = 0; i < self->n_essence_containers; i++) {
917 memcpy (t->data + 8 + 16 * i, &self->essence_containers[i], 16);
919 ret = g_list_prepend (ret, t);
921 if (self->dm_schemes) {
922 t = g_slice_new0 (MXFLocalTag);
923 memcpy (&t->ul, MXF_UL (DM_SCHEMES), 16);
924 t->size = 8 + 16 * self->n_dm_schemes;
925 t->data = g_slice_alloc0 (t->size);
927 mxf_primer_pack_add_mapping (primer, 0x3b0b, &t->ul);
928 GST_WRITE_UINT32_BE (t->data, self->n_dm_schemes);
929 GST_WRITE_UINT32_BE (t->data + 4, 16);
930 for (i = 0; i < self->n_dm_schemes; i++) {
931 memcpy (t->data + 8 + 16 * i, &self->dm_schemes[i], 16);
933 ret = g_list_prepend (ret, t);
940 mxf_metadata_preface_init (MXFMetadataPreface * self)
946 mxf_metadata_preface_class_init (MXFMetadataPrefaceClass * klass)
948 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
949 GObjectClass *object_class = (GObjectClass *) klass;
950 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
952 object_class->finalize = mxf_metadata_preface_finalize;
953 metadata_base_class->handle_tag = mxf_metadata_preface_handle_tag;
954 metadata_base_class->resolve = mxf_metadata_preface_resolve;
955 metadata_base_class->to_structure = mxf_metadata_preface_to_structure;
956 metadata_base_class->write_tags = mxf_metadata_preface_write_tags;
957 metadata_base_class->name_quark = MXF_QUARK (PREFACE);
958 metadata_class->type = 0x012f;
961 G_DEFINE_TYPE (MXFMetadataIdentification, mxf_metadata_identification,
965 mxf_metadata_identification_finalize (GObject * object)
967 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (object);
969 g_free (self->company_name);
970 self->company_name = NULL;
972 g_free (self->product_name);
973 self->product_name = NULL;
975 g_free (self->version_string);
976 self->version_string = NULL;
978 g_free (self->platform);
979 self->platform = NULL;
981 G_OBJECT_CLASS (mxf_metadata_identification_parent_class)->finalize (object);
985 mxf_metadata_identification_handle_tag (MXFMetadataBase * metadata,
986 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
989 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (metadata);
991 #ifndef GST_DISABLE_GST_DEBUG
999 memcpy (&self->this_generation_uid, tag_data, 16);
1000 GST_DEBUG (" this generation uid = %s",
1001 mxf_uuid_to_string (&self->this_generation_uid, str));
1004 self->company_name = mxf_utf16_to_utf8 (tag_data, tag_size);
1005 GST_DEBUG (" company name = %s", GST_STR_NULL (self->company_name));
1008 self->product_name = mxf_utf16_to_utf8 (tag_data, tag_size);
1009 GST_DEBUG (" product name = %s", GST_STR_NULL (self->product_name));
1012 if (!mxf_product_version_parse (&self->product_version,
1013 tag_data, tag_size))
1015 GST_DEBUG (" product version = %u.%u.%u.%u.%u",
1016 self->product_version.major,
1017 self->product_version.minor,
1018 self->product_version.patch,
1019 self->product_version.build, self->product_version.release);
1022 self->version_string = mxf_utf16_to_utf8 (tag_data, tag_size);
1023 GST_DEBUG (" version string = %s", GST_STR_NULL (self->version_string));
1028 memcpy (&self->product_uid, tag_data, 16);
1029 GST_DEBUG (" product uid = %s",
1030 mxf_uuid_to_string (&self->product_uid, str));
1033 if (!mxf_timestamp_parse (&self->modification_date, tag_data, tag_size))
1035 GST_DEBUG (" modification date = %s",
1036 mxf_timestamp_to_string (&self->modification_date, str));
1039 if (!mxf_product_version_parse (&self->toolkit_version,
1040 tag_data, tag_size))
1042 GST_DEBUG (" toolkit version = %u.%u.%u.%u.%u",
1043 self->toolkit_version.major,
1044 self->toolkit_version.minor,
1045 self->toolkit_version.patch,
1046 self->toolkit_version.build, self->toolkit_version.release);
1049 self->platform = mxf_utf16_to_utf8 (tag_data, tag_size);
1050 GST_DEBUG (" platform = %s", GST_STR_NULL (self->platform));
1054 MXF_METADATA_BASE_CLASS
1055 (mxf_metadata_identification_parent_class)->handle_tag (metadata,
1056 primer, tag, tag_data, tag_size);
1063 GST_ERROR ("Invalid identification local tag 0x%04x of size %u", tag,
1069 static GstStructure *
1070 mxf_metadata_identification_to_structure (MXFMetadataBase * m)
1073 MXF_METADATA_BASE_CLASS
1074 (mxf_metadata_identification_parent_class)->to_structure (m);
1075 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (m);
1078 if (!mxf_uuid_is_zero (&self->this_generation_uid)) {
1079 mxf_uuid_to_string (&self->this_generation_uid, str);
1080 gst_structure_id_set (ret, MXF_QUARK (THIS_GENERATION_UID), G_TYPE_STRING,
1084 if (self->company_name)
1085 gst_structure_id_set (ret, MXF_QUARK (COMPANY_NAME), G_TYPE_STRING,
1086 self->company_name, NULL);
1088 if (self->product_name)
1089 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_NAME), G_TYPE_STRING,
1090 self->product_name, NULL);
1092 if (self->product_version.major ||
1093 self->product_version.minor ||
1094 self->product_version.patch ||
1095 self->product_version.build || self->product_version.release) {
1096 g_snprintf (str, 48, "%u.%u.%u.%u.%u", self->product_version.major,
1097 self->product_version.minor,
1098 self->product_version.patch,
1099 self->product_version.build, self->product_version.release);
1100 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_VERSION), G_TYPE_STRING, str,
1104 if (self->version_string)
1105 gst_structure_id_set (ret, MXF_QUARK (VERSION_STRING), G_TYPE_STRING,
1106 self->version_string, NULL);
1108 if (!mxf_uuid_is_zero (&self->product_uid)) {
1109 mxf_uuid_to_string (&self->product_uid, str);
1110 gst_structure_id_set (ret, MXF_QUARK (PRODUCT_UID), G_TYPE_STRING, str,
1114 if (!mxf_timestamp_is_unknown (&self->modification_date)) {
1115 mxf_timestamp_to_string (&self->modification_date, str);
1116 gst_structure_id_set (ret, MXF_QUARK (MODIFICATION_DATE), G_TYPE_STRING,
1120 if (self->toolkit_version.major ||
1121 self->toolkit_version.minor ||
1122 self->toolkit_version.patch ||
1123 self->toolkit_version.build || self->toolkit_version.release) {
1124 g_snprintf (str, 48, "%u.%u.%u.%u.%u", self->toolkit_version.major,
1125 self->toolkit_version.minor,
1126 self->toolkit_version.patch,
1127 self->toolkit_version.build, self->toolkit_version.release);
1128 gst_structure_id_set (ret, MXF_QUARK (TOOLKIT_VERSION), G_TYPE_STRING, str,
1133 gst_structure_id_set (ret, MXF_QUARK (PLATFORM), G_TYPE_STRING,
1134 self->platform, NULL);
1140 mxf_metadata_identification_write_tags (MXFMetadataBase * m,
1141 MXFPrimerPack * primer)
1143 MXFMetadataIdentification *self = MXF_METADATA_IDENTIFICATION (m);
1145 MXF_METADATA_BASE_CLASS
1146 (mxf_metadata_identification_parent_class)->write_tags (m, primer);
1149 if (self->company_name) {
1150 t = g_slice_new0 (MXFLocalTag);
1151 memcpy (&t->ul, MXF_UL (COMPANY_NAME), 16);
1152 t->data = mxf_utf8_to_utf16 (self->company_name, &t->size);
1153 mxf_primer_pack_add_mapping (primer, 0x3c01, &t->ul);
1154 ret = g_list_prepend (ret, t);
1157 if (self->product_name) {
1158 t = g_slice_new0 (MXFLocalTag);
1159 memcpy (&t->ul, MXF_UL (PRODUCT_NAME), 16);
1160 t->data = mxf_utf8_to_utf16 (self->product_name, &t->size);
1161 mxf_primer_pack_add_mapping (primer, 0x3c02, &t->ul);
1162 ret = g_list_prepend (ret, t);
1165 if (!mxf_product_version_is_valid (&self->product_version)) {
1166 t = g_slice_new0 (MXFLocalTag);
1167 memcpy (&t->ul, MXF_UL (PRODUCT_VERSION), 16);
1169 t->data = g_slice_alloc (t->size);
1171 mxf_product_version_write (&self->product_version, t->data);
1172 mxf_primer_pack_add_mapping (primer, 0x3c03, &t->ul);
1173 ret = g_list_prepend (ret, t);
1176 if (self->version_string) {
1177 t = g_slice_new0 (MXFLocalTag);
1178 memcpy (&t->ul, MXF_UL (VERSION_STRING), 16);
1179 t->data = mxf_utf8_to_utf16 (self->version_string, &t->size);
1180 mxf_primer_pack_add_mapping (primer, 0x3c04, &t->ul);
1181 ret = g_list_prepend (ret, t);
1184 if (!mxf_uuid_is_zero (&self->product_uid)) {
1185 t = g_slice_new0 (MXFLocalTag);
1186 memcpy (&t->ul, MXF_UL (PRODUCT_UID), 16);
1188 t->data = g_slice_alloc (t->size);
1190 memcpy (t->data, &self->product_uid, 16);
1191 mxf_primer_pack_add_mapping (primer, 0x3c05, &t->ul);
1192 ret = g_list_prepend (ret, t);
1195 if (!mxf_timestamp_is_unknown (&self->modification_date)) {
1196 t = g_slice_new0 (MXFLocalTag);
1197 memcpy (&t->ul, MXF_UL (MODIFICATION_DATE), 16);
1199 t->data = g_slice_alloc (t->size);
1201 mxf_timestamp_write (&self->modification_date, t->data);
1202 mxf_primer_pack_add_mapping (primer, 0x3c06, &t->ul);
1203 ret = g_list_prepend (ret, t);
1206 if (!mxf_product_version_is_valid (&self->toolkit_version)) {
1207 t = g_slice_new0 (MXFLocalTag);
1208 memcpy (&t->ul, MXF_UL (TOOLKIT_VERSION), 16);
1210 t->data = g_slice_alloc (t->size);
1212 mxf_product_version_write (&self->toolkit_version, t->data);
1213 mxf_primer_pack_add_mapping (primer, 0x3c07, &t->ul);
1214 ret = g_list_prepend (ret, t);
1217 if (self->platform) {
1218 t = g_slice_new0 (MXFLocalTag);
1219 memcpy (&t->ul, MXF_UL (PLATFORM), 16);
1220 t->data = mxf_utf8_to_utf16 (self->platform, &t->size);
1221 mxf_primer_pack_add_mapping (primer, 0x3c08, &t->ul);
1222 ret = g_list_prepend (ret, t);
1229 mxf_metadata_identification_init (MXFMetadataIdentification * self)
1235 mxf_metadata_identification_class_init (MXFMetadataIdentificationClass * klass)
1237 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1238 GObjectClass *object_class = (GObjectClass *) klass;
1239 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1241 object_class->finalize = mxf_metadata_identification_finalize;
1242 metadata_base_class->handle_tag = mxf_metadata_identification_handle_tag;
1243 metadata_base_class->name_quark = MXF_QUARK (IDENTIFICATION);
1244 metadata_base_class->to_structure = mxf_metadata_identification_to_structure;
1245 metadata_base_class->write_tags = mxf_metadata_identification_write_tags;
1246 metadata_class->type = 0x0130;
1249 G_DEFINE_TYPE (MXFMetadataContentStorage, mxf_metadata_content_storage,
1253 mxf_metadata_content_storage_finalize (GObject * object)
1255 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (object);
1257 g_free (self->packages);
1258 self->packages = NULL;
1259 g_free (self->packages_uids);
1260 self->packages_uids = NULL;
1261 g_free (self->essence_container_data);
1262 self->essence_container_data = NULL;
1263 g_free (self->essence_container_data_uids);
1264 self->essence_container_data_uids = NULL;
1266 G_OBJECT_CLASS (mxf_metadata_content_storage_parent_class)->finalize (object);
1270 mxf_metadata_content_storage_handle_tag (MXFMetadataBase * metadata,
1271 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1274 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (metadata);
1275 gboolean ret = TRUE;
1276 #ifndef GST_DISABLE_GST_DEBUG
1282 if (!mxf_uuid_array_parse (&self->packages_uids, &self->n_packages,
1283 tag_data, tag_size))
1285 GST_DEBUG (" number of packages = %u", self->n_packages);
1286 #ifndef GST_DISABLE_GST_DEBUG
1289 for (i = 0; i < self->n_packages; i++) {
1290 GST_DEBUG (" package %u = %s", i,
1291 mxf_uuid_to_string (&self->packages_uids[i], str));
1297 if (!mxf_uuid_array_parse (&self->essence_container_data_uids,
1298 &self->n_essence_container_data, tag_data, tag_size))
1301 GST_DEBUG (" number of essence container data = %u",
1302 self->n_essence_container_data);
1303 #ifndef GST_DISABLE_GST_DEBUG
1306 for (i = 0; i < self->n_essence_container_data; i++) {
1307 GST_DEBUG (" essence container data %u = %s", i,
1308 mxf_uuid_to_string (&self->essence_container_data_uids[i], str));
1315 MXF_METADATA_BASE_CLASS
1316 (mxf_metadata_content_storage_parent_class)->handle_tag (metadata,
1317 primer, tag, tag_data, tag_size);
1325 GST_ERROR ("Invalid content storage local tag 0x%04x of size %u", tag,
1332 mxf_metadata_content_storage_resolve (MXFMetadataBase * m,
1333 GHashTable * metadata)
1335 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1336 MXFMetadataBase *current = NULL;
1338 gboolean have_package = FALSE;
1339 gboolean have_ecd = FALSE;
1342 memset (self->packages, 0, sizeof (gpointer) * self->n_packages);
1344 self->packages = g_new0 (MXFMetadataGenericPackage *, self->n_packages);
1346 for (i = 0; i < self->n_packages; i++) {
1347 current = g_hash_table_lookup (metadata, &self->packages_uids[i]);
1348 if (current && MXF_IS_METADATA_GENERIC_PACKAGE (current)) {
1349 if (mxf_metadata_base_resolve (current, metadata)) {
1350 self->packages[i] = MXF_METADATA_GENERIC_PACKAGE (current);
1351 have_package = TRUE;
1353 GST_ERROR ("Couldn't resolve package");
1356 GST_ERROR ("Package not found");
1360 if (self->essence_container_data)
1361 memset (self->essence_container_data, 0,
1362 sizeof (gpointer) * self->n_essence_container_data);
1364 self->essence_container_data =
1365 g_new0 (MXFMetadataEssenceContainerData *,
1366 self->n_essence_container_data);
1367 for (i = 0; i < self->n_essence_container_data; i++) {
1369 g_hash_table_lookup (metadata, &self->essence_container_data_uids[i]);
1370 if (current && MXF_IS_METADATA_ESSENCE_CONTAINER_DATA (current)) {
1371 if (mxf_metadata_base_resolve (current, metadata)) {
1372 self->essence_container_data[i] =
1373 MXF_METADATA_ESSENCE_CONTAINER_DATA (current);
1376 GST_ERROR ("Couldn't resolve essence container data");
1379 GST_ERROR ("Essence container data not found");
1383 if (!have_package) {
1384 GST_ERROR ("Couldn't resolve any package");
1386 } else if (!have_ecd) {
1387 GST_ERROR ("Couldn't resolve any essence container data");
1392 MXF_METADATA_BASE_CLASS
1393 (mxf_metadata_content_storage_parent_class)->resolve (m, metadata);
1396 static GstStructure *
1397 mxf_metadata_content_storage_to_structure (MXFMetadataBase * m)
1400 MXF_METADATA_BASE_CLASS
1401 (mxf_metadata_content_storage_parent_class)->to_structure (m);
1402 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1405 if (self->n_packages > 0) {
1410 g_value_init (&arr, GST_TYPE_ARRAY);
1412 for (i = 0; i < self->n_packages; i++) {
1415 if (self->packages[i] == NULL)
1418 g_value_init (&val, GST_TYPE_STRUCTURE);
1420 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->packages
1422 gst_value_set_structure (&val, s);
1423 gst_structure_free (s);
1424 gst_value_array_append_value (&arr, &val);
1425 g_value_unset (&val);
1428 if (gst_value_array_get_size (&arr) > 0)
1429 gst_structure_id_set_value (ret, MXF_QUARK (PACKAGES), &arr);
1431 g_value_unset (&arr);
1434 if (self->n_essence_container_data > 0) {
1439 g_value_init (&arr, GST_TYPE_ARRAY);
1441 for (i = 0; i < self->n_essence_container_data; i++) {
1444 if (self->essence_container_data[i] == NULL)
1447 g_value_init (&val, GST_TYPE_STRUCTURE);
1449 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
1450 (self->essence_container_data[i]));
1451 gst_value_set_structure (&val, s);
1452 gst_structure_free (s);
1453 gst_value_array_append_value (&arr, &val);
1454 g_value_unset (&val);
1457 if (gst_value_array_get_size (&arr) > 0)
1458 gst_structure_id_set_value (ret, MXF_QUARK (ESSENCE_CONTAINER_DATA),
1461 g_value_unset (&arr);
1468 mxf_metadata_content_storage_write_tags (MXFMetadataBase * m,
1469 MXFPrimerPack * primer)
1471 MXFMetadataContentStorage *self = MXF_METADATA_CONTENT_STORAGE (m);
1473 MXF_METADATA_BASE_CLASS
1474 (mxf_metadata_content_storage_parent_class)->write_tags (m, primer);
1478 if (self->packages) {
1479 t = g_slice_new0 (MXFLocalTag);
1480 memcpy (&t->ul, MXF_UL (PACKAGES), 16);
1481 t->size = 8 + 16 * self->n_packages;
1482 t->data = g_slice_alloc0 (t->size);
1484 GST_WRITE_UINT32_BE (t->data, self->n_packages);
1485 GST_WRITE_UINT32_BE (t->data + 4, 16);
1486 for (i = 0; i < self->n_packages; i++) {
1487 if (!self->packages[i])
1490 memcpy (t->data + 8 + i * 16,
1491 &MXF_METADATA_BASE (self->packages[i])->instance_uid, 16);
1494 mxf_primer_pack_add_mapping (primer, 0x1901, &t->ul);
1495 ret = g_list_prepend (ret, t);
1498 if (self->essence_container_data) {
1499 t = g_slice_new0 (MXFLocalTag);
1500 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINER_DATA), 16);
1501 t->size = 8 + 16 * self->n_essence_container_data;
1502 t->data = g_slice_alloc0 (t->size);
1504 GST_WRITE_UINT32_BE (t->data, self->n_essence_container_data);
1505 GST_WRITE_UINT32_BE (t->data + 4, 16);
1506 for (i = 0; i < self->n_essence_container_data; i++) {
1507 if (!self->essence_container_data[i])
1510 memcpy (t->data + 8 + i * 16,
1511 &MXF_METADATA_BASE (self->essence_container_data[i])->instance_uid,
1515 mxf_primer_pack_add_mapping (primer, 0x1902, &t->ul);
1516 ret = g_list_prepend (ret, t);
1523 mxf_metadata_content_storage_init (MXFMetadataContentStorage * self)
1529 mxf_metadata_content_storage_class_init (MXFMetadataContentStorageClass * klass)
1531 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1532 GObjectClass *object_class = (GObjectClass *) klass;
1533 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1535 object_class->finalize = mxf_metadata_content_storage_finalize;
1536 metadata_base_class->handle_tag = mxf_metadata_content_storage_handle_tag;
1537 metadata_base_class->resolve = mxf_metadata_content_storage_resolve;
1538 metadata_base_class->name_quark = MXF_QUARK (CONTENT_STORAGE);
1539 metadata_base_class->to_structure = mxf_metadata_content_storage_to_structure;
1540 metadata_base_class->write_tags = mxf_metadata_content_storage_write_tags;
1541 metadata_class->type = 0x0118;
1544 G_DEFINE_TYPE (MXFMetadataEssenceContainerData,
1545 mxf_metadata_essence_container_data, MXF_TYPE_METADATA);
1548 mxf_metadata_essence_container_data_handle_tag (MXFMetadataBase * metadata,
1549 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1552 MXFMetadataEssenceContainerData *self =
1553 MXF_METADATA_ESSENCE_CONTAINER_DATA (metadata);
1554 gboolean ret = TRUE;
1555 #ifndef GST_DISABLE_GST_DEBUG
1563 memcpy (&self->linked_package_uid, tag_data, 32);
1564 GST_DEBUG (" linked package = %s",
1565 mxf_umid_to_string (&self->linked_package_uid, str));
1570 self->index_sid = GST_READ_UINT32_BE (tag_data);
1571 GST_DEBUG (" index sid = %u", self->index_sid);
1576 self->body_sid = GST_READ_UINT32_BE (tag_data);
1577 GST_DEBUG (" body sid = %u", self->body_sid);
1581 MXF_METADATA_BASE_CLASS
1582 (mxf_metadata_essence_container_data_parent_class)->handle_tag
1583 (metadata, primer, tag, tag_data, tag_size);
1591 GST_ERROR ("Invalid essence container data local tag 0x%04x of size %u", tag,
1598 mxf_metadata_essence_container_data_resolve (MXFMetadataBase * m,
1599 GHashTable * metadata)
1601 MXFMetadataEssenceContainerData *self =
1602 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1603 MXFMetadataBase *current = NULL;
1604 GHashTableIter iter;
1606 g_hash_table_iter_init (&iter, metadata);
1608 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & current)) {
1609 if (MXF_IS_METADATA_SOURCE_PACKAGE (current)) {
1610 MXFMetadataSourcePackage *package = MXF_METADATA_SOURCE_PACKAGE (current);
1612 if (mxf_umid_is_equal (&package->parent.package_uid,
1613 &self->linked_package_uid)) {
1614 if (mxf_metadata_base_resolve (current, metadata)) {
1615 self->linked_package = package;
1622 if (!self->linked_package) {
1623 GST_ERROR ("Couldn't resolve a package");
1628 MXF_METADATA_BASE_CLASS
1629 (mxf_metadata_essence_container_data_parent_class)->resolve (m, metadata);
1632 static GstStructure *
1633 mxf_metadata_essence_container_data_to_structure (MXFMetadataBase * m)
1636 MXF_METADATA_BASE_CLASS
1637 (mxf_metadata_essence_container_data_parent_class)->to_structure (m);
1638 MXFMetadataEssenceContainerData *self =
1639 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1642 if (!mxf_umid_is_zero (&self->linked_package_uid)) {
1643 mxf_umid_to_string (&self->linked_package_uid, str);
1644 gst_structure_id_set (ret, MXF_QUARK (LINKED_PACKAGE), G_TYPE_STRING, str,
1648 gst_structure_id_set (ret, MXF_QUARK (INDEX_SID), G_TYPE_UINT,
1649 self->index_sid, MXF_QUARK (BODY_SID), G_TYPE_UINT, self->body_sid, NULL);
1656 mxf_metadata_essence_container_data_write_tags (MXFMetadataBase * m,
1657 MXFPrimerPack * primer)
1659 MXFMetadataEssenceContainerData *self =
1660 MXF_METADATA_ESSENCE_CONTAINER_DATA (m);
1662 MXF_METADATA_BASE_CLASS
1663 (mxf_metadata_essence_container_data_parent_class)->write_tags (m,
1667 t = g_slice_new0 (MXFLocalTag);
1668 memcpy (&t->ul, MXF_UL (LINKED_PACKAGE_UID), 16);
1670 t->data = g_slice_alloc0 (32);
1672 if (self->linked_package)
1673 memcpy (t->data, &self->linked_package->parent.package_uid, 32);
1674 mxf_primer_pack_add_mapping (primer, 0x2701, &t->ul);
1675 ret = g_list_prepend (ret, t);
1677 t = g_slice_new0 (MXFLocalTag);
1678 memcpy (&t->ul, MXF_UL (BODY_SID), 16);
1680 t->data = g_slice_alloc (4);
1682 GST_WRITE_UINT32_BE (t->data, self->body_sid);
1683 mxf_primer_pack_add_mapping (primer, 0x3f07, &t->ul);
1684 ret = g_list_prepend (ret, t);
1686 if (self->index_sid) {
1687 t = g_slice_new0 (MXFLocalTag);
1688 memcpy (&t->ul, MXF_UL (INDEX_SID), 16);
1690 t->data = g_slice_alloc (4);
1692 GST_WRITE_UINT32_BE (t->data, self->index_sid);
1693 mxf_primer_pack_add_mapping (primer, 0x3f07, &t->ul);
1694 ret = g_list_prepend (ret, t);
1701 mxf_metadata_essence_container_data_init (MXFMetadataEssenceContainerData *
1708 mxf_metadata_essence_container_data_class_init
1709 (MXFMetadataEssenceContainerDataClass * klass)
1711 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
1712 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
1714 metadata_base_class->handle_tag =
1715 mxf_metadata_essence_container_data_handle_tag;
1716 metadata_base_class->resolve = mxf_metadata_essence_container_data_resolve;
1717 metadata_base_class->name_quark = MXF_QUARK (ESSENCE_CONTAINER_DATA);
1718 metadata_base_class->to_structure =
1719 mxf_metadata_essence_container_data_to_structure;
1720 metadata_base_class->write_tags =
1721 mxf_metadata_essence_container_data_write_tags;
1722 metadata_class->type = 0x0123;
1725 G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericPackage, mxf_metadata_generic_package,
1729 mxf_metadata_generic_package_finalize (GObject * object)
1731 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (object);
1733 g_free (self->name);
1735 g_free (self->tracks_uids);
1736 self->tracks_uids = NULL;
1738 g_free (self->tracks);
1739 self->tracks = NULL;
1741 G_OBJECT_CLASS (mxf_metadata_generic_package_parent_class)->finalize (object);
1745 mxf_metadata_generic_package_handle_tag (MXFMetadataBase * metadata,
1746 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
1749 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (metadata);
1750 gboolean ret = TRUE;
1751 #ifndef GST_DISABLE_GST_DEBUG
1759 memcpy (&self->package_uid, tag_data, 32);
1760 GST_DEBUG (" UMID = %s", mxf_umid_to_string (&self->package_uid, str));
1763 self->name = mxf_utf16_to_utf8 (tag_data, tag_size);
1764 GST_DEBUG (" name = %s", GST_STR_NULL (self->name));
1767 if (!mxf_timestamp_parse (&self->package_creation_date,
1768 tag_data, tag_size))
1770 GST_DEBUG (" creation date = %s",
1771 mxf_timestamp_to_string (&self->package_creation_date, str));
1774 if (!mxf_timestamp_parse (&self->package_modified_date,
1775 tag_data, tag_size))
1777 GST_DEBUG (" modification date = %s",
1778 mxf_timestamp_to_string (&self->package_modified_date, str));
1781 if (!mxf_uuid_array_parse (&self->tracks_uids, &self->n_tracks, tag_data,
1785 GST_DEBUG (" number of tracks = %u", self->n_tracks);
1786 #ifndef GST_DISABLE_GST_DEBUG
1789 for (i = 0; i < self->n_tracks; i++) {
1790 GST_DEBUG (" track %u = %s", i,
1791 mxf_uuid_to_string (&self->tracks_uids[i], str));
1798 MXF_METADATA_BASE_CLASS
1799 (mxf_metadata_generic_package_parent_class)->handle_tag (metadata,
1800 primer, tag, tag_data, tag_size);
1808 GST_ERROR ("Invalid generic package local tag 0x%04x of size %u", tag,
1815 mxf_metadata_generic_package_resolve (MXFMetadataBase * m,
1816 GHashTable * metadata)
1818 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1819 MXFMetadataBase *current = NULL;
1821 gboolean have_track = FALSE;
1824 memset (self->tracks, 0, sizeof (gpointer) * self->n_tracks);
1826 self->tracks = g_new0 (MXFMetadataTrack *, self->n_tracks);
1827 for (i = 0; i < self->n_tracks; i++) {
1828 current = g_hash_table_lookup (metadata, &self->tracks_uids[i]);
1829 if (current && MXF_IS_METADATA_TRACK (current)) {
1830 if (mxf_metadata_base_resolve (current, metadata)) {
1831 MXFMetadataTrack *track = MXF_METADATA_TRACK (current);
1833 self->tracks[i] = track;
1835 if ((track->type & 0xf0) == 0x10)
1836 self->n_timecode_tracks++;
1837 else if ((track->type & 0xf0) == 0x20)
1838 self->n_metadata_tracks++;
1839 else if ((track->type & 0xf0) == 0x30)
1840 self->n_essence_tracks++;
1841 else if ((track->type & 0xf0) == 0x40)
1842 self->n_other_tracks++;
1844 GST_ERROR ("Track couldn't be resolved");
1847 GST_ERROR ("Track not found");
1852 GST_ERROR ("Couldn't resolve a track");
1857 MXF_METADATA_BASE_CLASS
1858 (mxf_metadata_generic_package_parent_class)->resolve (m, metadata);
1861 static GstStructure *
1862 mxf_metadata_generic_package_to_structure (MXFMetadataBase * m)
1865 MXF_METADATA_BASE_CLASS
1866 (mxf_metadata_generic_package_parent_class)->to_structure (m);
1867 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1871 mxf_umid_to_string (&self->package_uid, str);
1872 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_UID), G_TYPE_STRING, str, NULL);
1875 gst_structure_id_set (ret, MXF_QUARK (NAME), G_TYPE_STRING, self->name,
1878 if (!mxf_timestamp_is_unknown (&self->package_creation_date)) {
1879 mxf_timestamp_to_string (&self->package_creation_date, str);
1880 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_CREATION_DATE), G_TYPE_STRING,
1884 if (!mxf_timestamp_is_unknown (&self->package_modified_date)) {
1885 mxf_timestamp_to_string (&self->package_modified_date, str);
1886 gst_structure_id_set (ret, MXF_QUARK (PACKAGE_MODIFIED_DATE), G_TYPE_STRING,
1890 if (self->n_tracks > 0) {
1895 g_value_init (&arr, GST_TYPE_ARRAY);
1897 for (i = 0; i < self->n_tracks; i++) {
1900 if (self->tracks[i] == NULL)
1903 g_value_init (&val, GST_TYPE_STRUCTURE);
1905 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->tracks[i]));
1906 gst_value_set_structure (&val, s);
1907 gst_structure_free (s);
1908 gst_value_array_append_value (&arr, &val);
1909 g_value_unset (&val);
1912 if (gst_value_array_get_size (&arr) > 0)
1913 gst_structure_id_set_value (ret, MXF_QUARK (TRACKS), &arr);
1915 g_value_unset (&arr);
1922 mxf_metadata_generic_package_write_tags (MXFMetadataBase * m,
1923 MXFPrimerPack * primer)
1925 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
1927 MXF_METADATA_BASE_CLASS
1928 (mxf_metadata_generic_package_parent_class)->write_tags (m, primer);
1931 t = g_slice_new0 (MXFLocalTag);
1932 memcpy (&t->ul, MXF_UL (PACKAGE_UID), 16);
1934 t->data = g_slice_alloc (t->size);
1936 memcpy (t->data, &self->package_uid, 32);
1937 mxf_primer_pack_add_mapping (primer, 0x4401, &t->ul);
1938 ret = g_list_prepend (ret, t);
1941 t = g_slice_new0 (MXFLocalTag);
1942 memcpy (&t->ul, MXF_UL (PACKAGE_NAME), 16);
1943 t->data = mxf_utf8_to_utf16 (self->name, &t->size);
1944 mxf_primer_pack_add_mapping (primer, 0x4402, &t->ul);
1945 ret = g_list_prepend (ret, t);
1948 t = g_slice_new0 (MXFLocalTag);
1949 memcpy (&t->ul, MXF_UL (PACKAGE_CREATION_DATE), 16);
1951 t->data = g_slice_alloc (t->size);
1953 mxf_timestamp_write (&self->package_creation_date, t->data);
1954 mxf_primer_pack_add_mapping (primer, 0x4405, &t->ul);
1955 ret = g_list_prepend (ret, t);
1957 t = g_slice_new0 (MXFLocalTag);
1958 memcpy (&t->ul, MXF_UL (PACKAGE_MODIFIED_DATE), 16);
1960 t->data = g_slice_alloc (t->size);
1962 mxf_timestamp_write (&self->package_modified_date, t->data);
1963 mxf_primer_pack_add_mapping (primer, 0x4404, &t->ul);
1964 ret = g_list_prepend (ret, t);
1969 t = g_slice_new0 (MXFLocalTag);
1970 memcpy (&t->ul, MXF_UL (TRACKS), 16);
1971 t->size = 8 + 16 * self->n_tracks;
1972 t->data = g_slice_alloc0 (t->size);
1974 GST_WRITE_UINT32_BE (t->data, self->n_tracks);
1975 GST_WRITE_UINT32_BE (t->data + 4, 16);
1976 for (i = 0; i < self->n_tracks; i++) {
1977 if (!self->tracks[i])
1980 memcpy (t->data + 8 + 16 * i,
1981 &MXF_METADATA_BASE (self->tracks[i])->instance_uid, 16);
1983 mxf_primer_pack_add_mapping (primer, 0x4403, &t->ul);
1984 ret = g_list_prepend (ret, t);
1991 mxf_metadata_generic_package_init (MXFMetadataGenericPackage * self)
1997 mxf_metadata_generic_package_class_init (MXFMetadataGenericPackageClass * klass)
1999 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2000 GObjectClass *object_class = (GObjectClass *) klass;
2002 object_class->finalize = mxf_metadata_generic_package_finalize;
2003 metadata_base_class->handle_tag = mxf_metadata_generic_package_handle_tag;
2004 metadata_base_class->resolve = mxf_metadata_generic_package_resolve;
2005 metadata_base_class->to_structure = mxf_metadata_generic_package_to_structure;
2006 metadata_base_class->write_tags = mxf_metadata_generic_package_write_tags;
2009 G_DEFINE_TYPE (MXFMetadataMaterialPackage, mxf_metadata_material_package,
2010 MXF_TYPE_METADATA_GENERIC_PACKAGE);
2013 mxf_metadata_material_package_resolve (MXFMetadataBase * m,
2014 GHashTable * metadata)
2017 MXF_METADATA_BASE_CLASS
2018 (mxf_metadata_material_package_parent_class)->resolve (m, metadata);
2019 MXFMetadataGenericPackage *self = MXF_METADATA_GENERIC_PACKAGE (m);
2026 for (i = 0; i < self->n_tracks; i++) {
2027 MXFMetadataTrack *track = self->tracks[i];
2028 MXFMetadataSequence *sequence;
2034 sequence = track->sequence;
2036 if (!sequence || !sequence->structural_components)
2039 for (j = 0; j < sequence->n_structural_components; j++) {
2040 MXFMetadataSourceClip *sc;
2041 MXFMetadataTimelineTrack *st = NULL;
2044 if (!sequence->structural_components[j]
2045 || !MXF_IS_METADATA_SOURCE_CLIP (sequence->structural_components[j]))
2048 sc = MXF_METADATA_SOURCE_CLIP (sequence->structural_components[j]);
2050 if (!sc->source_package) {
2051 GST_ERROR ("Material package track %u without resolved source package",
2057 if (!mxf_metadata_base_resolve (MXF_METADATA_BASE (sc->source_package),
2059 GST_ERROR ("Couldn't resolve source package for track %u", i);
2064 sc->source_package->top_level = TRUE;
2065 for (k = 0; k < sc->source_package->parent.n_tracks; k++) {
2066 MXFMetadataTimelineTrack *tmp;
2068 if (!sc->source_package->parent.tracks[k] ||
2069 !MXF_IS_METADATA_TIMELINE_TRACK (sc->source_package->
2074 MXF_METADATA_TIMELINE_TRACK (sc->source_package->parent.tracks[k]);
2075 if (tmp->parent.track_id == sc->source_track_id) {
2082 GST_ERROR ("Material package track %u without resolved source track",
2091 self->tracks[i] = NULL;
2095 GST_ERROR ("No tracks could be resolved");
2097 } else if (ntracks != self->n_tracks) {
2098 GST_WARNING ("Not all tracks could be resolved");
2105 mxf_metadata_material_package_init (MXFMetadataMaterialPackage * self)
2110 mxf_metadata_material_package_class_init (MXFMetadataMaterialPackageClass *
2113 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2114 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2116 metadata_base_class->resolve = mxf_metadata_material_package_resolve;
2117 metadata_base_class->name_quark = MXF_QUARK (MATERIAL_PACKAGE);
2118 metadata_class->type = 0x0136;
2121 G_DEFINE_TYPE (MXFMetadataSourcePackage, mxf_metadata_source_package,
2122 MXF_TYPE_METADATA_GENERIC_PACKAGE);
2125 mxf_metadata_source_package_handle_tag (MXFMetadataBase * metadata,
2126 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2129 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (metadata);
2130 gboolean ret = TRUE;
2131 #ifndef GST_DISABLE_GST_DEBUG
2140 memcpy (&self->descriptor_uid, tag_data, 16);
2141 GST_DEBUG (" descriptor = %s",
2142 mxf_uuid_to_string (&self->descriptor_uid, str));
2146 MXF_METADATA_BASE_CLASS
2147 (mxf_metadata_source_package_parent_class)->handle_tag (metadata,
2148 primer, tag, tag_data, tag_size);
2156 GST_ERROR ("Invalid source package local tag 0x%04x of size %u", tag,
2163 mxf_metadata_source_package_resolve (MXFMetadataBase * m, GHashTable * metadata)
2165 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2166 MXFMetadataGenericPackage *package = MXF_METADATA_GENERIC_PACKAGE (m);
2167 MXFMetadataBase *current = NULL;
2170 MXFMetadataFileDescriptor *d;
2172 if (mxf_uuid_is_zero (&self->descriptor_uid))
2174 MXF_METADATA_BASE_CLASS
2175 (mxf_metadata_source_package_parent_class)->resolve (m, metadata);
2177 current = g_hash_table_lookup (metadata, &self->descriptor_uid);
2179 GST_ERROR ("Descriptor not found");
2183 if (!mxf_metadata_base_resolve (MXF_METADATA_BASE (current), metadata)) {
2184 GST_ERROR ("Couldn't resolve descriptor");
2188 self->descriptor = MXF_METADATA_GENERIC_DESCRIPTOR (current);
2191 MXF_METADATA_BASE_CLASS
2192 (mxf_metadata_source_package_parent_class)->resolve (m, metadata);
2194 if (!MXF_IS_METADATA_FILE_DESCRIPTOR (self->descriptor))
2197 d = MXF_METADATA_FILE_DESCRIPTOR (current);
2199 for (i = 0; i < package->n_tracks; i++) {
2200 if (!MXF_IS_METADATA_MULTIPLE_DESCRIPTOR (d)) {
2201 if (d->linked_track_id == package->tracks[i]->track_id ||
2202 (d->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2203 (package->tracks[i]->type & 0xf0) == 0x30)) {
2204 package->tracks[i]->descriptor =
2205 g_new0 (MXFMetadataFileDescriptor *, 1);
2206 package->tracks[i]->descriptor[0] = d;
2207 package->tracks[i]->n_descriptor = 1;
2211 guint n_descriptor = 0, j, k = 0;
2212 MXFMetadataMultipleDescriptor *md = MXF_METADATA_MULTIPLE_DESCRIPTOR (d);
2214 for (j = 0; j < md->n_sub_descriptors; j++) {
2215 MXFMetadataFileDescriptor *fd;
2217 if (!md->sub_descriptors[j] ||
2218 !MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]))
2221 fd = MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]);
2223 if (fd->linked_track_id == package->tracks[i]->track_id ||
2224 (fd->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2225 (package->tracks[i]->type & 0xf0) == 0x30))
2229 package->tracks[i]->descriptor =
2230 g_new0 (MXFMetadataFileDescriptor *, n_descriptor);
2231 package->tracks[i]->n_descriptor = n_descriptor;
2233 for (j = 0; j < md->n_sub_descriptors; j++) {
2234 MXFMetadataFileDescriptor *fd;
2236 if (!md->sub_descriptors[j] ||
2237 !MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]))
2240 fd = MXF_METADATA_FILE_DESCRIPTOR (md->sub_descriptors[j]);
2242 if (fd->linked_track_id == package->tracks[i]->track_id ||
2243 (fd->linked_track_id == 0 && package->n_essence_tracks == 1 &&
2244 (package->tracks[i]->type & 0xf0) == 0x30)) {
2245 package->tracks[i]->descriptor[k] = fd;
2255 static GstStructure *
2256 mxf_metadata_source_package_to_structure (MXFMetadataBase * m)
2259 MXF_METADATA_BASE_CLASS
2260 (mxf_metadata_source_package_parent_class)->to_structure (m);
2261 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2264 if (!self->descriptor)
2267 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->descriptor));
2268 gst_structure_id_set (ret, MXF_QUARK (DESCRIPTOR), GST_TYPE_STRUCTURE, s,
2270 gst_structure_free (s);
2276 mxf_metadata_source_package_write_tags (MXFMetadataBase * m,
2277 MXFPrimerPack * primer)
2279 MXFMetadataSourcePackage *self = MXF_METADATA_SOURCE_PACKAGE (m);
2281 MXF_METADATA_BASE_CLASS
2282 (mxf_metadata_source_package_parent_class)->write_tags (m, primer);
2285 if (self->descriptor) {
2286 t = g_slice_new0 (MXFLocalTag);
2287 memcpy (&t->ul, MXF_UL (DESCRIPTOR), 16);
2289 t->data = g_slice_alloc (t->size);
2291 memcpy (t->data, &MXF_METADATA_BASE (self->descriptor)->instance_uid, 16);
2292 mxf_primer_pack_add_mapping (primer, 0x4701, &t->ul);
2293 ret = g_list_prepend (ret, t);
2300 mxf_metadata_source_package_init (MXFMetadataSourcePackage * self)
2306 mxf_metadata_source_package_class_init (MXFMetadataSourcePackageClass * klass)
2308 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2309 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2311 metadata_base_class->handle_tag = mxf_metadata_source_package_handle_tag;
2312 metadata_base_class->resolve = mxf_metadata_source_package_resolve;
2313 metadata_base_class->name_quark = MXF_QUARK (SOURCE_PACKAGE);
2314 metadata_base_class->to_structure = mxf_metadata_source_package_to_structure;
2315 metadata_base_class->write_tags = mxf_metadata_source_package_write_tags;
2316 metadata_class->type = 0x0137;
2319 G_DEFINE_ABSTRACT_TYPE (MXFMetadataTrack, mxf_metadata_track,
2323 mxf_metadata_track_finalize (GObject * object)
2325 MXFMetadataTrack *self = MXF_METADATA_TRACK (object);
2327 g_free (self->track_name);
2328 self->track_name = NULL;
2329 g_free (self->descriptor);
2330 self->descriptor = NULL;
2332 G_OBJECT_CLASS (mxf_metadata_track_parent_class)->finalize (object);
2336 mxf_metadata_track_handle_tag (MXFMetadataBase * metadata,
2337 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2340 MXFMetadataTrack *self = MXF_METADATA_TRACK (metadata);
2341 gboolean ret = TRUE;
2342 #ifndef GST_DISABLE_GST_DEBUG
2350 self->track_id = GST_READ_UINT32_BE (tag_data);
2351 GST_DEBUG (" track id = %u", self->track_id);
2356 self->track_number = GST_READ_UINT32_BE (tag_data);
2357 GST_DEBUG (" track number = %u", self->track_number);
2360 self->track_name = mxf_utf16_to_utf8 (tag_data, tag_size);
2361 GST_DEBUG (" track name = %s", GST_STR_NULL (self->track_name));
2366 memcpy (&self->sequence_uid, tag_data, 16);
2367 GST_DEBUG (" sequence uid = %s",
2368 mxf_uuid_to_string (&self->sequence_uid, str));
2372 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->handle_tag
2373 (metadata, primer, tag, tag_data, tag_size);
2381 GST_ERROR ("Invalid track local tag 0x%04x of size %u", tag, tag_size);
2387 mxf_metadata_track_resolve (MXFMetadataBase * m, GHashTable * metadata)
2389 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2390 MXFMetadataBase *current = NULL;
2393 current = g_hash_table_lookup (metadata, &self->sequence_uid);
2394 if (current && MXF_IS_METADATA_SEQUENCE (current)) {
2395 if (mxf_metadata_base_resolve (current, metadata)) {
2396 self->sequence = MXF_METADATA_SEQUENCE (current);
2398 GST_ERROR ("Couldn't resolve sequence");
2402 GST_ERROR ("Couldn't find sequence");
2407 mxf_metadata_track_identifier_parse (&self->sequence->data_definition);
2408 if (self->type == MXF_METADATA_TRACK_UNKNOWN) {
2409 MXFMetadataSequence *sequence = self->sequence;
2411 for (i = 0; i < sequence->n_structural_components; i++) {
2412 MXFMetadataStructuralComponent *component =
2413 sequence->structural_components[i];
2419 mxf_metadata_track_identifier_parse (&component->data_definition);
2420 if (self->type != MXF_METADATA_TRACK_UNKNOWN)
2425 return MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->resolve (m,
2429 static GstStructure *
2430 mxf_metadata_track_to_structure (MXFMetadataBase * m)
2433 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->to_structure
2435 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2437 gst_structure_id_set (ret, MXF_QUARK (TRACK_ID), G_TYPE_UINT, self->track_id,
2438 MXF_QUARK (TRACK_NUMBER), G_TYPE_UINT, self->track_number, NULL);
2440 if (self->track_name)
2441 gst_structure_id_set (ret, MXF_QUARK (TRACK_NAME), G_TYPE_STRING,
2442 self->track_name, NULL);
2444 if (self->sequence) {
2446 mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->sequence));
2448 gst_structure_id_set (ret, MXF_QUARK (SEQUENCE), GST_TYPE_STRUCTURE, s,
2450 gst_structure_free (s);
2458 mxf_metadata_track_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
2460 MXFMetadataTrack *self = MXF_METADATA_TRACK (m);
2462 MXF_METADATA_BASE_CLASS (mxf_metadata_track_parent_class)->write_tags (m,
2466 t = g_slice_new0 (MXFLocalTag);
2467 memcpy (&t->ul, MXF_UL (TRACK_ID), 16);
2469 t->data = g_slice_alloc (t->size);
2471 GST_WRITE_UINT32_BE (t->data, self->track_id);
2472 mxf_primer_pack_add_mapping (primer, 0x4801, &t->ul);
2473 ret = g_list_prepend (ret, t);
2475 t = g_slice_new0 (MXFLocalTag);
2476 memcpy (&t->ul, MXF_UL (TRACK_NUMBER), 16);
2478 t->data = g_slice_alloc (t->size);
2480 GST_WRITE_UINT32_BE (t->data, self->track_number);
2481 mxf_primer_pack_add_mapping (primer, 0x4804, &t->ul);
2482 ret = g_list_prepend (ret, t);
2484 if (self->track_name) {
2485 t = g_slice_new0 (MXFLocalTag);
2486 memcpy (&t->ul, MXF_UL (TRACK_NAME), 16);
2487 t->data = mxf_utf8_to_utf16 (self->track_name, &t->size);
2488 mxf_primer_pack_add_mapping (primer, 0x4802, &t->ul);
2489 ret = g_list_prepend (ret, t);
2492 t = g_slice_new0 (MXFLocalTag);
2493 memcpy (&t->ul, MXF_UL (SEQUENCE), 16);
2495 t->data = g_slice_alloc (t->size);
2497 memcpy (t->data, &MXF_METADATA_BASE (self->sequence)->instance_uid, 16);
2498 mxf_primer_pack_add_mapping (primer, 0x4803, &t->ul);
2499 ret = g_list_prepend (ret, t);
2505 mxf_metadata_track_init (MXFMetadataTrack * self)
2511 mxf_metadata_track_class_init (MXFMetadataTrackClass * klass)
2513 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2514 GObjectClass *object_class = (GObjectClass *) klass;
2516 object_class->finalize = mxf_metadata_track_finalize;
2517 metadata_base_class->handle_tag = mxf_metadata_track_handle_tag;
2518 metadata_base_class->resolve = mxf_metadata_track_resolve;
2519 metadata_base_class->to_structure = mxf_metadata_track_to_structure;
2520 metadata_base_class->write_tags = mxf_metadata_track_write_tags;
2527 const MXFMetadataTrackType type;
2528 } mxf_metadata_track_identifier[] = {
2530 MXF_UL (TRACK_TIMECODE_12M_INACTIVE),
2531 MXF_METADATA_TRACK_TIMECODE_12M_INACTIVE}, {
2532 MXF_UL (TRACK_TIMECODE_12M_ACTIVE), MXF_METADATA_TRACK_TIMECODE_12M_ACTIVE}, {
2533 MXF_UL (TRACK_TIMECODE_309M), MXF_METADATA_TRACK_TIMECODE_309M}, {
2534 MXF_UL (TRACK_METADATA), MXF_METADATA_TRACK_METADATA}, {
2535 MXF_UL (TRACK_PICTURE_ESSENCE), MXF_METADATA_TRACK_PICTURE_ESSENCE}, {
2536 MXF_UL (TRACK_SOUND_ESSENCE), MXF_METADATA_TRACK_SOUND_ESSENCE}, {
2537 MXF_UL (TRACK_DATA_ESSENCE), MXF_METADATA_TRACK_DATA_ESSENCE}, {
2538 MXF_UL (TRACK_AUXILIARY_DATA), MXF_METADATA_TRACK_AUXILIARY_DATA}, {
2539 MXF_UL (TRACK_PARSED_TEXT), MXF_METADATA_TRACK_PARSED_TEXT},
2542 MXF_UL (TRACK_AVID_PICTURE_ESSENCE), MXF_METADATA_TRACK_PICTURE_ESSENCE}
2545 MXFMetadataTrackType
2546 mxf_metadata_track_identifier_parse (const MXFUL * track_identifier)
2550 for (i = 0; i < G_N_ELEMENTS (mxf_metadata_track_identifier); i++)
2551 if (mxf_ul_is_equal (mxf_metadata_track_identifier[i].ul, track_identifier))
2552 return mxf_metadata_track_identifier[i].type;
2554 return MXF_METADATA_TRACK_UNKNOWN;
2558 mxf_metadata_track_identifier_get (MXFMetadataTrackType type)
2562 for (i = 0; i < G_N_ELEMENTS (mxf_metadata_track_identifier); i++)
2563 if (mxf_metadata_track_identifier[i].type == type)
2564 return mxf_metadata_track_identifier[i].ul;
2569 G_DEFINE_TYPE (MXFMetadataTimelineTrack, mxf_metadata_timeline_track,
2570 MXF_TYPE_METADATA_TRACK);
2573 mxf_metadata_timeline_track_handle_tag (MXFMetadataBase * metadata,
2574 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2577 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (metadata);
2578 gboolean ret = TRUE;
2582 if (!mxf_fraction_parse (&self->edit_rate, tag_data, tag_size))
2584 GST_DEBUG (" edit rate = %d/%d", self->edit_rate.n, self->edit_rate.d);
2589 self->origin = GST_READ_UINT64_BE (tag_data);
2590 GST_DEBUG (" origin = %" G_GINT64_FORMAT, self->origin);
2594 MXF_METADATA_BASE_CLASS
2595 (mxf_metadata_timeline_track_parent_class)->handle_tag (metadata,
2596 primer, tag, tag_data, tag_size);
2604 GST_ERROR ("Invalid timeline track local tag 0x%04x of size %u", tag,
2610 static GstStructure *
2611 mxf_metadata_timeline_track_to_structure (MXFMetadataBase * m)
2614 MXF_METADATA_BASE_CLASS
2615 (mxf_metadata_timeline_track_parent_class)->to_structure (m);
2616 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (m);
2618 gst_structure_id_set (ret, MXF_QUARK (EDIT_RATE), GST_TYPE_FRACTION,
2619 self->edit_rate.n, self->edit_rate.d, MXF_QUARK (ORIGIN), G_TYPE_INT64,
2620 self->origin, NULL);
2626 mxf_metadata_timeline_track_write_tags (MXFMetadataBase * m,
2627 MXFPrimerPack * primer)
2629 MXFMetadataTimelineTrack *self = MXF_METADATA_TIMELINE_TRACK (m);
2631 MXF_METADATA_BASE_CLASS
2632 (mxf_metadata_timeline_track_parent_class)->write_tags (m, primer);
2635 t = g_slice_new0 (MXFLocalTag);
2636 memcpy (&t->ul, MXF_UL (EDIT_RATE), 16);
2638 t->data = g_slice_alloc (t->size);
2640 GST_WRITE_UINT32_BE (t->data, self->edit_rate.n);
2641 GST_WRITE_UINT32_BE (t->data + 4, self->edit_rate.d);
2642 mxf_primer_pack_add_mapping (primer, 0x4b01, &t->ul);
2643 ret = g_list_prepend (ret, t);
2645 t = g_slice_new0 (MXFLocalTag);
2646 memcpy (&t->ul, MXF_UL (ORIGIN), 16);
2648 t->data = g_slice_alloc (t->size);
2650 GST_WRITE_UINT64_BE (t->data, self->origin);
2651 mxf_primer_pack_add_mapping (primer, 0x4b02, &t->ul);
2652 ret = g_list_prepend (ret, t);
2658 mxf_metadata_timeline_track_init (MXFMetadataTimelineTrack * self)
2664 mxf_metadata_timeline_track_class_init (MXFMetadataTimelineTrackClass * klass)
2666 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2667 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2669 metadata_base_class->handle_tag = mxf_metadata_timeline_track_handle_tag;
2670 metadata_base_class->name_quark = MXF_QUARK (TIMELINE_TRACK);
2671 metadata_base_class->to_structure = mxf_metadata_timeline_track_to_structure;
2672 metadata_base_class->write_tags = mxf_metadata_timeline_track_write_tags;
2673 metadata_class->type = 0x013b;
2676 G_DEFINE_TYPE (MXFMetadataEventTrack, mxf_metadata_event_track,
2677 MXF_TYPE_METADATA_TRACK);
2680 mxf_metadata_event_track_handle_tag (MXFMetadataBase * metadata,
2681 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2684 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (metadata);
2685 gboolean ret = TRUE;
2689 if (!mxf_fraction_parse (&self->event_edit_rate, tag_data, tag_size))
2691 GST_DEBUG (" event edit rate = %d/%d", self->event_edit_rate.n,
2692 self->event_edit_rate.d);
2697 self->event_origin = GST_READ_UINT64_BE (tag_data);
2698 GST_DEBUG (" event origin = %" G_GINT64_FORMAT, self->event_origin);
2702 MXF_METADATA_BASE_CLASS
2703 (mxf_metadata_event_track_parent_class)->handle_tag (metadata, primer,
2704 tag, tag_data, tag_size);
2712 GST_ERROR ("Invalid event track local tag 0x%04x of size %u", tag, tag_size);
2717 static GstStructure *
2718 mxf_metadata_event_track_to_structure (MXFMetadataBase * m)
2721 MXF_METADATA_BASE_CLASS
2722 (mxf_metadata_event_track_parent_class)->to_structure (m);
2723 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (m);
2725 gst_structure_id_set (ret, MXF_QUARK (EVENT_EDIT_RATE), GST_TYPE_FRACTION,
2726 self->event_edit_rate.n, self->event_edit_rate.d,
2727 MXF_QUARK (EVENT_ORIGIN), G_TYPE_INT64, self->event_origin, NULL);
2733 mxf_metadata_event_track_write_tags (MXFMetadataBase * m,
2734 MXFPrimerPack * primer)
2736 MXFMetadataEventTrack *self = MXF_METADATA_EVENT_TRACK (m);
2738 MXF_METADATA_BASE_CLASS
2739 (mxf_metadata_event_track_parent_class)->write_tags (m, primer);
2742 t = g_slice_new0 (MXFLocalTag);
2743 memcpy (&t->ul, MXF_UL (EVENT_EDIT_RATE), 16);
2745 t->data = g_slice_alloc (t->size);
2747 GST_WRITE_UINT32_BE (t->data, self->event_edit_rate.n);
2748 GST_WRITE_UINT32_BE (t->data + 4, self->event_edit_rate.d);
2749 mxf_primer_pack_add_mapping (primer, 0x4901, &t->ul);
2750 ret = g_list_prepend (ret, t);
2752 t = g_slice_new0 (MXFLocalTag);
2753 memcpy (&t->ul, MXF_UL (EVENT_ORIGIN), 16);
2755 t->data = g_slice_alloc (t->size);
2757 GST_WRITE_UINT64_BE (t->data, self->event_origin);
2758 mxf_primer_pack_add_mapping (primer, 0x4902, &t->ul);
2759 ret = g_list_prepend (ret, t);
2765 mxf_metadata_event_track_init (MXFMetadataEventTrack * self)
2771 mxf_metadata_event_track_class_init (MXFMetadataEventTrackClass * klass)
2773 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2774 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2776 metadata_base_class->handle_tag = mxf_metadata_event_track_handle_tag;
2777 metadata_base_class->name_quark = MXF_QUARK (EVENT_TRACK);
2778 metadata_base_class->to_structure = mxf_metadata_event_track_to_structure;
2779 metadata_base_class->write_tags = mxf_metadata_event_track_write_tags;
2780 metadata_class->type = 0x0139;
2783 G_DEFINE_TYPE (MXFMetadataStaticTrack, mxf_metadata_static_track,
2784 MXF_TYPE_METADATA_TRACK);
2787 mxf_metadata_static_track_init (MXFMetadataStaticTrack * self)
2792 mxf_metadata_static_track_class_init (MXFMetadataStaticTrackClass * klass)
2794 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
2795 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
2797 metadata_base_class->name_quark = MXF_QUARK (STATIC_TRACK);
2798 metadata_class->type = 0x013a;
2801 G_DEFINE_TYPE (MXFMetadataSequence, mxf_metadata_sequence, MXF_TYPE_METADATA);
2804 mxf_metadata_sequence_finalize (GObject * object)
2806 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (object);
2808 g_free (self->structural_components_uids);
2809 self->structural_components_uids = NULL;
2810 g_free (self->structural_components);
2811 self->structural_components = NULL;
2813 G_OBJECT_CLASS (mxf_metadata_sequence_parent_class)->finalize (object);
2817 mxf_metadata_sequence_handle_tag (MXFMetadataBase * metadata,
2818 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
2821 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (metadata);
2822 gboolean ret = TRUE;
2823 #ifndef GST_DISABLE_GST_DEBUG
2831 memcpy (&self->data_definition, tag_data, 16);
2832 GST_DEBUG (" data definition = %s",
2833 mxf_ul_to_string (&self->data_definition, str));
2838 self->duration = GST_READ_UINT64_BE (tag_data);
2839 GST_DEBUG (" duration = %" G_GINT64_FORMAT, self->duration);
2842 if (!mxf_uuid_array_parse (&self->structural_components_uids,
2843 &self->n_structural_components, tag_data, tag_size))
2846 GST_DEBUG (" number of structural components = %u",
2847 self->n_structural_components);
2848 #ifndef GST_DISABLE_GST_DEBUG
2851 for (i = 0; i < self->n_structural_components; i++) {
2852 GST_DEBUG (" structural component %u = %s", i,
2853 mxf_uuid_to_string (&self->structural_components_uids[i], str));
2860 MXF_METADATA_BASE_CLASS
2861 (mxf_metadata_sequence_parent_class)->handle_tag (metadata, primer,
2862 tag, tag_data, tag_size);
2870 GST_ERROR ("Invalid sequence local tag 0x%04x of size %u", tag, tag_size);
2876 mxf_metadata_sequence_resolve (MXFMetadataBase * m, GHashTable * metadata)
2878 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2879 MXFMetadataBase *current = NULL;
2882 if (self->structural_components)
2883 memset (self->structural_components, 0,
2884 sizeof (gpointer) * self->n_structural_components);
2886 self->structural_components =
2887 g_new0 (MXFMetadataStructuralComponent *,
2888 self->n_structural_components);
2889 for (i = 0; i < self->n_structural_components; i++) {
2891 g_hash_table_lookup (metadata, &self->structural_components_uids[i]);
2892 if (current && MXF_IS_METADATA_STRUCTURAL_COMPONENT (current)) {
2893 if (mxf_metadata_base_resolve (current, metadata)) {
2894 self->structural_components[i] =
2895 MXF_METADATA_STRUCTURAL_COMPONENT (current);
2897 GST_ERROR ("Couldn't resolve structural component");
2901 GST_ERROR ("Structural component not found");
2907 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->resolve (m,
2912 static GstStructure *
2913 mxf_metadata_sequence_to_structure (MXFMetadataBase * m)
2916 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->to_structure
2918 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2922 mxf_ul_to_string (&self->data_definition, str);
2923 gst_structure_id_set (ret, MXF_QUARK (DATA_DEFINITION), G_TYPE_STRING, str,
2924 MXF_QUARK (DURATION), G_TYPE_INT64, self->duration, NULL);
2926 if (self->n_structural_components > 0) {
2931 g_value_init (&arr, GST_TYPE_ARRAY);
2933 for (i = 0; i < self->n_structural_components; i++) {
2936 if (self->structural_components[i] == NULL)
2939 g_value_init (&val, GST_TYPE_STRUCTURE);
2941 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
2942 (self->structural_components[i]));
2943 gst_value_set_structure (&val, s);
2944 gst_structure_free (s);
2945 gst_value_array_append_value (&arr, &val);
2946 g_value_unset (&val);
2949 if (gst_value_array_get_size (&arr) > 0)
2950 gst_structure_id_set_value (ret, MXF_QUARK (STRUCTURAL_COMPONENTS), &arr);
2952 g_value_unset (&arr);
2959 mxf_metadata_sequence_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
2961 MXFMetadataSequence *self = MXF_METADATA_SEQUENCE (m);
2963 MXF_METADATA_BASE_CLASS (mxf_metadata_sequence_parent_class)->write_tags
2967 t = g_slice_new0 (MXFLocalTag);
2968 memcpy (&t->ul, MXF_UL (DATA_DEFINITION), 16);
2970 t->data = g_slice_alloc (t->size);
2972 memcpy (t->data, &self->data_definition, 16);
2973 mxf_primer_pack_add_mapping (primer, 0x0201, &t->ul);
2974 ret = g_list_prepend (ret, t);
2976 t = g_slice_new0 (MXFLocalTag);
2977 memcpy (&t->ul, MXF_UL (DURATION), 16);
2979 t->data = g_slice_alloc (t->size);
2981 GST_WRITE_UINT64_BE (t->data, self->duration);
2982 mxf_primer_pack_add_mapping (primer, 0x0202, &t->ul);
2983 ret = g_list_prepend (ret, t);
2985 if (self->structural_components) {
2987 t = g_slice_new0 (MXFLocalTag);
2988 memcpy (&t->ul, MXF_UL (STRUCTURAL_COMPONENTS), 16);
2989 t->size = 8 + 16 * self->n_structural_components;
2990 t->data = g_slice_alloc0 (t->size);
2993 GST_WRITE_UINT32_BE (t->data, self->n_structural_components);
2994 GST_WRITE_UINT32_BE (t->data + 4, 16);
2995 for (i = 0; i < self->n_structural_components; i++) {
2996 if (!self->structural_components[i])
2999 memcpy (t->data + 8 + i * 16,
3000 &MXF_METADATA_BASE (self->structural_components[i])->instance_uid,
3004 mxf_primer_pack_add_mapping (primer, 0x1001, &t->ul);
3005 ret = g_list_prepend (ret, t);
3012 mxf_metadata_sequence_init (MXFMetadataSequence * self)
3014 self->duration = -1;
3018 mxf_metadata_sequence_class_init (MXFMetadataSequenceClass * klass)
3020 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3021 GObjectClass *object_class = (GObjectClass *) klass;
3022 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3024 object_class->finalize = mxf_metadata_sequence_finalize;
3025 metadata_base_class->handle_tag = mxf_metadata_sequence_handle_tag;
3026 metadata_base_class->resolve = mxf_metadata_sequence_resolve;
3027 metadata_base_class->name_quark = MXF_QUARK (SEQUENCE);
3028 metadata_base_class->to_structure = mxf_metadata_sequence_to_structure;
3029 metadata_base_class->write_tags = mxf_metadata_sequence_write_tags;
3030 metadata_class->type = 0x010f;
3033 G_DEFINE_TYPE (MXFMetadataStructuralComponent,
3034 mxf_metadata_structural_component, MXF_TYPE_METADATA);
3037 mxf_metadata_structural_component_handle_tag (MXFMetadataBase * metadata,
3038 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3041 MXFMetadataStructuralComponent *self =
3042 MXF_METADATA_STRUCTURAL_COMPONENT (metadata);
3043 gboolean ret = TRUE;
3044 #ifndef GST_DISABLE_GST_DEBUG
3052 memcpy (&self->data_definition, tag_data, 16);
3053 GST_DEBUG (" data definition = %s",
3054 mxf_ul_to_string (&self->data_definition, str));
3059 self->duration = GST_READ_UINT64_BE (tag_data);
3060 GST_DEBUG (" duration = %" G_GINT64_FORMAT, self->duration);
3064 MXF_METADATA_BASE_CLASS
3065 (mxf_metadata_structural_component_parent_class)->handle_tag
3066 (metadata, primer, tag, tag_data, tag_size);
3074 GST_ERROR ("Invalid structural component local tag 0x%04x of size %u", tag,
3080 static GstStructure *
3081 mxf_metadata_structural_component_to_structure (MXFMetadataBase * m)
3084 MXF_METADATA_BASE_CLASS
3085 (mxf_metadata_structural_component_parent_class)->to_structure (m);
3086 MXFMetadataStructuralComponent *self = MXF_METADATA_STRUCTURAL_COMPONENT (m);
3089 mxf_ul_to_string (&self->data_definition, str);
3090 gst_structure_id_set (ret, MXF_QUARK (DATA_DEFINITION), G_TYPE_STRING, str,
3091 MXF_QUARK (DURATION), G_TYPE_INT64, self->duration, NULL);
3097 mxf_metadata_structural_component_write_tags (MXFMetadataBase * m,
3098 MXFPrimerPack * primer)
3100 MXFMetadataStructuralComponent *self = MXF_METADATA_STRUCTURAL_COMPONENT (m);
3102 MXF_METADATA_BASE_CLASS
3103 (mxf_metadata_structural_component_parent_class)->write_tags (m, primer);
3106 t = g_slice_new0 (MXFLocalTag);
3107 memcpy (&t->ul, MXF_UL (DATA_DEFINITION), 16);
3109 t->data = g_slice_alloc (t->size);
3111 memcpy (t->data, &self->data_definition, 16);
3112 mxf_primer_pack_add_mapping (primer, 0x0201, &t->ul);
3113 ret = g_list_prepend (ret, t);
3115 t = g_slice_new0 (MXFLocalTag);
3116 memcpy (&t->ul, MXF_UL (DURATION), 16);
3118 t->data = g_slice_alloc (t->size);
3120 GST_WRITE_UINT64_BE (t->data, self->duration);
3121 mxf_primer_pack_add_mapping (primer, 0x0202, &t->ul);
3122 ret = g_list_prepend (ret, t);
3128 mxf_metadata_structural_component_init (MXFMetadataStructuralComponent * self)
3130 self->duration = -1;
3134 mxf_metadata_structural_component_class_init
3135 (MXFMetadataStructuralComponentClass * klass)
3137 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3139 metadata_base_class->handle_tag =
3140 mxf_metadata_structural_component_handle_tag;
3141 metadata_base_class->to_structure =
3142 mxf_metadata_structural_component_to_structure;
3143 metadata_base_class->write_tags =
3144 mxf_metadata_structural_component_write_tags;
3147 G_DEFINE_TYPE (MXFMetadataTimecodeComponent, mxf_metadata_timecode_component,
3148 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3151 mxf_metadata_timecode_component_handle_tag (MXFMetadataBase * metadata,
3152 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3155 MXFMetadataTimecodeComponent *self =
3156 MXF_METADATA_TIMECODE_COMPONENT (metadata);
3157 gboolean ret = TRUE;
3163 self->rounded_timecode_base = GST_READ_UINT16_BE (tag_data);
3164 GST_DEBUG (" rounded timecode base = %u", self->rounded_timecode_base);
3169 self->start_timecode = GST_READ_UINT64_BE (tag_data);
3170 GST_DEBUG (" start timecode = %" G_GINT64_FORMAT, self->start_timecode);
3175 self->drop_frame = (GST_READ_UINT8 (tag_data) != 0);
3176 GST_DEBUG (" drop frame = %s", (self->drop_frame) ? "yes" : "no");
3180 MXF_METADATA_BASE_CLASS
3181 (mxf_metadata_timecode_component_parent_class)->handle_tag (metadata,
3182 primer, tag, tag_data, tag_size);
3190 GST_ERROR ("Invalid timecode component local tag 0x%04x of size %u", tag,
3196 static GstStructure *
3197 mxf_metadata_timecode_component_to_structure (MXFMetadataBase * m)
3200 MXF_METADATA_BASE_CLASS
3201 (mxf_metadata_timecode_component_parent_class)->to_structure (m);
3202 MXFMetadataTimecodeComponent *self = MXF_METADATA_TIMECODE_COMPONENT (m);
3204 gst_structure_id_set (ret, MXF_QUARK (START_TIMECODE), G_TYPE_INT64,
3205 self->start_timecode, MXF_QUARK (ROUNDED_TIMECODE_BASE), G_TYPE_UINT,
3206 self->rounded_timecode_base, MXF_QUARK (DROP_FRAME), G_TYPE_BOOLEAN,
3207 self->drop_frame, NULL);
3213 mxf_metadata_timecode_component_write_tags (MXFMetadataBase * m,
3214 MXFPrimerPack * primer)
3216 MXFMetadataTimecodeComponent *self = MXF_METADATA_TIMECODE_COMPONENT (m);
3218 MXF_METADATA_BASE_CLASS
3219 (mxf_metadata_timecode_component_parent_class)->write_tags (m, primer);
3222 t = g_slice_new0 (MXFLocalTag);
3223 memcpy (&t->ul, MXF_UL (ROUNDED_TIMECODE_BASE), 16);
3225 t->data = g_slice_alloc (t->size);
3227 GST_WRITE_UINT16_BE (t->data, self->rounded_timecode_base);
3228 mxf_primer_pack_add_mapping (primer, 0x1502, &t->ul);
3229 ret = g_list_prepend (ret, t);
3231 t = g_slice_new0 (MXFLocalTag);
3232 memcpy (&t->ul, MXF_UL (START_TIMECODE), 16);
3234 t->data = g_slice_alloc (t->size);
3236 GST_WRITE_UINT64_BE (t->data, self->start_timecode);
3237 mxf_primer_pack_add_mapping (primer, 0x1501, &t->ul);
3238 ret = g_list_prepend (ret, t);
3240 t = g_slice_new0 (MXFLocalTag);
3241 memcpy (&t->ul, MXF_UL (DROP_FRAME), 16);
3243 t->data = g_slice_alloc (t->size);
3245 GST_WRITE_UINT8 (t->data, (self->drop_frame) ? 1 : 0);
3246 mxf_primer_pack_add_mapping (primer, 0x1503, &t->ul);
3247 ret = g_list_prepend (ret, t);
3253 mxf_metadata_timecode_component_init (MXFMetadataTimecodeComponent * self)
3259 mxf_metadata_timecode_component_class_init (MXFMetadataTimecodeComponentClass *
3262 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3263 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3265 metadata_base_class->handle_tag = mxf_metadata_timecode_component_handle_tag;
3266 metadata_base_class->name_quark = MXF_QUARK (TIMECODE_COMPONENT);
3267 metadata_base_class->to_structure =
3268 mxf_metadata_timecode_component_to_structure;
3269 metadata_base_class->write_tags = mxf_metadata_timecode_component_write_tags;
3270 metadata_class->type = 0x0114;
3273 G_DEFINE_TYPE (MXFMetadataSourceClip, mxf_metadata_source_clip,
3274 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3277 mxf_metadata_source_clip_handle_tag (MXFMetadataBase * metadata,
3278 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3281 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (metadata);
3282 gboolean ret = TRUE;
3283 #ifndef GST_DISABLE_GST_DEBUG
3292 self->start_position = GST_READ_UINT64_BE (tag_data);
3293 GST_DEBUG (" start position = %" G_GINT64_FORMAT, self->start_position);
3299 memcpy (&self->source_package_id, tag_data, 32);
3300 GST_DEBUG (" source package id = %s",
3301 mxf_umid_to_string (&self->source_package_id, str));
3307 self->source_track_id = GST_READ_UINT32_BE (tag_data);
3308 GST_DEBUG (" source track id = %u", self->source_track_id);
3312 MXF_METADATA_BASE_CLASS
3313 (mxf_metadata_source_clip_parent_class)->handle_tag (metadata, primer,
3314 tag, tag_data, tag_size);
3322 GST_ERROR ("Invalid source clip local tag 0x%04x of size %u", tag, tag_size);
3328 mxf_metadata_source_clip_resolve (MXFMetadataBase * m, GHashTable * metadata)
3330 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3331 MXFMetadataBase *current = NULL;
3332 GHashTableIter iter;
3334 g_hash_table_iter_init (&iter, metadata);
3336 while (g_hash_table_iter_next (&iter, NULL, (gpointer) & current)) {
3337 if (MXF_IS_METADATA_SOURCE_PACKAGE (current)) {
3338 MXFMetadataGenericPackage *p = MXF_METADATA_GENERIC_PACKAGE (current);
3340 if (mxf_umid_is_equal (&p->package_uid, &self->source_package_id)) {
3341 self->source_package = MXF_METADATA_SOURCE_PACKAGE (current);
3348 MXF_METADATA_BASE_CLASS (mxf_metadata_source_clip_parent_class)->resolve
3352 static GstStructure *
3353 mxf_metadata_source_clip_to_structure (MXFMetadataBase * m)
3356 MXF_METADATA_BASE_CLASS
3357 (mxf_metadata_source_clip_parent_class)->to_structure (m);
3358 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3361 mxf_umid_to_string (&self->source_package_id, str);
3362 gst_structure_id_set (ret, MXF_QUARK (START_POSITION), G_TYPE_INT64,
3363 self->start_position, MXF_QUARK (SOURCE_PACKAGE), G_TYPE_STRING, str,
3364 MXF_QUARK (SOURCE_TRACK_ID), G_TYPE_UINT, self->source_track_id, NULL);
3370 mxf_metadata_source_clip_write_tags (MXFMetadataBase * m,
3371 MXFPrimerPack * primer)
3373 MXFMetadataSourceClip *self = MXF_METADATA_SOURCE_CLIP (m);
3375 MXF_METADATA_BASE_CLASS
3376 (mxf_metadata_source_clip_parent_class)->write_tags (m, primer);
3379 t = g_slice_new0 (MXFLocalTag);
3380 memcpy (&t->ul, MXF_UL (START_POSITION), 16);
3382 t->data = g_slice_alloc (t->size);
3384 GST_WRITE_UINT64_BE (t->data, self->start_position);
3385 mxf_primer_pack_add_mapping (primer, 0x1201, &t->ul);
3386 ret = g_list_prepend (ret, t);
3388 t = g_slice_new0 (MXFLocalTag);
3389 memcpy (&t->ul, MXF_UL (SOURCE_PACKAGE_ID), 16);
3391 t->data = g_slice_alloc (t->size);
3393 memcpy (t->data, &self->source_package_id, 32);
3394 mxf_primer_pack_add_mapping (primer, 0x1101, &t->ul);
3395 ret = g_list_prepend (ret, t);
3397 t = g_slice_new0 (MXFLocalTag);
3398 memcpy (&t->ul, MXF_UL (SOURCE_TRACK_ID), 16);
3400 t->data = g_slice_alloc (t->size);
3402 GST_WRITE_UINT32_BE (t->data, self->source_track_id);
3403 mxf_primer_pack_add_mapping (primer, 0x1102, &t->ul);
3404 ret = g_list_prepend (ret, t);
3410 mxf_metadata_source_clip_init (MXFMetadataSourceClip * self)
3416 mxf_metadata_source_clip_class_init (MXFMetadataSourceClipClass * klass)
3418 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3419 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3421 metadata_base_class->handle_tag = mxf_metadata_source_clip_handle_tag;
3422 metadata_base_class->resolve = mxf_metadata_source_clip_resolve;
3423 metadata_base_class->name_quark = MXF_QUARK (SOURCE_CLIP);
3424 metadata_base_class->to_structure = mxf_metadata_source_clip_to_structure;
3425 metadata_base_class->write_tags = mxf_metadata_source_clip_write_tags;
3426 metadata_class->type = 0x0111;
3429 G_DEFINE_TYPE (MXFMetadataDMSourceClip, mxf_metadata_dm_source_clip,
3430 MXF_TYPE_METADATA_SOURCE_CLIP);
3433 mxf_metadata_dm_source_clip_finalize (GObject * object)
3435 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (object);
3437 g_free (self->track_ids);
3438 self->track_ids = NULL;
3440 G_OBJECT_CLASS (mxf_metadata_dm_source_clip_parent_class)->finalize (object);
3444 mxf_metadata_dm_source_clip_handle_tag (MXFMetadataBase * metadata,
3445 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3448 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (metadata);
3449 gboolean ret = TRUE;
3460 len = GST_READ_UINT32_BE (tag_data);
3461 GST_DEBUG (" number of track ids = %u", len);
3465 if (GST_READ_UINT32_BE (tag_data + 4) != 4)
3468 if (tag_size < 8 + 4 * len)
3474 self->n_track_ids = len;
3475 self->track_ids = g_new0 (guint32, len);
3477 for (i = 0; i < len; i++) {
3478 self->track_ids[i] = GST_READ_UINT32_BE (tag_data);
3479 GST_DEBUG (" track id %u = %u", i, self->track_ids[i]);
3487 MXF_METADATA_BASE_CLASS
3488 (mxf_metadata_dm_source_clip_parent_class)->handle_tag (metadata,
3489 primer, tag, tag_data, tag_size);
3497 GST_ERROR ("Invalid DM source clip local tag 0x%04x of size %u", tag,
3503 static GstStructure *
3504 mxf_metadata_dm_source_clip_to_structure (MXFMetadataBase * m)
3507 MXF_METADATA_BASE_CLASS
3508 (mxf_metadata_dm_source_clip_parent_class)->to_structure (m);
3509 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (m);
3512 if (self->n_track_ids > 0) {
3517 g_value_init (&arr, GST_TYPE_ARRAY);
3519 for (i = 0; i < self->n_track_ids; i++) {
3520 g_value_init (&val, G_TYPE_UINT);
3522 g_value_set_uint (&val, self->track_ids[i]);
3523 gst_value_array_append_value (&arr, &val);
3524 g_value_unset (&val);
3527 if (gst_value_array_get_size (&arr) > 0)
3528 gst_structure_id_set_value (ret, MXF_QUARK (TRACK_IDS), &arr);
3530 g_value_unset (&arr);
3537 mxf_metadata_dm_source_clip_write_tags (MXFMetadataBase * m,
3538 MXFPrimerPack * primer)
3540 MXFMetadataDMSourceClip *self = MXF_METADATA_DM_SOURCE_CLIP (m);
3542 MXF_METADATA_BASE_CLASS
3543 (mxf_metadata_dm_source_clip_parent_class)->write_tags (m, primer);
3546 if (self->track_ids) {
3549 t = g_slice_new0 (MXFLocalTag);
3550 memcpy (&t->ul, MXF_UL (DM_SOURCECLIP_TRACK_IDS), 16);
3551 t->size = 8 + 4 * self->n_track_ids;
3552 t->data = g_slice_alloc (t->size);
3554 GST_WRITE_UINT32_BE (t->data, self->n_track_ids);
3555 GST_WRITE_UINT32_BE (t->data + 4, 4);
3556 for (i = 0; i < self->n_track_ids; i++)
3557 GST_WRITE_UINT32_BE (t->data + 8 + i * 4, self->track_ids[i]);
3558 mxf_primer_pack_add_mapping (primer, 0x6103, &t->ul);
3559 ret = g_list_prepend (ret, t);
3566 mxf_metadata_dm_source_clip_init (MXFMetadataDMSourceClip * self)
3572 mxf_metadata_dm_source_clip_class_init (MXFMetadataDMSourceClipClass * klass)
3574 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3575 GObjectClass *object_class = (GObjectClass *) klass;
3576 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3578 object_class->finalize = mxf_metadata_dm_source_clip_finalize;
3579 metadata_base_class->handle_tag = mxf_metadata_dm_source_clip_handle_tag;
3580 metadata_base_class->name_quark = MXF_QUARK (DM_SOURCE_CLIP);
3581 metadata_base_class->to_structure = mxf_metadata_dm_source_clip_to_structure;
3582 metadata_base_class->write_tags = mxf_metadata_dm_source_clip_write_tags;
3583 metadata_class->type = 0x0145;
3586 G_DEFINE_TYPE (MXFMetadataDMSegment, mxf_metadata_dm_segment,
3587 MXF_TYPE_METADATA_STRUCTURAL_COMPONENT);
3590 mxf_metadata_dm_segment_finalize (GObject * object)
3592 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (object);
3594 g_free (self->track_ids);
3595 self->track_ids = NULL;
3597 g_free (self->event_comment);
3598 self->event_comment = NULL;
3600 G_OBJECT_CLASS (mxf_metadata_dm_segment_parent_class)->finalize (object);
3604 mxf_metadata_dm_segment_handle_tag (MXFMetadataBase * metadata,
3605 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3608 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (metadata);
3609 gboolean ret = TRUE;
3610 #ifndef GST_DISABLE_GST_DEBUG
3618 self->event_start_position = GST_READ_UINT64_BE (tag_data);
3619 GST_DEBUG (" event start position = %" G_GINT64_FORMAT,
3620 self->event_start_position);
3623 self->event_comment = mxf_utf16_to_utf8 (tag_data, tag_size);
3624 GST_DEBUG (" event comment = %s", GST_STR_NULL (self->event_comment));
3633 len = GST_READ_UINT32_BE (tag_data);
3634 GST_DEBUG (" number of track ids = %u", len);
3638 if (GST_READ_UINT32_BE (tag_data + 4) != 4)
3641 if (len * 4 + 8 < tag_size)
3644 self->n_track_ids = len;
3645 self->track_ids = g_new0 (guint32, len);
3650 for (i = 0; i < len; i++) {
3651 self->track_ids[i] = GST_READ_UINT32_BE (tag_data);
3652 GST_DEBUG (" track id %u = %u", i, self->track_ids[i]);
3662 memcpy (&self->dm_framework_uid, tag_data, 16);
3663 GST_DEBUG (" DM framework = %s",
3664 mxf_uuid_to_string (&self->dm_framework_uid, str));
3668 MXF_METADATA_BASE_CLASS
3669 (mxf_metadata_dm_segment_parent_class)->handle_tag (metadata, primer,
3670 tag, tag_data, tag_size);
3678 GST_ERROR ("Invalid DM segment local tag 0x%04x of size %u", tag, tag_size);
3684 mxf_metadata_dm_segment_resolve (MXFMetadataBase * m, GHashTable * metadata)
3686 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3687 MXFMetadataBase *current = NULL;
3689 current = g_hash_table_lookup (metadata, &self->dm_framework_uid);
3690 if (current && MXF_IS_DESCRIPTIVE_METADATA_FRAMEWORK (current)) {
3691 if (mxf_metadata_base_resolve (current, metadata)) {
3692 self->dm_framework = MXF_DESCRIPTIVE_METADATA_FRAMEWORK (current);
3694 GST_ERROR ("Couldn't resolve DM framework");
3698 GST_ERROR ("Couldn't find DM framework");
3704 MXF_METADATA_BASE_CLASS (mxf_metadata_dm_segment_parent_class)->resolve
3708 static GstStructure *
3709 mxf_metadata_dm_segment_to_structure (MXFMetadataBase * m)
3712 MXF_METADATA_BASE_CLASS
3713 (mxf_metadata_dm_segment_parent_class)->to_structure (m);
3714 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3717 gst_structure_id_set (ret, MXF_QUARK (EVENT_START_POSITION), G_TYPE_INT64,
3718 self->event_start_position, NULL);
3720 if (self->event_comment)
3721 gst_structure_id_set (ret, MXF_QUARK (EVENT_COMMENT), G_TYPE_STRING,
3722 self->event_comment, NULL);
3723 /* FIXME: DMS1 doesn't support serializing to a structure yet */
3725 if (self->dm_framework) {
3727 mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->dm_framework));
3729 gst_structure_id_set (ret, MXF_QUARK (DM_FRAMEWORK), GST_TYPE_STRUCTURE,
3731 gst_structure_free (s);
3735 if (self->n_track_ids > 0) {
3740 g_value_init (&arr, GST_TYPE_ARRAY);
3742 for (i = 0; i < self->n_track_ids; i++) {
3743 g_value_init (&val, G_TYPE_UINT);
3745 g_value_set_uint (&val, self->track_ids[i]);
3746 gst_value_array_append_value (&arr, &val);
3747 g_value_unset (&val);
3750 if (gst_value_array_get_size (&arr) > 0)
3751 gst_structure_id_set_value (ret, MXF_QUARK (TRACK_IDS), &arr);
3753 g_value_unset (&arr);
3760 mxf_metadata_dm_segment_write_tags (MXFMetadataBase * m, MXFPrimerPack * primer)
3762 MXFMetadataDMSegment *self = MXF_METADATA_DM_SEGMENT (m);
3764 MXF_METADATA_BASE_CLASS (mxf_metadata_dm_segment_parent_class)->write_tags
3768 if (self->event_start_position != -1) {
3769 t = g_slice_new0 (MXFLocalTag);
3770 memcpy (&t->ul, MXF_UL (EVENT_START_POSITION), 16);
3772 t->data = g_slice_alloc (t->size);
3774 GST_WRITE_UINT64_BE (t->data, self->event_start_position);
3775 mxf_primer_pack_add_mapping (primer, 0x0601, &t->ul);
3776 ret = g_list_prepend (ret, t);
3779 if (self->event_comment) {
3780 t = g_slice_new0 (MXFLocalTag);
3781 memcpy (&t->ul, MXF_UL (EVENT_COMMENT), 16);
3782 t->data = mxf_utf8_to_utf16 (self->event_comment, &t->size);
3783 mxf_primer_pack_add_mapping (primer, 0x0602, &t->ul);
3784 ret = g_list_prepend (ret, t);
3787 if (self->track_ids) {
3790 t = g_slice_new0 (MXFLocalTag);
3791 memcpy (&t->ul, MXF_UL (DM_SEGMENT_TRACK_IDS), 16);
3792 t->size = 8 + 4 * self->n_track_ids;
3793 t->data = g_slice_alloc (t->size);
3795 GST_WRITE_UINT32_BE (t->data, self->n_track_ids);
3796 GST_WRITE_UINT32_BE (t->data + 4, 4);
3797 for (i = 0; i < self->n_track_ids; i++)
3798 GST_WRITE_UINT32_BE (t->data + 8 + i * 4, self->track_ids[i]);
3799 mxf_primer_pack_add_mapping (primer, 0x6102, &t->ul);
3800 ret = g_list_prepend (ret, t);
3803 if (self->dm_framework) {
3804 t = g_slice_new0 (MXFLocalTag);
3805 memcpy (&t->ul, MXF_UL (DM_FRAMEWORK), 16);
3807 t->data = g_slice_alloc (t->size);
3809 memcpy (t->data, &MXF_METADATA_BASE (self->dm_framework)->instance_uid, 16);
3810 mxf_primer_pack_add_mapping (primer, 0x6101, &t->ul);
3811 ret = g_list_prepend (ret, t);
3818 mxf_metadata_dm_segment_init (MXFMetadataDMSegment * self)
3820 self->event_start_position = -1;
3824 mxf_metadata_dm_segment_class_init (MXFMetadataDMSegmentClass * klass)
3826 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
3827 GObjectClass *object_class = (GObjectClass *) klass;
3828 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
3830 object_class->finalize = mxf_metadata_dm_segment_finalize;
3831 metadata_base_class->handle_tag = mxf_metadata_dm_segment_handle_tag;
3832 metadata_base_class->resolve = mxf_metadata_dm_segment_resolve;
3833 metadata_base_class->name_quark = MXF_QUARK (DM_SEGMENT);
3834 metadata_base_class->to_structure = mxf_metadata_dm_segment_to_structure;
3835 metadata_base_class->write_tags = mxf_metadata_dm_segment_write_tags;
3836 metadata_class->type = 0x0141;
3839 G_DEFINE_ABSTRACT_TYPE (MXFMetadataGenericDescriptor,
3840 mxf_metadata_generic_descriptor, MXF_TYPE_METADATA);
3843 mxf_metadata_generic_descriptor_finalize (GObject * object)
3845 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (object);
3847 g_free (self->locators_uids);
3848 self->locators_uids = NULL;
3850 g_free (self->locators);
3851 self->locators = NULL;
3853 G_OBJECT_CLASS (mxf_metadata_generic_descriptor_parent_class)->finalize
3858 mxf_metadata_generic_descriptor_handle_tag (MXFMetadataBase * metadata,
3859 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
3862 MXFMetadataGenericDescriptor *self =
3863 MXF_METADATA_GENERIC_DESCRIPTOR (metadata);
3864 gboolean ret = TRUE;
3865 #ifndef GST_DISABLE_GST_DEBUG
3871 if (!mxf_uuid_array_parse (&self->locators_uids, &self->n_locators,
3872 tag_data, tag_size))
3875 GST_DEBUG (" number of locators = %u", self->n_locators);
3876 #ifndef GST_DISABLE_GST_DEBUG
3879 for (i = 0; i < self->n_locators; i++) {
3880 GST_DEBUG (" locator %u = %s", i,
3881 mxf_uuid_to_string (&self->locators_uids[i], str));
3888 MXF_METADATA_BASE_CLASS
3889 (mxf_metadata_generic_descriptor_parent_class)->handle_tag (metadata,
3890 primer, tag, tag_data, tag_size);
3898 GST_ERROR ("Invalid generic descriptor local tag 0x%04x of size %u", tag,
3905 mxf_metadata_generic_descriptor_resolve (MXFMetadataBase * m,
3906 GHashTable * metadata)
3908 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3909 MXFMetadataBase *current = NULL;
3911 gboolean have_locator = FALSE;
3914 memset (self->locators, 0, sizeof (gpointer) * self->n_locators);
3916 self->locators = g_new0 (MXFMetadataLocator *, self->n_locators);
3917 for (i = 0; i < self->n_locators; i++) {
3918 current = g_hash_table_lookup (metadata, &self->locators_uids[i]);
3919 if (current && MXF_IS_METADATA_LOCATOR (current)) {
3920 if (mxf_metadata_base_resolve (current, metadata)) {
3921 self->locators[i] = MXF_METADATA_LOCATOR (current);
3922 have_locator = TRUE;
3924 GST_ERROR ("Couldn't resolve locator");
3927 GST_ERROR ("Locator not found");
3931 if (!have_locator && self->n_locators > 0) {
3932 GST_ERROR ("Couldn't resolve a locator");
3937 MXF_METADATA_BASE_CLASS
3938 (mxf_metadata_generic_descriptor_parent_class)->resolve (m, metadata);
3941 static GstStructure *
3942 mxf_metadata_generic_descriptor_to_structure (MXFMetadataBase * m)
3945 MXF_METADATA_BASE_CLASS
3946 (mxf_metadata_generic_descriptor_parent_class)->to_structure (m);
3947 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3950 if (self->n_locators > 0) {
3955 g_value_init (&arr, GST_TYPE_ARRAY);
3957 for (i = 0; i < self->n_locators; i++) {
3960 if (self->locators[i] == NULL)
3963 g_value_init (&val, GST_TYPE_STRUCTURE);
3965 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE (self->locators
3967 gst_value_set_structure (&val, s);
3968 gst_structure_free (s);
3969 gst_value_array_append_value (&arr, &val);
3970 g_value_unset (&val);
3973 if (gst_value_array_get_size (&arr) > 0)
3974 gst_structure_id_set_value (ret, MXF_QUARK (LOCATORS), &arr);
3976 g_value_unset (&arr);
3983 mxf_metadata_generic_descriptor_write_tags (MXFMetadataBase * m,
3984 MXFPrimerPack * primer)
3986 MXFMetadataGenericDescriptor *self = MXF_METADATA_GENERIC_DESCRIPTOR (m);
3988 MXF_METADATA_BASE_CLASS
3989 (mxf_metadata_generic_descriptor_parent_class)->write_tags (m, primer);
3992 if (self->locators) {
3995 t = g_slice_new0 (MXFLocalTag);
3996 memcpy (&t->ul, MXF_UL (LOCATORS), 16);
3997 t->size = 8 + 16 * self->n_locators;;
3998 t->data = g_slice_alloc0 (t->size);
4000 GST_WRITE_UINT32_BE (t->data, self->n_locators);
4001 GST_WRITE_UINT32_BE (t->data + 4, 16);
4002 for (i = 0; i < self->n_locators; i++) {
4003 if (!self->locators[i])
4005 memcpy (t->data + 8 + 16 * i,
4006 &MXF_METADATA_BASE (self->locators[i])->instance_uid, 16);
4008 mxf_primer_pack_add_mapping (primer, 0x2f01, &t->ul);
4009 ret = g_list_prepend (ret, t);
4016 mxf_metadata_generic_descriptor_init (MXFMetadataGenericDescriptor * self)
4022 mxf_metadata_generic_descriptor_class_init (MXFMetadataGenericDescriptorClass *
4025 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4026 GObjectClass *object_class = (GObjectClass *) klass;
4028 object_class->finalize = mxf_metadata_generic_descriptor_finalize;
4029 metadata_base_class->handle_tag = mxf_metadata_generic_descriptor_handle_tag;
4030 metadata_base_class->resolve = mxf_metadata_generic_descriptor_resolve;
4031 metadata_base_class->to_structure =
4032 mxf_metadata_generic_descriptor_to_structure;
4033 metadata_base_class->write_tags = mxf_metadata_generic_descriptor_write_tags;
4036 G_DEFINE_TYPE (MXFMetadataFileDescriptor, mxf_metadata_file_descriptor,
4037 MXF_TYPE_METADATA_GENERIC_DESCRIPTOR);
4040 mxf_metadata_file_descriptor_handle_tag (MXFMetadataBase * metadata,
4041 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4044 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (metadata);
4045 gboolean ret = TRUE;
4046 #ifndef GST_DISABLE_GST_DEBUG
4054 self->linked_track_id = GST_READ_UINT32_BE (tag_data);
4055 GST_DEBUG (" linked track id = %u", self->linked_track_id);
4058 if (!mxf_fraction_parse (&self->sample_rate, tag_data, tag_size))
4060 GST_DEBUG (" sample rate = %d/%d", self->sample_rate.n,
4061 self->sample_rate.d);
4066 self->container_duration = GST_READ_UINT64_BE (tag_data);
4067 GST_DEBUG (" container duration = %" G_GINT64_FORMAT,
4068 self->container_duration);
4073 memcpy (&self->essence_container, tag_data, 16);
4074 GST_DEBUG (" essence container = %s",
4075 mxf_ul_to_string (&self->essence_container, str));
4080 memcpy (&self->codec, tag_data, 16);
4081 GST_DEBUG (" codec = %s", mxf_ul_to_string (&self->codec, str));
4085 MXF_METADATA_BASE_CLASS
4086 (mxf_metadata_file_descriptor_parent_class)->handle_tag (metadata,
4087 primer, tag, tag_data, tag_size);
4095 GST_ERROR ("Invalid file descriptor local tag 0x%04x of size %u", tag,
4101 static GstStructure *
4102 mxf_metadata_file_descriptor_to_structure (MXFMetadataBase * m)
4105 MXF_METADATA_BASE_CLASS
4106 (mxf_metadata_file_descriptor_parent_class)->to_structure (m);
4107 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (m);
4110 if (self->linked_track_id)
4111 gst_structure_id_set (ret, MXF_QUARK (LINKED_TRACK_ID), G_TYPE_UINT,
4112 self->linked_track_id, NULL);
4114 if (self->sample_rate.n && self->sample_rate.d)
4115 gst_structure_id_set (ret, MXF_QUARK (SAMPLE_RATE), GST_TYPE_FRACTION,
4116 self->sample_rate.n, self->sample_rate.d, NULL);
4118 if (self->container_duration)
4119 gst_structure_id_set (ret, MXF_QUARK (CONTAINER_DURATION), G_TYPE_INT64,
4120 self->container_duration, NULL);
4122 mxf_ul_to_string (&self->essence_container, str);
4123 gst_structure_id_set (ret, MXF_QUARK (ESSENCE_CONTAINER), G_TYPE_STRING, str,
4126 if (!mxf_ul_is_zero (&self->codec)) {
4127 mxf_ul_to_string (&self->codec, str);
4128 gst_structure_id_set (ret, MXF_QUARK (CODEC), G_TYPE_STRING, str, NULL);
4135 mxf_metadata_file_descriptor_write_tags (MXFMetadataBase * m,
4136 MXFPrimerPack * primer)
4138 MXFMetadataFileDescriptor *self = MXF_METADATA_FILE_DESCRIPTOR (m);
4140 MXF_METADATA_BASE_CLASS
4141 (mxf_metadata_file_descriptor_parent_class)->write_tags (m, primer);
4144 if (self->linked_track_id) {
4145 t = g_slice_new0 (MXFLocalTag);
4146 memcpy (&t->ul, MXF_UL (LINKED_TRACK_ID), 16);
4148 t->data = g_slice_alloc (t->size);
4150 GST_WRITE_UINT32_BE (t->data, self->linked_track_id);
4151 mxf_primer_pack_add_mapping (primer, 0x3006, &t->ul);
4152 ret = g_list_prepend (ret, t);
4155 t = g_slice_new0 (MXFLocalTag);
4156 memcpy (&t->ul, MXF_UL (SAMPLE_RATE), 16);
4158 t->data = g_slice_alloc (t->size);
4160 GST_WRITE_UINT32_BE (t->data, self->sample_rate.n);
4161 GST_WRITE_UINT32_BE (t->data + 4, self->sample_rate.d);
4162 mxf_primer_pack_add_mapping (primer, 0x3001, &t->ul);
4163 ret = g_list_prepend (ret, t);
4165 if (self->container_duration > 0) {
4166 t = g_slice_new0 (MXFLocalTag);
4167 memcpy (&t->ul, MXF_UL (CONTAINER_DURATION), 16);
4169 t->data = g_slice_alloc (t->size);
4171 GST_WRITE_UINT64_BE (t->data, self->container_duration);
4172 mxf_primer_pack_add_mapping (primer, 0x3002, &t->ul);
4173 ret = g_list_prepend (ret, t);
4176 t = g_slice_new0 (MXFLocalTag);
4177 memcpy (&t->ul, MXF_UL (ESSENCE_CONTAINER), 16);
4179 t->data = g_slice_alloc (t->size);
4181 memcpy (t->data, &self->essence_container, 16);
4182 mxf_primer_pack_add_mapping (primer, 0x3004, &t->ul);
4183 ret = g_list_prepend (ret, t);
4185 if (!mxf_ul_is_zero (&self->codec)) {
4186 t = g_slice_new0 (MXFLocalTag);
4187 memcpy (&t->ul, MXF_UL (CODEC), 16);
4189 t->data = g_slice_alloc (t->size);
4191 memcpy (t->data, &self->codec, 16);
4192 mxf_primer_pack_add_mapping (primer, 0x3005, &t->ul);
4193 ret = g_list_prepend (ret, t);
4200 mxf_metadata_file_descriptor_init (MXFMetadataFileDescriptor * self)
4206 mxf_metadata_file_descriptor_class_init (MXFMetadataFileDescriptorClass * klass)
4208 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4209 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
4211 metadata_base_class->handle_tag = mxf_metadata_file_descriptor_handle_tag;
4212 metadata_base_class->name_quark = MXF_QUARK (FILE_DESCRIPTOR);
4213 metadata_base_class->to_structure = mxf_metadata_file_descriptor_to_structure;
4214 metadata_base_class->write_tags = mxf_metadata_file_descriptor_write_tags;
4215 metadata_class->type = 0x0125;
4218 G_DEFINE_TYPE (MXFMetadataGenericPictureEssenceDescriptor,
4219 mxf_metadata_generic_picture_essence_descriptor,
4220 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
4223 mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataBase *
4224 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4227 MXFMetadataGenericPictureEssenceDescriptor *self =
4228 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (metadata);
4229 gboolean ret = TRUE;
4230 #ifndef GST_DISABLE_GST_DEBUG
4238 self->signal_standard = GST_READ_UINT8 (tag_data);
4239 GST_DEBUG (" signal standard = %u", self->signal_standard);
4244 self->frame_layout = GST_READ_UINT8 (tag_data);
4245 GST_DEBUG (" frame layout = %u", self->frame_layout);
4250 self->stored_width = GST_READ_UINT32_BE (tag_data);
4251 GST_DEBUG (" stored width = %u", self->stored_width);
4256 self->stored_height = GST_READ_UINT32_BE (tag_data);
4257 GST_DEBUG (" stored height = %u", self->stored_height);
4262 self->stored_f2_offset = GST_READ_UINT32_BE (tag_data);
4263 GST_DEBUG (" stored f2 offset = %d", self->stored_f2_offset);
4268 self->sampled_width = GST_READ_UINT32_BE (tag_data);
4269 GST_DEBUG (" sampled width = %u", self->sampled_width);
4274 self->sampled_height = GST_READ_UINT32_BE (tag_data);
4275 GST_DEBUG (" sampled height = %u", self->sampled_height);
4280 self->sampled_x_offset = GST_READ_UINT32_BE (tag_data);
4281 GST_DEBUG (" sampled x offset = %d", self->sampled_x_offset);
4286 self->sampled_y_offset = GST_READ_UINT32_BE (tag_data);
4287 GST_DEBUG (" sampled y offset = %d", self->sampled_y_offset);
4292 self->display_height = GST_READ_UINT32_BE (tag_data);
4293 GST_DEBUG (" display height = %u", self->display_height);
4298 self->display_width = GST_READ_UINT32_BE (tag_data);
4299 GST_DEBUG (" display width = %u", self->display_width);
4304 self->display_x_offset = GST_READ_UINT32_BE (tag_data);
4305 GST_DEBUG (" display x offset = %d", self->display_x_offset);
4310 self->display_y_offset = GST_READ_UINT32_BE (tag_data);
4311 GST_DEBUG (" display y offset = %d", self->display_y_offset);
4316 self->display_f2_offset = GST_READ_UINT32_BE (tag_data);
4317 GST_DEBUG (" display f2 offset = %d", self->display_f2_offset);
4320 if (!mxf_fraction_parse (&self->aspect_ratio, tag_data, tag_size))
4322 GST_DEBUG (" aspect ratio = %d/%d", self->aspect_ratio.n,
4323 self->aspect_ratio.d);
4328 self->active_format_descriptor = GST_READ_UINT8 (tag_data);
4329 GST_DEBUG (" active format descriptor = %u",
4330 self->active_format_descriptor);
4336 if (GST_READ_UINT32_BE (tag_data) == 0)
4339 if (GST_READ_UINT32_BE (tag_data) != 2 &&
4340 GST_READ_UINT32_BE (tag_data + 4) != 4)
4346 self->video_line_map[0] = GST_READ_UINT32_BE (tag_data + 8);
4347 self->video_line_map[1] = GST_READ_UINT32_BE (tag_data + 12);
4348 GST_DEBUG (" video line map = {%i, %i}", self->video_line_map[0],
4349 self->video_line_map[1]);
4354 self->alpha_transparency = GST_READ_UINT8 (tag_data);
4355 GST_DEBUG (" alpha transparency = %u", self->alpha_transparency);
4360 memcpy (&self->capture_gamma, tag_data, 16);
4361 GST_DEBUG (" capture gamma = %s",
4362 mxf_ul_to_string (&self->capture_gamma, str));
4367 self->image_alignment_offset = GST_READ_UINT32_BE (tag_data);
4368 GST_DEBUG (" image alignment offset = %u", self->image_alignment_offset);
4373 self->image_start_offset = GST_READ_UINT32_BE (tag_data);
4374 GST_DEBUG (" image start offset = %u", self->image_start_offset);
4379 self->image_end_offset = GST_READ_UINT32_BE (tag_data);
4380 GST_DEBUG (" image end offset = %u", self->image_end_offset);
4385 self->field_dominance = GST_READ_UINT8 (tag_data);
4386 GST_DEBUG (" field dominance = %u", self->field_dominance);
4391 memcpy (&self->picture_essence_coding, tag_data, 16);
4392 GST_DEBUG (" picture essence coding = %s",
4393 mxf_ul_to_string (&self->picture_essence_coding, str));
4397 MXF_METADATA_BASE_CLASS
4398 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->
4399 handle_tag (metadata, primer, tag, tag_data, tag_size);
4408 ("Invalid generic picture essence descriptor local tag 0x%04x of size %u",
4414 static GstStructure *
4415 mxf_metadata_generic_picture_essence_descriptor_to_structure (MXFMetadataBase *
4419 MXF_METADATA_BASE_CLASS
4420 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->
4422 MXFMetadataGenericPictureEssenceDescriptor *self =
4423 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (m);
4426 gst_structure_id_set (ret, MXF_QUARK (SIGNAL_STANDARD), G_TYPE_UCHAR,
4427 self->signal_standard, NULL);
4429 if (self->frame_layout != 255)
4430 gst_structure_id_set (ret, MXF_QUARK (FRAME_LAYOUT), G_TYPE_UCHAR,
4431 self->frame_layout, NULL);
4433 if (self->stored_width != 0 && self->stored_height != 0)
4434 gst_structure_id_set (ret, MXF_QUARK (STORED_WIDTH), G_TYPE_UINT,
4435 self->stored_width, MXF_QUARK (STORED_HEIGHT), G_TYPE_UINT,
4436 self->stored_height, NULL);
4438 if (self->stored_f2_offset != 0)
4439 gst_structure_id_set (ret, MXF_QUARK (STORED_F2_OFFSET), G_TYPE_INT,
4440 self->stored_f2_offset, NULL);
4442 if (self->sampled_width != 0 && self->sampled_height != 0)
4443 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_WIDTH), G_TYPE_UINT,
4444 self->sampled_width, MXF_QUARK (SAMPLED_HEIGHT), G_TYPE_UINT,
4445 self->sampled_height, NULL);
4447 if (self->sampled_x_offset != 0)
4448 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_X_OFFSET), G_TYPE_INT,
4449 self->sampled_x_offset, NULL);
4451 if (self->sampled_y_offset != 0)
4452 gst_structure_id_set (ret, MXF_QUARK (SAMPLED_Y_OFFSET), G_TYPE_INT,
4453 self->sampled_y_offset, NULL);
4455 if (self->display_width != 0 && self->display_height != 0)
4456 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_WIDTH), G_TYPE_UINT,
4457 self->display_width, MXF_QUARK (DISPLAY_HEIGHT), G_TYPE_UINT,
4458 self->display_height, NULL);
4460 if (self->display_x_offset != 0)
4461 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_X_OFFSET), G_TYPE_INT,
4462 self->display_x_offset, NULL);
4464 if (self->display_y_offset != 0)
4465 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_Y_OFFSET), G_TYPE_INT,
4466 self->display_y_offset, NULL);
4468 if (self->display_f2_offset != 0)
4469 gst_structure_id_set (ret, MXF_QUARK (DISPLAY_F2_OFFSET), G_TYPE_INT,
4470 self->display_f2_offset, NULL);
4472 if (self->aspect_ratio.n != 0 && self->aspect_ratio.d != 0)
4473 gst_structure_id_set (ret, MXF_QUARK (ASPECT_RATIO), GST_TYPE_FRACTION,
4474 self->aspect_ratio.n, self->aspect_ratio.d, NULL);
4476 if (self->active_format_descriptor)
4477 gst_structure_id_set (ret, MXF_QUARK (ACTIVE_FORMAT_DESCRIPTOR),
4478 G_TYPE_UCHAR, self->active_format_descriptor, NULL);
4480 if (self->video_line_map[0] != 0 && self->video_line_map[1] != 0)
4481 gst_structure_id_set (ret, MXF_QUARK (VIDEO_LINE_MAP_0), G_TYPE_UINT,
4482 self->video_line_map[0], MXF_QUARK (VIDEO_LINE_MAP_1), G_TYPE_UINT,
4483 self->video_line_map[1], NULL);
4485 if (self->alpha_transparency != 0)
4486 gst_structure_id_set (ret, MXF_QUARK (ALPHA_TRANSPARENCY), G_TYPE_UCHAR,
4487 self->alpha_transparency, NULL);
4489 if (!mxf_ul_is_zero (&self->capture_gamma)) {
4490 mxf_ul_to_string (&self->capture_gamma, str);
4491 gst_structure_id_set (ret, MXF_QUARK (CAPTURE_GAMMA), G_TYPE_STRING, str,
4495 if (self->image_alignment_offset != 0)
4496 gst_structure_id_set (ret, MXF_QUARK (IMAGE_ALIGNMENT_OFFSET), G_TYPE_UINT,
4497 self->image_alignment_offset, NULL);
4499 if (self->image_start_offset != 0)
4500 gst_structure_id_set (ret, MXF_QUARK (IMAGE_START_OFFSET), G_TYPE_UINT,
4501 self->image_start_offset, NULL);
4503 if (self->image_end_offset != 0)
4504 gst_structure_id_set (ret, MXF_QUARK (IMAGE_END_OFFSET), G_TYPE_UINT,
4505 self->image_end_offset, NULL);
4507 if (self->field_dominance != 0)
4508 gst_structure_id_set (ret, MXF_QUARK (FIELD_DOMINANCE), G_TYPE_UCHAR,
4509 self->field_dominance, NULL);
4511 if (!mxf_ul_is_zero (&self->picture_essence_coding)) {
4512 mxf_ul_to_string (&self->picture_essence_coding, str);
4513 gst_structure_id_set (ret, MXF_QUARK (PICTURE_ESSENCE_CODING),
4514 G_TYPE_STRING, str, NULL);
4521 mxf_metadata_generic_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
4522 MXFPrimerPack * primer)
4524 MXFMetadataGenericPictureEssenceDescriptor *self =
4525 MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (m);
4527 MXF_METADATA_BASE_CLASS
4528 (mxf_metadata_generic_picture_essence_descriptor_parent_class)->write_tags
4532 if (self->signal_standard != 1) {
4533 t = g_slice_new0 (MXFLocalTag);
4534 memcpy (&t->ul, MXF_UL (SIGNAL_STANDARD), 16);
4536 t->data = g_slice_alloc (t->size);
4538 GST_WRITE_UINT8 (t->data, self->signal_standard);
4539 mxf_primer_pack_add_mapping (primer, 0x3215, &t->ul);
4540 ret = g_list_prepend (ret, t);
4543 if (self->frame_layout != 255) {
4544 t = g_slice_new0 (MXFLocalTag);
4545 memcpy (&t->ul, MXF_UL (FRAME_LAYOUT), 16);
4547 t->data = g_slice_alloc (t->size);
4549 GST_WRITE_UINT8 (t->data, self->frame_layout);
4550 mxf_primer_pack_add_mapping (primer, 0x320c, &t->ul);
4551 ret = g_list_prepend (ret, t);
4554 if (self->stored_width != 0) {
4555 t = g_slice_new0 (MXFLocalTag);
4556 memcpy (&t->ul, MXF_UL (STORED_WIDTH), 16);
4558 t->data = g_slice_alloc (t->size);
4560 GST_WRITE_UINT32_BE (t->data, self->stored_width);
4561 mxf_primer_pack_add_mapping (primer, 0x3203, &t->ul);
4562 ret = g_list_prepend (ret, t);
4565 if (self->stored_height != 0) {
4566 t = g_slice_new0 (MXFLocalTag);
4567 memcpy (&t->ul, MXF_UL (STORED_HEIGHT), 16);
4569 t->data = g_slice_alloc (t->size);
4571 GST_WRITE_UINT32_BE (t->data, self->stored_height);
4572 mxf_primer_pack_add_mapping (primer, 0x3202, &t->ul);
4573 ret = g_list_prepend (ret, t);
4576 if (self->stored_f2_offset != 0) {
4577 t = g_slice_new0 (MXFLocalTag);
4578 memcpy (&t->ul, MXF_UL (STORED_F2_OFFSET), 16);
4580 t->data = g_slice_alloc (t->size);
4582 GST_WRITE_UINT32_BE (t->data, self->stored_f2_offset);
4583 mxf_primer_pack_add_mapping (primer, 0x3216, &t->ul);
4584 ret = g_list_prepend (ret, t);
4587 if (self->sampled_width != 0) {
4588 t = g_slice_new0 (MXFLocalTag);
4589 memcpy (&t->ul, MXF_UL (SAMPLED_WIDTH), 16);
4591 t->data = g_slice_alloc (t->size);
4593 GST_WRITE_UINT32_BE (t->data, self->sampled_width);
4594 mxf_primer_pack_add_mapping (primer, 0x3205, &t->ul);
4595 ret = g_list_prepend (ret, t);
4598 if (self->sampled_height != 0) {
4599 t = g_slice_new0 (MXFLocalTag);
4600 memcpy (&t->ul, MXF_UL (SAMPLED_HEIGHT), 16);
4602 t->data = g_slice_alloc (t->size);
4604 GST_WRITE_UINT32_BE (t->data, self->sampled_height);
4605 mxf_primer_pack_add_mapping (primer, 0x3204, &t->ul);
4606 ret = g_list_prepend (ret, t);
4609 if (self->sampled_x_offset != 0) {
4610 t = g_slice_new0 (MXFLocalTag);
4611 memcpy (&t->ul, MXF_UL (SAMPLED_X_OFFSET), 16);
4613 t->data = g_slice_alloc (t->size);
4615 GST_WRITE_UINT32_BE (t->data, self->sampled_x_offset);
4616 mxf_primer_pack_add_mapping (primer, 0x3206, &t->ul);
4617 ret = g_list_prepend (ret, t);
4620 if (self->sampled_y_offset != 0) {
4621 t = g_slice_new0 (MXFLocalTag);
4622 memcpy (&t->ul, MXF_UL (SAMPLED_Y_OFFSET), 16);
4624 t->data = g_slice_alloc (t->size);
4626 GST_WRITE_UINT32_BE (t->data, self->sampled_y_offset);
4627 mxf_primer_pack_add_mapping (primer, 0x3207, &t->ul);
4628 ret = g_list_prepend (ret, t);
4631 if (self->display_height != 0) {
4632 t = g_slice_new0 (MXFLocalTag);
4633 memcpy (&t->ul, MXF_UL (DISPLAY_HEIGHT), 16);
4635 t->data = g_slice_alloc (t->size);
4637 GST_WRITE_UINT32_BE (t->data, self->display_height);
4638 mxf_primer_pack_add_mapping (primer, 0x3208, &t->ul);
4639 ret = g_list_prepend (ret, t);
4642 if (self->display_width != 0) {
4643 t = g_slice_new0 (MXFLocalTag);
4644 memcpy (&t->ul, MXF_UL (DISPLAY_WIDTH), 16);
4646 t->data = g_slice_alloc (t->size);
4648 GST_WRITE_UINT32_BE (t->data, self->display_width);
4649 mxf_primer_pack_add_mapping (primer, 0x3209, &t->ul);
4650 ret = g_list_prepend (ret, t);
4653 if (self->display_x_offset != 0) {
4654 t = g_slice_new0 (MXFLocalTag);
4655 memcpy (&t->ul, MXF_UL (DISPLAY_X_OFFSET), 16);
4657 t->data = g_slice_alloc (t->size);
4659 GST_WRITE_UINT32_BE (t->data, self->display_x_offset);
4660 mxf_primer_pack_add_mapping (primer, 0x320a, &t->ul);
4661 ret = g_list_prepend (ret, t);
4664 if (self->display_y_offset != 0) {
4665 t = g_slice_new0 (MXFLocalTag);
4666 memcpy (&t->ul, MXF_UL (DISPLAY_Y_OFFSET), 16);
4668 t->data = g_slice_alloc (t->size);
4670 GST_WRITE_UINT32_BE (t->data, self->display_y_offset);
4671 mxf_primer_pack_add_mapping (primer, 0x320b, &t->ul);
4672 ret = g_list_prepend (ret, t);
4675 if (self->display_f2_offset != 0) {
4676 t = g_slice_new0 (MXFLocalTag);
4677 memcpy (&t->ul, MXF_UL (DISPLAY_F2_OFFSET), 16);
4679 t->data = g_slice_alloc (t->size);
4681 GST_WRITE_UINT32_BE (t->data, self->display_f2_offset);
4682 mxf_primer_pack_add_mapping (primer, 0x3217, &t->ul);
4683 ret = g_list_prepend (ret, t);
4686 if (self->aspect_ratio.n != 0 && self->aspect_ratio.d != 0) {
4687 t = g_slice_new0 (MXFLocalTag);
4688 memcpy (&t->ul, MXF_UL (ASPECT_RATIO), 16);
4690 t->data = g_slice_alloc (t->size);
4692 GST_WRITE_UINT32_BE (t->data, self->aspect_ratio.n);
4693 GST_WRITE_UINT32_BE (t->data + 4, self->aspect_ratio.d);
4694 mxf_primer_pack_add_mapping (primer, 0x320e, &t->ul);
4695 ret = g_list_prepend (ret, t);
4698 if (self->active_format_descriptor != 0) {
4699 t = g_slice_new0 (MXFLocalTag);
4700 memcpy (&t->ul, MXF_UL (ACTIVE_FORMAT_DESCRIPTOR), 16);
4702 t->data = g_slice_alloc (t->size);
4704 GST_WRITE_UINT8 (t->data, self->active_format_descriptor);
4705 mxf_primer_pack_add_mapping (primer, 0x3218, &t->ul);
4706 ret = g_list_prepend (ret, t);
4709 if (self->video_line_map[0] != 0 || self->video_line_map[1] != 0) {
4710 t = g_slice_new0 (MXFLocalTag);
4711 memcpy (&t->ul, MXF_UL (VIDEO_LINE_MAP), 16);
4713 t->data = g_slice_alloc (t->size);
4715 GST_WRITE_UINT64_BE (t->data, self->video_line_map[0]);
4716 GST_WRITE_UINT64_BE (t->data + 8, self->video_line_map[1]);
4717 mxf_primer_pack_add_mapping (primer, 0x320d, &t->ul);
4718 ret = g_list_prepend (ret, t);
4721 if (self->alpha_transparency != 0) {
4722 t = g_slice_new0 (MXFLocalTag);
4723 memcpy (&t->ul, MXF_UL (ALPHA_TRANSPARENCY), 16);
4725 t->data = g_slice_alloc (t->size);
4727 GST_WRITE_UINT8 (t->data, self->alpha_transparency);
4728 mxf_primer_pack_add_mapping (primer, 0x320f, &t->ul);
4729 ret = g_list_prepend (ret, t);
4732 if (!mxf_ul_is_zero (&self->capture_gamma)) {
4733 t = g_slice_new0 (MXFLocalTag);
4734 memcpy (&t->ul, MXF_UL (CAPTURE_GAMMA), 16);
4736 t->data = g_slice_alloc (t->size);
4738 memcpy (t->data, &self->capture_gamma, 16);
4739 mxf_primer_pack_add_mapping (primer, 0x3210, &t->ul);
4740 ret = g_list_prepend (ret, t);
4743 if (self->image_alignment_offset != 0) {
4744 t = g_slice_new0 (MXFLocalTag);
4745 memcpy (&t->ul, MXF_UL (IMAGE_ALIGNMENT_OFFSET), 16);
4747 t->data = g_slice_alloc (t->size);
4749 GST_WRITE_UINT32_BE (t->data, self->image_alignment_offset);
4750 mxf_primer_pack_add_mapping (primer, 0x3211, &t->ul);
4751 ret = g_list_prepend (ret, t);
4754 if (self->image_start_offset != 0) {
4755 t = g_slice_new0 (MXFLocalTag);
4756 memcpy (&t->ul, MXF_UL (IMAGE_START_OFFSET), 16);
4758 t->data = g_slice_alloc (t->size);
4760 GST_WRITE_UINT32_BE (t->data, self->image_start_offset);
4761 mxf_primer_pack_add_mapping (primer, 0x3213, &t->ul);
4762 ret = g_list_prepend (ret, t);
4765 if (self->image_end_offset != 0) {
4766 t = g_slice_new0 (MXFLocalTag);
4767 memcpy (&t->ul, MXF_UL (IMAGE_END_OFFSET), 16);
4769 t->data = g_slice_alloc (t->size);
4771 GST_WRITE_UINT32_BE (t->data, self->image_end_offset);
4772 mxf_primer_pack_add_mapping (primer, 0x3214, &t->ul);
4773 ret = g_list_prepend (ret, t);
4776 if (self->field_dominance != 0) {
4777 t = g_slice_new0 (MXFLocalTag);
4778 memcpy (&t->ul, MXF_UL (FIELD_DOMINANCE), 16);
4780 t->data = g_slice_alloc (t->size);
4782 GST_WRITE_UINT8 (t->data, self->field_dominance);
4783 mxf_primer_pack_add_mapping (primer, 0x3212, &t->ul);
4784 ret = g_list_prepend (ret, t);
4787 if (!mxf_ul_is_zero (&self->picture_essence_coding)) {
4788 t = g_slice_new0 (MXFLocalTag);
4789 memcpy (&t->ul, MXF_UL (PICTURE_ESSENCE_CODING), 16);
4791 t->data = g_slice_alloc (t->size);
4793 memcpy (t->data, &self->picture_essence_coding, 16);
4794 mxf_primer_pack_add_mapping (primer, 0x3201, &t->ul);
4795 ret = g_list_prepend (ret, t);
4802 mxf_metadata_generic_picture_essence_descriptor_init
4803 (MXFMetadataGenericPictureEssenceDescriptor * self)
4805 self->signal_standard = 1;
4806 self->frame_layout = 255;
4810 mxf_metadata_generic_picture_essence_descriptor_class_init
4811 (MXFMetadataGenericPictureEssenceDescriptorClass * klass)
4813 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
4814 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
4816 metadata_base_class->handle_tag =
4817 mxf_metadata_generic_picture_essence_descriptor_handle_tag;
4818 metadata_base_class->name_quark =
4819 MXF_QUARK (GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
4820 metadata_base_class->to_structure =
4821 mxf_metadata_generic_picture_essence_descriptor_to_structure;
4822 metadata_base_class->write_tags =
4823 mxf_metadata_generic_picture_essence_descriptor_write_tags;
4824 metadata_class->type = 0x0127;
4827 void mxf_metadata_generic_picture_essence_descriptor_set_caps
4828 (MXFMetadataGenericPictureEssenceDescriptor * self, GstCaps * caps)
4831 guint width, height;
4832 MXFMetadataFileDescriptor *f = (MXFMetadataFileDescriptor *) self;
4834 g_return_if_fail (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (self));
4835 g_return_if_fail (GST_IS_CAPS (caps));
4837 if (f->sample_rate.d == 0) {
4838 GST_ERROR ("Invalid framerate");
4840 gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, f->sample_rate.n,
4841 f->sample_rate.d, NULL);
4844 width = self->stored_width;
4845 height = self->stored_height;
4847 /* If the video is stored as separate fields the
4848 * height is only the height of one field, i.e.
4849 * half the height of the frame.
4851 * See SMPTE 377M E2.2 and E1.2
4853 if (self->frame_layout == 1 || self->frame_layout == 2
4854 || self->frame_layout == 4) {
4856 gst_caps_set_simple (caps, "interlaced", G_TYPE_BOOLEAN, TRUE, NULL);
4859 if (width == 0 || height == 0) {
4860 GST_ERROR ("Invalid width/height");
4864 gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height", G_TYPE_INT,
4867 if (self->aspect_ratio.n == 0 || self->aspect_ratio.d == 0) {
4868 GST_ERROR ("Invalid aspect ratio");
4872 par_n = height * self->aspect_ratio.n;
4873 par_d = width * self->aspect_ratio.d;
4875 gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION,
4876 par_n, par_d, NULL);
4880 gst_greatest_common_divisor (gint a, gint b)
4893 mxf_metadata_generic_picture_essence_descriptor_from_caps
4894 (MXFMetadataGenericPictureEssenceDescriptor * self, GstCaps * caps) {
4895 gint par_n, par_d, gcd;
4898 MXFMetadataFileDescriptor *f = (MXFMetadataFileDescriptor *) self;
4900 gboolean interlaced;
4902 g_return_val_if_fail (MXF_IS_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR
4904 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
4906 s = gst_caps_get_structure (caps, 0);
4908 if (!gst_structure_get_boolean (s, "interlaced", &interlaced) || !interlaced)
4909 self->frame_layout = 0;
4911 self->frame_layout = 3;
4913 if (!gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) {
4914 GST_ERROR ("Invalid framerate");
4917 f->sample_rate.n = fps_n;
4918 f->sample_rate.d = fps_d;
4920 if (!gst_structure_get_int (s, "width", &width) ||
4921 !gst_structure_get_int (s, "height", &height)) {
4922 GST_ERROR ("Invalid width/height");
4926 self->stored_width = width;
4927 self->stored_height = height;
4929 if (!gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_n, &par_d)) {
4934 self->aspect_ratio.n = par_n * width;
4935 self->aspect_ratio.d = par_d * height;
4937 gst_greatest_common_divisor (self->aspect_ratio.n, self->aspect_ratio.d);
4938 self->aspect_ratio.n /= gcd;
4939 self->aspect_ratio.d /= gcd;
4945 G_DEFINE_TYPE (MXFMetadataGenericSoundEssenceDescriptor,
4946 mxf_metadata_generic_sound_essence_descriptor,
4947 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
4950 mxf_metadata_generic_sound_essence_descriptor_handle_tag (MXFMetadataBase *
4951 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
4954 MXFMetadataGenericSoundEssenceDescriptor *self =
4955 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (metadata);
4956 gboolean ret = TRUE;
4957 #ifndef GST_DISABLE_GST_DEBUG
4963 if (!mxf_fraction_parse (&self->audio_sampling_rate, tag_data, tag_size))
4965 GST_DEBUG (" audio sampling rate = %d/%d",
4966 self->audio_sampling_rate.n, self->audio_sampling_rate.d);
4971 self->locked = (GST_READ_UINT8 (tag_data) != 0);
4972 GST_DEBUG (" locked = %s", (self->locked) ? "yes" : "no");
4977 self->audio_ref_level = GST_READ_UINT8 (tag_data);
4978 GST_DEBUG (" audio ref level = %d", self->audio_ref_level);
4983 self->electro_spatial_formulation = GST_READ_UINT8 (tag_data);
4984 GST_DEBUG (" electro spatial formulation = %u",
4985 self->electro_spatial_formulation);
4990 self->channel_count = GST_READ_UINT32_BE (tag_data);
4991 GST_DEBUG (" channel count = %u", self->channel_count);
4996 self->quantization_bits = GST_READ_UINT32_BE (tag_data);
4997 GST_DEBUG (" quantization bits = %u", self->quantization_bits);
5002 self->dial_norm = GST_READ_UINT8 (tag_data);
5003 GST_DEBUG (" dial norm = %d", self->dial_norm);
5008 memcpy (&self->sound_essence_compression, tag_data, 16);
5009 GST_DEBUG (" sound essence compression = %s",
5010 mxf_ul_to_string (&self->sound_essence_compression, str));
5014 MXF_METADATA_BASE_CLASS
5015 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->
5016 handle_tag (metadata, primer, tag, tag_data, tag_size);
5025 ("Invalid generic sound essence descriptor local tag 0x%04x of size %u",
5031 static GstStructure *
5032 mxf_metadata_generic_sound_essence_descriptor_to_structure (MXFMetadataBase * m)
5035 MXF_METADATA_BASE_CLASS
5036 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->to_structure
5038 MXFMetadataGenericSoundEssenceDescriptor *self =
5039 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (m);
5041 gst_structure_id_set (ret, MXF_QUARK (AUDIO_SAMPLING_RATE), GST_TYPE_FRACTION,
5042 self->audio_sampling_rate.n, self->audio_sampling_rate.d, NULL);
5044 gst_structure_id_set (ret, MXF_QUARK (LOCKED), G_TYPE_BOOLEAN, self->locked,
5047 if (self->electro_spatial_formulation != 0)
5048 gst_structure_id_set (ret, MXF_QUARK (ELECTRO_SPATIAL_FORMULATION),
5049 G_TYPE_UCHAR, self->electro_spatial_formulation, NULL);
5051 if (self->channel_count != 0)
5052 gst_structure_id_set (ret, MXF_QUARK (CHANNEL_COUNT), G_TYPE_UINT,
5053 self->channel_count, NULL);
5055 if (self->quantization_bits != 0)
5056 gst_structure_id_set (ret, MXF_QUARK (QUANTIZATION_BITS), G_TYPE_UINT,
5057 self->quantization_bits, NULL);
5059 if (self->dial_norm != 0)
5060 gst_structure_id_set (ret, MXF_QUARK (DIAL_NORM), G_TYPE_CHAR,
5061 self->dial_norm, NULL);
5063 if (!mxf_ul_is_zero (&self->sound_essence_compression)) {
5066 mxf_ul_to_string (&self->sound_essence_compression, str);
5067 gst_structure_id_set (ret, MXF_QUARK (SOUND_ESSENCE_COMPRESSION),
5068 G_TYPE_STRING, str, NULL);
5075 mxf_metadata_generic_sound_essence_descriptor_write_tags (MXFMetadataBase * m,
5076 MXFPrimerPack * primer)
5078 MXFMetadataGenericSoundEssenceDescriptor *self =
5079 MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (m);
5081 MXF_METADATA_BASE_CLASS
5082 (mxf_metadata_generic_sound_essence_descriptor_parent_class)->write_tags
5086 if (self->audio_sampling_rate.d && self->audio_sampling_rate.n) {
5087 t = g_slice_new0 (MXFLocalTag);
5088 memcpy (&t->ul, MXF_UL (AUDIO_SAMPLING_RATE), 16);
5090 t->data = g_slice_alloc (t->size);
5092 GST_WRITE_UINT32_BE (t->data, self->audio_sampling_rate.n);
5093 GST_WRITE_UINT32_BE (t->data + 4, self->audio_sampling_rate.d);
5094 mxf_primer_pack_add_mapping (primer, 0x3d03, &t->ul);
5095 ret = g_list_prepend (ret, t);
5098 t = g_slice_new0 (MXFLocalTag);
5099 memcpy (&t->ul, MXF_UL (LOCKED), 16);
5101 t->data = g_slice_alloc (t->size);
5103 GST_WRITE_UINT8 (t->data, (self->locked) ? 1 : 0);
5104 mxf_primer_pack_add_mapping (primer, 0x3d02, &t->ul);
5105 ret = g_list_prepend (ret, t);
5107 if (self->audio_ref_level) {
5108 t = g_slice_new0 (MXFLocalTag);
5109 memcpy (&t->ul, MXF_UL (AUDIO_REF_LEVEL), 16);
5111 t->data = g_slice_alloc (t->size);
5113 GST_WRITE_UINT8 (t->data, self->audio_ref_level);
5114 mxf_primer_pack_add_mapping (primer, 0x3d04, &t->ul);
5115 ret = g_list_prepend (ret, t);
5118 if (self->electro_spatial_formulation != 255) {
5119 t = g_slice_new0 (MXFLocalTag);
5120 memcpy (&t->ul, MXF_UL (ELECTRO_SPATIAL_FORMULATION), 16);
5122 t->data = g_slice_alloc (t->size);
5124 GST_WRITE_UINT8 (t->data, self->electro_spatial_formulation);
5125 mxf_primer_pack_add_mapping (primer, 0x3d05, &t->ul);
5126 ret = g_list_prepend (ret, t);
5129 if (self->channel_count) {
5130 t = g_slice_new0 (MXFLocalTag);
5131 memcpy (&t->ul, MXF_UL (CHANNEL_COUNT), 16);
5133 t->data = g_slice_alloc (t->size);
5135 GST_WRITE_UINT32_BE (t->data, self->channel_count);
5136 mxf_primer_pack_add_mapping (primer, 0x3d07, &t->ul);
5137 ret = g_list_prepend (ret, t);
5140 if (self->quantization_bits) {
5141 t = g_slice_new0 (MXFLocalTag);
5142 memcpy (&t->ul, MXF_UL (QUANTIZATION_BITS), 16);
5144 t->data = g_slice_alloc (t->size);
5146 GST_WRITE_UINT32_BE (t->data, self->quantization_bits);
5147 mxf_primer_pack_add_mapping (primer, 0x3d01, &t->ul);
5148 ret = g_list_prepend (ret, t);
5151 if (self->dial_norm != 0) {
5152 t = g_slice_new0 (MXFLocalTag);
5153 memcpy (&t->ul, MXF_UL (DIAL_NORM), 16);
5155 t->data = g_slice_alloc (t->size);
5157 GST_WRITE_UINT8 (t->data, self->dial_norm);
5158 mxf_primer_pack_add_mapping (primer, 0x3d0c, &t->ul);
5159 ret = g_list_prepend (ret, t);
5162 if (!mxf_ul_is_zero (&self->sound_essence_compression)) {
5163 t = g_slice_new0 (MXFLocalTag);
5164 memcpy (&t->ul, MXF_UL (SOUND_ESSENCE_COMPRESSION), 16);
5166 t->data = g_slice_alloc (t->size);
5168 memcpy (t->data, &self->sound_essence_compression, 16);
5169 mxf_primer_pack_add_mapping (primer, 0x3d06, &t->ul);
5170 ret = g_list_prepend (ret, t);
5177 mxf_metadata_generic_sound_essence_descriptor_init
5178 (MXFMetadataGenericSoundEssenceDescriptor * self)
5180 self->audio_sampling_rate.n = 48000;
5181 self->audio_sampling_rate.d = 1;
5182 self->electro_spatial_formulation = 255;
5186 mxf_metadata_generic_sound_essence_descriptor_class_init
5187 (MXFMetadataGenericSoundEssenceDescriptorClass * klass)
5189 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5190 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5192 metadata_base_class->handle_tag =
5193 mxf_metadata_generic_sound_essence_descriptor_handle_tag;
5194 metadata_base_class->name_quark =
5195 MXF_QUARK (GENERIC_SOUND_ESSENCE_DESCRIPTOR);
5196 metadata_base_class->to_structure =
5197 mxf_metadata_generic_sound_essence_descriptor_to_structure;
5198 metadata_base_class->write_tags =
5199 mxf_metadata_generic_sound_essence_descriptor_write_tags;
5200 metadata_class->type = 0x0142;
5203 void mxf_metadata_generic_sound_essence_descriptor_set_caps
5204 (MXFMetadataGenericSoundEssenceDescriptor * self, GstCaps * caps)
5206 g_return_if_fail (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (self));
5207 g_return_if_fail (GST_IS_CAPS (caps));
5209 if (self->audio_sampling_rate.n == 0 || self->audio_sampling_rate.d == 0) {
5210 GST_ERROR ("Invalid audio sampling rate");
5212 gst_caps_set_simple (caps,
5214 (gint) (mxf_fraction_to_double (&self->audio_sampling_rate)
5218 if (self->channel_count == 0) {
5219 GST_ERROR ("Invalid number of channels (0)");
5221 gst_caps_set_simple (caps, "channels", G_TYPE_INT, self->channel_count,
5227 mxf_metadata_generic_sound_essence_descriptor_from_caps
5228 (MXFMetadataGenericSoundEssenceDescriptor * self, GstCaps * caps) {
5233 g_return_val_if_fail (MXF_IS_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (self),
5235 g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
5237 s = gst_caps_get_structure (caps, 0);
5239 if (!gst_structure_get_int (s, "rate", &rate) || rate == 0) {
5240 GST_WARNING ("No samplerate");
5243 self->audio_sampling_rate.n = rate;
5244 self->audio_sampling_rate.d = 1;
5247 if (!gst_structure_get_int (s, "channels", &channels) || channels == 0) {
5248 GST_WARNING ("No channels");
5251 self->channel_count = channels;
5258 G_DEFINE_TYPE (MXFMetadataCDCIPictureEssenceDescriptor,
5259 mxf_metadata_cdci_picture_essence_descriptor,
5260 MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
5263 mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataBase *
5264 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5267 MXFMetadataCDCIPictureEssenceDescriptor *self =
5268 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (metadata);
5269 gboolean ret = TRUE;
5275 self->component_depth = GST_READ_UINT32_BE (tag_data);
5276 GST_DEBUG (" component depth = %u", self->component_depth);
5281 self->horizontal_subsampling = GST_READ_UINT32_BE (tag_data);
5282 GST_DEBUG (" horizontal subsampling = %u", self->horizontal_subsampling);
5287 self->vertical_subsampling = GST_READ_UINT32_BE (tag_data);
5288 GST_DEBUG (" vertical subsampling = %u", self->vertical_subsampling);
5293 self->color_siting = GST_READ_UINT8 (tag_data);
5294 GST_DEBUG (" color siting = %u", self->color_siting);
5299 self->reversed_byte_order = GST_READ_UINT8 (tag_data);
5300 GST_DEBUG (" reversed byte order = %s",
5301 (self->reversed_byte_order) ? "yes" : "no");
5306 self->padding_bits = GST_READ_UINT16_BE (tag_data);
5307 GST_DEBUG (" padding bits = %d", self->padding_bits);
5312 self->alpha_sample_depth = GST_READ_UINT32_BE (tag_data);
5313 GST_DEBUG (" alpha sample depth = %u", self->alpha_sample_depth);
5318 self->black_ref_level = GST_READ_UINT32_BE (tag_data);
5319 GST_DEBUG (" black ref level = %u", self->black_ref_level);
5324 self->white_ref_level = GST_READ_UINT32_BE (tag_data);
5325 GST_DEBUG (" white ref level = %u", self->white_ref_level);
5330 self->color_range = GST_READ_UINT32_BE (tag_data);
5331 GST_DEBUG (" color range = %u", self->color_range);
5335 MXF_METADATA_BASE_CLASS
5336 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->
5337 handle_tag (metadata, primer, tag, tag_data, tag_size);
5346 ("Invalid CDCI picture essence descriptor local tag 0x%04x of size %u",
5352 static GstStructure *
5353 mxf_metadata_cdci_picture_essence_descriptor_to_structure (MXFMetadataBase * m)
5356 MXF_METADATA_BASE_CLASS
5357 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->to_structure
5359 MXFMetadataCDCIPictureEssenceDescriptor *self =
5360 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (m);
5362 if (self->component_depth != 0)
5363 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_DEPTH), G_TYPE_UINT,
5364 self->component_depth, NULL);
5366 if (self->horizontal_subsampling != 0)
5367 gst_structure_id_set (ret, MXF_QUARK (HORIZONTAL_SUBSAMPLING), G_TYPE_UINT,
5368 self->horizontal_subsampling, NULL);
5370 if (self->vertical_subsampling != 0)
5371 gst_structure_id_set (ret, MXF_QUARK (VERTICAL_SUBSAMPLING), G_TYPE_UINT,
5372 self->vertical_subsampling, NULL);
5374 if (self->color_siting != 255)
5375 gst_structure_id_set (ret, MXF_QUARK (COLOR_SITING), G_TYPE_UCHAR,
5376 self->color_siting, NULL);
5378 gst_structure_id_set (ret, MXF_QUARK (REVERSED_BYTE_ORDER), G_TYPE_BOOLEAN,
5379 self->reversed_byte_order, NULL);
5381 if (self->padding_bits != 0)
5382 gst_structure_id_set (ret, MXF_QUARK (PADDING_BITS), G_TYPE_INT,
5383 self->padding_bits, NULL);
5385 if (self->alpha_sample_depth != 0)
5386 gst_structure_id_set (ret, MXF_QUARK (ALPHA_SAMPLE_DEPTH), G_TYPE_UINT,
5387 self->alpha_sample_depth, NULL);
5389 if (self->black_ref_level != 0)
5390 gst_structure_id_set (ret, MXF_QUARK (BLACK_REF_LEVEL), G_TYPE_UINT,
5391 self->black_ref_level, NULL);
5393 if (self->white_ref_level != 0)
5394 gst_structure_id_set (ret, MXF_QUARK (WHITE_REF_LEVEL), G_TYPE_UINT,
5395 self->white_ref_level, NULL);
5397 if (self->color_range != 0)
5398 gst_structure_id_set (ret, MXF_QUARK (COLOR_RANGE), G_TYPE_UINT,
5399 self->color_range, NULL);
5405 mxf_metadata_cdci_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
5406 MXFPrimerPack * primer)
5408 MXFMetadataCDCIPictureEssenceDescriptor *self =
5409 MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (m);
5411 MXF_METADATA_BASE_CLASS
5412 (mxf_metadata_cdci_picture_essence_descriptor_parent_class)->write_tags
5416 if (self->component_depth) {
5417 t = g_slice_new0 (MXFLocalTag);
5418 memcpy (&t->ul, MXF_UL (COMPONENT_DEPTH), 16);
5420 t->data = g_slice_alloc (t->size);
5422 GST_WRITE_UINT32_BE (t->data, self->component_depth);
5423 mxf_primer_pack_add_mapping (primer, 0x3301, &t->ul);
5424 ret = g_list_prepend (ret, t);
5427 if (self->horizontal_subsampling) {
5428 t = g_slice_new0 (MXFLocalTag);
5429 memcpy (&t->ul, MXF_UL (HORIZONTAL_SUBSAMPLING), 16);
5431 t->data = g_slice_alloc (t->size);
5433 GST_WRITE_UINT32_BE (t->data, self->horizontal_subsampling);
5434 mxf_primer_pack_add_mapping (primer, 0x3302, &t->ul);
5435 ret = g_list_prepend (ret, t);
5438 if (self->vertical_subsampling) {
5439 t = g_slice_new0 (MXFLocalTag);
5440 memcpy (&t->ul, MXF_UL (VERTICAL_SUBSAMPLING), 16);
5442 t->data = g_slice_alloc (t->size);
5444 GST_WRITE_UINT32_BE (t->data, self->vertical_subsampling);
5445 mxf_primer_pack_add_mapping (primer, 0x3308, &t->ul);
5446 ret = g_list_prepend (ret, t);
5449 if (self->color_siting != 0xff) {
5450 t = g_slice_new0 (MXFLocalTag);
5451 memcpy (&t->ul, MXF_UL (COLOR_SITING), 16);
5453 t->data = g_slice_alloc (t->size);
5455 GST_WRITE_UINT8 (t->data, self->color_siting);
5456 mxf_primer_pack_add_mapping (primer, 0x3303, &t->ul);
5457 ret = g_list_prepend (ret, t);
5460 if (self->reversed_byte_order) {
5461 t = g_slice_new0 (MXFLocalTag);
5462 memcpy (&t->ul, MXF_UL (REVERSED_BYTE_ORDER), 16);
5464 t->data = g_slice_alloc (t->size);
5466 GST_WRITE_UINT8 (t->data, (self->reversed_byte_order) ? 1 : 0);
5467 mxf_primer_pack_add_mapping (primer, 0x330b, &t->ul);
5468 ret = g_list_prepend (ret, t);
5471 if (self->padding_bits) {
5472 t = g_slice_new0 (MXFLocalTag);
5473 memcpy (&t->ul, MXF_UL (PADDING_BITS), 16);
5475 t->data = g_slice_alloc (t->size);
5477 GST_WRITE_UINT16_BE (t->data, self->padding_bits);
5478 mxf_primer_pack_add_mapping (primer, 0x3307, &t->ul);
5479 ret = g_list_prepend (ret, t);
5482 if (self->alpha_sample_depth) {
5483 t = g_slice_new0 (MXFLocalTag);
5484 memcpy (&t->ul, MXF_UL (ALPHA_SAMPLE_DEPTH), 16);
5486 t->data = g_slice_alloc (t->size);
5488 GST_WRITE_UINT32_BE (t->data, self->alpha_sample_depth);
5489 mxf_primer_pack_add_mapping (primer, 0x3309, &t->ul);
5490 ret = g_list_prepend (ret, t);
5493 if (self->black_ref_level) {
5494 t = g_slice_new0 (MXFLocalTag);
5495 memcpy (&t->ul, MXF_UL (BLACK_REF_LEVEL), 16);
5497 t->data = g_slice_alloc (t->size);
5499 GST_WRITE_UINT32_BE (t->data, self->black_ref_level);
5500 mxf_primer_pack_add_mapping (primer, 0x3304, &t->ul);
5501 ret = g_list_prepend (ret, t);
5504 if (self->white_ref_level) {
5505 t = g_slice_new0 (MXFLocalTag);
5506 memcpy (&t->ul, MXF_UL (WHITE_REF_LEVEL), 16);
5508 t->data = g_slice_alloc (t->size);
5510 GST_WRITE_UINT32_BE (t->data, self->white_ref_level);
5511 mxf_primer_pack_add_mapping (primer, 0x3305, &t->ul);
5512 ret = g_list_prepend (ret, t);
5515 if (self->color_range) {
5516 t = g_slice_new0 (MXFLocalTag);
5517 memcpy (&t->ul, MXF_UL (COLOR_RANGE), 16);
5519 t->data = g_slice_alloc (t->size);
5521 GST_WRITE_UINT32_BE (t->data, self->color_range);
5522 mxf_primer_pack_add_mapping (primer, 0x3306, &t->ul);
5523 ret = g_list_prepend (ret, t);
5530 mxf_metadata_cdci_picture_essence_descriptor_init
5531 (MXFMetadataCDCIPictureEssenceDescriptor * self)
5533 self->color_siting = 0xff;
5537 mxf_metadata_cdci_picture_essence_descriptor_class_init
5538 (MXFMetadataCDCIPictureEssenceDescriptorClass * klass)
5540 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5541 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5543 metadata_base_class->handle_tag =
5544 mxf_metadata_cdci_picture_essence_descriptor_handle_tag;
5545 metadata_base_class->name_quark = MXF_QUARK (CDCI_PICTURE_ESSENCE_DESCRIPTOR);
5546 metadata_base_class->to_structure =
5547 mxf_metadata_cdci_picture_essence_descriptor_to_structure;
5548 metadata_base_class->write_tags =
5549 mxf_metadata_cdci_picture_essence_descriptor_write_tags;
5550 metadata_class->type = 0x0128;
5553 G_DEFINE_TYPE (MXFMetadataRGBAPictureEssenceDescriptor,
5554 mxf_metadata_rgba_picture_essence_descriptor,
5555 MXF_TYPE_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR);
5558 mxf_metadata_rgba_picture_essence_descriptor_finalize (GObject * object)
5560 MXFMetadataRGBAPictureEssenceDescriptor *self =
5561 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (object);
5563 g_free (self->pixel_layout);
5564 self->pixel_layout = NULL;
5567 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->finalize
5572 mxf_metadata_rgba_picture_essence_descriptor_handle_tag (MXFMetadataBase *
5573 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5576 MXFMetadataRGBAPictureEssenceDescriptor *self =
5577 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (metadata);
5578 gboolean ret = TRUE;
5584 self->component_max_ref = GST_READ_UINT32_BE (tag_data);
5585 GST_DEBUG (" component max ref = %u", self->component_max_ref);
5590 self->component_min_ref = GST_READ_UINT32_BE (tag_data);
5591 GST_DEBUG (" component min ref = %u", self->component_min_ref);
5596 self->alpha_max_ref = GST_READ_UINT32_BE (tag_data);
5597 GST_DEBUG (" alpha max ref = %u", self->alpha_max_ref);
5602 self->alpha_min_ref = GST_READ_UINT32_BE (tag_data);
5603 GST_DEBUG (" alpha min ref = %u", self->alpha_min_ref);
5608 self->scanning_direction = GST_READ_UINT8 (tag_data);
5609 GST_DEBUG (" scanning direction = %u", self->scanning_direction);
5614 if (tag_size % 2 != 0)
5618 while (tag_data[i] != 0 && tag_data[i + 1] != 0 && i + 2 <= tag_size)
5622 self->n_pixel_layout = len;
5623 GST_DEBUG (" number of pixel layouts = %u", len);
5627 self->pixel_layout = g_malloc0 (2 * len);
5629 for (i = 0; i < len; i++) {
5630 self->pixel_layout[2 * i] = tag_data[2 * i];
5631 self->pixel_layout[2 * i + 1] = tag_data[2 * i + 1];
5632 GST_DEBUG (" pixel layout %u = %c : %u", i,
5633 (gchar) self->pixel_layout[2 * i], self->pixel_layout[2 * i + 1]);
5640 /* TODO: handle this */
5641 GST_WARNING (" tag 0x%04x not implemented yet", tag);
5645 MXF_METADATA_BASE_CLASS
5646 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->
5647 handle_tag (metadata, primer, tag, tag_data, tag_size);
5656 ("Invalid RGBA picture essence descriptor local tag 0x%04x of size %u",
5662 static GstStructure *
5663 mxf_metadata_rgba_picture_essence_descriptor_to_structure (MXFMetadataBase * m)
5666 MXF_METADATA_BASE_CLASS
5667 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->to_structure
5669 MXFMetadataRGBAPictureEssenceDescriptor *self =
5670 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (m);
5672 if (self->component_max_ref != 255)
5673 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_MAX_REF), G_TYPE_UINT,
5674 self->component_max_ref, NULL);
5676 if (self->component_min_ref != 0)
5677 gst_structure_id_set (ret, MXF_QUARK (COMPONENT_MIN_REF), G_TYPE_UINT,
5678 self->component_min_ref, NULL);
5680 if (self->alpha_max_ref != 255)
5681 gst_structure_id_set (ret, MXF_QUARK (ALPHA_MAX_REF), G_TYPE_UINT,
5682 self->alpha_max_ref, NULL);
5684 if (self->alpha_min_ref != 0)
5685 gst_structure_id_set (ret, MXF_QUARK (ALPHA_MIN_REF), G_TYPE_UINT,
5686 self->alpha_min_ref, NULL);
5688 if (self->scanning_direction != 0)
5689 gst_structure_id_set (ret, MXF_QUARK (SCANNING_DIRECTION), G_TYPE_UCHAR,
5690 self->scanning_direction, NULL);
5692 if (self->n_pixel_layout != 0) {
5693 gchar *pl = g_new0 (gchar, self->n_pixel_layout * 2 + 1);
5695 memcpy (pl, self->pixel_layout, self->n_pixel_layout * 2);
5697 gst_structure_id_set (ret, MXF_QUARK (PIXEL_LAYOUT), G_TYPE_STRING, pl,
5707 mxf_metadata_rgba_picture_essence_descriptor_write_tags (MXFMetadataBase * m,
5708 MXFPrimerPack * primer)
5710 MXFMetadataRGBAPictureEssenceDescriptor *self =
5711 MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (m);
5713 MXF_METADATA_BASE_CLASS
5714 (mxf_metadata_rgba_picture_essence_descriptor_parent_class)->write_tags
5718 if (self->component_max_ref != 255) {
5719 t = g_slice_new0 (MXFLocalTag);
5720 memcpy (&t->ul, MXF_UL (COMPONENT_MAX_REF), 16);
5722 t->data = g_slice_alloc (t->size);
5724 GST_WRITE_UINT32_BE (t->data, self->component_max_ref);
5725 mxf_primer_pack_add_mapping (primer, 0x3406, &t->ul);
5726 ret = g_list_prepend (ret, t);
5729 if (self->component_min_ref) {
5730 t = g_slice_new0 (MXFLocalTag);
5731 memcpy (&t->ul, MXF_UL (COMPONENT_MIN_REF), 16);
5733 t->data = g_slice_alloc (t->size);
5735 GST_WRITE_UINT32_BE (t->data, self->component_min_ref);
5736 mxf_primer_pack_add_mapping (primer, 0x3407, &t->ul);
5737 ret = g_list_prepend (ret, t);
5740 if (self->alpha_max_ref != 255) {
5741 t = g_slice_new0 (MXFLocalTag);
5742 memcpy (&t->ul, MXF_UL (ALPHA_MAX_REF), 16);
5744 t->data = g_slice_alloc (t->size);
5746 GST_WRITE_UINT32_BE (t->data, self->alpha_max_ref);
5747 mxf_primer_pack_add_mapping (primer, 0x3408, &t->ul);
5748 ret = g_list_prepend (ret, t);
5751 if (self->alpha_min_ref) {
5752 t = g_slice_new0 (MXFLocalTag);
5753 memcpy (&t->ul, MXF_UL (ALPHA_MIN_REF), 16);
5755 t->data = g_slice_alloc (t->size);
5757 GST_WRITE_UINT32_BE (t->data, self->alpha_min_ref);
5758 mxf_primer_pack_add_mapping (primer, 0x3409, &t->ul);
5759 ret = g_list_prepend (ret, t);
5762 if (self->scanning_direction) {
5763 t = g_slice_new0 (MXFLocalTag);
5764 memcpy (&t->ul, MXF_UL (SCANNING_DIRECTION), 16);
5766 t->data = g_slice_alloc (t->size);
5768 GST_WRITE_UINT8 (t->data, self->scanning_direction);
5769 mxf_primer_pack_add_mapping (primer, 0x3405, &t->ul);
5770 ret = g_list_prepend (ret, t);
5773 if (self->pixel_layout) {
5774 t = g_slice_new0 (MXFLocalTag);
5775 memcpy (&t->ul, MXF_UL (PIXEL_LAYOUT), 16);
5776 t->size = 2 * self->n_pixel_layout + 2;
5777 t->data = g_slice_alloc0 (t->size);
5779 memcpy (t->data, self->pixel_layout, self->n_pixel_layout * 2);
5780 mxf_primer_pack_add_mapping (primer, 0x3401, &t->ul);
5781 ret = g_list_prepend (ret, t);
5789 mxf_metadata_rgba_picture_essence_descriptor_init
5790 (MXFMetadataRGBAPictureEssenceDescriptor * self)
5792 self->component_max_ref = 255;
5793 self->alpha_max_ref = 255;
5797 mxf_metadata_rgba_picture_essence_descriptor_class_init
5798 (MXFMetadataRGBAPictureEssenceDescriptorClass * klass)
5800 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5801 GObjectClass *object_class = (GObjectClass *) klass;
5802 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5804 object_class->finalize =
5805 mxf_metadata_rgba_picture_essence_descriptor_finalize;
5806 metadata_base_class->handle_tag =
5807 mxf_metadata_rgba_picture_essence_descriptor_handle_tag;
5808 metadata_base_class->name_quark = MXF_QUARK (RGBA_PICTURE_ESSENCE_DESCRIPTOR);
5809 metadata_base_class->to_structure =
5810 mxf_metadata_rgba_picture_essence_descriptor_to_structure;
5811 metadata_base_class->write_tags =
5812 mxf_metadata_rgba_picture_essence_descriptor_write_tags;
5813 metadata_class->type = 0x0129;
5816 G_DEFINE_TYPE (MXFMetadataGenericDataEssenceDescriptor,
5817 mxf_metadata_generic_data_essence_descriptor,
5818 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
5821 mxf_metadata_generic_data_essence_descriptor_handle_tag (MXFMetadataBase *
5822 metadata, MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5825 MXFMetadataGenericDataEssenceDescriptor *self =
5826 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (metadata);
5827 gboolean ret = TRUE;
5828 #ifndef GST_DISABLE_GST_DEBUG
5836 memcpy (&self->data_essence_coding, tag_data, 16);
5837 GST_DEBUG (" data essence coding = %s",
5838 mxf_ul_to_string (&self->data_essence_coding, str));
5842 MXF_METADATA_BASE_CLASS
5843 (mxf_metadata_generic_data_essence_descriptor_parent_class)->
5844 handle_tag (metadata, primer, tag, tag_data, tag_size);
5853 ("Invalid generic data essence descriptor local tag 0x%04x of size %u",
5859 static GstStructure *
5860 mxf_metadata_generic_data_essence_descriptor_to_structure (MXFMetadataBase * m)
5863 MXF_METADATA_BASE_CLASS
5864 (mxf_metadata_generic_data_essence_descriptor_parent_class)->to_structure
5866 MXFMetadataGenericDataEssenceDescriptor *self =
5867 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (m);
5870 if (!mxf_ul_is_zero (&self->data_essence_coding)) {
5871 mxf_ul_to_string (&self->data_essence_coding, str);
5872 gst_structure_id_set (ret, MXF_QUARK (DATA_ESSENCE_CODING), G_TYPE_STRING,
5880 mxf_metadata_generic_data_essence_descriptor_write_tags (MXFMetadataBase * m,
5881 MXFPrimerPack * primer)
5883 MXFMetadataGenericDataEssenceDescriptor *self =
5884 MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (m);
5886 MXF_METADATA_BASE_CLASS
5887 (mxf_metadata_generic_data_essence_descriptor_parent_class)->write_tags
5891 if (!mxf_ul_is_zero (&self->data_essence_coding)) {
5892 t = g_slice_new0 (MXFLocalTag);
5893 memcpy (&t->ul, MXF_UL (DATA_ESSENCE_CODING), 16);
5895 t->data = g_slice_alloc (t->size);
5897 memcpy (t->data, &self->data_essence_coding, 16);
5898 mxf_primer_pack_add_mapping (primer, 0x3e01, &t->ul);
5899 ret = g_list_prepend (ret, t);
5906 mxf_metadata_generic_data_essence_descriptor_init
5907 (MXFMetadataGenericDataEssenceDescriptor * self)
5913 mxf_metadata_generic_data_essence_descriptor_class_init
5914 (MXFMetadataGenericDataEssenceDescriptorClass * klass)
5916 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
5917 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
5919 metadata_base_class->handle_tag =
5920 mxf_metadata_generic_data_essence_descriptor_handle_tag;
5921 metadata_base_class->name_quark = MXF_QUARK (GENERIC_DATA_ESSENCE_DESCRIPTOR);
5922 metadata_base_class->to_structure =
5923 mxf_metadata_generic_data_essence_descriptor_to_structure;
5924 metadata_base_class->write_tags =
5925 mxf_metadata_generic_data_essence_descriptor_write_tags;
5926 metadata_class->type = 0x0143;
5929 G_DEFINE_TYPE (MXFMetadataMultipleDescriptor, mxf_metadata_multiple_descriptor,
5930 MXF_TYPE_METADATA_FILE_DESCRIPTOR);
5933 mxf_metadata_multiple_descriptor_finalize (GObject * object)
5935 MXFMetadataMultipleDescriptor *self =
5936 MXF_METADATA_MULTIPLE_DESCRIPTOR (object);
5938 g_free (self->sub_descriptors_uids);
5939 self->sub_descriptors_uids = NULL;
5940 g_free (self->sub_descriptors);
5941 self->sub_descriptors = NULL;
5944 (mxf_metadata_multiple_descriptor_parent_class)->finalize (object);
5948 mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataBase * metadata,
5949 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
5952 MXFMetadataMultipleDescriptor *self =
5953 MXF_METADATA_MULTIPLE_DESCRIPTOR (metadata);
5954 gboolean ret = TRUE;
5955 #ifndef GST_DISABLE_GST_DEBUG
5961 if (!mxf_uuid_array_parse (&self->sub_descriptors_uids,
5962 &self->n_sub_descriptors, tag_data, tag_size))
5965 GST_DEBUG (" number of sub descriptors = %u", self->n_sub_descriptors);
5966 #ifndef GST_DISABLE_GST_DEBUG
5969 for (i = 0; i < self->n_sub_descriptors; i++) {
5970 GST_DEBUG (" sub descriptor %u = %s", i,
5971 mxf_uuid_to_string (&self->sub_descriptors_uids[i], str));
5979 MXF_METADATA_BASE_CLASS
5980 (mxf_metadata_multiple_descriptor_parent_class)->handle_tag (metadata,
5981 primer, tag, tag_data, tag_size);
5989 GST_ERROR ("Invalid multiple descriptor local tag 0x%04x of size %u", tag,
5996 mxf_metadata_multiple_descriptor_resolve (MXFMetadataBase * m,
5997 GHashTable * metadata)
5999 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6000 MXFMetadataBase *current = NULL;
6001 guint i, have_subdescriptors = 0;
6003 if (self->sub_descriptors)
6004 memset (self->sub_descriptors, 0,
6005 sizeof (gpointer) * self->n_sub_descriptors);
6007 self->sub_descriptors =
6008 g_new0 (MXFMetadataGenericDescriptor *, self->n_sub_descriptors);
6009 for (i = 0; i < self->n_sub_descriptors; i++) {
6010 current = g_hash_table_lookup (metadata, &self->sub_descriptors_uids[i]);
6011 if (current && MXF_IS_METADATA_GENERIC_DESCRIPTOR (current)) {
6012 if (mxf_metadata_base_resolve (current, metadata)) {
6013 self->sub_descriptors[i] = MXF_METADATA_GENERIC_DESCRIPTOR (current);
6014 have_subdescriptors++;
6016 GST_ERROR ("Couldn't resolve descriptor");
6020 GST_ERROR ("Descriptor not found");
6026 MXF_METADATA_BASE_CLASS
6027 (mxf_metadata_multiple_descriptor_parent_class)->resolve (m, metadata);
6030 static GstStructure *
6031 mxf_metadata_multiple_descriptor_to_structure (MXFMetadataBase * m)
6034 MXF_METADATA_BASE_CLASS
6035 (mxf_metadata_multiple_descriptor_parent_class)->to_structure (m);
6036 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6039 if (self->n_sub_descriptors > 0) {
6044 g_value_init (&arr, GST_TYPE_ARRAY);
6046 for (i = 0; i < self->n_sub_descriptors; i++) {
6049 if (self->sub_descriptors[i] == NULL)
6052 g_value_init (&val, GST_TYPE_STRUCTURE);
6054 s = mxf_metadata_base_to_structure (MXF_METADATA_BASE
6055 (self->sub_descriptors[i]));
6056 gst_value_set_structure (&val, s);
6057 gst_structure_free (s);
6058 gst_value_array_append_value (&arr, &val);
6059 g_value_unset (&val);
6062 if (gst_value_array_get_size (&arr) > 0)
6063 gst_structure_id_set_value (ret, MXF_QUARK (SUB_DESCRIPTORS), &arr);
6065 g_value_unset (&arr);
6072 mxf_metadata_multiple_descriptor_write_tags (MXFMetadataBase * m,
6073 MXFPrimerPack * primer)
6075 MXFMetadataMultipleDescriptor *self = MXF_METADATA_MULTIPLE_DESCRIPTOR (m);
6077 MXF_METADATA_BASE_CLASS
6078 (mxf_metadata_multiple_descriptor_parent_class)->write_tags (m, primer);
6081 if (self->sub_descriptors) {
6084 t = g_slice_new0 (MXFLocalTag);
6085 memcpy (&t->ul, MXF_UL (SUB_DESCRIPTORS), 16);
6086 t->size = 8 + 16 * self->n_sub_descriptors;
6087 t->data = g_slice_alloc0 (t->size);
6089 GST_WRITE_UINT32_BE (t->data, self->n_sub_descriptors);
6090 GST_WRITE_UINT32_BE (t->data + 4, 16);
6091 for (i = 0; i < self->n_sub_descriptors; i++) {
6092 if (!self->sub_descriptors[i])
6095 memcpy (t->data + 8 + 16 * i,
6096 &MXF_METADATA_BASE (self->sub_descriptors[i])->instance_uid, 16);
6098 mxf_primer_pack_add_mapping (primer, 0x3f01, &t->ul);
6099 ret = g_list_prepend (ret, t);
6106 mxf_metadata_multiple_descriptor_init (MXFMetadataMultipleDescriptor * self)
6112 mxf_metadata_multiple_descriptor_class_init (MXFMetadataMultipleDescriptorClass
6115 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6116 GObjectClass *object_class = (GObjectClass *) klass;
6117 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6119 object_class->finalize = mxf_metadata_multiple_descriptor_finalize;
6120 metadata_base_class->handle_tag = mxf_metadata_multiple_descriptor_handle_tag;
6121 metadata_base_class->resolve = mxf_metadata_multiple_descriptor_resolve;
6122 metadata_base_class->name_quark = MXF_QUARK (MULTIPLE_DESCRIPTOR);
6123 metadata_base_class->to_structure =
6124 mxf_metadata_multiple_descriptor_to_structure;
6125 metadata_base_class->write_tags = mxf_metadata_multiple_descriptor_write_tags;
6126 metadata_class->type = 0x0144;
6129 G_DEFINE_ABSTRACT_TYPE (MXFMetadataLocator, mxf_metadata_locator,
6133 mxf_metadata_locator_init (MXFMetadataLocator * self)
6138 mxf_metadata_locator_class_init (MXFMetadataLocatorClass * klass)
6142 G_DEFINE_TYPE (MXFMetadataTextLocator, mxf_metadata_text_locator,
6143 MXF_TYPE_METADATA_LOCATOR);
6146 mxf_metadata_text_locator_finalize (GObject * object)
6148 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (object);
6150 g_free (self->locator_name);
6151 self->locator_name = NULL;
6153 G_OBJECT_CLASS (mxf_metadata_text_locator_parent_class)->finalize (object);
6157 mxf_metadata_text_locator_handle_tag (MXFMetadataBase * metadata,
6158 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
6161 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (metadata);
6162 gboolean ret = TRUE;
6166 self->locator_name = mxf_utf16_to_utf8 (tag_data, tag_size);
6167 GST_DEBUG (" text locator = %s", GST_STR_NULL (self->locator_name));
6171 MXF_METADATA_BASE_CLASS
6172 (mxf_metadata_text_locator_parent_class)->handle_tag (metadata,
6173 primer, tag, tag_data, tag_size);
6180 static GstStructure *
6181 mxf_metadata_text_locator_to_structure (MXFMetadataBase * m)
6184 MXF_METADATA_BASE_CLASS
6185 (mxf_metadata_text_locator_parent_class)->to_structure (m);
6186 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (m);
6188 gst_structure_id_set (ret, MXF_QUARK (LOCATOR_NAME), G_TYPE_STRING,
6189 self->locator_name, NULL);
6195 mxf_metadata_text_locator_write_tags (MXFMetadataBase * m,
6196 MXFPrimerPack * primer)
6198 MXFMetadataTextLocator *self = MXF_METADATA_TEXT_LOCATOR (m);
6200 MXF_METADATA_BASE_CLASS
6201 (mxf_metadata_text_locator_parent_class)->write_tags (m, primer);
6204 if (self->locator_name) {
6205 t = g_slice_new0 (MXFLocalTag);
6206 memcpy (&t->ul, MXF_UL (LOCATOR_NAME), 16);
6207 t->data = mxf_utf8_to_utf16 (self->locator_name, &t->size);
6208 mxf_primer_pack_add_mapping (primer, 0x4101, &t->ul);
6209 ret = g_list_prepend (ret, t);
6216 mxf_metadata_text_locator_init (MXFMetadataTextLocator * self)
6222 mxf_metadata_text_locator_class_init (MXFMetadataTextLocatorClass * klass)
6224 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6225 GObjectClass *object_class = (GObjectClass *) klass;
6226 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6228 object_class->finalize = mxf_metadata_text_locator_finalize;
6229 metadata_base_class->handle_tag = mxf_metadata_text_locator_handle_tag;
6230 metadata_base_class->name_quark = MXF_QUARK (TEXT_LOCATOR);
6231 metadata_base_class->to_structure = mxf_metadata_text_locator_to_structure;
6232 metadata_base_class->write_tags = mxf_metadata_text_locator_write_tags;
6233 metadata_class->type = 0x0133;
6236 G_DEFINE_TYPE (MXFMetadataNetworkLocator, mxf_metadata_network_locator,
6237 MXF_TYPE_METADATA_LOCATOR);
6240 mxf_metadata_network_locator_finalize (GObject * object)
6242 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (object);
6244 g_free (self->url_string);
6245 self->url_string = NULL;
6247 G_OBJECT_CLASS (mxf_metadata_network_locator_parent_class)->finalize (object);
6251 mxf_metadata_network_locator_handle_tag (MXFMetadataBase * metadata,
6252 MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
6255 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (metadata);
6256 gboolean ret = TRUE;
6260 self->url_string = mxf_utf16_to_utf8 (tag_data, tag_size);
6261 GST_DEBUG (" url string = %s", GST_STR_NULL (self->url_string));
6265 MXF_METADATA_BASE_CLASS
6266 (mxf_metadata_network_locator_parent_class)->handle_tag (metadata,
6267 primer, tag, tag_data, tag_size);
6274 static GstStructure *
6275 mxf_metadata_network_locator_to_structure (MXFMetadataBase * m)
6278 MXF_METADATA_BASE_CLASS
6279 (mxf_metadata_network_locator_parent_class)->to_structure (m);
6280 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (m);
6282 gst_structure_id_set (ret, MXF_QUARK (URL_STRING), G_TYPE_STRING,
6283 self->url_string, NULL);
6289 mxf_metadata_network_locator_write_tags (MXFMetadataBase * m,
6290 MXFPrimerPack * primer)
6292 MXFMetadataNetworkLocator *self = MXF_METADATA_NETWORK_LOCATOR (m);
6294 MXF_METADATA_BASE_CLASS
6295 (mxf_metadata_network_locator_parent_class)->write_tags (m, primer);
6298 if (self->url_string) {
6299 t = g_slice_new0 (MXFLocalTag);
6300 memcpy (&t->ul, MXF_UL (URL_STRING), 16);
6301 t->data = mxf_utf8_to_utf16 (self->url_string, &t->size);
6302 mxf_primer_pack_add_mapping (primer, 0x4001, &t->ul);
6303 ret = g_list_prepend (ret, t);
6310 mxf_metadata_network_locator_init (MXFMetadataNetworkLocator * self)
6315 mxf_metadata_network_locator_class_init (MXFMetadataNetworkLocatorClass * klass)
6317 MXFMetadataBaseClass *metadata_base_class = (MXFMetadataBaseClass *) klass;
6318 GObjectClass *object_class = (GObjectClass *) klass;
6319 MXFMetadataClass *metadata_class = (MXFMetadataClass *) klass;
6321 object_class->finalize = mxf_metadata_network_locator_finalize;
6322 metadata_base_class->handle_tag = mxf_metadata_network_locator_handle_tag;
6323 metadata_base_class->name_quark = MXF_QUARK (NETWORK_LOCATOR);
6324 metadata_base_class->to_structure = mxf_metadata_network_locator_to_structure;
6325 metadata_base_class->write_tags = mxf_metadata_network_locator_write_tags;
6326 metadata_class->type = 0x0133;
6329 G_DEFINE_ABSTRACT_TYPE (MXFDescriptiveMetadata, mxf_descriptive_metadata,
6330 MXF_TYPE_METADATA_BASE);
6333 mxf_descriptive_metadata_init (MXFDescriptiveMetadata * self)
6338 mxf_descriptive_metadata_class_init (MXFDescriptiveMetadataClass * klass)
6346 } _MXFDescriptiveMetadataScheme;
6348 static GArray *_dm_schemes = NULL;
6351 mxf_descriptive_metadata_register (guint8 scheme, GType * types)
6353 _MXFDescriptiveMetadataScheme s;
6357 g_array_new (FALSE, TRUE, sizeof (_MXFDescriptiveMetadataScheme));
6362 g_array_append_val (_dm_schemes, s);
6365 MXFDescriptiveMetadata *
6366 mxf_descriptive_metadata_new (guint8 scheme, guint32 type,
6367 MXFPrimerPack * primer, guint64 offset, const guint8 * data, guint size)
6370 GType t = G_TYPE_INVALID, *p;
6371 _MXFDescriptiveMetadataScheme *s = NULL;
6372 MXFDescriptiveMetadata *ret = NULL;
6374 g_return_val_if_fail (primer != NULL, NULL);
6376 if (G_UNLIKELY (type == 0)) {
6377 GST_WARNING ("Type 0 is invalid");
6381 for (i = 0; i < _dm_schemes->len; i++) {
6382 _MXFDescriptiveMetadataScheme *data =
6383 &g_array_index (_dm_schemes, _MXFDescriptiveMetadataScheme, i);
6385 if (data->scheme == scheme) {
6392 GST_WARNING ("Descriptive metadata scheme 0x%02x not supported", scheme);
6399 MXFDescriptiveMetadataClass *klass =
6400 MXF_DESCRIPTIVE_METADATA_CLASS (g_type_class_ref (tmp));
6402 if (klass->type == type) {
6403 g_type_class_unref (klass);
6407 g_type_class_unref (klass);
6411 if (t == G_TYPE_INVALID) {
6413 ("No handler for type 0x%06x of descriptive metadata scheme 0x%02x found",
6418 GST_DEBUG ("DM scheme 0x%02x type 0x%06x is handled by type %s", scheme, type,
6421 ret = (MXFDescriptiveMetadata *) g_type_create_instance (t);
6422 if (!mxf_metadata_base_parse (MXF_METADATA_BASE (ret), primer, data, size)) {
6423 GST_ERROR ("Parsing metadata failed");
6424 g_object_unref (ret);
6428 ret->parent.offset = offset;
6434 mxf_descriptive_metadata_framework_get_type (void)
6436 static volatile gsize type = 0;
6437 if (g_once_init_enter (&type)) {
6439 static const GTypeInfo info = {
6440 sizeof (MXFDescriptiveMetadataFrameworkInterface),
6441 NULL, /* base_init */
6442 NULL, /* base_finalize */
6443 NULL, /* class_init */
6444 NULL, /* class_finalize */
6445 NULL, /* class_data */
6446 0, /* instance_size */
6447 0, /* n_preallocs */
6448 NULL /* instance_init */
6450 _type = g_type_register_static (G_TYPE_INTERFACE,
6451 "MXFDescriptiveMetadataFrameworkInterface", &info, 0);
6453 g_type_interface_add_prerequisite (_type, MXF_TYPE_DESCRIPTIVE_METADATA);
6455 g_once_init_leave (&type, (gsize) _type);
6458 return (GType) type;
6462 mxf_metadata_hash_table_new (void)
6464 return g_hash_table_new_full ((GHashFunc) mxf_uuid_hash,
6465 (GEqualFunc) mxf_uuid_is_equal, (GDestroyNotify) NULL,
6466 (GDestroyNotify) g_object_unref);