mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 03:01:03 +00:00
8e580ea6f1
Coverity 1139645
5656 lines
182 KiB
C
5656 lines
182 KiB
C
/* GStreamer
|
|
* Copyright (C) 2008-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/* Implementation of SMPTE S380M - Descriptive Metadata Scheme-1 */
|
|
|
|
/* TODO:
|
|
* - What are the "locators"?
|
|
* - Create sensible tags from this
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <gst/gst.h>
|
|
#include <string.h>
|
|
|
|
#include "mxfdms1.h"
|
|
#include "mxftypes.h"
|
|
|
|
GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
|
|
#define GST_CAT_DEFAULT mxf_debug
|
|
|
|
G_DEFINE_ABSTRACT_TYPE (MXFDMS1, mxf_dms1, MXF_TYPE_DESCRIPTIVE_METADATA);
|
|
|
|
static gboolean
|
|
mxf_dms1_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1 *self = MXF_DMS1 (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 instance_uid_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x15, 0x02, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 generation_uid_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, 0x05,
|
|
0x20, 0x07, 0x01, 0x08, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &instance_uid_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
memcpy (&MXF_METADATA_BASE (self)->instance_uid, tag_data, 16);
|
|
GST_DEBUG (" instance uid = %s",
|
|
mxf_uuid_to_string (&MXF_METADATA_BASE (self)->instance_uid, str));
|
|
} else if (memcmp (tag_ul, &generation_uid_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
memcpy (&MXF_METADATA_BASE (self)->generation_uid, tag_data, 16);
|
|
GST_DEBUG (" generation uid = %s",
|
|
mxf_uuid_to_string (&MXF_METADATA_BASE (self)->generation_uid, str));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_init (MXFDMS1 * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_class_init (MXFDMS1Class * klass)
|
|
{
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
metadatabase_class->handle_tag = mxf_dms1_handle_tag;
|
|
dm_class->scheme = 0x01;
|
|
}
|
|
|
|
G_DEFINE_ABSTRACT_TYPE (MXFDMS1TextLanguage, mxf_dms1_text_language,
|
|
MXF_TYPE_DMS1);
|
|
|
|
static gboolean
|
|
mxf_dms1_text_language_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1TextLanguage *self = MXF_DMS1_TEXT_LANGUAGE (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 extended_text_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x02, 0x11, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &extended_text_language_code_ul, 16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
|
|
memcpy (self->extended_text_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" extended text language code = %s",
|
|
self->extended_text_language_code);
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_text_language_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 text language local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_text_language_init (MXFDMS1TextLanguage * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_text_language_class_init (MXFDMS1TextLanguageClass * klass)
|
|
{
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
|
|
metadatabase_class->handle_tag = mxf_dms1_text_language_handle_tag;
|
|
}
|
|
|
|
G_DEFINE_ABSTRACT_TYPE (MXFDMS1Thesaurus, mxf_dms1_thesaurus,
|
|
MXF_TYPE_DMS1_TEXT_LANGUAGE);
|
|
|
|
static void
|
|
mxf_dms1_thesaurus_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Thesaurus *self = MXF_DMS1_THESAURUS (object);
|
|
|
|
g_free (self->thesaurus_name);
|
|
self->thesaurus_name = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_thesaurus_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_thesaurus_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Thesaurus *self = MXF_DMS1_THESAURUS (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 thesaurus_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x01, 0x02, 0x02, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &thesaurus_name_ul, 16) == 0) {
|
|
self->thesaurus_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" thesaurus name = %s", GST_STR_NULL (self->thesaurus_name));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_thesaurus_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_thesaurus_init (MXFDMS1Thesaurus * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_thesaurus_class_init (MXFDMS1ThesaurusClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_thesaurus_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_thesaurus_handle_tag;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_framework_interface_init (gpointer g_iface, gpointer iface_data)
|
|
{
|
|
}
|
|
|
|
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MXFDMS1Framework, mxf_dms1_framework,
|
|
MXF_TYPE_DMS1,
|
|
G_IMPLEMENT_INTERFACE (MXF_TYPE_DESCRIPTIVE_METADATA_FRAMEWORK,
|
|
mxf_dms1_framework_interface_init));
|
|
|
|
static void
|
|
mxf_dms1_framework_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Framework *self = MXF_DMS1_FRAMEWORK (object);
|
|
|
|
g_free (self->framework_thesaurus_name);
|
|
self->framework_thesaurus_name = NULL;
|
|
|
|
g_free (self->framework_title);
|
|
self->framework_title = NULL;
|
|
|
|
g_free (self->metadata_server_locators_uids);
|
|
self->metadata_server_locators_uids = NULL;
|
|
|
|
g_free (self->titles_sets_uids);
|
|
self->titles_sets_uids = NULL;
|
|
|
|
g_free (self->titles_sets);
|
|
self->titles_sets = NULL;
|
|
|
|
g_free (self->annotation_sets_uids);
|
|
self->annotation_sets_uids = NULL;
|
|
|
|
g_free (self->annotation_sets);
|
|
self->annotation_sets = NULL;
|
|
|
|
g_free (self->participant_sets_uids);
|
|
self->participant_sets_uids = NULL;
|
|
|
|
g_free (self->participant_sets);
|
|
self->participant_sets = NULL;
|
|
|
|
g_free (self->location_sets_uids);
|
|
self->location_sets_uids = NULL;
|
|
|
|
g_free (self->location_sets);
|
|
self->location_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_framework_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_framework_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Framework *self = MXF_DMS1_FRAMEWORK (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->titles_sets)
|
|
memset (self->titles_sets, 0, sizeof (gpointer) * self->n_titles_sets);
|
|
else
|
|
self->titles_sets = g_new0 (MXFDMS1Titles *, self->n_titles_sets);
|
|
|
|
if (self->annotation_sets)
|
|
memset (self->annotation_sets, 0,
|
|
sizeof (gpointer) * self->n_annotation_sets);
|
|
else
|
|
self->annotation_sets =
|
|
g_new0 (MXFDMS1Annotation *, self->n_annotation_sets);
|
|
|
|
if (self->participant_sets)
|
|
memset (self->participant_sets, 0,
|
|
sizeof (gpointer) * self->n_participant_sets);
|
|
else
|
|
self->participant_sets =
|
|
g_new0 (MXFDMS1Participant *, self->n_participant_sets);
|
|
|
|
if (self->location_sets)
|
|
memset (self->location_sets, 0, sizeof (gpointer) * self->n_location_sets);
|
|
else
|
|
self->location_sets = g_new0 (MXFDMS1Location *, self->n_location_sets);
|
|
|
|
for (i = 0; i < self->n_titles_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->titles_sets_uids[i]);
|
|
|
|
if (current && MXF_IS_DMS1_TITLES (current)) {
|
|
self->titles_sets[i] = MXF_DMS1_TITLES (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_annotation_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->annotation_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ANNOTATION (current)) {
|
|
self->annotation_sets[i] = MXF_DMS1_ANNOTATION (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->participant_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PARTICIPANT (current)) {
|
|
self->participant_sets[i] = MXF_DMS1_PARTICIPANT (current);
|
|
}
|
|
}
|
|
|
|
current = g_hash_table_lookup (metadata, &self->contacts_list_set_uid);
|
|
if (current && MXF_IS_DMS1_CONTACTS_LIST (current)) {
|
|
self->contacts_list_set = MXF_DMS1_CONTACTS_LIST (current);
|
|
}
|
|
|
|
for (i = 0; i < self->n_location_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->location_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_LOCATION (current)) {
|
|
self->location_sets[i] = MXF_DMS1_LOCATION (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_framework_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_framework_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Framework *self = MXF_DMS1_FRAMEWORK (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 framework_extended_text_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x02, 0x13, 0x00, 0x00
|
|
};
|
|
static const guint8 framework_thesaurus_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x02, 0x15, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 framework_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x05, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 primary_extended_spoken_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x03, 0x11, 0x00, 0x00
|
|
};
|
|
static const guint8 secondary_extended_spoken_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x03, 0x12, 0x00, 0x00
|
|
};
|
|
static const guint8 original_extended_spoken_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x03, 0x13, 0x00, 0x00
|
|
};
|
|
static const guint8 metadata_server_locators_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x06, 0x0C, 0x00, 0x00
|
|
};
|
|
static const guint8 titles_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x04, 0x00
|
|
};
|
|
static const guint8 annotation_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0d, 0x00
|
|
};
|
|
static const guint8 participant_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x13, 0x00
|
|
};
|
|
static const guint8 contacts_list_set_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x22, 0x00
|
|
};
|
|
static const guint8 location_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x16, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &framework_extended_text_language_code_ul, 16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
memcpy (&self->framework_extended_text_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" framework extended text language code = %s",
|
|
self->framework_extended_text_language_code);
|
|
} else if (memcmp (tag_ul, &framework_thesaurus_name_ul, 16) == 0) {
|
|
self->framework_thesaurus_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" framework thesaurus name = %s",
|
|
GST_STR_NULL (self->framework_thesaurus_name));
|
|
} else if (memcmp (tag_ul, &framework_title_ul, 16) == 0) {
|
|
self->framework_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" framework title = %s", GST_STR_NULL (self->framework_title));
|
|
} else if (memcmp (tag_ul, &primary_extended_spoken_language_code_ul,
|
|
16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
memcpy (&self->primary_extended_spoken_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" primary extended spoken language code = %s",
|
|
self->primary_extended_spoken_language_code);
|
|
} else if (memcmp (tag_ul, &secondary_extended_spoken_language_code_ul,
|
|
16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
memcpy (&self->secondary_extended_spoken_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" secondary extended spoken language code = %s",
|
|
self->secondary_extended_spoken_language_code);
|
|
} else if (memcmp (tag_ul, &original_extended_spoken_language_code_ul,
|
|
16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
memcpy (&self->original_extended_spoken_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" original extended spoken language code = %s",
|
|
self->original_extended_spoken_language_code);
|
|
} else if (memcmp (tag_ul, &metadata_server_locators_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->metadata_server_locators_uids,
|
|
&self->n_metadata_server_locators, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" number of metadata server locators = %u",
|
|
self->n_metadata_server_locators);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_metadata_server_locators; i++) {
|
|
GST_DEBUG (" metadata server locator %u = %s", i,
|
|
mxf_uuid_to_string (&self->metadata_server_locators_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &titles_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->titles_sets_uids, &self->n_titles_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" number of titles sets = %u", self->n_titles_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_titles_sets; i++) {
|
|
GST_DEBUG (" titles sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->titles_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &annotation_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->annotation_sets_uids,
|
|
&self->n_annotation_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of annotation sets = %u", self->n_annotation_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_annotation_sets; i++) {
|
|
GST_DEBUG (" annotation sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->annotation_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &participant_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->participant_sets_uids,
|
|
&self->n_participant_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of participant sets = %u", self->n_participant_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
GST_DEBUG (" participant sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->participant_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &contacts_list_set_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->contacts_list_set_uid, tag_data, 16);
|
|
GST_DEBUG (" contacts list = %s",
|
|
mxf_uuid_to_string (&self->contacts_list_set_uid, str));
|
|
} else if (memcmp (tag_ul, &location_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->location_sets_uids,
|
|
&self->n_location_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of location sets = %u", self->n_location_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_location_sets; i++) {
|
|
GST_DEBUG (" location sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->location_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_framework_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 framework local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_framework_init (MXFDMS1Framework * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_framework_class_init (MXFDMS1FrameworkClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_framework_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_framework_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_framework_resolve;
|
|
}
|
|
|
|
G_DEFINE_ABSTRACT_TYPE (MXFDMS1ProductionClipFramework,
|
|
mxf_dms1_production_clip_framework, MXF_TYPE_DMS1_FRAMEWORK);
|
|
|
|
static void
|
|
mxf_dms1_production_clip_framework_finalize (GObject * object)
|
|
{
|
|
MXFDMS1ProductionClipFramework *self =
|
|
MXF_DMS1_PRODUCTION_CLIP_FRAMEWORK (object);
|
|
|
|
g_free (self->captions_description_sets_uids);
|
|
self->captions_description_sets_uids = NULL;
|
|
|
|
g_free (self->captions_description_sets);
|
|
self->captions_description_sets = NULL;
|
|
|
|
g_free (self->contract_sets_uids);
|
|
self->contract_sets_uids = NULL;
|
|
|
|
g_free (self->contract_sets);
|
|
self->contract_sets = NULL;
|
|
|
|
G_OBJECT_CLASS
|
|
(mxf_dms1_production_clip_framework_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_production_clip_framework_resolve (MXFMetadataBase * m,
|
|
GHashTable * metadata)
|
|
{
|
|
MXFDMS1ProductionClipFramework *self = MXF_DMS1_PRODUCTION_CLIP_FRAMEWORK (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->captions_description_sets)
|
|
memset (self->captions_description_sets, 0,
|
|
sizeof (gpointer) * self->n_captions_description_sets);
|
|
else
|
|
self->captions_description_sets =
|
|
g_new0 (MXFDMS1CaptionsDescription *,
|
|
self->n_captions_description_sets);
|
|
|
|
if (self->contract_sets)
|
|
memset (self->contract_sets, 0,
|
|
sizeof (gpointer) * self->n_captions_description_sets);
|
|
else
|
|
self->contract_sets = g_new0 (MXFDMS1Contract *, self->n_contract_sets);
|
|
|
|
current = g_hash_table_lookup (metadata, &self->picture_format_set_uid);
|
|
if (current && MXF_IS_DMS1_PICTURE_FORMAT (current)) {
|
|
self->picture_format = MXF_DMS1_PICTURE_FORMAT (current);
|
|
}
|
|
|
|
for (i = 0; i < self->n_captions_description_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata,
|
|
&self->captions_description_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_CAPTIONS_DESCRIPTION (current)) {
|
|
self->captions_description_sets[i] =
|
|
MXF_DMS1_CAPTIONS_DESCRIPTION (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_contract_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->contract_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_CONTRACT (current)) {
|
|
self->contract_sets[i] = MXF_DMS1_CONTRACT (current);
|
|
}
|
|
}
|
|
|
|
current = g_hash_table_lookup (metadata, &self->project_set_uid);
|
|
if (current && MXF_IS_DMS1_PROJECT (current)) {
|
|
self->project_set = MXF_DMS1_PROJECT (current);
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_production_clip_framework_parent_class)->resolve (m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_production_clip_framework_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1ProductionClipFramework *self =
|
|
MXF_DMS1_PRODUCTION_CLIP_FRAMEWORK (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 picture_format_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x1d, 0x00
|
|
};
|
|
static const guint8 captions_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0c, 0x00
|
|
};
|
|
static const guint8 contract_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x19, 0x00
|
|
};
|
|
static const guint8 project_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x21, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &picture_format_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->picture_format_set_uid, tag_data, 16);
|
|
GST_DEBUG (" picture format set = %s",
|
|
mxf_uuid_to_string (&self->picture_format_set_uid, str));
|
|
} else if (memcmp (tag_ul, &captions_description_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->captions_description_sets_uids,
|
|
&self->n_captions_description_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of captions description sets = %u",
|
|
self->n_captions_description_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_captions_description_sets; i++) {
|
|
GST_DEBUG (" captions description sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->captions_description_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &contract_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->contract_sets_uids,
|
|
&self->n_contract_sets, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" number of contract sets = %u", self->n_contract_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_contract_sets; i++) {
|
|
GST_DEBUG (" contract sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->contract_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &project_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->project_set_uid, tag_data, 16);
|
|
GST_DEBUG (" project set = %s", mxf_uuid_to_string (&self->project_set_uid,
|
|
str));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_production_clip_framework_parent_class)->handle_tag (metadata,
|
|
primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR
|
|
("Invalid DMS1 production-clip framework local tag 0x%04x of size %u",
|
|
tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_production_clip_framework_init (MXFDMS1ProductionClipFramework * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_production_clip_framework_class_init
|
|
(MXFDMS1ProductionClipFrameworkClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_production_clip_framework_finalize;
|
|
metadatabase_class->handle_tag =
|
|
mxf_dms1_production_clip_framework_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_production_clip_framework_resolve;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1ProductionFramework, mxf_dms1_production_framework,
|
|
MXF_TYPE_DMS1_PRODUCTION_CLIP_FRAMEWORK);
|
|
|
|
static void
|
|
mxf_dms1_production_framework_finalize (GObject * object)
|
|
{
|
|
MXFDMS1ProductionFramework *self = MXF_DMS1_PRODUCTION_FRAMEWORK (object);
|
|
|
|
g_free (self->integration_indication);
|
|
self->integration_indication = NULL;
|
|
|
|
g_free (self->identification_sets_uids);
|
|
self->identification_sets_uids = NULL;
|
|
|
|
g_free (self->identification_sets);
|
|
self->identification_sets = NULL;
|
|
|
|
g_free (self->group_relationship_sets_uids);
|
|
self->group_relationship_sets_uids = NULL;
|
|
|
|
g_free (self->group_relationship_sets);
|
|
self->group_relationship_sets = NULL;
|
|
|
|
g_free (self->branding_sets_uids);
|
|
self->branding_sets_uids = NULL;
|
|
|
|
g_free (self->branding_sets);
|
|
self->branding_sets = NULL;
|
|
|
|
g_free (self->event_sets_uids);
|
|
self->event_sets_uids = NULL;
|
|
|
|
g_free (self->event_sets);
|
|
self->event_sets = NULL;
|
|
|
|
g_free (self->award_sets_uids);
|
|
self->award_sets_uids = NULL;
|
|
|
|
g_free (self->award_sets);
|
|
self->award_sets = NULL;
|
|
|
|
g_free (self->setting_period_sets_uids);
|
|
self->setting_period_sets_uids = NULL;
|
|
|
|
g_free (self->setting_period_sets);
|
|
self->setting_period_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_production_framework_parent_class)->finalize
|
|
(object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_production_framework_resolve (MXFMetadataBase * m,
|
|
GHashTable * metadata)
|
|
{
|
|
MXFDMS1ProductionFramework *self = MXF_DMS1_PRODUCTION_FRAMEWORK (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->identification_sets)
|
|
memset (self->identification_sets, 0,
|
|
sizeof (gpointer) * self->n_identification_sets);
|
|
else
|
|
self->identification_sets =
|
|
g_new0 (MXFDMS1Identification *, self->n_identification_sets);
|
|
|
|
if (self->group_relationship_sets)
|
|
memset (self->group_relationship_sets, 0,
|
|
sizeof (gpointer) * self->n_group_relationship_sets);
|
|
else
|
|
self->group_relationship_sets =
|
|
g_new0 (MXFDMS1GroupRelationship *, self->n_group_relationship_sets);
|
|
|
|
if (self->branding_sets)
|
|
memset (self->branding_sets, 0, sizeof (gpointer) * self->n_branding_sets);
|
|
else
|
|
self->branding_sets = g_new0 (MXFDMS1Branding *, self->n_branding_sets);
|
|
|
|
if (self->event_sets)
|
|
memset (self->event_sets, 0, sizeof (gpointer) * self->n_event_sets);
|
|
else
|
|
self->event_sets = g_new0 (MXFDMS1Event *, self->n_event_sets);
|
|
|
|
if (self->award_sets)
|
|
memset (self->award_sets, 0, sizeof (gpointer) * self->n_award_sets);
|
|
else
|
|
self->award_sets = g_new0 (MXFDMS1Award *, self->n_award_sets);
|
|
|
|
if (self->setting_period_sets)
|
|
memset (self->setting_period_sets, 0,
|
|
sizeof (gpointer) * self->n_setting_period_sets);
|
|
else
|
|
self->setting_period_sets =
|
|
g_new0 (MXFDMS1SettingPeriod *, self->n_setting_period_sets);
|
|
|
|
for (i = 0; i < self->n_identification_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->identification_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_IDENTIFICATION (current)) {
|
|
self->identification_sets[i] = MXF_DMS1_IDENTIFICATION (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_group_relationship_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->group_relationship_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_GROUP_RELATIONSHIP (current)) {
|
|
self->group_relationship_sets[i] = MXF_DMS1_GROUP_RELATIONSHIP (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_branding_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->branding_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_BRANDING (current)) {
|
|
self->branding_sets[i] = MXF_DMS1_BRANDING (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_event_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->event_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_EVENT (current)) {
|
|
self->event_sets[i] = MXF_DMS1_EVENT (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_award_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->award_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_AWARD (current)) {
|
|
self->award_sets[i] = MXF_DMS1_AWARD (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_setting_period_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->setting_period_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_SETTING_PERIOD (current)) {
|
|
self->setting_period_sets[i] = MXF_DMS1_SETTING_PERIOD (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_production_framework_parent_class)->resolve (m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_production_framework_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1ProductionFramework *self = MXF_DMS1_PRODUCTION_FRAMEWORK (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 integration_indication_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x05,
|
|
0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 identification_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x06, 0x00
|
|
};
|
|
static const guint8 group_relationship_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x05, 0x00
|
|
};
|
|
static const guint8 branding_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x08, 0x00
|
|
};
|
|
static const guint8 event_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x09, 0x00
|
|
};
|
|
static const guint8 award_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0b, 0x00
|
|
};
|
|
static const guint8 setting_period_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0e, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &integration_indication_ul, 16) == 0) {
|
|
self->integration_indication = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" integration indication = %s",
|
|
GST_STR_NULL (self->integration_indication));
|
|
} else if (memcmp (tag_ul, &identification_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->identification_sets_uids,
|
|
&self->n_identification_sets, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" number of identification sets = %u",
|
|
self->n_identification_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_identification_sets; i++) {
|
|
GST_DEBUG (" identification sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->identification_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &group_relationship_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->group_relationship_sets_uids,
|
|
&self->n_group_relationship_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of group relationship sets = %u",
|
|
self->n_group_relationship_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_group_relationship_sets; i++) {
|
|
GST_DEBUG (" group relationship sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->group_relationship_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &branding_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->branding_sets_uids,
|
|
&self->n_branding_sets, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" number of branding sets = %u", self->n_branding_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_branding_sets; i++) {
|
|
GST_DEBUG (" branding sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->branding_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &event_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->event_sets_uids, &self->n_event_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of event sets = %u", self->n_event_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_event_sets; i++) {
|
|
GST_DEBUG (" event sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->event_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &award_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->award_sets_uids, &self->n_award_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of award sets = %u", self->n_award_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_award_sets; i++) {
|
|
GST_DEBUG (" award sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->award_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &setting_period_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->setting_period_sets_uids,
|
|
&self->n_setting_period_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of setting period sets = %u",
|
|
self->n_setting_period_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_setting_period_sets; i++) {
|
|
GST_DEBUG (" setting period sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->setting_period_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_production_framework_parent_class)->handle_tag (metadata,
|
|
primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 production framework local tag 0x%04x of size %u",
|
|
tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_production_framework_init (MXFDMS1ProductionFramework * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_production_framework_class_init (MXFDMS1ProductionFrameworkClass *
|
|
klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_production_framework_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_production_framework_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_production_framework_resolve;
|
|
|
|
dm_class->type = 0x010100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1ClipFramework, mxf_dms1_clip_framework,
|
|
MXF_TYPE_DMS1_PRODUCTION_CLIP_FRAMEWORK);
|
|
|
|
static void
|
|
mxf_dms1_clip_framework_finalize (GObject * object)
|
|
{
|
|
MXFDMS1ClipFramework *self = MXF_DMS1_CLIP_FRAMEWORK (object);
|
|
|
|
g_free (self->clip_kind);
|
|
self->clip_kind = NULL;
|
|
|
|
g_free (self->slate_information);
|
|
self->slate_information = NULL;
|
|
|
|
g_free (self->scripting_sets_uids);
|
|
self->scripting_sets_uids = NULL;
|
|
|
|
g_free (self->scripting_sets);
|
|
self->scripting_sets = NULL;
|
|
|
|
g_free (self->shot_sets_uids);
|
|
self->shot_sets_uids = NULL;
|
|
|
|
g_free (self->shot_sets);
|
|
self->shot_sets = NULL;
|
|
|
|
g_free (self->device_parameters_sets_uids);
|
|
self->device_parameters_sets_uids = NULL;
|
|
|
|
g_free (self->device_parameters_sets);
|
|
self->device_parameters_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_clip_framework_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_clip_framework_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1ClipFramework *self = MXF_DMS1_CLIP_FRAMEWORK (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->scripting_sets)
|
|
memset (self->scripting_sets, 0,
|
|
sizeof (gpointer) * self->n_scripting_sets);
|
|
else
|
|
self->scripting_sets = g_new0 (MXFDMS1Scripting *, self->n_scripting_sets);
|
|
|
|
if (self->shot_sets)
|
|
memset (self->shot_sets, 0, sizeof (gpointer) * self->n_shot_sets);
|
|
else
|
|
self->shot_sets = g_new0 (MXFDMS1Shot *, self->n_shot_sets);
|
|
|
|
if (self->device_parameters_sets)
|
|
memset (self->device_parameters_sets, 0,
|
|
sizeof (gpointer) * self->n_device_parameters_sets);
|
|
else
|
|
self->device_parameters_sets =
|
|
g_new0 (MXFDMS1DeviceParameters *, self->n_device_parameters_sets);
|
|
|
|
for (i = 0; i < self->n_scripting_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->scripting_sets_uids[i]);
|
|
|
|
if (current && MXF_IS_DMS1_SCRIPTING (current)) {
|
|
self->scripting_sets[i] = MXF_DMS1_SCRIPTING (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_shot_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->shot_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_SHOT (current)) {
|
|
self->shot_sets[i] = MXF_DMS1_SHOT (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_device_parameters_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->device_parameters_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_DEVICE_PARAMETERS (current)) {
|
|
self->device_parameters_sets[i] = MXF_DMS1_DEVICE_PARAMETERS (current);
|
|
}
|
|
}
|
|
|
|
current = g_hash_table_lookup (metadata, &self->processing_set_uid);
|
|
if (current && MXF_IS_DMS1_PROCESSING (current)) {
|
|
self->processing_set = MXF_DMS1_PROCESSING (current);
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_clip_framework_parent_class)->resolve
|
|
(m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_clip_framework_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1ClipFramework *self = MXF_DMS1_CLIP_FRAMEWORK (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[96];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 clip_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 clip_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x05, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 extended_clip_id_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x01,
|
|
0x01, 0x15, 0x09, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 clip_creation_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x07,
|
|
0x02, 0x01, 0x10, 0x01, 0x04, 0x00, 0x00
|
|
};
|
|
static const guint8 take_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 slate_information_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 scripting_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0f, 0x00
|
|
};
|
|
static const guint8 shot_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x11, 0x02
|
|
};
|
|
static const guint8 device_parameters_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1e, 0x00
|
|
};
|
|
static const guint8 processing_set_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x20, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &clip_kind_ul, 16) == 0) {
|
|
self->clip_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" clip kind = %s", GST_STR_NULL (self->clip_kind));
|
|
} else if (memcmp (tag_ul, &clip_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->clip_number, tag_data, tag_size);
|
|
GST_DEBUG (" clip number = %s", self->clip_number);
|
|
} else if (memcmp (tag_ul, &extended_clip_id_ul, 16) == 0) {
|
|
if (tag_size != 32 && tag_size != 64)
|
|
goto error;
|
|
|
|
memcpy (self->extended_clip_id, tag_data, tag_size);
|
|
self->extended_clip_id_full = (tag_size == 64);
|
|
|
|
GST_DEBUG (" extended clip id (1) = %s",
|
|
mxf_umid_to_string ((MXFUMID *) & self->extended_clip_id, str));
|
|
if (tag_size == 64)
|
|
GST_DEBUG (" extended clip id (2) = %s",
|
|
mxf_umid_to_string ((MXFUMID *) & self->extended_clip_id[32], str));
|
|
} else if (memcmp (tag_ul, &clip_creation_date_and_time_ul, 16) == 0) {
|
|
if (!mxf_timestamp_parse (&self->clip_creation_date_and_time, tag_data,
|
|
tag_size))
|
|
goto error;
|
|
GST_DEBUG (" clip creation date and time = %s",
|
|
mxf_timestamp_to_string (&self->clip_creation_date_and_time, str));
|
|
} else if (memcmp (tag_ul, &take_number_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->take_number = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" take number = %u", self->take_number);
|
|
} else if (memcmp (tag_ul, &slate_information_ul, 16) == 0) {
|
|
self->slate_information = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" slate information = %s",
|
|
GST_STR_NULL (self->slate_information));
|
|
} else if (memcmp (tag_ul, &scripting_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->scripting_sets_uids,
|
|
&self->n_scripting_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of scripting sets = %u", self->n_scripting_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_scripting_sets; i++) {
|
|
GST_DEBUG (" scripting sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->scripting_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &shot_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->shot_sets_uids, &self->n_shot_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of shot sets = %u", self->n_shot_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_shot_sets; i++) {
|
|
GST_DEBUG (" shot sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->shot_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &device_parameters_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->device_parameters_sets_uids,
|
|
&self->n_device_parameters_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of device parameters sets = %u",
|
|
self->n_device_parameters_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_device_parameters_sets; i++) {
|
|
GST_DEBUG (" device parameters sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->device_parameters_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &processing_set_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->processing_set_uid, tag_data, 16);
|
|
GST_DEBUG (" processing set = %s",
|
|
mxf_uuid_to_string (&self->processing_set_uid, str));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_clip_framework_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 clip framework local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_clip_framework_init (MXFDMS1ClipFramework * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_clip_framework_class_init (MXFDMS1ClipFrameworkClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_clip_framework_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_clip_framework_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_clip_framework_resolve;
|
|
dm_class->type = 0x010200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1SceneFramework, mxf_dms1_scene_framework,
|
|
MXF_TYPE_DMS1_FRAMEWORK);
|
|
|
|
static void
|
|
mxf_dms1_scene_framework_finalize (GObject * object)
|
|
{
|
|
MXFDMS1SceneFramework *self = MXF_DMS1_SCENE_FRAMEWORK (object);
|
|
|
|
g_free (self->setting_period_sets_uids);
|
|
self->setting_period_sets_uids = NULL;
|
|
|
|
g_free (self->setting_period_sets);
|
|
self->setting_period_sets = NULL;
|
|
|
|
g_free (self->shot_scene_sets_uids);
|
|
self->shot_scene_sets_uids = NULL;
|
|
|
|
g_free (self->shot_scene_sets);
|
|
self->shot_scene_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_scene_framework_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_scene_framework_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1SceneFramework *self = MXF_DMS1_SCENE_FRAMEWORK (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->setting_period_sets)
|
|
memset (self->setting_period_sets, 0,
|
|
sizeof (gpointer) * self->n_setting_period_sets);
|
|
else
|
|
self->setting_period_sets =
|
|
g_new0 (MXFDMS1SettingPeriod *, self->n_setting_period_sets);
|
|
|
|
if (self->shot_scene_sets)
|
|
memset (self->shot_scene_sets, 0,
|
|
sizeof (gpointer) * self->n_shot_scene_sets);
|
|
else
|
|
self->shot_scene_sets = g_new0 (MXFDMS1Shot *, self->n_shot_scene_sets);
|
|
|
|
for (i = 0; i < self->n_setting_period_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->setting_period_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_SETTING_PERIOD (current)) {
|
|
self->setting_period_sets[i] = MXF_DMS1_SETTING_PERIOD (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_shot_scene_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->shot_scene_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_SHOT (current)) {
|
|
self->shot_scene_sets[i] = MXF_DMS1_SHOT (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_scene_framework_parent_class)->resolve
|
|
(m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_scene_framework_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1SceneFramework *self = MXF_DMS1_SCENE_FRAMEWORK (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 scene_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 setting_period_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0e, 0x02
|
|
};
|
|
static const guint8 shot_scene_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x11, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &scene_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->scene_number, tag_data, tag_size);
|
|
GST_DEBUG (" scene number = %s", self->scene_number);
|
|
} else if (memcmp (tag_ul, &setting_period_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->setting_period_sets_uids,
|
|
&self->n_setting_period_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of setting period sets = %u",
|
|
self->n_setting_period_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_setting_period_sets; i++) {
|
|
GST_DEBUG (" setting period sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->setting_period_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &shot_scene_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->shot_scene_sets_uids,
|
|
&self->n_shot_scene_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of shot sets = %u", self->n_shot_scene_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_shot_scene_sets; i++) {
|
|
GST_DEBUG (" shot sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->shot_scene_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_scene_framework_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 scene framework local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_scene_framework_init (MXFDMS1SceneFramework * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_scene_framework_class_init (MXFDMS1SceneFrameworkClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_scene_framework_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_scene_framework_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_scene_framework_resolve;
|
|
dm_class->type = 0x010300;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Titles, mxf_dms1_titles, MXF_TYPE_DMS1_TEXT_LANGUAGE);
|
|
|
|
static void
|
|
mxf_dms1_titles_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Titles *self = MXF_DMS1_TITLES (object);
|
|
|
|
g_free (self->main_title);
|
|
self->main_title = NULL;
|
|
|
|
g_free (self->secondary_title);
|
|
self->secondary_title = NULL;
|
|
|
|
g_free (self->working_title);
|
|
self->working_title = NULL;
|
|
|
|
g_free (self->original_title);
|
|
self->original_title = NULL;
|
|
|
|
g_free (self->version_title);
|
|
self->version_title = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_titles_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_titles_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Titles *self = MXF_DMS1_TITLES (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 main_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x01,
|
|
0x05, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 secondary_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x01,
|
|
0x05, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 working_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x05, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 original_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x05, 0x0b, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 version_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x01,
|
|
0x05, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &main_title_ul, 16) == 0) {
|
|
self->main_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" main title = %s", GST_STR_NULL (self->main_title));
|
|
} else if (memcmp (tag_ul, &secondary_title_ul, 16) == 0) {
|
|
self->secondary_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" secondary title = %s", GST_STR_NULL (self->secondary_title));
|
|
} else if (memcmp (tag_ul, &working_title_ul, 16) == 0) {
|
|
self->working_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" working title = %s", GST_STR_NULL (self->working_title));
|
|
} else if (memcmp (tag_ul, &original_title_ul, 16) == 0) {
|
|
self->original_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" original title = %s", GST_STR_NULL (self->original_title));
|
|
} else if (memcmp (tag_ul, &version_title_ul, 16) == 0) {
|
|
self->version_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" version title = %s", GST_STR_NULL (self->version_title));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_titles_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_titles_init (MXFDMS1Titles * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_titles_class_init (MXFDMS1TitlesClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_titles_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_titles_handle_tag;
|
|
dm_class->type = 0x100100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Identification, mxf_dms1_identification,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_identification_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Identification *self = MXF_DMS1_IDENTIFICATION (object);
|
|
|
|
g_free (self->identifier_value);
|
|
self->identifier_value = NULL;
|
|
|
|
g_free (self->identification_issuing_authority);
|
|
self->identification_issuing_authority = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_identification_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_identification_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Identification *self = MXF_DMS1_IDENTIFICATION (metadata);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 identifier_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 identifier_value_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 identification_locator_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 identification_issuing_authority_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x0a, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &identifier_kind_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->identifier_kind, tag_data, tag_size);
|
|
GST_DEBUG (" identifier kind = %s", self->identifier_kind);
|
|
} else if (memcmp (tag_ul, &identifier_value_ul, 16) == 0) {
|
|
self->identifier_value = g_memdup (tag_data, tag_size);
|
|
self->identifier_value_length = tag_size;
|
|
GST_DEBUG (" identifier value length = %u", tag_size);
|
|
} else if (memcmp (tag_ul, &identification_locator_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->identification_locator, tag_data, 16);
|
|
|
|
GST_DEBUG (" identification locator = %s",
|
|
mxf_uuid_to_string (&self->identification_locator, str));
|
|
} else if (memcmp (tag_ul, &identification_issuing_authority_ul, 16) == 0) {
|
|
self->identification_issuing_authority =
|
|
mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" identification issuing authority = %s",
|
|
GST_STR_NULL (self->identification_issuing_authority));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_identification_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 identification local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_identification_init (MXFDMS1Identification * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_identification_class_init (MXFDMS1IdentificationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_identification_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_identification_handle_tag;
|
|
dm_class->type = 0x110100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1GroupRelationship, mxf_dms1_group_relationship,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_group_relationship_finalize (GObject * object)
|
|
{
|
|
MXFDMS1GroupRelationship *self = MXF_DMS1_GROUP_RELATIONSHIP (object);
|
|
|
|
g_free (self->programming_group_kind);
|
|
self->programming_group_kind = NULL;
|
|
|
|
g_free (self->programming_group_title);
|
|
self->programming_group_title = NULL;
|
|
|
|
g_free (self->group_synopsis);
|
|
self->group_synopsis = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_group_relationship_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_group_relationship_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1GroupRelationship *self = MXF_DMS1_GROUP_RELATIONSHIP (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 programming_group_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x02, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 programming_group_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x02, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 group_synopsis_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x08, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 numerical_position_in_sequence_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x06,
|
|
0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 total_number_in_the_sequence_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 episodic_start_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 episodic_end_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x02, 0x05, 0x02, 0x03, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &programming_group_kind_ul, 16) == 0) {
|
|
self->programming_group_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" programming group kind = %s",
|
|
GST_STR_NULL (self->programming_group_kind));
|
|
} else if (memcmp (tag_ul, &programming_group_title_ul, 16) == 0) {
|
|
self->programming_group_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" programming group title = %s",
|
|
GST_STR_NULL (self->programming_group_title));
|
|
} else if (memcmp (tag_ul, &group_synopsis_ul, 16) == 0) {
|
|
self->group_synopsis = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" group synopsis = %s", GST_STR_NULL (self->group_synopsis));
|
|
} else if (memcmp (tag_ul, &numerical_position_in_sequence_ul, 16) == 0) {
|
|
if (tag_size != 4)
|
|
goto error;
|
|
|
|
self->numerical_position_in_sequence = GST_READ_UINT32_BE (tag_data);
|
|
GST_DEBUG (" numerical position in sequence = %u",
|
|
self->numerical_position_in_sequence);
|
|
} else if (memcmp (tag_ul, &total_number_in_the_sequence_ul, 16) == 0) {
|
|
if (tag_size != 4)
|
|
goto error;
|
|
|
|
self->total_number_in_the_sequence = GST_READ_UINT32_BE (tag_data);
|
|
GST_DEBUG (" total number in the sequence = %u",
|
|
self->total_number_in_the_sequence);
|
|
} else if (memcmp (tag_ul, &episodic_start_number_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->episodic_start_number = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" episodic start number = %u", self->episodic_start_number);
|
|
} else if (memcmp (tag_ul, &episodic_end_number_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->episodic_end_number = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" episodic end number = %u", self->episodic_end_number);
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_group_relationship_parent_class)->handle_tag (metadata,
|
|
primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 group relationship local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_group_relationship_init (MXFDMS1GroupRelationship * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_group_relationship_class_init (MXFDMS1GroupRelationshipClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_group_relationship_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_group_relationship_handle_tag;
|
|
dm_class->type = 0x120100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Branding, mxf_dms1_branding, MXF_TYPE_DMS1_TEXT_LANGUAGE);
|
|
|
|
static void
|
|
mxf_dms1_branding_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Branding *self = MXF_DMS1_BRANDING (object);
|
|
|
|
g_free (self->brand_main_title);
|
|
self->brand_main_title = NULL;
|
|
|
|
g_free (self->brand_original_title);
|
|
self->brand_original_title = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_branding_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_branding_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Branding *self = MXF_DMS1_BRANDING (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 brand_main_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x05, 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 brand_original_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x05, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &brand_main_title_ul, 16) == 0) {
|
|
self->brand_main_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" brand main title = %s",
|
|
GST_STR_NULL (self->brand_main_title));
|
|
} else if (memcmp (tag_ul, &brand_original_title_ul, 16) == 0) {
|
|
self->brand_original_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" brand original title = %s",
|
|
GST_STR_NULL (self->brand_original_title));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_branding_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_branding_init (MXFDMS1Branding * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_branding_class_init (MXFDMS1BrandingClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_branding_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_branding_handle_tag;
|
|
dm_class->type = 0x130100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Event, mxf_dms1_event, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_event_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Event *self = MXF_DMS1_EVENT (object);
|
|
|
|
g_free (self->event_indication);
|
|
self->event_indication = NULL;
|
|
|
|
g_free (self->publication_sets_uids);
|
|
self->publication_sets_uids = NULL;
|
|
|
|
g_free (self->publication_sets);
|
|
self->publication_sets = NULL;
|
|
|
|
g_free (self->annotation_sets_uids);
|
|
self->annotation_sets_uids = NULL;
|
|
|
|
g_free (self->annotation_sets);
|
|
self->annotation_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_event_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_event_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Event *self = MXF_DMS1_EVENT (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->publication_sets)
|
|
memset (self->publication_sets, 0,
|
|
sizeof (gpointer) * self->n_publication_sets);
|
|
else
|
|
self->publication_sets =
|
|
g_new0 (MXFDMS1Publication *, self->n_publication_sets);
|
|
|
|
if (self->annotation_sets)
|
|
memset (self->annotation_sets, 0,
|
|
sizeof (gpointer) * self->n_annotation_sets);
|
|
else
|
|
self->annotation_sets =
|
|
g_new0 (MXFDMS1Annotation *, self->n_annotation_sets);
|
|
|
|
for (i = 0; i < self->n_publication_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->publication_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PUBLICATION (current)) {
|
|
self->publication_sets[i] = MXF_DMS1_PUBLICATION (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_annotation_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->annotation_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ANNOTATION (current)) {
|
|
self->annotation_sets[i] = MXF_DMS1_ANNOTATION (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_event_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_event_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Event *self = MXF_DMS1_EVENT (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 event_indication_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x05,
|
|
0x01, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 event_start_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x07,
|
|
0x02, 0x01, 0x02, 0x07, 0x02, 0x00, 0x00
|
|
};
|
|
static const guint8 event_end_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x07,
|
|
0x02, 0x01, 0x02, 0x09, 0x02, 0x00, 0x00
|
|
};
|
|
static const guint8 publication_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0a, 0x00
|
|
};
|
|
static const guint8 annotation_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x08, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x0d, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &event_indication_ul, 16) == 0) {
|
|
self->event_indication = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" event indication = %s",
|
|
GST_STR_NULL (self->event_indication));
|
|
} else if (memcmp (tag_ul, &event_start_date_and_time_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->event_start_date_and_time, tag_data, tag_size);
|
|
GST_DEBUG (" event start date and time = %s",
|
|
self->event_start_date_and_time);
|
|
} else if (memcmp (tag_ul, &event_end_date_and_time_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->event_end_date_and_time, tag_data, tag_size);
|
|
GST_DEBUG (" event end date and time = %s", self->event_end_date_and_time);
|
|
} else if (memcmp (tag_ul, &publication_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->publication_sets_uids,
|
|
&self->n_publication_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of publication sets = %u", self->n_publication_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_publication_sets; i++) {
|
|
GST_DEBUG (" publication sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->publication_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &annotation_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->annotation_sets_uids,
|
|
&self->n_annotation_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of annotation sets = %u", self->n_annotation_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_annotation_sets; i++) {
|
|
GST_DEBUG (" annotation sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->annotation_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_event_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 event local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_event_init (MXFDMS1Event * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_event_class_init (MXFDMS1EventClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_event_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_event_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_event_resolve;
|
|
dm_class->type = 0x140100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Publication, mxf_dms1_publication, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_publication_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Publication *self = MXF_DMS1_PUBLICATION (object);
|
|
|
|
g_free (self->publication_organisation_name);
|
|
self->publication_organisation_name = NULL;
|
|
|
|
g_free (self->publication_service_name);
|
|
self->publication_service_name = NULL;
|
|
|
|
g_free (self->publication_medium);
|
|
self->publication_medium = NULL;
|
|
|
|
g_free (self->publication_region);
|
|
self->publication_region = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_publication_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_publication_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Publication *self = MXF_DMS1_PUBLICATION (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 publication_organisation_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x10, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 publication_service_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x10, 0x02, 0x01, 0x02, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 publication_medium_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x10, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 publication_region_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x10, 0x02, 0x01, 0x04, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &publication_organisation_name_ul, 16) == 0) {
|
|
self->publication_organisation_name =
|
|
mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" publication organisation name = %s",
|
|
GST_STR_NULL (self->publication_organisation_name));
|
|
} else if (memcmp (tag_ul, &publication_service_name_ul, 16) == 0) {
|
|
self->publication_service_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" publication service name = %s",
|
|
GST_STR_NULL (self->publication_service_name));
|
|
} else if (memcmp (tag_ul, &publication_medium_ul, 16) == 0) {
|
|
self->publication_medium = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" publication medium = %s",
|
|
GST_STR_NULL (self->publication_medium));
|
|
} else if (memcmp (tag_ul, &publication_region_ul, 16) == 0) {
|
|
self->publication_region = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" publication region = %s",
|
|
GST_STR_NULL (self->publication_region));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_publication_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_publication_init (MXFDMS1Publication * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_publication_class_init (MXFDMS1PublicationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_publication_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_publication_handle_tag;
|
|
dm_class->type = 0x140200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Award, mxf_dms1_award, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_award_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Award *self = MXF_DMS1_AWARD (object);
|
|
|
|
g_free (self->festival);
|
|
self->festival = NULL;
|
|
|
|
g_free (self->award_name);
|
|
self->award_name = NULL;
|
|
|
|
g_free (self->award_classification);
|
|
self->award_classification = NULL;
|
|
|
|
g_free (self->nomination_category);
|
|
self->nomination_category = NULL;
|
|
|
|
g_free (self->participant_sets_uids);
|
|
self->participant_sets_uids = NULL;
|
|
|
|
g_free (self->participant_sets);
|
|
self->participant_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_award_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_award_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Award *self = MXF_DMS1_AWARD (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->participant_sets)
|
|
memset (self->participant_sets, 0,
|
|
sizeof (gpointer) * self->n_participant_sets);
|
|
else
|
|
self->participant_sets =
|
|
g_new0 (MXFDMS1Participant *, self->n_participant_sets);
|
|
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->participant_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PARTICIPANT (current)) {
|
|
self->participant_sets[i] = MXF_DMS1_PARTICIPANT (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_award_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_award_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Award *self = MXF_DMS1_AWARD (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 festival_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x02, 0x01, 0x03, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 festival_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x02, 0x01, 0x02, 0x07, 0x10, 0x01, 0x00
|
|
};
|
|
static const guint8 award_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x02, 0x01, 0x04, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 award_classification_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x02, 0x01, 0x05, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 nomination_category_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x02, 0x01, 0x06, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 participant_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x13, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &festival_ul, 16) == 0) {
|
|
self->festival = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" festival = %s", GST_STR_NULL (self->festival));
|
|
} else if (memcmp (tag_ul, &festival_date_and_time_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->festival_date_and_time, tag_data, tag_size);
|
|
GST_DEBUG (" festival date and time = %s",
|
|
GST_STR_NULL (self->festival_date_and_time));
|
|
} else if (memcmp (tag_ul, &award_name_ul, 16) == 0) {
|
|
self->award_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" award name = %s", GST_STR_NULL (self->award_name));
|
|
} else if (memcmp (tag_ul, &award_classification_ul, 16) == 0) {
|
|
self->award_classification = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" award classification = %s",
|
|
GST_STR_NULL (self->award_classification));
|
|
} else if (memcmp (tag_ul, &nomination_category_ul, 16) == 0) {
|
|
self->nomination_category = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" nomination category = %s",
|
|
GST_STR_NULL (self->nomination_category));
|
|
} else if (memcmp (tag_ul, &participant_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->participant_sets_uids,
|
|
&self->n_participant_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of participant sets = %u", self->n_participant_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
GST_DEBUG (" participant sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->participant_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_award_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 award local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_award_init (MXFDMS1Award * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_award_class_init (MXFDMS1AwardClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_award_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_award_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_award_resolve;
|
|
dm_class->type = 0x150100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1CaptionsDescription, mxf_dms1_captions_description,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_captions_description_finalize (GObject * object)
|
|
{
|
|
MXFDMS1CaptionsDescription *self = MXF_DMS1_CAPTIONS_DESCRIPTION (object);
|
|
|
|
g_free (self->caption_kind);
|
|
self->caption_kind = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_captions_description_parent_class)->finalize
|
|
(object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_captions_description_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1CaptionsDescription *self = MXF_DMS1_CAPTIONS_DESCRIPTION (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 extended_captions_language_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x01, 0x01, 0x02, 0x02, 0x12, 0x00, 0x00
|
|
};
|
|
static const guint8 caption_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x04,
|
|
0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &extended_captions_language_code_ul, 16) == 0) {
|
|
if (tag_size > 12)
|
|
goto error;
|
|
|
|
memcpy (self->extended_captions_language_code, tag_data, tag_size);
|
|
GST_DEBUG (" extended captions language code = %s",
|
|
self->extended_captions_language_code);
|
|
} else if (memcmp (tag_ul, &caption_kind_ul, 16) == 0) {
|
|
self->caption_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" caption kind = %s", GST_STR_NULL (self->caption_kind));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_captions_description_parent_class)->handle_tag (metadata,
|
|
primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 captions description local tag 0x%04x of size %u",
|
|
tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_captions_description_init (MXFDMS1CaptionsDescription * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_captions_description_class_init (MXFDMS1CaptionsDescriptionClass *
|
|
klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_captions_description_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_captions_description_handle_tag;
|
|
dm_class->type = 0x160100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Annotation, mxf_dms1_annotation, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_annotation_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Annotation *self = MXF_DMS1_ANNOTATION (object);
|
|
|
|
g_free (self->annotation_kind);
|
|
self->annotation_kind = NULL;
|
|
|
|
g_free (self->annotation_synopsis);
|
|
self->annotation_synopsis = NULL;
|
|
|
|
g_free (self->annotation_description);
|
|
self->annotation_description = NULL;
|
|
|
|
g_free (self->related_material_description);
|
|
self->related_material_description = NULL;
|
|
|
|
g_free (self->classification_sets_uids);
|
|
self->classification_sets_uids = NULL;
|
|
|
|
g_free (self->classification_sets);
|
|
self->classification_sets = NULL;
|
|
|
|
g_free (self->related_material_locators);
|
|
self->related_material_locators = NULL;
|
|
|
|
g_free (self->participant_sets_uids);
|
|
self->participant_sets_uids = NULL;
|
|
|
|
g_free (self->participant_sets);
|
|
self->participant_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_annotation_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_annotation_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Annotation *self = MXF_DMS1_ANNOTATION (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->classification_sets)
|
|
memset (self->classification_sets, 0,
|
|
sizeof (gpointer) * self->n_classification_sets);
|
|
else
|
|
self->classification_sets =
|
|
g_new0 (MXFDMS1Classification *, self->n_classification_sets);
|
|
|
|
if (self->participant_sets)
|
|
memset (self->participant_sets, 0,
|
|
sizeof (gpointer) * self->n_participant_sets);
|
|
else
|
|
self->participant_sets =
|
|
g_new0 (MXFDMS1Participant *, self->n_participant_sets);
|
|
|
|
for (i = 0; i < self->n_classification_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->classification_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_CLASSIFICATION (current)) {
|
|
self->classification_sets[i] = MXF_DMS1_CLASSIFICATION (current);
|
|
}
|
|
}
|
|
|
|
current = g_hash_table_lookup (metadata, &self->cue_words_set_uid);
|
|
if (current && MXF_IS_DMS1_CUE_WORDS (current)) {
|
|
self->cue_words_set = MXF_DMS1_CUE_WORDS (current);
|
|
}
|
|
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->participant_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PARTICIPANT (current)) {
|
|
self->participant_sets[i] = MXF_DMS1_PARTICIPANT (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_annotation_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_annotation_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Annotation *self = MXF_DMS1_ANNOTATION (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 annotation_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0e, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 annotation_synopsis_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x09, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 annotation_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0a, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 related_material_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0f, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 classification_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x10, 0x00
|
|
};
|
|
static const guint8 cue_words_set_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x23, 0x01
|
|
};
|
|
static const guint8 related_material_locators_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x06, 0x0d, 0x00, 0x00
|
|
};
|
|
static const guint8 participant_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x13, 0x03
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &annotation_kind_ul, 16) == 0) {
|
|
self->annotation_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" annotation kind = %s", GST_STR_NULL (self->annotation_kind));
|
|
} else if (memcmp (tag_ul, &annotation_synopsis_ul, 16) == 0) {
|
|
self->annotation_synopsis = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" annotation synopsis = %s",
|
|
GST_STR_NULL (self->annotation_synopsis));
|
|
} else if (memcmp (tag_ul, &annotation_description_ul, 16) == 0) {
|
|
self->annotation_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" annotation description = %s",
|
|
GST_STR_NULL (self->annotation_description));
|
|
} else if (memcmp (tag_ul, &related_material_description_ul, 16) == 0) {
|
|
self->related_material_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" related material description = %s",
|
|
GST_STR_NULL (self->related_material_description));
|
|
} else if (memcmp (tag_ul, &classification_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->classification_sets_uids,
|
|
&self->n_classification_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of classification sets = %u",
|
|
self->n_classification_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_classification_sets; i++) {
|
|
GST_DEBUG (" classification sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->classification_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &cue_words_set_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->cue_words_set_uid, tag_data, 16);
|
|
GST_DEBUG (" cue words set = %s",
|
|
mxf_uuid_to_string (&self->cue_words_set_uid, str));
|
|
} else if (memcmp (tag_ul, &related_material_locators_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->related_material_locators,
|
|
&self->n_related_material_locators, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of related material locators = %u",
|
|
self->n_related_material_locators);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_related_material_locators; i++) {
|
|
GST_DEBUG (" related material locators %u = %s", i,
|
|
mxf_uuid_to_string (&self->related_material_locators[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &participant_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->participant_sets_uids,
|
|
&self->n_participant_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of participant sets = %u", self->n_participant_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
GST_DEBUG (" participant sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->participant_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_annotation_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 annotation local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_annotation_init (MXFDMS1Annotation * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_annotation_class_init (MXFDMS1AnnotationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_annotation_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_annotation_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_annotation_resolve;
|
|
dm_class->type = 0x170100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1SettingPeriod, mxf_dms1_setting_period,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_setting_period_finalize (GObject * object)
|
|
{
|
|
MXFDMS1SettingPeriod *self = MXF_DMS1_SETTING_PERIOD (object);
|
|
|
|
g_free (self->time_period_keyword);
|
|
self->time_period_keyword = NULL;
|
|
|
|
g_free (self->setting_period_description);
|
|
self->setting_period_description = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_setting_period_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_setting_period_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1SettingPeriod *self = MXF_DMS1_SETTING_PERIOD (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[32];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 setting_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 time_period_keyword_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x08, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 setting_period_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x08, 0x03, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &setting_date_and_time_ul, 16) == 0) {
|
|
if (!mxf_timestamp_parse (&self->setting_date_and_time, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" last modified date = %s",
|
|
mxf_timestamp_to_string (&self->setting_date_and_time, str));
|
|
} else if (memcmp (tag_ul, &time_period_keyword_ul, 16) == 0) {
|
|
self->time_period_keyword = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" time period keyword = %s",
|
|
GST_STR_NULL (self->time_period_keyword));
|
|
} else if (memcmp (tag_ul, &setting_period_description_ul, 16) == 0) {
|
|
self->setting_period_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" setting period description = %s",
|
|
GST_STR_NULL (self->setting_period_description));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_setting_period_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 setting period local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_setting_period_init (MXFDMS1SettingPeriod * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_setting_period_class_init (MXFDMS1SettingPeriodClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_setting_period_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_setting_period_handle_tag;
|
|
dm_class->type = 0x170200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Scripting, mxf_dms1_scripting, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_scripting_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Scripting *self = MXF_DMS1_SCRIPTING (object);
|
|
|
|
g_free (self->scripting_kind);
|
|
self->scripting_kind = NULL;
|
|
|
|
g_free (self->scripting_text);
|
|
self->scripting_text = NULL;
|
|
|
|
g_free (self->scripting_locators);
|
|
self->scripting_locators = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_scripting_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_scripting_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Scripting *self = MXF_DMS1_SCRIPTING (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 scripting_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0b, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 scripting_text_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0c, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 scripting_locators_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x08, 0x06,
|
|
0x01, 0x01, 0x04, 0x06, 0x0e, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &scripting_kind_ul, 16) == 0) {
|
|
self->scripting_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" scripting kind = %s", GST_STR_NULL (self->scripting_kind));
|
|
} else if (memcmp (tag_ul, &scripting_text_ul, 16) == 0) {
|
|
self->scripting_text = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" scripting description = %s",
|
|
GST_STR_NULL (self->scripting_text));
|
|
} else if (memcmp (tag_ul, &scripting_locators_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->scripting_locators,
|
|
&self->n_scripting_locators, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of scripting locators = %u",
|
|
self->n_scripting_locators);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_scripting_locators; i++) {
|
|
GST_DEBUG (" scripting locators %u = %s", i,
|
|
mxf_uuid_to_string (&self->scripting_locators[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_scripting_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 scripting local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_scripting_init (MXFDMS1Scripting * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_scripting_class_init (MXFDMS1ScriptingClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_scripting_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_scripting_handle_tag;
|
|
dm_class->type = 0x170300;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Classification, mxf_dms1_classification,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_classification_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Classification *self = MXF_DMS1_CLASSIFICATION (object);
|
|
|
|
g_free (self->name_value_sets_uids);
|
|
self->name_value_sets_uids = NULL;
|
|
|
|
g_free (self->name_value_sets);
|
|
self->name_value_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_classification_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_classification_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Classification *self = MXF_DMS1_CLASSIFICATION (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->name_value_sets)
|
|
memset (self->name_value_sets, 0,
|
|
sizeof (gpointer) * self->n_name_value_sets);
|
|
else
|
|
self->name_value_sets =
|
|
g_new0 (MXFDMS1NameValue *, self->n_name_value_sets);
|
|
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->name_value_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_NAME_VALUE (current)) {
|
|
self->name_value_sets[i] = MXF_DMS1_NAME_VALUE (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_classification_parent_class)->resolve
|
|
(m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_classification_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Classification *self = MXF_DMS1_CLASSIFICATION (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 content_classification_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x03,
|
|
0x02, 0x01, 0x03, 0x04, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 name_value_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1f, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &content_classification_ul, 16) == 0) {
|
|
if (tag_size > 127)
|
|
goto error;
|
|
|
|
memcpy (self->content_classification, tag_data, tag_size);
|
|
GST_DEBUG (" content classification = %s", self->content_classification);
|
|
} else if (memcmp (tag_ul, &name_value_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->name_value_sets_uids,
|
|
&self->n_name_value_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of name-value sets = %u", self->n_name_value_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
GST_DEBUG (" name-value sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->name_value_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_classification_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 classification local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_classification_init (MXFDMS1Classification * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_classification_class_init (MXFDMS1ClassificationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_classification_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_classification_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_classification_resolve;
|
|
dm_class->type = 0x170400;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Shot, mxf_dms1_shot, MXF_TYPE_DMS1_TEXT_LANGUAGE);
|
|
|
|
static void
|
|
mxf_dms1_shot_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Shot *self = MXF_DMS1_SHOT (object);
|
|
|
|
g_free (self->shot_track_ids);
|
|
self->shot_track_ids = NULL;
|
|
|
|
g_free (self->shot_description);
|
|
self->shot_description = NULL;
|
|
|
|
g_free (self->shot_comment_kind);
|
|
self->shot_comment_kind = NULL;
|
|
|
|
g_free (self->shot_comment);
|
|
self->shot_comment = NULL;
|
|
|
|
g_free (self->key_point_sets_uids);
|
|
self->key_point_sets_uids = NULL;
|
|
|
|
g_free (self->key_point_sets);
|
|
self->key_point_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_shot_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_shot_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Shot *self = MXF_DMS1_SHOT (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->key_point_sets)
|
|
memset (self->key_point_sets, 0,
|
|
sizeof (gpointer) * self->n_key_point_sets);
|
|
else
|
|
self->key_point_sets = g_new0 (MXFDMS1KeyPoint *, self->n_key_point_sets);
|
|
|
|
current = g_hash_table_lookup (metadata, &self->cue_words_set_uid);
|
|
if (current && MXF_IS_DMS1_CUE_WORDS (current)) {
|
|
self->cue_words_set = MXF_DMS1_CUE_WORDS (current);
|
|
}
|
|
|
|
for (i = 0; i < self->n_key_point_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->key_point_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_KEY_POINT (current)) {
|
|
self->key_point_sets[i] = MXF_DMS1_KEY_POINT (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_shot_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_shot_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Shot *self = MXF_DMS1_SHOT (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 shot_start_position_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x02, 0x01, 0x03, 0x01, 0x09, 0x00, 0x00
|
|
};
|
|
static const guint8 shot_duration_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x02, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00
|
|
};
|
|
static const guint8 shot_track_ids_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x07, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 shot_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x02, 0x01, 0x06, 0x0d, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 shot_comment_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x02, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 shot_comment_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x03,
|
|
0x02, 0x05, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 cue_words_set_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x02, 0x40, 0x23, 0x01
|
|
};
|
|
static const guint8 key_point_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x12, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &shot_start_position_ul, 16) == 0) {
|
|
if (tag_size != 8)
|
|
goto error;
|
|
|
|
self->shot_start_position = GST_READ_UINT64_BE (tag_data);
|
|
GST_DEBUG (" shot start position = %" G_GINT64_FORMAT,
|
|
self->shot_start_position);
|
|
} else if (memcmp (tag_ul, &shot_duration_ul, 16) == 0) {
|
|
if (tag_size != 8)
|
|
goto error;
|
|
|
|
self->shot_duration = GST_READ_UINT64_BE (tag_data);
|
|
GST_DEBUG (" shot duration = %" G_GINT64_FORMAT, self->shot_duration);
|
|
} else if (memcmp (tag_ul, &shot_track_ids_ul, 16) == 0) {
|
|
guint32 len, i;
|
|
|
|
len = GST_READ_UINT32_BE (tag_data);
|
|
GST_DEBUG (" number of shot track ids = %u", len);
|
|
if (len == 0)
|
|
return ret;
|
|
|
|
if (GST_READ_UINT32_BE (tag_data + 4) != 4)
|
|
goto error;
|
|
tag_data += 8;
|
|
tag_size -= 8;
|
|
|
|
if (tag_size < 4 * len)
|
|
goto error;
|
|
|
|
self->n_shot_track_ids = len;
|
|
self->shot_track_ids = g_new0 (guint32, len);
|
|
|
|
for (i = 0; i < len; i++) {
|
|
self->shot_track_ids[i] = GST_READ_UINT32_BE (tag_data);
|
|
GST_DEBUG (" shot track ids %u = %u", i, self->shot_track_ids[i]);
|
|
tag_data += 4;
|
|
tag_size -= 4;
|
|
}
|
|
} else if (memcmp (tag_ul, &shot_description_ul, 16) == 0) {
|
|
self->shot_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" shot description = %s",
|
|
GST_STR_NULL (self->shot_description));
|
|
} else if (memcmp (tag_ul, &shot_comment_kind_ul, 16) == 0) {
|
|
self->shot_comment_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" shot comment kind = %s",
|
|
GST_STR_NULL (self->shot_comment_kind));
|
|
} else if (memcmp (tag_ul, &shot_comment_ul, 16) == 0) {
|
|
self->shot_comment = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" shot comment = %s", GST_STR_NULL (self->shot_comment));
|
|
} else if (memcmp (tag_ul, &cue_words_set_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->cue_words_set_uid, tag_data, 16);
|
|
GST_DEBUG (" cue words set = %s",
|
|
mxf_uuid_to_string (&self->cue_words_set_uid, str));
|
|
} else if (memcmp (tag_ul, &key_point_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->key_point_sets_uids,
|
|
&self->n_key_point_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of key point sets = %u", self->n_key_point_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_key_point_sets; i++) {
|
|
GST_DEBUG (" key point sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->key_point_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_shot_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 shot local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_shot_init (MXFDMS1Shot * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_shot_class_init (MXFDMS1ShotClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_shot_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_shot_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_shot_resolve;
|
|
dm_class->type = 0x170500;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1KeyPoint, mxf_dms1_key_point, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_key_point_finalize (GObject * object)
|
|
{
|
|
MXFDMS1KeyPoint *self = MXF_DMS1_KEY_POINT (object);
|
|
|
|
g_free (self->keypoint_kind);
|
|
self->keypoint_kind = NULL;
|
|
|
|
g_free (self->keypoint_value);
|
|
self->keypoint_value = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_key_point_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_key_point_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1KeyPoint *self = MXF_DMS1_KEY_POINT (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 keypoint_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x01, 0x02, 0x10, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 keypoint_value_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x01, 0x02, 0x11, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 keypoint_position_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x03, 0x01, 0x07, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &keypoint_kind_ul, 16) == 0) {
|
|
self->keypoint_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" keypoint kind = %s", GST_STR_NULL (self->keypoint_kind));
|
|
} else if (memcmp (tag_ul, &keypoint_value_ul, 16) == 0) {
|
|
self->keypoint_value = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" keypoint value = %s", GST_STR_NULL (self->keypoint_value));
|
|
} else if (memcmp (tag_ul, &keypoint_position_ul, 16) == 0) {
|
|
if (tag_size != 8)
|
|
goto error;
|
|
|
|
self->keypoint_position = GST_READ_UINT64_BE (tag_data);
|
|
GST_DEBUG (" keypoint position = %" G_GINT64_FORMAT,
|
|
self->keypoint_position);
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_key_point_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 key point local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_key_point_init (MXFDMS1KeyPoint * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_key_point_class_init (MXFDMS1KeyPointClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_key_point_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_key_point_handle_tag;
|
|
dm_class->type = 0x170600;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Participant, mxf_dms1_participant,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_participant_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Participant *self = MXF_DMS1_PARTICIPANT (object);
|
|
|
|
g_free (self->contribution_status);
|
|
self->contribution_status = NULL;
|
|
|
|
g_free (self->job_function);
|
|
self->job_function = NULL;
|
|
|
|
g_free (self->role_or_identity_name);
|
|
self->role_or_identity_name = NULL;
|
|
|
|
g_free (self->person_sets_uids);
|
|
self->person_sets_uids = NULL;
|
|
|
|
g_free (self->person_sets);
|
|
self->person_sets = NULL;
|
|
|
|
g_free (self->organisation_sets_uids);
|
|
self->organisation_sets_uids = NULL;
|
|
|
|
g_free (self->organisation_sets);
|
|
self->organisation_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_participant_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_participant_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Participant *self = MXF_DMS1_PARTICIPANT (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->person_sets)
|
|
memset (self->person_sets, 0, sizeof (gpointer) * self->n_person_sets);
|
|
else
|
|
self->person_sets = g_new0 (MXFDMS1Person *, self->n_person_sets);
|
|
|
|
if (self->organisation_sets)
|
|
memset (self->organisation_sets, 0,
|
|
sizeof (gpointer) * self->n_organisation_sets);
|
|
else
|
|
self->organisation_sets =
|
|
g_new0 (MXFDMS1Organisation *, self->n_organisation_sets);
|
|
|
|
for (i = 0; i < self->n_person_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->person_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PERSON (current)) {
|
|
self->person_sets[i] = MXF_DMS1_PERSON (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->organisation_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ORGANISATION (current)) {
|
|
self->organisation_sets[i] = MXF_DMS1_ORGANISATION (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_participant_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_participant_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Participant *self = MXF_DMS1_PARTICIPANT (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 participant_uid_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x08, 0x01,
|
|
0x01, 0x15, 0x40, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 contribution_status_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x01, 0x02, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 job_function_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x05, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 job_function_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x05, 0x01, 0x02, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 role_or_identity_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x05, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 person_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x14, 0x00
|
|
};
|
|
static const guint8 organisation_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x15, 0x02
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &participant_uid_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->participant_uid, tag_data, 16);
|
|
GST_DEBUG (" participant uid = %s",
|
|
mxf_uuid_to_string (&self->participant_uid, str));
|
|
} else if (memcmp (tag_ul, &contribution_status_ul, 16) == 0) {
|
|
self->contribution_status = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" contribution status = %s",
|
|
GST_STR_NULL (self->contribution_status));
|
|
} else if (memcmp (tag_ul, &job_function_ul, 16) == 0) {
|
|
self->job_function = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" job function = %s", GST_STR_NULL (self->job_function));
|
|
} else if (memcmp (tag_ul, &job_function_code_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->job_function_code, tag_data, tag_size);
|
|
GST_DEBUG (" job function code = %s", self->job_function_code);
|
|
} else if (memcmp (tag_ul, &role_or_identity_name_ul, 16) == 0) {
|
|
self->role_or_identity_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" role or identity name = %s",
|
|
GST_STR_NULL (self->role_or_identity_name));
|
|
} else if (memcmp (tag_ul, &person_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->person_sets_uids, &self->n_person_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of person sets = %u", self->n_person_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_person_sets; i++) {
|
|
GST_DEBUG (" person sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->person_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &organisation_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->organisation_sets_uids,
|
|
&self->n_organisation_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of organisation sets = %u", self->n_organisation_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
GST_DEBUG (" organisation sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->organisation_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_participant_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 participant local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_participant_init (MXFDMS1Participant * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_participant_class_init (MXFDMS1ParticipantClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_participant_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_participant_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_participant_resolve;
|
|
dm_class->type = 0x180100;
|
|
}
|
|
|
|
G_DEFINE_ABSTRACT_TYPE (MXFDMS1Contact, mxf_dms1_contact,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_contact_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Contact *self = MXF_DMS1_CONTACT (object);
|
|
|
|
g_free (self->name_value_sets_uids);
|
|
self->name_value_sets_uids = NULL;
|
|
|
|
g_free (self->name_value_sets);
|
|
self->name_value_sets = NULL;
|
|
|
|
g_free (self->address_sets_uids);
|
|
self->address_sets_uids = NULL;
|
|
|
|
g_free (self->address_sets);
|
|
self->address_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_contact_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contact_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Contact *self = MXF_DMS1_CONTACT (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->name_value_sets)
|
|
memset (self->name_value_sets, 0,
|
|
sizeof (gpointer) * self->n_name_value_sets);
|
|
else
|
|
self->name_value_sets =
|
|
g_new0 (MXFDMS1NameValue *, self->n_name_value_sets);
|
|
|
|
if (self->address_sets)
|
|
memset (self->address_sets, 0, sizeof (gpointer) * self->n_address_sets);
|
|
else
|
|
self->address_sets = g_new0 (MXFDMS1Address *, self->n_address_sets);
|
|
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->name_value_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_NAME_VALUE (current)) {
|
|
self->name_value_sets[i] = MXF_DMS1_NAME_VALUE (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_address_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->address_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ADDRESS (current)) {
|
|
self->address_sets[i] = MXF_DMS1_ADDRESS (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_contact_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contact_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Contact *self = MXF_DMS1_CONTACT (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 contact_uid_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x08, 0x01,
|
|
0x01, 0x15, 0x40, 0x01, 0x02, 0x00, 0x00
|
|
};
|
|
static const guint8 name_value_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1f, 0x02
|
|
};
|
|
static const guint8 address_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x17, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &contact_uid_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->contact_uid, tag_data, 16);
|
|
GST_DEBUG (" contact uid = %s", mxf_uuid_to_string (&self->contact_uid,
|
|
str));
|
|
} else if (memcmp (tag_ul, &name_value_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->name_value_sets_uids,
|
|
&self->n_name_value_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of name-value sets = %u", self->n_name_value_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
GST_DEBUG (" name-value sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->name_value_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &address_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->address_sets_uids, &self->n_address_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of address sets = %u", self->n_address_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_address_sets; i++) {
|
|
GST_DEBUG (" address sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->address_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_contact_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 contact local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contact_init (MXFDMS1Contact * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contact_class_init (MXFDMS1ContactClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_contact_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_contact_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_contact_resolve;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Person, mxf_dms1_person, MXF_TYPE_DMS1_CONTACT);
|
|
|
|
static void
|
|
mxf_dms1_person_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Person *self = MXF_DMS1_PERSON (object);
|
|
|
|
g_free (self->family_name);
|
|
self->family_name = NULL;
|
|
|
|
g_free (self->first_given_name);
|
|
self->first_given_name = NULL;
|
|
|
|
g_free (self->other_given_names);
|
|
self->other_given_names = NULL;
|
|
|
|
g_free (self->linking_name);
|
|
self->linking_name = NULL;
|
|
|
|
g_free (self->salutation);
|
|
self->salutation = NULL;
|
|
|
|
g_free (self->name_suffix);
|
|
self->name_suffix = NULL;
|
|
|
|
g_free (self->honours_qualifications);
|
|
self->honours_qualifications = NULL;
|
|
|
|
g_free (self->former_family_name);
|
|
self->former_family_name = NULL;
|
|
|
|
g_free (self->person_description);
|
|
self->person_description = NULL;
|
|
|
|
g_free (self->alternate_name);
|
|
self->alternate_name = NULL;
|
|
|
|
g_free (self->nationality);
|
|
self->nationality = NULL;
|
|
|
|
g_free (self->citizenship);
|
|
self->citizenship = NULL;
|
|
|
|
g_free (self->organisation_sets_uids);
|
|
self->organisation_sets_uids = NULL;
|
|
|
|
g_free (self->organisation_sets);
|
|
self->organisation_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_person_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_person_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Person *self = MXF_DMS1_PERSON (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->organisation_sets)
|
|
memset (self->organisation_sets, 0,
|
|
sizeof (gpointer) * self->n_organisation_sets);
|
|
else
|
|
self->organisation_sets =
|
|
g_new0 (MXFDMS1Organisation *, self->n_organisation_sets);
|
|
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->organisation_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ORGANISATION (current)) {
|
|
self->organisation_sets[i] = MXF_DMS1_ORGANISATION (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_person_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_person_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Person *self = MXF_DMS1_PERSON (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 family_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x01, 0x01, 0x00
|
|
};
|
|
static const guint8 first_given_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x02, 0x01, 0x00
|
|
};
|
|
static const guint8 other_given_names_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x08, 0x01, 0x00
|
|
};
|
|
static const guint8 linking_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x0a, 0x01, 0x00
|
|
};
|
|
static const guint8 salutation_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x05, 0x01, 0x00
|
|
};
|
|
static const guint8 name_suffix_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x0b, 0x01, 0x00
|
|
};
|
|
static const guint8 honours_qualifications_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x06, 0x01, 0x00
|
|
};
|
|
static const guint8 former_family_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x0c, 0x01, 0x00
|
|
};
|
|
static const guint8 person_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x07, 0x01, 0x00
|
|
};
|
|
static const guint8 alternate_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x09, 0x01, 0x00
|
|
};
|
|
static const guint8 nationality_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x0d, 0x01, 0x00
|
|
};
|
|
static const guint8 citizenship_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x02,
|
|
0x30, 0x06, 0x03, 0x01, 0x0e, 0x01, 0x00
|
|
};
|
|
static const guint8 organisation_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x15, 0x02
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &family_name_ul, 16) == 0) {
|
|
self->family_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" family name = %s", GST_STR_NULL (self->family_name));
|
|
} else if (memcmp (tag_ul, &first_given_name_ul, 16) == 0) {
|
|
self->first_given_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" first given name = %s",
|
|
GST_STR_NULL (self->first_given_name));
|
|
} else if (memcmp (tag_ul, &other_given_names_ul, 16) == 0) {
|
|
self->other_given_names = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" other given names = %s",
|
|
GST_STR_NULL (self->other_given_names));
|
|
} else if (memcmp (tag_ul, &linking_name_ul, 16) == 0) {
|
|
self->linking_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" linking name = %s", GST_STR_NULL (self->linking_name));
|
|
} else if (memcmp (tag_ul, &salutation_ul, 16) == 0) {
|
|
self->salutation = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" salutation = %s", GST_STR_NULL (self->salutation));
|
|
} else if (memcmp (tag_ul, &name_suffix_ul, 16) == 0) {
|
|
self->name_suffix = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" name suffix = %s", GST_STR_NULL (self->name_suffix));
|
|
} else if (memcmp (tag_ul, &honours_qualifications_ul, 16) == 0) {
|
|
self->honours_qualifications = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" honours & qualifications = %s",
|
|
GST_STR_NULL (self->honours_qualifications));
|
|
} else if (memcmp (tag_ul, &former_family_name_ul, 16) == 0) {
|
|
self->former_family_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" former family name = %s",
|
|
GST_STR_NULL (self->former_family_name));
|
|
} else if (memcmp (tag_ul, &person_description_ul, 16) == 0) {
|
|
self->person_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" person description = %s",
|
|
GST_STR_NULL (self->person_description));
|
|
} else if (memcmp (tag_ul, &alternate_name_ul, 16) == 0) {
|
|
self->alternate_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" alternate name = %s", GST_STR_NULL (self->alternate_name));
|
|
} else if (memcmp (tag_ul, &nationality_ul, 16) == 0) {
|
|
self->nationality = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" nationality = %s", GST_STR_NULL (self->nationality));
|
|
} else if (memcmp (tag_ul, &citizenship_ul, 16) == 0) {
|
|
self->citizenship = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" citizenship = %s", GST_STR_NULL (self->citizenship));
|
|
} else if (memcmp (tag_ul, &organisation_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->organisation_sets_uids,
|
|
&self->n_organisation_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of organisation sets = %u", self->n_organisation_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
GST_DEBUG (" organisation sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->organisation_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_person_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 person local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_person_init (MXFDMS1Person * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_person_class_init (MXFDMS1PersonClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_person_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_person_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_person_resolve;
|
|
dm_class->type = 0x1a0200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Organisation, mxf_dms1_organisation,
|
|
MXF_TYPE_DMS1_CONTACT);
|
|
|
|
static void
|
|
mxf_dms1_organisation_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Organisation *self = MXF_DMS1_ORGANISATION (object);
|
|
|
|
g_free (self->nature_of_organisation);
|
|
self->nature_of_organisation = NULL;
|
|
|
|
g_free (self->organisation_main_name);
|
|
self->organisation_main_name = NULL;
|
|
|
|
g_free (self->organisation_code);
|
|
self->organisation_code = NULL;
|
|
|
|
g_free (self->contact_department);
|
|
self->contact_department = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_organisation_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_organisation_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Organisation *self = MXF_DMS1_ORGANISATION (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 nature_of_organisation_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 organisation_main_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x06, 0x03, 0x03, 0x01, 0x01, 0x00
|
|
};
|
|
static const guint8 organisation_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x0a, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 contact_department_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x30, 0x06, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &nature_of_organisation_ul, 16) == 0) {
|
|
self->nature_of_organisation = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" nature of organisation = %s",
|
|
GST_STR_NULL (self->nature_of_organisation));
|
|
} else if (memcmp (tag_ul, &organisation_main_name_ul, 16) == 0) {
|
|
self->organisation_main_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" organisation main name = %s",
|
|
GST_STR_NULL (self->organisation_main_name));
|
|
} else if (memcmp (tag_ul, &organisation_code_ul, 16) == 0) {
|
|
self->organisation_code = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" organisation code = %s",
|
|
GST_STR_NULL (self->organisation_code));
|
|
} else if (memcmp (tag_ul, &contact_department_ul, 16) == 0) {
|
|
self->contact_department = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" contact department = %s",
|
|
GST_STR_NULL (self->contact_department));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_organisation_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_organisation_init (MXFDMS1Organisation * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_organisation_class_init (MXFDMS1OrganisationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_organisation_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_organisation_handle_tag;
|
|
dm_class->type = 0x1a0300;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Location, mxf_dms1_location, MXF_TYPE_DMS1_CONTACT);
|
|
|
|
static void
|
|
mxf_dms1_location_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Location *self = MXF_DMS1_LOCATION (object);
|
|
|
|
g_free (self->location_kind);
|
|
self->location_kind = NULL;
|
|
|
|
g_free (self->location_description);
|
|
self->location_description = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_location_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_location_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Location *self = MXF_DMS1_LOCATION (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 location_kind_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x01, 0x20, 0x02, 0x03, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 location_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x01, 0x20, 0x02, 0x02, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &location_kind_ul, 16) == 0) {
|
|
self->location_kind = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" location kind = %s", GST_STR_NULL (self->location_kind));
|
|
} else if (memcmp (tag_ul, &location_description_ul, 16) == 0) {
|
|
self->location_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" location description = %s",
|
|
GST_STR_NULL (self->location_description));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_location_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_location_init (MXFDMS1Location * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_location_class_init (MXFDMS1LocationClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_location_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_location_handle_tag;
|
|
dm_class->type = 0x1a0400;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Address, mxf_dms1_address, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_address_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Address *self = MXF_DMS1_ADDRESS (object);
|
|
|
|
g_free (self->room_or_suite_number);
|
|
self->room_or_suite_number = NULL;
|
|
|
|
g_free (self->room_or_suite_name);
|
|
self->room_or_suite_name = NULL;
|
|
|
|
g_free (self->building_name);
|
|
self->building_name = NULL;
|
|
|
|
g_free (self->street_number);
|
|
self->street_number = NULL;
|
|
|
|
g_free (self->street_name);
|
|
self->street_name = NULL;
|
|
|
|
g_free (self->postal_town);
|
|
self->postal_town = NULL;
|
|
|
|
g_free (self->city);
|
|
self->city = NULL;
|
|
|
|
g_free (self->state_or_province_or_country);
|
|
self->state_or_province_or_country = NULL;
|
|
|
|
g_free (self->postal_code);
|
|
self->postal_code = NULL;
|
|
|
|
g_free (self->country);
|
|
self->country = NULL;
|
|
|
|
g_free (self->astronomical_body_name);
|
|
self->astronomical_body_name = NULL;
|
|
|
|
g_free (self->communications_sets_uids);
|
|
self->communications_sets_uids = NULL;
|
|
|
|
g_free (self->communications_sets);
|
|
self->communications_sets = NULL;
|
|
|
|
g_free (self->name_value_sets_uids);
|
|
self->name_value_sets_uids = NULL;
|
|
|
|
g_free (self->name_value_sets);
|
|
self->name_value_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_address_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_address_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Address *self = MXF_DMS1_ADDRESS (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->communications_sets)
|
|
memset (self->communications_sets, 0,
|
|
sizeof (gpointer) * self->n_communications_sets);
|
|
else
|
|
self->communications_sets =
|
|
g_new0 (MXFDMS1Communications *, self->n_communications_sets);
|
|
|
|
if (self->name_value_sets)
|
|
memset (self->name_value_sets, 0,
|
|
sizeof (gpointer) * self->n_name_value_sets);
|
|
else
|
|
self->name_value_sets =
|
|
g_new0 (MXFDMS1NameValue *, self->n_name_value_sets);
|
|
|
|
for (i = 0; i < self->n_communications_sets; i++) {
|
|
current =
|
|
g_hash_table_lookup (metadata, &self->communications_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_COMMUNICATIONS (current)) {
|
|
self->communications_sets[i] = MXF_DMS1_COMMUNICATIONS (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->name_value_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_NAME_VALUE (current)) {
|
|
self->name_value_sets[i] = MXF_DMS1_NAME_VALUE (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_address_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_address_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Address *self = MXF_DMS1_ADDRESS (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 room_or_suite_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x01, 0x01
|
|
};
|
|
static const guint8 room_or_suite_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x11, 0x01
|
|
};
|
|
static const guint8 building_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x12, 0x01
|
|
};
|
|
static const guint8 place_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x14, 0x01
|
|
};
|
|
static const guint8 street_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x02, 0x01
|
|
};
|
|
static const guint8 street_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x03, 0x01
|
|
};
|
|
static const guint8 postal_town_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x04, 0x01
|
|
};
|
|
static const guint8 city_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x05, 0x01
|
|
};
|
|
static const guint8 state_or_province_or_country_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x06, 0x01
|
|
};
|
|
static const guint8 postal_code_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x07, 0x01
|
|
};
|
|
static const guint8 country_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x08, 0x01
|
|
};
|
|
static const guint8 geographical_coordinate_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x15, 0x01
|
|
};
|
|
static const guint8 astronomical_body_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x07,
|
|
0x01, 0x20, 0x01, 0x04, 0x01, 0x16, 0x01
|
|
};
|
|
static const guint8 communications_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x19, 0x00
|
|
};
|
|
static const guint8 name_value_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x07, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1f, 0x04
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &room_or_suite_name_ul, 16) == 0) {
|
|
self->room_or_suite_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" room or suite name = %s",
|
|
GST_STR_NULL (self->room_or_suite_name));
|
|
} else if (memcmp (tag_ul, &room_or_suite_number_ul, 16) == 0) {
|
|
self->room_or_suite_number = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" room or suite number = %s",
|
|
GST_STR_NULL (self->room_or_suite_number));
|
|
} else if (memcmp (tag_ul, &building_name_ul, 16) == 0) {
|
|
self->building_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" building name = %s", GST_STR_NULL (self->building_name));
|
|
} else if (memcmp (tag_ul, &place_name_ul, 16) == 0) {
|
|
self->place_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" place name = %s", GST_STR_NULL (self->place_name));
|
|
} else if (memcmp (tag_ul, &street_number_ul, 16) == 0) {
|
|
self->street_number = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" street number = %s", GST_STR_NULL (self->street_number));
|
|
} else if (memcmp (tag_ul, &street_name_ul, 16) == 0) {
|
|
self->street_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" street name = %s", GST_STR_NULL (self->street_name));
|
|
} else if (memcmp (tag_ul, &postal_town_ul, 16) == 0) {
|
|
self->postal_town = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" postal town = %s", GST_STR_NULL (self->postal_town));
|
|
} else if (memcmp (tag_ul, &city_ul, 16) == 0) {
|
|
self->city = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" city = %s", GST_STR_NULL (self->city));
|
|
} else if (memcmp (tag_ul, &state_or_province_or_country_ul, 16) == 0) {
|
|
self->state_or_province_or_country = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" state or province or country = %s",
|
|
GST_STR_NULL (self->state_or_province_or_country));
|
|
} else if (memcmp (tag_ul, &postal_code_ul, 16) == 0) {
|
|
self->postal_code = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" postal code = %s", GST_STR_NULL (self->postal_code));
|
|
} else if (memcmp (tag_ul, &country_ul, 16) == 0) {
|
|
self->country = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" country = %s", GST_STR_NULL (self->country));
|
|
} else if (memcmp (tag_ul, &geographical_coordinate_ul, 16) == 0) {
|
|
if (tag_size != 12)
|
|
goto error;
|
|
|
|
memcpy (&self->geographical_coordinate, tag_data, 12);
|
|
/* TODO implement */
|
|
} else if (memcmp (tag_ul, &astronomical_body_name_ul, 16) == 0) {
|
|
self->astronomical_body_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" astronomical body name = %s",
|
|
GST_STR_NULL (self->astronomical_body_name));
|
|
} else if (memcmp (tag_ul, &communications_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->communications_sets_uids,
|
|
&self->n_communications_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of communications sets = %u",
|
|
self->n_communications_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_communications_sets; i++) {
|
|
GST_DEBUG (" communications sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->communications_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &name_value_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->name_value_sets_uids,
|
|
&self->n_name_value_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of name-value sets = %u", self->n_name_value_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
GST_DEBUG (" name-value sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->name_value_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_address_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 address local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_address_init (MXFDMS1Address * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_address_class_init (MXFDMS1AddressClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_address_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_address_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_address_resolve;
|
|
dm_class->type = 0x1b0100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Communications, mxf_dms1_communications, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_communications_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Communications *self = MXF_DMS1_COMMUNICATIONS (object);
|
|
|
|
g_free (self->email_address);
|
|
self->email_address = NULL;
|
|
|
|
g_free (self->web_page);
|
|
self->web_page = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_communications_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_communications_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Communications *self = MXF_DMS1_COMMUNICATIONS (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 central_telephone_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x04, 0x00
|
|
};
|
|
static const guint8 telephone_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x01, 0x00
|
|
};
|
|
static const guint8 mobile_telephone_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x05, 0x00
|
|
};
|
|
static const guint8 fax_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x02, 0x00
|
|
};
|
|
static const guint8 email_address_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x03, 0x01
|
|
};
|
|
static const guint8 web_page_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x07,
|
|
0x01, 0x20, 0x01, 0x10, 0x03, 0x06, 0x01
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, ¢ral_telephone_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
memcpy (self->central_telephone_number, tag_data, tag_size);
|
|
|
|
GST_DEBUG (" central telephone number = %s",
|
|
self->central_telephone_number);
|
|
} else if (memcmp (tag_ul, &telephone_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
memcpy (self->telephone_number, tag_data, tag_size);
|
|
|
|
GST_DEBUG (" telephone number = %s", self->telephone_number);
|
|
} else if (memcmp (tag_ul, &mobile_telephone_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
memcpy (self->mobile_telephone_number, tag_data, tag_size);
|
|
|
|
GST_DEBUG (" mobile telephone number = %s", self->mobile_telephone_number);
|
|
} else if (memcmp (tag_ul, &fax_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
memcpy (self->fax_number, tag_data, tag_size);
|
|
|
|
GST_DEBUG (" fax number = %s", self->fax_number);
|
|
} else if (memcmp (tag_ul, &email_address_ul, 16) == 0) {
|
|
self->email_address = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" email address = %s", GST_STR_NULL (self->email_address));
|
|
} else if (memcmp (tag_ul, &web_page_ul, 16) == 0) {
|
|
self->web_page = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" web page = %s", GST_STR_NULL (self->web_page));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_communications_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 communications local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_communications_init (MXFDMS1Communications * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_communications_class_init (MXFDMS1CommunicationsClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_communications_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_communications_handle_tag;
|
|
dm_class->type = 0x1b0200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Contract, mxf_dms1_contract, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_contract_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Contract *self = MXF_DMS1_CONTRACT (object);
|
|
|
|
g_free (self->rights_sets_uids);
|
|
self->rights_sets_uids = NULL;
|
|
|
|
g_free (self->rights_sets);
|
|
self->rights_sets = NULL;
|
|
|
|
g_free (self->participant_sets_uids);
|
|
self->participant_sets_uids = NULL;
|
|
|
|
g_free (self->participant_sets);
|
|
self->participant_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_contract_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contract_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1Contract *self = MXF_DMS1_CONTRACT (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->rights_sets)
|
|
memset (self->rights_sets, 0, sizeof (gpointer) * self->n_rights_sets);
|
|
else
|
|
self->rights_sets = g_new0 (MXFDMS1Rights *, self->n_rights_sets);
|
|
|
|
if (self->participant_sets)
|
|
memset (self->participant_sets, 0,
|
|
sizeof (gpointer) * self->n_participant_sets);
|
|
else
|
|
self->participant_sets =
|
|
g_new0 (MXFDMS1Participant *, self->n_participant_sets);
|
|
|
|
for (i = 0; i < self->n_rights_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->rights_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_RIGHTS (current)) {
|
|
self->rights_sets[i] = MXF_DMS1_RIGHTS (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->participant_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PARTICIPANT (current)) {
|
|
self->participant_sets[i] = MXF_DMS1_PARTICIPANT (current);
|
|
}
|
|
}
|
|
|
|
return MXF_METADATA_BASE_CLASS (mxf_dms1_contract_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contract_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Contract *self = MXF_DMS1_CONTRACT (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 supply_contract_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x02,
|
|
0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 rights_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1a, 0x00
|
|
};
|
|
static const guint8 participant_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x13, 0x02
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &supply_contract_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->supply_contract_number, tag_data, tag_size);
|
|
GST_DEBUG (" supply contract number = %s", self->supply_contract_number);
|
|
} else if (memcmp (tag_ul, &rights_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->rights_sets_uids, &self->n_rights_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of rights sets = %u", self->n_rights_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_rights_sets; i++) {
|
|
GST_DEBUG (" rights sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->rights_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &participant_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->participant_sets_uids,
|
|
&self->n_participant_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of participant sets = %u", self->n_participant_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_participant_sets; i++) {
|
|
GST_DEBUG (" participant sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->participant_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_contract_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 contract local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contract_init (MXFDMS1Contract * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contract_class_init (MXFDMS1ContractClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_contract_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_contract_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_contract_resolve;
|
|
dm_class->type = 0x1c0100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Rights, mxf_dms1_rights, MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_rights_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Rights *self = MXF_DMS1_RIGHTS (object);
|
|
|
|
g_free (self->copyright_owner);
|
|
self->copyright_owner = NULL;
|
|
|
|
g_free (self->rights_holder);
|
|
self->rights_holder = NULL;
|
|
|
|
g_free (self->rights_managment_authority);
|
|
self->rights_managment_authority = NULL;
|
|
|
|
g_free (self->region_or_area_of_ip_license);
|
|
self->region_or_area_of_ip_license = NULL;
|
|
|
|
g_free (self->intellectual_property_type);
|
|
self->intellectual_property_type = NULL;
|
|
|
|
g_free (self->right_condition);
|
|
self->right_condition = NULL;
|
|
|
|
g_free (self->right_remarks);
|
|
self->right_remarks = NULL;
|
|
|
|
g_free (self->intellectual_property_right);
|
|
self->intellectual_property_right = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_rights_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_rights_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Rights *self = MXF_DMS1_RIGHTS (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[32];
|
|
#endif
|
|
static const guint8 copyright_owner_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 rights_holder_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 rights_managment_authority_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 region_or_area_of_ip_license_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x07,
|
|
0x01, 0x20, 0x01, 0x03, 0x05, 0x01, 0x00
|
|
};
|
|
static const guint8 intellectual_property_type_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 right_condition_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 right_remarks_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x08, 0x02,
|
|
0x05, 0x04, 0x04, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 intellectual_property_right_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x02,
|
|
0x05, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 rights_start_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x20, 0x02, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 rights_stop_date_and_time_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x07,
|
|
0x02, 0x01, 0x20, 0x03, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 maximum_number_of_usages_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x02,
|
|
0x05, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, ©right_owner_ul, 16) == 0) {
|
|
self->copyright_owner = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" copyright owner = %s", GST_STR_NULL (self->copyright_owner));
|
|
} else if (memcmp (tag_ul, &rights_holder_ul, 16) == 0) {
|
|
self->rights_holder = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" rights holder = %s", GST_STR_NULL (self->rights_holder));
|
|
} else if (memcmp (tag_ul, &rights_managment_authority_ul, 16) == 0) {
|
|
self->rights_managment_authority = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" rights managment authority = %s",
|
|
GST_STR_NULL (self->rights_managment_authority));
|
|
} else if (memcmp (tag_ul, ®ion_or_area_of_ip_license_ul, 16) == 0) {
|
|
self->region_or_area_of_ip_license = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" region or area of ip license = %s",
|
|
GST_STR_NULL (self->region_or_area_of_ip_license));
|
|
} else if (memcmp (tag_ul, &intellectual_property_type_ul, 16) == 0) {
|
|
self->intellectual_property_type = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" intellectual property type = %s",
|
|
GST_STR_NULL (self->intellectual_property_type));
|
|
} else if (memcmp (tag_ul, &right_condition_ul, 16) == 0) {
|
|
self->right_condition = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" right condition = %s", GST_STR_NULL (self->right_condition));
|
|
} else if (memcmp (tag_ul, &right_remarks_ul, 16) == 0) {
|
|
self->right_remarks = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" right remarks = %s", GST_STR_NULL (self->right_remarks));
|
|
} else if (memcmp (tag_ul, &intellectual_property_right_ul, 16) == 0) {
|
|
self->intellectual_property_right = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" intellectual property right = %s",
|
|
GST_STR_NULL (self->intellectual_property_right));
|
|
} else if (memcmp (tag_ul, &rights_start_date_and_time_ul, 16) == 0) {
|
|
if (!mxf_timestamp_parse (&self->rights_start_date_and_time, tag_data,
|
|
tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" rights start date and time = %s",
|
|
mxf_timestamp_to_string (&self->rights_start_date_and_time, str));
|
|
} else if (memcmp (tag_ul, &rights_stop_date_and_time_ul, 16) == 0) {
|
|
if (!mxf_timestamp_parse (&self->rights_stop_date_and_time, tag_data,
|
|
tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" rights stop date and time = %s",
|
|
mxf_timestamp_to_string (&self->rights_stop_date_and_time, str));
|
|
} else if (memcmp (tag_ul, &maximum_number_of_usages_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->maximum_number_of_usages = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" maximum number of usages = %u",
|
|
self->maximum_number_of_usages);
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_rights_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 rights local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_rights_init (MXFDMS1Rights * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_rights_class_init (MXFDMS1RightsClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_rights_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_rights_handle_tag;
|
|
dm_class->type = 0x1c0200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1PictureFormat, mxf_dms1_picture_format, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_picture_format_finalize (GObject * object)
|
|
{
|
|
MXFDMS1PictureFormat *self = MXF_DMS1_PICTURE_FORMAT (object);
|
|
|
|
g_free (self->colour_descriptor);
|
|
self->colour_descriptor = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_picture_format_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_picture_format_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1PictureFormat *self = MXF_DMS1_PICTURE_FORMAT (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 viewport_aspect_ratio_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, 0x04,
|
|
0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 perceived_display_format_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x04,
|
|
0x01, 0x01, 0x01, 0x08, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 colour_descriptor_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x03,
|
|
0x02, 0x01, 0x06, 0x04, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &viewport_aspect_ratio_ul, 16) == 0) {
|
|
if (!mxf_fraction_parse (&self->viewport_aspect_ratio, tag_data, tag_size))
|
|
goto error;
|
|
|
|
GST_DEBUG (" viewport aspect ratio = %u/%u", self->viewport_aspect_ratio.n,
|
|
self->viewport_aspect_ratio.d);
|
|
} else if (memcmp (tag_ul, &perceived_display_format_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->perceived_display_format, tag_data, tag_size);
|
|
GST_DEBUG (" perceived display format = %s",
|
|
self->perceived_display_format);
|
|
} else if (memcmp (tag_ul, &colour_descriptor_ul, 16) == 0) {
|
|
self->colour_descriptor = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" colour descriptor = %s",
|
|
GST_STR_NULL (self->colour_descriptor));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_picture_format_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 picture format local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_picture_format_init (MXFDMS1PictureFormat * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_picture_format_class_init (MXFDMS1PictureFormatClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_picture_format_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_picture_format_handle_tag;
|
|
dm_class->type = 0x1d0100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1DeviceParameters, mxf_dms1_device_parameters,
|
|
MXF_TYPE_DMS1_THESAURUS);
|
|
|
|
static void
|
|
mxf_dms1_device_parameters_finalize (GObject * object)
|
|
{
|
|
MXFDMS1DeviceParameters *self = MXF_DMS1_DEVICE_PARAMETERS (object);
|
|
|
|
g_free (self->device_type);
|
|
self->device_type = NULL;
|
|
|
|
g_free (self->manufacturer);
|
|
self->manufacturer = NULL;
|
|
|
|
g_free (self->device_model);
|
|
self->device_model = NULL;
|
|
|
|
g_free (self->device_serial_number);
|
|
self->device_serial_number = NULL;
|
|
|
|
g_free (self->device_usage_description);
|
|
self->device_usage_description = NULL;
|
|
|
|
g_free (self->name_value_sets_uids);
|
|
self->name_value_sets_uids = NULL;
|
|
|
|
g_free (self->name_value_sets);
|
|
self->name_value_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_device_parameters_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_device_parameters_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1DeviceParameters *self = MXF_DMS1_DEVICE_PARAMETERS (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->name_value_sets)
|
|
memset (self->name_value_sets, 0,
|
|
sizeof (gpointer) * self->n_name_value_sets);
|
|
else
|
|
self->name_value_sets =
|
|
g_new0 (MXFDMS1NameValue *, self->n_name_value_sets);
|
|
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->name_value_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_NAME_VALUE (current)) {
|
|
self->name_value_sets[i] = MXF_DMS1_NAME_VALUE (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_device_parameters_parent_class)->resolve
|
|
(m, metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_device_parameters_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1DeviceParameters *self = MXF_DMS1_DEVICE_PARAMETERS (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 device_type_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x01, 0x20, 0x08, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 device_designation_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 device_asset_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x01, 0x20, 0x0c, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 ieee_device_identifier_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, 0x01,
|
|
0x01, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 manufacturer_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, 0x01,
|
|
0x0a, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 device_model_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x20, 0x03, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 device_serial_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
0x01, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 device_usage_description_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x03, 0x03, 0x10, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 name_value_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x05, 0x40, 0x1f, 0x03
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &device_type_ul, 16) == 0) {
|
|
self->device_type = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" device type = %s", GST_STR_NULL (self->device_type));
|
|
} else if (memcmp (tag_ul, &device_designation_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->device_designation, tag_data, tag_size);
|
|
GST_DEBUG (" device designation = %s", self->device_designation);
|
|
} else if (memcmp (tag_ul, &device_asset_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->device_asset_number, tag_data, tag_size);
|
|
GST_DEBUG (" device asset number = %s", self->device_asset_number);
|
|
} else if (memcmp (tag_ul, &ieee_device_identifier_ul, 16) == 0) {
|
|
if (tag_size != 6)
|
|
goto error;
|
|
|
|
memcpy (self->ieee_device_identifier, tag_data, 6);
|
|
GST_DEBUG
|
|
(" IEEE device identifier = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x",
|
|
self->ieee_device_identifier[0], self->ieee_device_identifier[1],
|
|
self->ieee_device_identifier[2], self->ieee_device_identifier[3],
|
|
self->ieee_device_identifier[4], self->ieee_device_identifier[5]);
|
|
} else if (memcmp (tag_ul, &manufacturer_ul, 16) == 0) {
|
|
self->manufacturer = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" manufacturer = %s", GST_STR_NULL (self->manufacturer));
|
|
} else if (memcmp (tag_ul, &device_model_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->device_model, tag_data, tag_size);
|
|
GST_DEBUG (" device model = %s", self->device_model);
|
|
} else if (memcmp (tag_ul, &device_serial_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->device_serial_number, tag_data, tag_size);
|
|
GST_DEBUG (" device serial number = %s", self->device_serial_number);
|
|
} else if (memcmp (tag_ul, &device_usage_description_ul, 16) == 0) {
|
|
self->device_usage_description = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" device usage description = %s",
|
|
GST_STR_NULL (self->device_usage_description));
|
|
} else if (memcmp (tag_ul, &name_value_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->name_value_sets_uids,
|
|
&self->n_name_value_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of name-value sets = %u", self->n_name_value_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_name_value_sets; i++) {
|
|
GST_DEBUG (" name-value sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->name_value_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_device_parameters_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 device parameters local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_device_parameters_init (MXFDMS1DeviceParameters * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_device_parameters_class_init (MXFDMS1DeviceParametersClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_device_parameters_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_device_parameters_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_device_parameters_resolve;
|
|
dm_class->type = 0x1e0100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1NameValue, mxf_dms1_name_value, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_name_value_finalize (GObject * object)
|
|
{
|
|
MXFDMS1NameValue *self = MXF_DMS1_NAME_VALUE (object);
|
|
|
|
g_free (self->item_name);
|
|
self->item_name = NULL;
|
|
|
|
g_free (self->item_value);
|
|
self->item_value = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_name_value_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_name_value_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1NameValue *self = MXF_DMS1_NAME_VALUE (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 item_name_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x01, 0x02, 0x0a, 0x01, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 item_value_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x03,
|
|
0x01, 0x02, 0x0a, 0x02, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 smpte_universal_label_locator_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x01,
|
|
0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &item_name_ul, 16) == 0) {
|
|
self->item_name = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" item name = %s", GST_STR_NULL (self->item_name));
|
|
} else if (memcmp (tag_ul, &item_value_ul, 16) == 0) {
|
|
self->item_value = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" item value = %s", GST_STR_NULL (self->item_value));
|
|
} else if (memcmp (tag_ul, &smpte_universal_label_locator_ul, 16) == 0) {
|
|
if (tag_size != 16)
|
|
goto error;
|
|
|
|
memcpy (&self->smpte_universal_label_locator, tag_data, 16);
|
|
GST_DEBUG (" SMPTE universal label locator = %s",
|
|
mxf_uuid_to_string (&self->smpte_universal_label_locator, str));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_name_value_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 name-value local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_name_value_init (MXFDMS1NameValue * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_name_value_class_init (MXFDMS1NameValueClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_name_value_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_name_value_handle_tag;
|
|
dm_class->type = 0x1f0100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Processing, mxf_dms1_processing, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_processing_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Processing *self = MXF_DMS1_PROCESSING (object);
|
|
|
|
g_free (self->descriptive_comment);
|
|
self->descriptive_comment = NULL;
|
|
|
|
g_free (self->graphic_usage_type);
|
|
self->graphic_usage_type = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_processing_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_processing_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1Processing *self = MXF_DMS1_PROCESSING (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 quality_flag_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x05,
|
|
0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 descriptive_comment_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x03,
|
|
0x02, 0x03, 0x02, 0x02, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 logo_flag_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x03, 0x05,
|
|
0x01, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 graphic_usage_type_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x05,
|
|
0x01, 0x01, 0x07, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 process_steps_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x05,
|
|
0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 generation_copy_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x05,
|
|
0x01, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 generation_clone_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x01, 0x05,
|
|
0x01, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &quality_flag_ul, 16) == 0) {
|
|
if (tag_size != 1)
|
|
goto error;
|
|
|
|
self->quality_flag = GST_READ_UINT8 (tag_data);
|
|
GST_DEBUG (" quality flag = %u", self->quality_flag);
|
|
} else if (memcmp (tag_ul, &descriptive_comment_ul, 16) == 0) {
|
|
self->descriptive_comment = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" descriptive comment = %s",
|
|
GST_STR_NULL (self->descriptive_comment));
|
|
} else if (memcmp (tag_ul, &logo_flag_ul, 16) == 0) {
|
|
if (tag_size != 1)
|
|
goto error;
|
|
|
|
self->logo_flag = GST_READ_UINT8 (tag_data);
|
|
GST_DEBUG (" logo flag = %u", self->logo_flag);
|
|
} else if (memcmp (tag_ul, &graphic_usage_type_ul, 16) == 0) {
|
|
self->graphic_usage_type = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" graphic usage type = %s",
|
|
GST_STR_NULL (self->graphic_usage_type));
|
|
} else if (memcmp (tag_ul, &process_steps_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->process_steps = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" process steps = %u", self->process_steps);
|
|
} else if (memcmp (tag_ul, &generation_copy_number_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->generation_copy_number = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" generation copy number = %u", self->generation_copy_number);
|
|
} else if (memcmp (tag_ul, &generation_clone_number_ul, 16) == 0) {
|
|
if (tag_size != 2)
|
|
goto error;
|
|
|
|
self->generation_clone_number = GST_READ_UINT16_BE (tag_data);
|
|
GST_DEBUG (" generation clone number = %u", self->generation_clone_number);
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_processing_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 processing local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_processing_init (MXFDMS1Processing * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_processing_class_init (MXFDMS1ProcessingClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_processing_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_processing_handle_tag;
|
|
dm_class->type = 0x200100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1Project, mxf_dms1_project, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_project_finalize (GObject * object)
|
|
{
|
|
MXFDMS1Project *self = MXF_DMS1_PROJECT (object);
|
|
|
|
g_free (self->project_name_or_title);
|
|
self->project_name_or_title = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_project_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_project_handle_tag (MXFMetadataBase * metadata, MXFPrimerPack * primer,
|
|
guint16 tag, const guint8 * tag_data, guint tag_size)
|
|
{
|
|
MXFDMS1Project *self = MXF_DMS1_PROJECT (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 project_number_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, 0x01,
|
|
0x03, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
static const guint8 project_name_or_title_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x01,
|
|
0x03, 0x01, 0x08, 0x01, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &project_number_ul, 16) == 0) {
|
|
if (tag_size > 32)
|
|
goto error;
|
|
|
|
memcpy (self->project_number, tag_data, tag_size);
|
|
|
|
GST_DEBUG (" project number = %s", self->project_number);
|
|
} else if (memcmp (tag_ul, &project_name_or_title_ul, 16) == 0) {
|
|
self->project_name_or_title = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" project name or title = %s",
|
|
GST_STR_NULL (self->project_name_or_title));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_project_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 project local tag 0x%04x of size %u", tag, tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_project_init (MXFDMS1Project * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_project_class_init (MXFDMS1ProjectClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_project_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_project_handle_tag;
|
|
dm_class->type = 0x200200;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1ContactsList, mxf_dms1_contacts_list, MXF_TYPE_DMS1);
|
|
|
|
static void
|
|
mxf_dms1_contacts_list_finalize (GObject * object)
|
|
{
|
|
MXFDMS1ContactsList *self = MXF_DMS1_CONTACTS_LIST (object);
|
|
|
|
g_free (self->person_sets_uids);
|
|
self->person_sets_uids = NULL;
|
|
|
|
g_free (self->person_sets);
|
|
self->person_sets = NULL;
|
|
|
|
g_free (self->organisation_sets_uids);
|
|
self->organisation_sets_uids = NULL;
|
|
|
|
g_free (self->organisation_sets);
|
|
self->organisation_sets = NULL;
|
|
|
|
g_free (self->location_sets_uids);
|
|
self->location_sets_uids = NULL;
|
|
|
|
g_free (self->location_sets);
|
|
self->location_sets = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_contacts_list_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contacts_list_resolve (MXFMetadataBase * m, GHashTable * metadata)
|
|
{
|
|
MXFDMS1ContactsList *self = MXF_DMS1_CONTACTS_LIST (m);
|
|
MXFMetadataBase *current = NULL;
|
|
guint i;
|
|
|
|
if (self->person_sets)
|
|
memset (self->person_sets, 0, sizeof (gpointer) * self->n_person_sets);
|
|
else
|
|
self->person_sets = g_new0 (MXFDMS1Person *, self->n_person_sets);
|
|
|
|
if (self->organisation_sets)
|
|
memset (self->organisation_sets, 0,
|
|
sizeof (gpointer) * self->n_organisation_sets);
|
|
else
|
|
self->organisation_sets =
|
|
g_new0 (MXFDMS1Organisation *, self->n_organisation_sets);
|
|
|
|
if (self->location_sets)
|
|
memset (self->location_sets, 0, sizeof (gpointer) * self->n_location_sets);
|
|
else
|
|
self->location_sets = g_new0 (MXFDMS1Location *, self->n_location_sets);
|
|
|
|
for (i = 0; i < self->n_person_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->person_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_PERSON (current)) {
|
|
self->person_sets[i] = MXF_DMS1_PERSON (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->organisation_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_ORGANISATION (current)) {
|
|
self->organisation_sets[i] = MXF_DMS1_ORGANISATION (current);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < self->n_location_sets; i++) {
|
|
current = g_hash_table_lookup (metadata, &self->location_sets_uids[i]);
|
|
if (current && MXF_IS_DMS1_LOCATION (current)) {
|
|
self->location_sets[i] = MXF_DMS1_LOCATION (current);
|
|
}
|
|
}
|
|
|
|
return
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_contacts_list_parent_class)->resolve (m,
|
|
metadata);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_contacts_list_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1ContactsList *self = MXF_DMS1_CONTACTS_LIST (metadata);
|
|
gboolean ret = TRUE;
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
gchar str[48];
|
|
#endif
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 person_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x14, 0x00
|
|
};
|
|
static const guint8 organisation_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x15, 0x00
|
|
};
|
|
static const guint8 location_sets_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x06,
|
|
0x01, 0x01, 0x04, 0x03, 0x40, 0x16, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &person_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->person_sets_uids, &self->n_person_sets,
|
|
tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of person sets = %u", self->n_person_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_person_sets; i++) {
|
|
GST_DEBUG (" person sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->person_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &organisation_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->organisation_sets_uids,
|
|
&self->n_organisation_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of organisation sets = %u", self->n_organisation_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_organisation_sets; i++) {
|
|
GST_DEBUG (" organisation sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->organisation_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else if (memcmp (tag_ul, &location_sets_ul, 16) == 0) {
|
|
if (!mxf_uuid_array_parse (&self->location_sets_uids,
|
|
&self->n_location_sets, tag_data, tag_size))
|
|
goto error;
|
|
GST_DEBUG (" number of location sets = %u", self->n_location_sets);
|
|
#ifndef GST_DISABLE_GST_DEBUG
|
|
{
|
|
guint i;
|
|
for (i = 0; i < self->n_location_sets; i++) {
|
|
GST_DEBUG (" location sets %u = %s", i,
|
|
mxf_uuid_to_string (&self->location_sets_uids[i], str));
|
|
}
|
|
}
|
|
#endif
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS
|
|
(mxf_dms1_contacts_list_parent_class)->handle_tag (metadata, primer,
|
|
tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
GST_ERROR ("Invalid DMS1 contacts list local tag 0x%04x of size %u", tag,
|
|
tag_size);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contacts_list_init (MXFDMS1ContactsList * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_contacts_list_class_init (MXFDMS1ContactsListClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_contacts_list_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_contacts_list_handle_tag;
|
|
metadatabase_class->resolve = mxf_dms1_contacts_list_resolve;
|
|
dm_class->type = 0x190100;
|
|
}
|
|
|
|
G_DEFINE_TYPE (MXFDMS1CueWords, mxf_dms1_cue_words,
|
|
MXF_TYPE_DMS1_TEXT_LANGUAGE);
|
|
|
|
static void
|
|
mxf_dms1_cue_words_finalize (GObject * object)
|
|
{
|
|
MXFDMS1CueWords *self = MXF_DMS1_CUE_WORDS (object);
|
|
|
|
g_free (self->in_cue_words);
|
|
self->in_cue_words = NULL;
|
|
|
|
g_free (self->out_cue_words);
|
|
self->out_cue_words = NULL;
|
|
|
|
G_OBJECT_CLASS (mxf_dms1_cue_words_parent_class)->finalize (object);
|
|
}
|
|
|
|
static gboolean
|
|
mxf_dms1_cue_words_handle_tag (MXFMetadataBase * metadata,
|
|
MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data,
|
|
guint tag_size)
|
|
{
|
|
MXFDMS1CueWords *self = MXF_DMS1_CUE_WORDS (metadata);
|
|
gboolean ret = TRUE;
|
|
MXFUL *tag_ul = NULL;
|
|
static const guint8 in_cue_words_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x01, 0x02, 0x0d, 0x01, 0x00, 0x00
|
|
};
|
|
static const guint8 out_cue_words_ul[] = {
|
|
0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x04, 0x03,
|
|
0x02, 0x01, 0x02, 0x0e, 0x01, 0x00, 0x00
|
|
};
|
|
|
|
if (!(tag_ul =
|
|
(MXFUL *) g_hash_table_lookup (primer->mappings,
|
|
GUINT_TO_POINTER (((guint) tag)))))
|
|
return FALSE;
|
|
|
|
if (memcmp (tag_ul, &in_cue_words_ul, 16) == 0) {
|
|
self->in_cue_words = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" in cue words = %s", GST_STR_NULL (self->in_cue_words));
|
|
} else if (memcmp (tag_ul, &out_cue_words_ul, 16) == 0) {
|
|
self->out_cue_words = mxf_utf16_to_utf8 (tag_data, tag_size);
|
|
GST_DEBUG (" out cue words = %s", GST_STR_NULL (self->out_cue_words));
|
|
} else {
|
|
ret =
|
|
MXF_METADATA_BASE_CLASS (mxf_dms1_cue_words_parent_class)->handle_tag
|
|
(metadata, primer, tag, tag_data, tag_size);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_cue_words_init (MXFDMS1CueWords * self)
|
|
{
|
|
}
|
|
|
|
static void
|
|
mxf_dms1_cue_words_class_init (MXFDMS1CueWordsClass * klass)
|
|
{
|
|
GObjectClass *object_class = (GObjectClass *) klass;
|
|
MXFMetadataBaseClass *metadatabase_class = (MXFMetadataBaseClass *) klass;
|
|
MXFDescriptiveMetadataClass *dm_class = (MXFDescriptiveMetadataClass *) klass;
|
|
|
|
object_class->finalize = mxf_dms1_cue_words_finalize;
|
|
metadatabase_class->handle_tag = mxf_dms1_cue_words_handle_tag;
|
|
dm_class->type = 0x170800;
|
|
}
|
|
|
|
#define _add_dm_type(type) G_STMT_START { \
|
|
GType tmp = type; \
|
|
\
|
|
g_array_append_val (dms1_sets, tmp); \
|
|
} G_STMT_END
|
|
|
|
void
|
|
mxf_dms1_initialize (void)
|
|
{
|
|
GArray *dms1_sets = g_array_new (TRUE, TRUE, sizeof (GType));
|
|
|
|
_add_dm_type (MXF_TYPE_DMS1_PRODUCTION_FRAMEWORK);
|
|
_add_dm_type (MXF_TYPE_DMS1_CLIP_FRAMEWORK);
|
|
_add_dm_type (MXF_TYPE_DMS1_SCENE_FRAMEWORK);
|
|
_add_dm_type (MXF_TYPE_DMS1_TITLES);
|
|
_add_dm_type (MXF_TYPE_DMS1_IDENTIFICATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_GROUP_RELATIONSHIP);
|
|
_add_dm_type (MXF_TYPE_DMS1_BRANDING);
|
|
_add_dm_type (MXF_TYPE_DMS1_EVENT);
|
|
_add_dm_type (MXF_TYPE_DMS1_PUBLICATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_AWARD);
|
|
_add_dm_type (MXF_TYPE_DMS1_CAPTIONS_DESCRIPTION);
|
|
_add_dm_type (MXF_TYPE_DMS1_ANNOTATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_SETTING_PERIOD);
|
|
_add_dm_type (MXF_TYPE_DMS1_SCRIPTING);
|
|
_add_dm_type (MXF_TYPE_DMS1_CLASSIFICATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_SHOT);
|
|
_add_dm_type (MXF_TYPE_DMS1_KEY_POINT);
|
|
_add_dm_type (MXF_TYPE_DMS1_PARTICIPANT);
|
|
_add_dm_type (MXF_TYPE_DMS1_PERSON);
|
|
_add_dm_type (MXF_TYPE_DMS1_ORGANISATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_LOCATION);
|
|
_add_dm_type (MXF_TYPE_DMS1_ADDRESS);
|
|
_add_dm_type (MXF_TYPE_DMS1_COMMUNICATIONS);
|
|
_add_dm_type (MXF_TYPE_DMS1_CONTRACT);
|
|
_add_dm_type (MXF_TYPE_DMS1_RIGHTS);
|
|
_add_dm_type (MXF_TYPE_DMS1_PICTURE_FORMAT);
|
|
_add_dm_type (MXF_TYPE_DMS1_DEVICE_PARAMETERS);
|
|
_add_dm_type (MXF_TYPE_DMS1_NAME_VALUE);
|
|
_add_dm_type (MXF_TYPE_DMS1_PROCESSING);
|
|
_add_dm_type (MXF_TYPE_DMS1_PROJECT);
|
|
_add_dm_type (MXF_TYPE_DMS1_CONTACTS_LIST);
|
|
_add_dm_type (MXF_TYPE_DMS1_CUE_WORDS);
|
|
|
|
mxf_descriptive_metadata_register (0x01, (GType *) g_array_free (dms1_sets,
|
|
FALSE));
|
|
}
|
|
|
|
#undef _add_dm_type
|
|
|
|
#undef ADD_SET
|