mxfdemux: Post structural metadata tree as tag on the bus

This will later be used to keep the structural metadata when
remuxing an MXF file and can also be used in Pitivi for example
to know the file structure and to select what should be used
and played.
This commit is contained in:
Sebastian Dröge 2009-02-21 17:38:49 +01:00
parent a9461b9818
commit acc6a316ce
10 changed files with 1854 additions and 6 deletions

View file

@ -2,6 +2,7 @@ plugin_LTLIBRARIES = libgstmxf.la
libgstmxf_la_SOURCES = \
mxf.c \
mxfquark.c \
mxfdemux.c \
mxfparse.c \
mxfaes-bwf.c \
@ -21,6 +22,7 @@ libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
libgstmxf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_HEADERS = \
mxfquark.h \
mxfdemux.h \
mxfparse.h \
mxfaes-bwf.h \

View file

@ -22,6 +22,7 @@
#include <gst/gst.h>
#include "mxfquark.h"
#include "mxfdemux.h"
#include "mxfaes-bwf.h"
#include "mxfmpeg.h"
@ -41,12 +42,19 @@ mxf_init (void)
{
gst_tag_register (GST_TAG_MXF_UMID, GST_TAG_FLAG_META,
G_TYPE_STRING, "UMID", "Unique Material Identifier", NULL);
gst_tag_register (GST_TAG_MXF_STRUCTURE, GST_TAG_FLAG_META,
GST_TYPE_STRUCTURE, "Structure", "Structural metadata of "
"the MXF file", NULL);
gst_tag_register (GST_TAG_MXF_DESCRIPTIVE_METADATA_FRAMEWORK,
GST_TAG_FLAG_META, GST_TYPE_STRUCTURE, "DM Framework",
"Descriptive metadata framework", NULL);
}
static gboolean
plugin_init (GstPlugin * plugin)
{
mxf_init ();
mxf_quark_initialize ();
mxf_metadata_init_types ();
mxf_aes_bwf_init ();
mxf_mpeg_init ();

View file

@ -36,6 +36,7 @@
#include <string.h>
#include "mxfaes-bwf.h"
#include "mxfquark.h"
GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
#define GST_CAT_DEFAULT mxf_debug
@ -231,6 +232,79 @@ error:
return FALSE;
}
static GstStructure *
mxf_metadata_wave_audio_essence_descriptor_to_structure (MXFMetadataBase * m)
{
GstStructure *ret =
MXF_METADATA_BASE_CLASS
(mxf_metadata_wave_audio_essence_descriptor_parent_class)->to_structure
(m);
MXFMetadataWaveAudioEssenceDescriptor *self =
MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR (m);
gchar str[48];
gst_structure_id_set (ret, MXF_QUARK (BLOCK_ALIGN), G_TYPE_UINT,
self->block_align, NULL);
if (self->sequence_offset)
gst_structure_id_set (ret, MXF_QUARK (SEQUENCE_OFFSET), G_TYPE_UCHAR,
self->sequence_offset, NULL);
if (self->avg_bps)
gst_structure_id_set (ret, MXF_QUARK (AVG_BPS), G_TYPE_UINT, self->avg_bps,
NULL);
if (!mxf_ul_is_zero (&self->channel_assignment)) {
gst_structure_id_set (ret, MXF_QUARK (CHANNEL_ASSIGNMENT), G_TYPE_STRING,
mxf_ul_to_string (&self->channel_assignment, str), NULL);
}
if (self->peak_envelope_version)
gst_structure_id_set (ret, MXF_QUARK (PEAK_ENVELOPE_VERSION), G_TYPE_UINT,
self->peak_envelope_version, NULL);
if (self->peak_envelope_format)
gst_structure_id_set (ret, MXF_QUARK (PEAK_ENVELOPE_FORMAT), G_TYPE_UINT,
self->peak_envelope_format, NULL);
if (self->points_per_peak_value)
gst_structure_id_set (ret, MXF_QUARK (POINTS_PER_PEAK_VALUE), G_TYPE_UINT,
self->points_per_peak_value, NULL);
if (self->peak_envelope_block_size)
gst_structure_id_set (ret, MXF_QUARK (PEAK_ENVELOPE_BLOCK_SIZE),
G_TYPE_UINT, self->peak_envelope_block_size, NULL);
if (self->peak_channels)
gst_structure_id_set (ret, MXF_QUARK (PEAK_CHANNELS), G_TYPE_UINT,
self->peak_channels, NULL);
if (self->peak_frames)
gst_structure_id_set (ret, MXF_QUARK (PEAK_FRAMES), G_TYPE_UINT,
self->peak_frames, NULL);
if (self->peak_of_peaks_position)
gst_structure_id_set (ret, MXF_QUARK (PEAK_OF_PEAKS_POSITION), G_TYPE_INT64,
self->peak_of_peaks_position, NULL);
if (!mxf_timestamp_is_unknown (&self->peak_envelope_timestamp))
gst_structure_id_set (ret, MXF_QUARK (PEAK_ENVELOPE_TIMESTAMP),
G_TYPE_STRING, mxf_timestamp_to_string (&self->peak_envelope_timestamp,
str), NULL);
if (self->peak_envelope_data) {
GstBuffer *buf = gst_buffer_new_and_alloc (self->peak_envelope_data_length);
memcpy (GST_BUFFER_DATA (buf), self->peak_envelope_data,
self->peak_envelope_data_length);
gst_structure_id_set (ret, MXF_QUARK (PEAK_ENVELOPE_DATA), GST_TYPE_BUFFER,
buf, NULL);
gst_buffer_unref (buf);
}
return ret;
}
static void
mxf_metadata_wave_audio_essence_descriptor_init
(MXFMetadataWaveAudioEssenceDescriptor * self)
@ -246,6 +320,9 @@ static void
metadata_base_class->handle_tag =
mxf_metadata_wave_audio_essence_descriptor_handle_tag;
metadata_base_class->name_quark = MXF_QUARK (WAVE_AUDIO_ESSENCE_DESCRIPTOR);
metadata_base_class->to_structure =
mxf_metadata_wave_audio_essence_descriptor_to_structure;
}
/* SMPTE 382M Annex 2 */
@ -511,6 +588,122 @@ error:
return FALSE;
}
static GstStructure *
mxf_metadata_aes3_audio_essence_descriptor_to_structure (MXFMetadataBase * m)
{
GstStructure *ret =
MXF_METADATA_BASE_CLASS
(mxf_metadata_aes3_audio_essence_descriptor_parent_class)->to_structure
(m);
MXFMetadataAES3AudioEssenceDescriptor *self =
MXF_METADATA_AES3_AUDIO_ESSENCE_DESCRIPTOR (m);
if (self->emphasis)
gst_structure_id_set (ret, MXF_QUARK (EMPHASIS), G_TYPE_UCHAR,
self->emphasis, NULL);
if (self->block_start_offset)
gst_structure_id_set (ret, MXF_QUARK (BLOCK_START_OFFSET), G_TYPE_UINT,
self->block_start_offset, NULL);
if (self->auxiliary_bits_mode)
gst_structure_id_set (ret, MXF_QUARK (AUXILIARY_BITS_MODE), G_TYPE_UCHAR,
self->auxiliary_bits_mode, NULL);
if (self->channel_status_mode) {
GstBuffer *buf = gst_buffer_new_and_alloc (self->n_channel_status_mode);
memcpy (GST_BUFFER_DATA (buf), self->channel_status_mode,
self->n_channel_status_mode);
gst_structure_id_set (ret, MXF_QUARK (CHANNEL_STATUS_MODE), GST_TYPE_BUFFER,
buf, NULL);
gst_buffer_unref (buf);
}
if (self->channel_status_mode) {
GstBuffer *buf = gst_buffer_new_and_alloc (self->n_channel_status_mode);
memcpy (GST_BUFFER_DATA (buf), self->channel_status_mode,
self->n_channel_status_mode);
gst_structure_id_set (ret, MXF_QUARK (CHANNEL_STATUS_MODE), GST_TYPE_BUFFER,
buf, NULL);
gst_buffer_unref (buf);
}
if (self->fixed_channel_status_data) {
guint i;
GValue va = { 0, }
, v = {
0,};
GstBuffer *buf;
g_value_init (&va, GST_TYPE_ARRAY);
for (i = 0; i < self->n_fixed_channel_status_data; i++) {
buf = gst_buffer_new_and_alloc (24);
g_value_init (&v, GST_TYPE_BUFFER);
memcpy (GST_BUFFER_DATA (buf), self->fixed_channel_status_data[i], 24);
gst_value_set_buffer (&v, buf);
gst_value_array_append_value (&va, &v);
gst_buffer_unref (buf);
g_value_unset (&v);
}
if (gst_value_array_get_size (&va) > 0)
gst_structure_id_set_value (ret, MXF_QUARK (FIXED_CHANNEL_STATUS_DATA),
&va);
g_value_unset (&va);
}
if (self->user_data_mode) {
GstBuffer *buf = gst_buffer_new_and_alloc (self->n_user_data_mode);
memcpy (GST_BUFFER_DATA (buf), self->user_data_mode,
self->n_user_data_mode);
gst_structure_id_set (ret, MXF_QUARK (USER_DATA_MODE), GST_TYPE_BUFFER, buf,
NULL);
gst_buffer_unref (buf);
}
if (self->fixed_user_data) {
guint i;
GValue va = { 0, }
, v = {
0,};
GstBuffer *buf;
g_value_init (&va, GST_TYPE_ARRAY);
for (i = 0; i < self->n_fixed_user_data; i++) {
buf = gst_buffer_new_and_alloc (24);
g_value_init (&v, GST_TYPE_BUFFER);
memcpy (GST_BUFFER_DATA (buf), self->fixed_user_data[i], 24);
gst_value_set_buffer (&v, buf);
gst_value_array_append_value (&va, &v);
gst_buffer_unref (buf);
g_value_unset (&v);
}
if (gst_value_array_get_size (&va) > 0)
gst_structure_id_set_value (ret, MXF_QUARK (FIXED_USER_DATA), &va);
g_value_unset (&va);
}
if (self->linked_timecode_track_id)
gst_structure_id_set (ret, MXF_QUARK (LINKED_TIMECODE_TRACK_ID),
G_TYPE_UINT, self->linked_timecode_track_id, NULL);
if (self->stream_number)
gst_structure_id_set (ret, MXF_QUARK (STREAM_NUMBER), G_TYPE_UCHAR,
self->stream_number, NULL);
return ret;
}
static void
mxf_metadata_aes3_audio_essence_descriptor_init
(MXFMetadataAES3AudioEssenceDescriptor * self)
@ -529,6 +722,9 @@ static void
mxf_metadata_aes3_audio_essence_descriptor_finalize;
metadata_base_class->handle_tag =
mxf_metadata_aes3_audio_essence_descriptor_handle_tag;
metadata_base_class->name_quark = MXF_QUARK (AES3_AUDIO_ESSENCE_DESCRIPTOR);
metadata_base_class->to_structure =
mxf_metadata_aes3_audio_essence_descriptor_to_structure;
}
static gboolean

