diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2016-01-28 16:32:34 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2016-01-28 18:54:29 +0100 |
commit | e48c5ed81691162fb0882303a306e24439717acd (patch) | |
tree | 461895146d5ca9a12daeeeb4101c2bbb453fb0ec /gst | |
parent | fd33314f03e7b4d499c3ab813338aedf37acf57e (diff) |
mxfmux: Write a timecode track into the source package too
Diffstat (limited to 'gst')
-rw-r--r-- | gst/mxf/mxfmux.c | 103 |
1 files changed, 90 insertions, 13 deletions
diff --git a/gst/mxf/mxfmux.c b/gst/mxf/mxfmux.c index c36ae9036..97b87d881 100644 --- a/gst/mxf/mxfmux.c +++ b/gst/mxf/mxfmux.c @@ -633,18 +633,18 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) memcpy (&p->parent.package_modified_date, &mux->preface->last_modified_date, sizeof (MXFTimestamp)); - p->parent.n_tracks = GST_ELEMENT_CAST (mux)->numsinkpads; + p->parent.n_tracks = GST_ELEMENT_CAST (mux)->numsinkpads + 1; p->parent.tracks = g_new0 (MXFMetadataTrack *, p->parent.n_tracks); - if (p->parent.n_tracks > 1) { + if (p->parent.n_tracks > 2) { MXFMetadataMultipleDescriptor *d; p->descriptor = (MXFMetadataGenericDescriptor *) g_object_new (MXF_TYPE_METADATA_MULTIPLE_DESCRIPTOR, NULL); d = (MXFMetadataMultipleDescriptor *) p->descriptor; - d->n_sub_descriptors = p->parent.n_tracks; + d->n_sub_descriptors = p->parent.n_tracks - 1; d->sub_descriptors = - g_new0 (MXFMetadataGenericDescriptor *, p->parent.n_tracks); + g_new0 (MXFMetadataGenericDescriptor *, p->parent.n_tracks - 1); mxf_uuid_init (&MXF_METADATA_BASE (d)->instance_uid, mux->metadata); g_hash_table_insert (mux->metadata, @@ -654,7 +654,9 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) /* Tracks */ { - guint n = 0; + guint n; + + n = 1; /* Essence tracks */ for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) { @@ -723,11 +725,11 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) pad->source_package = p; pad->source_track = track; pad->descriptor->linked_track_id = n + 1; - if (p->parent.n_tracks == 1) { + if (p->parent.n_tracks == 2) { p->descriptor = (MXFMetadataGenericDescriptor *) pad->descriptor; } else { MXF_METADATA_MULTIPLE_DESCRIPTOR (p-> - descriptor)->sub_descriptors[n] = + descriptor)->sub_descriptors[n - 1] = (MXFMetadataGenericDescriptor *) pad->descriptor; } @@ -780,8 +782,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) source_package = MXF_METADATA_SOURCE_PACKAGE (cstorage->packages[1]); source_track = - MXF_METADATA_TIMELINE_TRACK (source_package->parent.tracks[n - - 1]); + MXF_METADATA_TIMELINE_TRACK (source_package->parent.tracks[n]); p->tracks[n] = (MXFMetadataTrack *) g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL); @@ -853,7 +854,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) memcpy (&clip->source_package_id, &cstorage->packages[1]->package_uid, 32); - clip->source_track_id = n; + clip->source_track_id = n + 1; n++; } @@ -923,7 +924,71 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) } } - for (i = 0; i < cstorage->packages[1]->n_tracks; i++) { + /* Timecode track */ + { + MXFMetadataSourcePackage *p; + MXFMetadataTimelineTrack *track; + MXFMetadataSequence *sequence; + MXFMetadataTimecodeComponent *component; + guint n = 0; + + p = (MXFMetadataSourcePackage *) cstorage->packages[1]; + + p->parent.tracks[n] = (MXFMetadataTrack *) + g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL); + track = (MXFMetadataTimelineTrack *) p->parent.tracks[n]; + mxf_uuid_init (&MXF_METADATA_BASE (track)->instance_uid, mux->metadata); + g_hash_table_insert (mux->metadata, + &MXF_METADATA_BASE (track)->instance_uid, track); + mux->metadata_list = g_list_prepend (mux->metadata_list, track); + + track->parent.track_id = n + 1; + track->parent.track_number = 0; + track->parent.track_name = g_strdup ("Timecode track"); + /* FIXME: Is this correct? */ + memcpy (&track->edit_rate, &mux->min_edit_rate, sizeof (MXFFraction)); + + sequence = track->parent.sequence = (MXFMetadataSequence *) + g_object_new (MXF_TYPE_METADATA_SEQUENCE, NULL); + mxf_uuid_init (&MXF_METADATA_BASE (sequence)->instance_uid, + mux->metadata); + g_hash_table_insert (mux->metadata, + &MXF_METADATA_BASE (sequence)->instance_uid, sequence); + mux->metadata_list = g_list_prepend (mux->metadata_list, sequence); + + memcpy (&sequence->data_definition, + mxf_metadata_track_identifier_get + (MXF_METADATA_TRACK_TIMECODE_12M_INACTIVE), 16); + + sequence->n_structural_components = 1; + sequence->structural_components = + g_new0 (MXFMetadataStructuralComponent *, 1); + + component = (MXFMetadataTimecodeComponent *) + g_object_new (MXF_TYPE_METADATA_TIMECODE_COMPONENT, NULL); + sequence->structural_components[0] = + (MXFMetadataStructuralComponent *) component; + mxf_uuid_init (&MXF_METADATA_BASE (component)->instance_uid, + mux->metadata); + g_hash_table_insert (mux->metadata, + &MXF_METADATA_BASE (component)->instance_uid, component); + mux->metadata_list = g_list_prepend (mux->metadata_list, component); + + memcpy (&component->parent.data_definition, + &sequence->data_definition, 16); + + component->start_timecode = 0; + if (track->edit_rate.d == 0) + component->rounded_timecode_base = 1; + else + component->rounded_timecode_base = + (((gdouble) track->edit_rate.n) / + ((gdouble) track->edit_rate.d) + 0.5); + /* TODO: drop frame */ + } + + + for (i = 1; i < cstorage->packages[1]->n_tracks; i++) { MXFMetadataTrack *track = cstorage->packages[1]->tracks[i]; guint j; guint32 templ; @@ -935,7 +1000,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) templ = track->track_number; n_type = 0; - for (j = 0; j < cstorage->packages[1]->n_tracks; j++) { + for (j = 1; j < cstorage->packages[1]->n_tracks; j++) { MXFMetadataTrack *tmp = cstorage->packages[1]->tracks[j]; if (tmp->track_number == templ) { @@ -944,7 +1009,7 @@ gst_mxf_mux_create_metadata (GstMXFMux * mux) } n = 0; - for (j = 0; j < cstorage->packages[1]->n_tracks; j++) { + for (j = 1; j < cstorage->packages[1]->n_tracks; j++) { MXFMetadataTrack *tmp = cstorage->packages[1]->tracks[j]; if (tmp->track_number == templ) { @@ -1379,6 +1444,18 @@ gst_mxf_mux_handle_eos (GstMXFMux * mux) } { + MXFMetadataTimelineTrack *track = + MXF_METADATA_TIMELINE_TRACK (mux->preface-> + content_storage->packages[1]->tracks[0]); + MXFMetadataSequence *sequence = track->parent.sequence; + MXFMetadataTimecodeComponent *component = + MXF_METADATA_TIMECODE_COMPONENT (sequence->structural_components[0]); + + sequence->duration = mux->last_gc_position; + component->parent.duration = mux->last_gc_position; + } + + { guint64 body_partition = mux->partition.this_partition; guint32 body_sid = mux->partition.body_sid; guint64 footer_partition = mux->offset; |