From 837a4012b04c5915fddd178d579c1f24ed621919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 3 Feb 2009 22:27:33 +0000 Subject: [PATCH 1/9] configure.ac: bump core/base requirements to released versions --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 87104e7d21..9f4a5f3e05 100644 --- a/configure.ac +++ b/configure.ac @@ -45,8 +45,8 @@ AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** -GST_REQ=0.10.21.1 -GSTPB_REQ=0.10.20 +GST_REQ=0.10.22 +GSTPB_REQ=0.10.22 dnl *** autotools stuff **** From c4a0bc9887c38d84d04545e84f85f4051e0ff812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 3 Feb 2009 17:47:10 +0100 Subject: [PATCH 2/9] Remove some checks that will always be TRUE --- gst/mxf/mxfdemux.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 75b8cea400..4828007276 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -132,12 +132,9 @@ gst_mxf_demux_remove_pad (GstMXFDemuxPad * pad, GstMXFDemux * demux) static void gst_mxf_demux_remove_pads (GstMXFDemux * demux) { - if (demux->src) { - g_ptr_array_foreach (demux->src, (GFunc) gst_mxf_demux_remove_pad, demux); - g_ptr_array_foreach (demux->src, (GFunc) gst_object_unref, NULL); - g_ptr_array_free (demux->src, TRUE); - demux->src = NULL; - } + g_ptr_array_foreach (demux->src, (GFunc) gst_mxf_demux_remove_pad, demux); + g_ptr_array_foreach (demux->src, (GFunc) gst_object_unref, NULL); + g_ptr_array_set_size (demux->src, 0); } static void @@ -189,14 +186,12 @@ gst_mxf_demux_reset_linked_metadata (GstMXFDemux * demux) { guint i; - if (demux->src) { - for (i = 0; i < demux->src->len; i++) { - GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i); + for (i = 0; i < demux->src->len; i++) { + GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i); - pad->material_track = NULL; - pad->material_package = NULL; - pad->current_component = NULL; - } + pad->material_track = NULL; + pad->material_package = NULL; + pad->current_component = NULL; } if (demux->essence_tracks) { @@ -350,7 +345,7 @@ gst_mxf_demux_push_src_event (GstMXFDemux * demux, GstEvent * event) GST_DEBUG_OBJECT (demux, "Pushing '%s' event downstream", GST_EVENT_TYPE_NAME (event)); - if (!demux->src) + if (demux->src->len == 0) return ret; for (i = 0; i < demux->src->len; i++) { @@ -374,9 +369,6 @@ gst_mxf_demux_get_earliest_pad (GstMXFDemux * demux) GstClockTime earliest = GST_CLOCK_TIME_NONE; GstMXFDemuxPad *pad = NULL; - if (!demux->src) - return NULL; - for (i = 0; i < demux->src->len; i++) { GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i); @@ -859,7 +851,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux) return GST_FLOW_ERROR; } - first_run = (demux->src == NULL); + first_run = (demux->src->len == 0); for (i = 0; i < current_package->n_tracks; i++) { MXFMetadataTimelineTrack *track = NULL; @@ -884,7 +876,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux) track = MXF_METADATA_TIMELINE_TRACK (current_package->tracks[i]); - if (demux->src && demux->src->len > 0) { + if (demux->src->len > 0) { /* Find pad from track_id */ for (j = 0; j < demux->src->len; j++) { GstMXFDemuxPad *tmp = g_ptr_array_index (demux->src, j); @@ -1095,8 +1087,6 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux) gst_element_add_pad (GST_ELEMENT_CAST (demux), gst_object_ref (pad)); - if (!demux->src) - demux->src = g_ptr_array_new (); g_ptr_array_add (demux->src, pad); pad->discont = TRUE; } @@ -1105,7 +1095,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux) if (first_run) gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); - if (demux->src) { + if (demux->src->len > 0) { for (i = 0; i < demux->src->len; i++) { GstMXFDemuxPad *pad = g_ptr_array_index (demux->src, i); @@ -1463,7 +1453,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux, return GST_FLOW_ERROR; } - if (!demux->src || demux->src->len == 0) { + if (demux->src->len == 0) { GST_ERROR_OBJECT (demux, "No streams created yet"); return GST_FLOW_ERROR; } @@ -2421,7 +2411,7 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux) GstFlowReturn ret = GST_FLOW_OK; guint read = 0; - if (demux->src) { + if (demux->src->len > 0) { if (!gst_mxf_demux_get_earliest_pad (demux)) { ret = GST_FLOW_UNEXPECTED; GST_DEBUG_OBJECT (demux, "All tracks are EOS"); @@ -2670,7 +2660,7 @@ gst_mxf_demux_chain (GstPad * pad, GstBuffer * inbuf) GST_LOG_OBJECT (demux, "received buffer of %u bytes at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (inbuf), GST_BUFFER_OFFSET (inbuf)); - if (demux->src) { + if (demux->src->len > 0) { if (!gst_mxf_demux_get_earliest_pad (demux)) { ret = GST_FLOW_UNEXPECTED; GST_DEBUG_OBJECT (demux, "All tracks are EOS"); @@ -3454,7 +3444,7 @@ gst_mxf_demux_query (GstElement * element, GstQuery * query) if (format != GST_FORMAT_TIME) goto error; - if (!demux->src) + if (demux->src->len == 0) goto done; for (i = 0; i < demux->src->len; i++) { @@ -3589,6 +3579,9 @@ gst_mxf_demux_finalize (GObject * object) g_free (demux->requested_package_string); demux->requested_package_string = NULL; + g_ptr_array_free (demux->src, TRUE); + demux->src = NULL; + G_OBJECT_CLASS (parent_class)->finalize (object); } From a79c4e031406fc7659d31e5b39f655bf165d7d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 10:19:51 +0100 Subject: [PATCH 3/9] Try to resolve all synchronization issues, not only the first --- gst/mxf/mxfdemux.c | 74 ++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 4828007276..3d0f280c8f 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -2485,50 +2485,48 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux) demux->offset += read; if (ret == GST_FLOW_OK && demux->src && demux->essence_tracks) { - guint i; GstMXFDemuxPad *earliest = NULL; - guint64 offset; - gint64 position; - - earliest = gst_mxf_demux_get_earliest_pad (demux); - if (!earliest) - goto beach; - /* We allow time drifts of at most 500ms */ - if (demux->segment.last_stop - earliest->last_stop <= 500 * GST_MSECOND) - goto beach; + while ((earliest = gst_mxf_demux_get_earliest_pad (demux)) && + demux->segment.last_stop - earliest->last_stop > 500 * GST_MSECOND) { + guint i; + guint64 offset; + gint64 position; - GST_WARNING_OBJECT (demux, - "Found synchronization issue -- trying to solve"); + GST_WARNING_OBJECT (demux, + "Found synchronization issue -- trying to solve"); - position = earliest->current_essence_track_position; + position = earliest->current_essence_track_position; - /* FIXME: This can probably be improved by using the - * offset of position-1 if it's in the same partition - * or the start of the position otherwise. - * This way we won't skip elements from the same essence - * container as etrack->position - */ - offset = - gst_mxf_demux_find_essence_element (demux, - earliest->current_essence_track, &position, FALSE); - if (offset == -1) { - GST_ERROR_OBJECT (demux, "Failed to find offset for late essence track"); - earliest->eos = TRUE; - gst_pad_push_event (GST_PAD_CAST (earliest), gst_event_new_eos ()); - goto beach; + /* FIXME: This can probably be improved by using the + * offset of position-1 if it's in the same partition + * or the start of the position otherwise. + * This way we won't skip elements from the same essence + * container as etrack->position + */ + offset = + gst_mxf_demux_find_essence_element (demux, + earliest->current_essence_track, &position, FALSE); + if (offset == -1) { + GST_ERROR_OBJECT (demux, + "Failed to find offset for late essence track"); + earliest->eos = TRUE; + gst_pad_push_event (GST_PAD_CAST (earliest), gst_event_new_eos ()); + continue; + } + + demux->offset = offset + demux->run_in; + gst_mxf_demux_set_partition_for_offset (demux, demux->offset); + + for (i = 0; i < demux->essence_tracks->len; i++) { + GstMXFDemuxEssenceTrack *etrack = + &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i); + + etrack->position = -1; + } + earliest->current_essence_track->position = position; + break; } - - demux->offset = offset + demux->run_in; - gst_mxf_demux_set_partition_for_offset (demux, demux->offset); - - for (i = 0; i < demux->essence_tracks->len; i++) { - GstMXFDemuxEssenceTrack *etrack = - &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i); - - etrack->position = -1; - } - earliest->current_essence_track->position = position; } beach: From fd72ef34f6282df4d8059038bbab8fea60c23c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 10:27:03 +0100 Subject: [PATCH 4/9] Always set the current package, not only when it was changed This is necessary as the current package link will be set to NULL when updated metadata is parsed and should be set here again. --- gst/mxf/mxfdemux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 3d0f280c8f..293f224975 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -652,10 +652,10 @@ done: memcpy (&demux->current_package_uid, &ret->package_uid, 32); mxf_umid_to_string (&ret->package_uid, current_package_string); - demux->current_package = ret; demux->current_package_string = g_strdup (current_package_string); g_object_notify (G_OBJECT (demux), "package"); } + demux->current_package = ret; return ret; } From cc5699340d0f5c17ba966dbed05cb3dd3b021c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 10:37:20 +0100 Subject: [PATCH 5/9] Add property to set the maximum allowed time difference between tracks --- gst/mxf/mxfdemux.c | 21 ++++++++++++++++++--- gst/mxf/mxfdemux.h | 3 +++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 293f224975..27af01b572 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -113,7 +113,8 @@ gst_mxf_demux_pad_init (GstMXFDemuxPad * pad) enum { PROP_0, - PROP_PACKAGE + PROP_PACKAGE, + PROP_MAX_DRIFT }; static gboolean gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event); @@ -1590,7 +1591,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux, GstMXFDemuxPad *earliest = gst_mxf_demux_get_earliest_pad (demux); if (earliest && earliest != pad && earliest->last_stop < pad->last_stop && - pad->last_stop - earliest->last_stop > 500 * GST_MSECOND) { + pad->last_stop - earliest->last_stop > demux->max_drift) { GST_DEBUG_OBJECT (demux, "Pad is too far ahead of time"); continue; } @@ -2488,7 +2489,7 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux) GstMXFDemuxPad *earliest = NULL; /* We allow time drifts of at most 500ms */ while ((earliest = gst_mxf_demux_get_earliest_pad (demux)) && - demux->segment.last_stop - earliest->last_stop > 500 * GST_MSECOND) { + demux->segment.last_stop - earliest->last_stop > demux->max_drift) { guint i; guint64 offset; gint64 position; @@ -3533,6 +3534,9 @@ gst_mxf_demux_set_property (GObject * object, guint prop_id, g_free (demux->requested_package_string); demux->requested_package_string = g_value_dup_string (value); break; + case PROP_MAX_DRIFT: + demux->max_drift = g_value_get_uint64 (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -3549,6 +3553,9 @@ gst_mxf_demux_get_property (GObject * object, guint prop_id, case PROP_PACKAGE: g_value_set_string (value, demux->current_package_string); break; + case PROP_MAX_DRIFT: + g_value_set_uint64 (value, demux->max_drift); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -3614,6 +3621,12 @@ gst_mxf_demux_class_init (GstMXFDemuxClass * klass) "Material or Source package to use for playback", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_MAX_DRIFT, + g_param_spec_uint64 ("max-drift", "Maximum drift", + "Maximum number of nanoseconds by which tracks can differ", + 100 * GST_MSECOND, G_MAXUINT64, 500 * GST_MSECOND, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_mxf_demux_change_state); gstelement_class->query = GST_DEBUG_FUNCPTR (gst_mxf_demux_query); @@ -3640,6 +3653,8 @@ gst_mxf_demux_init (GstMXFDemux * demux, GstMXFDemuxClass * g_class) gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); + demux->max_drift = 500 * GST_MSECOND; + demux->adapter = gst_adapter_new (); demux->src = g_ptr_array_new (); gst_segment_init (&demux->segment, GST_FORMAT_TIME); diff --git a/gst/mxf/mxfdemux.h b/gst/mxf/mxfdemux.h index 9ae739fcfe..8e64e403ce 100644 --- a/gst/mxf/mxfdemux.h +++ b/gst/mxf/mxfdemux.h @@ -161,7 +161,10 @@ struct _GstMXFDemux MXFUMID current_package_uid; MXFMetadataGenericPackage *current_package; gchar *current_package_string; + + /* Properties */ gchar *requested_package_string; + GstClockTime max_drift; }; struct _GstMXFDemuxClass From 2ee7e7768de36f4e8dff575997eb670371660483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 10:53:52 +0100 Subject: [PATCH 6/9] In push mode play all remaining parts of the file on EOS if there are any --- gst/mxf/mxfdemux.c | 85 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 13 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 27af01b572..51a11a9471 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -631,11 +631,11 @@ gst_mxf_demux_choose_package (GstMXFDemux * demux) for (i = 0; i < demux->preface->content_storage->n_packages; i++) { if (demux->preface->content_storage->packages[i] && - MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface->content_storage-> - packages[i])) { + MXF_IS_METADATA_MATERIAL_PACKAGE (demux->preface-> + content_storage->packages[i])) { ret = - MXF_METADATA_GENERIC_PACKAGE (demux->preface->content_storage-> - packages[i]); + MXF_METADATA_GENERIC_PACKAGE (demux->preface-> + content_storage->packages[i]); break; } } @@ -1327,8 +1327,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad, pad->current_component_index); pad->current_component = - MXF_METADATA_SOURCE_CLIP (sequence->structural_components[pad-> - current_component_index]); + MXF_METADATA_SOURCE_CLIP (sequence-> + structural_components[pad->current_component_index]); if (pad->current_component == NULL) { GST_ERROR_OBJECT (demux, "No such structural component"); return GST_FLOW_ERROR; @@ -1336,8 +1336,8 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad, if (!pad->current_component->source_package || !pad->current_component->source_package->top_level - || !MXF_METADATA_GENERIC_PACKAGE (pad->current_component-> - source_package)->tracks) { + || !MXF_METADATA_GENERIC_PACKAGE (pad-> + current_component->source_package)->tracks) { GST_ERROR_OBJECT (demux, "Invalid component"); return GST_FLOW_ERROR; } @@ -2833,8 +2833,8 @@ gst_mxf_demux_pad_set_position (GstMXFDemux * demux, GstMXFDemuxPad * p, for (i = 0; i < p->material_track->parent.sequence->n_structural_components; i++) { clip = - MXF_METADATA_SOURCE_CLIP (p->material_track->parent.sequence-> - structural_components[i]); + MXF_METADATA_SOURCE_CLIP (p->material_track->parent. + sequence->structural_components[i]); if (clip->parent.duration <= 0) break; @@ -3362,11 +3362,69 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event) demux->offset = 0; ret = gst_mxf_demux_push_src_event (demux, event); break; - case GST_EVENT_EOS: - if (!gst_mxf_demux_push_src_event (demux, event)) + case GST_EVENT_EOS:{ + GstMXFDemuxPad *p = NULL; + guint i; + + for (i = 0; i < demux->essence_tracks->len; i++) { + GstMXFDemuxEssenceTrack *t = + &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i); + + if (t->position > 0) + t->duration = t->position; + } + + for (i = 0; i < demux->src->len; i++) { + GstMXFDemuxPad *p = g_ptr_array_index (demux->src, i); + + if (!p->eos + && p->current_essence_track_position >= + p->current_essence_track->duration) { + p->eos = TRUE; + gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ()); + } + } + + while ((p = gst_mxf_demux_get_earliest_pad (demux))) { + guint64 offset; + gint64 position; + + position = p->current_essence_track_position; + + offset = + gst_mxf_demux_find_essence_element (demux, p->current_essence_track, + &position, FALSE); + if (offset == -1) { + GST_ERROR_OBJECT (demux, "Failed to find offset for essence track"); + p->eos = TRUE; + gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ()); + continue; + } + + if (gst_pad_push_event (demux->sinkpad, + gst_event_new_seek (demux->segment.rate, GST_FORMAT_BYTES, + demux->segment.flags | GST_SEEK_FLAG_ACCURATE, + GST_SEEK_TYPE_SET, offset + demux->run_in, + GST_SEEK_TYPE_NONE, 0))) { + + for (i = 0; i < demux->essence_tracks->len; i++) { + GstMXFDemuxEssenceTrack *etrack = + &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, + i); + etrack->position = -1; + } + ret = TRUE; + goto out; + } else { + GST_WARNING_OBJECT (demux, + "Seek to remaining part of the file failed"); + } + } + + if (!(ret = gst_mxf_demux_push_src_event (demux, event))) GST_WARNING_OBJECT (pad, "failed pushing EOS on streams"); - ret = TRUE; break; + } case GST_EVENT_NEWSEGMENT:{ guint i; @@ -3387,6 +3445,7 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event) break; } +out: gst_object_unref (demux); return ret; From c0557df34d85b9886913ee470b8c97355ced074c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 10:59:53 +0100 Subject: [PATCH 7/9] Reset the current partition after seeking and NEWSEGMENT events --- gst/mxf/mxfdemux.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 51a11a9471..dcef0e0422 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -2235,7 +2235,7 @@ gst_mxf_demux_set_partition_for_offset (GstMXFDemux * demux, guint64 offset) for (l = demux->partitions; l; l = l->next) { GstMXFDemuxPartition *p = l->data; - if (p->partition.this_partition <= offset) + if (p->partition.this_partition + demux->run_in <= offset) demux->current_partition = p; } } @@ -2676,6 +2676,9 @@ gst_mxf_demux_chain (GstPad * pad, GstBuffer * inbuf) if (G_UNLIKELY (demux->offset == 0 && GST_BUFFER_OFFSET (inbuf) != 0)) { GST_DEBUG_OBJECT (demux, "offset was zero, synchronizing with buffer's"); demux->offset = GST_BUFFER_OFFSET (inbuf); + gst_mxf_demux_set_partition_for_offset (demux, demux->offset); + } else if (demux->current_partition == NULL) { + gst_mxf_demux_set_partition_for_offset (demux, demux->offset); } gst_adapter_push (demux->adapter, inbuf); @@ -3094,6 +3097,7 @@ gst_mxf_demux_seek_pull (GstMXFDemux * demux, GstEvent * event) goto no_new_offset; demux->offset = new_offset + demux->run_in; + gst_mxf_demux_set_partition_for_offset (demux, demux->offset); } if (G_UNLIKELY (demux->close_seg_event)) { @@ -3436,6 +3440,7 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event) t->position = -1; } } + demux->current_partition = NULL; gst_event_unref (event); ret = TRUE; break; From 3e2a880c6b9a23591501b9da594afa9284658bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 11:09:26 +0100 Subject: [PATCH 8/9] Post an UMID tag with the current package's UMID --- gst/mxf/mxf.c | 8 ++++++++ gst/mxf/mxfdemux.c | 5 +++++ gst/mxf/mxftypes.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/gst/mxf/mxf.c b/gst/mxf/mxf.c index 236e8358e0..58fa0302a2 100644 --- a/gst/mxf/mxf.c +++ b/gst/mxf/mxf.c @@ -36,9 +36,17 @@ GST_DEBUG_CATEGORY (mxf_debug); #define GST_CAT_DEFAULT mxf_debug +static void +mxf_init (void) +{ + gst_tag_register (GST_TAG_MXF_UMID, GST_TAG_FLAG_META, + G_TYPE_STRING, "UMID", "Unique Material Identifier", NULL); +} + static gboolean plugin_init (GstPlugin * plugin) { + mxf_init (); mxf_metadata_init_types (); mxf_aes_bwf_init (); mxf_mpeg_init (); diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index dcef0e0422..b6719bedab 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -648,6 +648,7 @@ gst_mxf_demux_choose_package (GstMXFDemux * demux) done: if (memcmp (&ret->package_uid, &demux->current_package_uid, 32) != 0) { gchar current_package_string[96]; + GstTagList *tags = gst_tag_list_new (); gst_mxf_demux_remove_pads (demux); memcpy (&demux->current_package_uid, &ret->package_uid, 32); @@ -655,6 +656,10 @@ done: mxf_umid_to_string (&ret->package_uid, current_package_string); demux->current_package_string = g_strdup (current_package_string); g_object_notify (G_OBJECT (demux), "package"); + + gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_MXF_UMID, + demux->current_package_string, NULL); + gst_element_found_tags (GST_ELEMENT_CAST (demux), tags); } demux->current_package = ret; diff --git a/gst/mxf/mxftypes.h b/gst/mxf/mxftypes.h index 73f4a834a0..a59ac74225 100644 --- a/gst/mxf/mxftypes.h +++ b/gst/mxf/mxftypes.h @@ -154,4 +154,6 @@ typedef struct { GHashTable *other_tags; } MXFIndexTableSegment; +#define GST_TAG_MXF_UMID "mxf-umid" + #endif /* __MXF_TYPES_H__ */ From ad2a64870cab550417ac7405c8c88b02429ef89d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 Feb 2009 11:11:31 +0100 Subject: [PATCH 9/9] Update TODO --- gst/mxf/mxfdemux.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index b6719bedab..b1595fd6c6 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -36,8 +36,7 @@ * The latter are just 16 byte unique identifiers * - Check everything for correctness vs. SMPTE S336M, some things can probably * be generalized/simplified - * - Seeking support: IndexTableSegments and skip-to-position seeks, needs correct - * timestamp calculation, etc. + * - Seeking support: Use IndexTableSegments * - Handle timecode tracks correctly (where is this documented?) * - Handle Generic container system items * - Implement correct support for clip-wrapped essence elements. @@ -49,6 +48,9 @@ * - Correctly handle the different rectangles and aspect-ratio for video * - Add support for non-standard MXF used by Avid (bug #561922). * - Fix frame layout stuff, i.e. interlaced/progressive + * - Extend essence element handlers to set DELTA_UNIT flag. + * - In pull mode first find the first buffer for every pad before pushing + * to prevent jumpy playback in the beginning due to resynchronization. * * - Implement SMPTE D11 essence and the digital cinema/MXF specs *