View file

@ -498,6 +498,8 @@ gst_mxf_demux_resolve_references (GstMXFDemux * demux)
GList *l, *values;
#endif
MXFMetadataBase *m = NULL;
GstStructure *structure;
GstTagList *taglist;
GST_DEBUG_OBJECT (demux, "Resolve metadata references");
demux->update_metadata = FALSE;
@ -542,6 +544,14 @@ gst_mxf_demux_resolve_references (GstMXFDemux * demux)
demux->metadata_resolved = TRUE;
taglist = gst_tag_list_new ();
structure =
mxf_metadata_base_to_structure (MXF_METADATA_BASE (demux->preface));
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_MXF_STRUCTURE,
structure, NULL);
gst_element_found_tags (GST_ELEMENT (demux), taglist);
gst_structure_free (structure);
#if !GLIB_CHECK_VERSION (2, 16, 0)
g_list_free (values);
#endif
@ -812,7 +822,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
if (MXF_IS_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (track->
parent.descriptor[0]))
mxf_ul_to_string (&MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR
(track->parent.descriptor[0])->data_essence_compression,
(track->parent.descriptor[0])->data_essence_coding,
essence_compression);
name =

File diff suppressed because it is too large Load diff

View file

@ -385,6 +385,9 @@ struct _MXFMetadataBaseClass {
gboolean (*handle_tag) (MXFMetadataBase *self, MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint tag_size);
gboolean (*resolve) (MXFMetadataBase *self, GHashTable *metadata);
GstStructure * (*to_structure) (MXFMetadataBase *self);
GQuark name_quark;
};
struct _MXFMetadata {
@ -699,7 +702,7 @@ struct _MXFMetadataGenericSoundEssenceDescriptor {
struct _MXFMetadataGenericDataEssenceDescriptor {
MXFMetadataFileDescriptor parent;
MXFUL data_essence_compression;
MXFUL data_essence_coding;
};
struct _MXFMetadataMultipleDescriptor {
@ -747,6 +750,7 @@ struct _MXFDescriptiveMetadataFrameworkInterface {
gboolean mxf_metadata_base_parse (MXFMetadataBase *self, MXFPrimerPack *primer, const guint8 *data, guint size);
gboolean mxf_metadata_base_resolve (MXFMetadataBase *self, GHashTable *metadata);
GstStructure * mxf_metadata_base_to_structure (MXFMetadataBase *self);
MXFMetadata *mxf_metadata_new (guint16 type, MXFPrimerPack *primer, guint64 offset, const guint8 *data, guint size);
void mxf_metadata_register (guint16 type_id, GType type);

View file

@ -36,6 +36,7 @@
#include <string.h>
#include "mxfmpeg.h"
#include "mxfquark.h"
#include <gst/base/gstbytereader.h>
@ -210,6 +211,38 @@ error:
return FALSE;
}
static GstStructure *
mxf_metadata_mpeg_video_descriptor_to_structure (MXFMetadataBase * m)
{
GstStructure *ret =
MXF_METADATA_BASE_CLASS
(mxf_metadata_mpeg_video_descriptor_parent_class)->to_structure (m);
MXFMetadataMPEGVideoDescriptor *self = MXF_METADATA_MPEG_VIDEO_DESCRIPTOR (m);
gst_structure_id_set (ret, MXF_QUARK (SINGLE_SEQUENCE), G_TYPE_BOOLEAN,
self->single_sequence, MXF_QUARK (CONST_B_FRAMES), G_TYPE_BOOLEAN,
self->const_b_frames, MXF_QUARK (CODED_CONTENT_TYPE), G_TYPE_UCHAR,
self->coded_content_type, MXF_QUARK (LOW_DELAY), G_TYPE_BOOLEAN,
self->low_delay, MXF_QUARK (CLOSED_GOP), G_TYPE_BOOLEAN, self->closed_gop,
MXF_QUARK (IDENTICAL_GOP), G_TYPE_BOOLEAN, self->identical_gop,
MXF_QUARK (PROFILE_AND_LEVEL), G_TYPE_UCHAR, self->profile_and_level,
NULL);
if (self->max_gop)
gst_structure_id_set (ret, MXF_QUARK (MAX_GOP), G_TYPE_UINT, self->max_gop,
NULL);
if (self->b_picture_count)
gst_structure_id_set (ret, MXF_QUARK (B_PICTURE_COUNT), G_TYPE_UINT,
self->b_picture_count, NULL);
if (self->bitrate)
gst_structure_id_set (ret, MXF_QUARK (BITRATE), G_TYPE_UINT, self->bitrate,
NULL);
return ret;
}
static void
mxf_metadata_mpeg_video_descriptor_init (MXFMetadataMPEGVideoDescriptor * self)
{
@ -224,6 +257,9 @@ static void
metadata_base_class->handle_tag =
mxf_metadata_mpeg_video_descriptor_handle_tag;
metadata_base_class->name_quark = MXF_QUARK (MPEG_VIDEO_DESCRIPTOR);
metadata_base_class->to_structure =
mxf_metadata_mpeg_video_descriptor_to_structure;
}
typedef enum

211
gst/mxf/mxfquark.c Normal file
View file

@ -0,0 +1,211 @@
/* GStreamer
* Copyright (C) <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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "mxfquark.h"
static const gchar *_quark_strings[] = {
"instance-uid",
"generation-uid",
"other-tags",
"tag",
"data",
"preface",
"last-modified-date",
"version",
"object-model-version",
"primary-package",
"identifications",
"content-storage",
"operational-pattern",
"essence-containers",
"dm-schemes",
"identification",
"this-generation-uid",
"company-name",
"product-name",
"product-version",
"version-string",
"product-uid",
"modification-date",
"toolkit-version",
"platform",
"packages",
"essence-container-data",
"linked-package",
"index-sid",
"body-sid",
"package-uid",
"name",
"package-creation-date",
"package-modified-date",
"tracks",
"material-package",
"source-package",
"descriptor",
"track-id",
"track-number",
"track-name",
"sequence",
"timeline-track",
"edit-rate",
"origin",
"event-track",
"event-edit-rate",
"event-origin",
"static-track",
"data-definition",
"duration",
"structural-components",
"timecode-component",
"start-timecode",
"rounded-timecode-base",
"drop-frame",
"source-clip",
"start-position",
"source-track-id",
"dm-source-clip",
"track-ids",
"dm-segment",
"event-start-position",
"event-comment",
"dm-framework",
"locators",
"file-descriptor",
"linked-track-id",
"sample-rate",
"container-duration",
"essence-container",
"codec",
"generic-picture-essence-descriptor",
"signal-standard",
"frame-layout",
"stored-width",
"stored-height",
"stored-f2-offset",
"sampled-width",
"sampled-height",
"sampled-x-offset",
"sampled-y-offset",
"display-height",
"display-width",
"display-x-offset",
"display-y-offset",
"display-f2-offset",
"aspect-ratio",
"active-format-descriptor",
"video-line-map-0",
"video-line-map-1",
"alpha-transparency",
"capture-gamma",
"image-alignment-offset",
"image-start-offset",
"image-end-offset",
"field-dominance",
"picture-essence-coding",
"cdci-picture-essence-descriptor",
"component-depth",
"horizontal-subsampling",
"vertical-subsampling",
"color-siting",
"reversed-byte-order",
"padding-bits",
"alpha-sample-depth",
"black-ref-level",
"white-ref-level",
"color-range",
"rgba-picture-essence-descriptor",
"component-max-ref",
"component-min-ref",
"alpha-max-ref",
"alpha-min-ref",
"scanning-direction",
"pixel-layout",
"generic-sound-essence-descriptor",
"audio-sampling-rate",
"locked",
"audio-ref-level",
"electro-spatial-formulation",
"channel-count",
"quantization-bits",
"dial-norm",
"sound-essence-compression",
"generic-data-essence-descriptor",
"data-essence-coding",
"multiple-descriptor",
"sub-descriptors",
"text-locator",
"locator-name",
"network-locator",
"url-string",
"wave-audio-essence-descriptor",
"block-align",
"sequence-offset",
"avg-bps",
"channel-assignment",
"peak-envelope-version",
"peak-envelope-format",
"points-per-peak-value",
"peak-envelope-block-size",
"peak-channels",
"peak-frames",
"peak-of-peaks-position",
"peak-envelope-timestamp",
"peak-envelope-data",
"aes3-audio-essence-descriptor",
"emphasis",
"block-start-offset",
"auxiliary-bits-mode",
"channel-status-mode",
"fixed-channel-status-data",
"user-data-mode",
"fixed-user-data",
"linked-timecode-track-id",
"stream-number",
"mpeg-video-descriptor",
"single-sequence",
"const-b-frames",
"coded-content-type",
"low-delay",
"closed-gop",
"identical-gop",
"max-gop",
"b-picture-count",
"bitrate",
"profile-and-level",
};
GQuark _mxf_quark_table[MXF_QUARK_MAX];
void
mxf_quark_initialize (void)
{
gint i;
if (G_N_ELEMENTS (_quark_strings) != MXF_QUARK_MAX)
g_warning ("the quark table is not consistent! %d != %d",
(int) G_N_ELEMENTS (_quark_strings), MXF_QUARK_MAX);
for (i = 0; i < MXF_QUARK_MAX; i++) {
_mxf_quark_table[i] = g_quark_from_static_string (_quark_strings[i]);
}
}

204
gst/mxf/mxfquark.h Normal file
View file

@ -0,0 +1,204 @@
/* GStreamer
* Copyright (C) <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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __MXF_QUARK_H__
#define __MXF_QUARK_H__
#include <gst/gst.h>
typedef enum {
MXF_QUARK_INSTANCE_UID = 0,
MXF_QUARK_GENERATION_UID = 1,
MXF_QUARK_OTHER_TAGS = 2,
MXF_QUARK_TAG = 3,
MXF_QUARK_DATA = 4,
MXF_QUARK_PREFACE = 5,
MXF_QUARK_LAST_MODIFIED_DATE = 6,
MXF_QUARK_VERSION = 7,
MXF_QUARK_OBJECT_MODEL_VERSION = 8,
MXF_QUARK_PRIMARY_PACKAGE = 9,
MXF_QUARK_IDENTIFICATIONS = 10,
MXF_QUARK_CONTENT_STORAGE = 11,
MXF_QUARK_OPERATIONAL_PATTERN = 12,
MXF_QUARK_ESSENCE_CONTAINERS = 13,
MXF_QUARK_DM_SCHEMES = 14,
MXF_QUARK_IDENTIFICATION = 15,
MXF_QUARK_THIS_GENERATION_UID = 16,
MXF_QUARK_COMPANY_NAME = 17,
MXF_QUARK_PRODUCT_NAME = 18,
MXF_QUARK_PRODUCT_VERSION = 19,
MXF_QUARK_VERSION_STRING = 20,
MXF_QUARK_PRODUCT_UID = 21,
MXF_QUARK_MODIFICATION_DATE = 22,
MXF_QUARK_TOOLKIT_VERSION = 23,
MXF_QUARK_PLATFORM = 24,
MXF_QUARK_PACKAGES = 25,
MXF_QUARK_ESSENCE_CONTAINER_DATA = 26,
MXF_QUARK_LINKED_PACKAGE = 27,
MXF_QUARK_INDEX_SID = 28,
MXF_QUARK_BODY_SID = 29,
MXF_QUARK_PACKAGE_UID = 30,
MXF_QUARK_NAME = 31,
MXF_QUARK_PACKAGE_CREATION_DATE = 32,
MXF_QUARK_PACKAGE_MODIFIED_DATE = 33,
MXF_QUARK_TRACKS = 34,
MXF_QUARK_MATERIAL_PACKAGE = 35,
MXF_QUARK_SOURCE_PACKAGE = 36,
MXF_QUARK_DESCRIPTOR = 37,
MXF_QUARK_TRACK_ID = 38,
MXF_QUARK_TRACK_NUMBER = 39,
MXF_QUARK_TRACK_NAME = 40,
MXF_QUARK_SEQUENCE = 41,
MXF_QUARK_TIMELINE_TRACK = 42,
MXF_QUARK_EDIT_RATE = 43,
MXF_QUARK_ORIGIN = 44,
MXF_QUARK_EVENT_TRACK = 45,
MXF_QUARK_EVENT_EDIT_RATE = 46,
MXF_QUARK_EVENT_ORIGIN = 47,
MXF_QUARK_STATIC_TRACK = 48,
MXF_QUARK_DATA_DEFINITION = 49,
MXF_QUARK_DURATION = 50,
MXF_QUARK_STRUCTURAL_COMPONENTS = 51,
MXF_QUARK_TIMECODE_COMPONENT = 52,
MXF_QUARK_START_TIMECODE = 53,
MXF_QUARK_ROUNDED_TIMECODE_BASE = 54,
MXF_QUARK_DROP_FRAME = 55,
MXF_QUARK_SOURCE_CLIP = 56,
MXF_QUARK_START_POSITION = 57,
MXF_QUARK_SOURCE_TRACK_ID = 58,
MXF_QUARK_DM_SOURCE_CLIP = 59,
MXF_QUARK_TRACK_IDS = 60,
MXF_QUARK_DM_SEGMENT = 61,
MXF_QUARK_EVENT_START_POSITION = 62,
MXF_QUARK_EVENT_COMMENT = 63,
MXF_QUARK_DM_FRAMEWORK = 64,
MXF_QUARK_LOCATORS = 65,
MXF_QUARK_FILE_DESCRIPTOR = 66,
MXF_QUARK_LINKED_TRACK_ID = 67,
MXF_QUARK_SAMPLE_RATE = 68,
MXF_QUARK_CONTAINER_DURATION = 69,
MXF_QUARK_ESSENCE_CONTAINER = 70,
MXF_QUARK_CODEC = 71,
MXF_QUARK_GENERIC_PICTURE_ESSENCE_DESCRIPTOR = 72,
MXF_QUARK_SIGNAL_STANDARD = 73,
MXF_QUARK_FRAME_LAYOUT = 74,
MXF_QUARK_STORED_WIDTH = 75,
MXF_QUARK_STORED_HEIGHT = 76,
MXF_QUARK_STORED_F2_OFFSET = 77,
MXF_QUARK_SAMPLED_WIDTH = 78,
MXF_QUARK_SAMPLED_HEIGHT = 79,
MXF_QUARK_SAMPLED_X_OFFSET = 80,
MXF_QUARK_SAMPLED_Y_OFFSET = 81,
MXF_QUARK_DISPLAY_HEIGHT = 82,
MXF_QUARK_DISPLAY_WIDTH = 83,
MXF_QUARK_DISPLAY_X_OFFSET = 84,
MXF_QUARK_DISPLAY_Y_OFFSET = 85,
MXF_QUARK_DISPLAY_F2_OFFSET = 86,
MXF_QUARK_ASPECT_RATIO = 87,
MXF_QUARK_ACTIVE_FORMAT_DESCRIPTOR = 88,
MXF_QUARK_VIDEO_LINE_MAP_0 = 89,
MXF_QUARK_VIDEO_LINE_MAP_1 = 90,
MXF_QUARK_ALPHA_TRANSPARENCY = 91,
MXF_QUARK_CAPTURE_GAMMA = 92,
MXF_QUARK_IMAGE_ALIGNMENT_OFFSET = 93,
MXF_QUARK_IMAGE_START_OFFSET = 94,
MXF_QUARK_IMAGE_END_OFFSET = 95,
MXF_QUARK_FIELD_DOMINANCE = 96,
MXF_QUARK_PICTURE_ESSENCE_CODING = 97,
MXF_QUARK_CDCI_PICTURE_ESSENCE_DESCRIPTOR = 98,
MXF_QUARK_COMPONENT_DEPTH = 99,
MXF_QUARK_HORIZONTAL_SUBSAMPLING = 100,
MXF_QUARK_VERTICAL_SUBSAMPLING = 101,
MXF_QUARK_COLOR_SITING = 102,
MXF_QUARK_REVERSED_BYTE_ORDER = 103,
MXF_QUARK_PADDING_BITS = 104,
MXF_QUARK_ALPHA_SAMPLE_DEPTH = 105,
MXF_QUARK_BLACK_REF_LEVEL = 106,
MXF_QUARK_WHITE_REF_LEVEL = 107,
MXF_QUARK_COLOR_RANGE = 108,
MXF_QUARK_RGBA_PICTURE_ESSENCE_DESCRIPTOR = 109,
MXF_QUARK_COMPONENT_MAX_REF = 110,
MXF_QUARK_COMPONENT_MIN_REF = 111,
MXF_QUARK_ALPHA_MAX_REF = 112,
MXF_QUARK_ALPHA_MIN_REF = 113,
MXF_QUARK_SCANNING_DIRECTION = 114,
MXF_QUARK_PIXEL_LAYOUT = 115,
MXF_QUARK_GENERIC_SOUND_ESSENCE_DESCRIPTOR = 116,
MXF_QUARK_AUDIO_SAMPLING_RATE = 117,
MXF_QUARK_LOCKED = 118,
MXF_QUARK_AUDIO_REF_LEVEL = 119,
MXF_QUARK_ELECTRO_SPATIAL_FORMULATION = 120,
MXF_QUARK_CHANNEL_COUNT = 121,
MXF_QUARK_QUANTIZATION_BITS = 122,
MXF_QUARK_DIAL_NORM = 123,
MXF_QUARK_SOUND_ESSENCE_COMPRESSION = 124,
MXF_QUARK_GENERIC_DATA_ESSENCE_DESCRIPTOR = 125,
MXF_QUARK_DATA_ESSENCE_CODING = 126,
MXF_QUARK_MULTIPLE_DESCRIPTOR = 127,
MXF_QUARK_SUB_DESCRIPTORS = 128,
MXF_QUARK_TEXT_LOCATOR = 129,
MXF_QUARK_LOCATOR_NAME = 130,
MXF_QUARK_NETWORK_LOCATOR = 131,
MXF_QUARK_URL_STRING = 132,
MXF_QUARK_WAVE_AUDIO_ESSENCE_DESCRIPTOR = 133,
MXF_QUARK_BLOCK_ALIGN = 134,
MXF_QUARK_SEQUENCE_OFFSET = 135,
MXF_QUARK_AVG_BPS = 136,
MXF_QUARK_CHANNEL_ASSIGNMENT = 137,
MXF_QUARK_PEAK_ENVELOPE_VERSION = 138,
MXF_QUARK_PEAK_ENVELOPE_FORMAT = 139,
MXF_QUARK_POINTS_PER_PEAK_VALUE = 140,
MXF_QUARK_PEAK_ENVELOPE_BLOCK_SIZE = 141,
MXF_QUARK_PEAK_CHANNELS = 142,
MXF_QUARK_PEAK_FRAMES = 143,
MXF_QUARK_PEAK_OF_PEAKS_POSITION = 144,
MXF_QUARK_PEAK_ENVELOPE_TIMESTAMP = 145,
MXF_QUARK_PEAK_ENVELOPE_DATA = 146,
MXF_QUARK_AES3_AUDIO_ESSENCE_DESCRIPTOR = 147,
MXF_QUARK_EMPHASIS = 148,
MXF_QUARK_BLOCK_START_OFFSET = 149,
MXF_QUARK_AUXILIARY_BITS_MODE = 150,
MXF_QUARK_CHANNEL_STATUS_MODE = 151,
MXF_QUARK_FIXED_CHANNEL_STATUS_DATA = 152,
MXF_QUARK_USER_DATA_MODE = 153,
MXF_QUARK_FIXED_USER_DATA = 154,
MXF_QUARK_LINKED_TIMECODE_TRACK_ID = 155,
MXF_QUARK_STREAM_NUMBER = 156,
MXF_QUARK_MPEG_VIDEO_DESCRIPTOR = 157,
MXF_QUARK_SINGLE_SEQUENCE = 158,
MXF_QUARK_CONST_B_FRAMES = 159,
MXF_QUARK_CODED_CONTENT_TYPE = 160,
MXF_QUARK_LOW_DELAY = 161,
MXF_QUARK_CLOSED_GOP = 162,
MXF_QUARK_IDENTICAL_GOP = 163,
MXF_QUARK_MAX_GOP = 164,
MXF_QUARK_B_PICTURE_COUNT = 165,
MXF_QUARK_BITRATE = 166,
MXF_QUARK_PROFILE_AND_LEVEL = 167,
MXF_QUARK_MAX
} MXFQuarkId;
extern GQuark _mxf_quark_table[MXF_QUARK_MAX];
#define MXF_QUARK(q) _mxf_quark_table[MXF_QUARK_##q]
void mxf_quark_initialize (void);
#endif /* __MXF_QUARK_H__ */

View file

@ -155,5 +155,7 @@ typedef struct {
} MXFIndexTableSegment;
#define GST_TAG_MXF_UMID "mxf-umid"
#define GST_TAG_MXF_STRUCTURE "mxf-structure"
#define GST_TAG_MXF_DESCRIPTIVE_METADATA_FRAMEWORK "mxf-descriptive-metadata-framework"
#endif /* __MXF_TYPES_H__ */