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: Remove some checks that will always be TRUE --- gst/mxf/mxfdemux.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 75b8cea4..48280072 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); } -- cgit v1.2.1 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: Try to resolve all synchronization issues, not only the first --- gst/mxf/mxfdemux.c | 68 ++++++++++++++++++++++++++---------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 48280072..3d0f280c 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); + 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); + for (i = 0; i < demux->essence_tracks->len; i++) { + GstMXFDemuxEssenceTrack *etrack = + &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i); - etrack->position = -1; + etrack->position = -1; + } + earliest->current_essence_track->position = position; + break; } - earliest->current_essence_track->position = position; } beach: -- cgit v1.2.1 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: 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(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 3d0f280c..293f2249 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; } -- cgit v1.2.1 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: 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(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 293f2249..27af01b5 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 9ae739fc..8e64e403 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 -- cgit v1.2.1 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: 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(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 27af01b5..51a11a94 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; -- cgit v1.2.1 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: Reset the current partition after seeking and NEWSEGMENT events --- gst/mxf/mxfdemux.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index 51a11a94..dcef0e04 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; -- cgit v1.2.1 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: 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(+) (limited to 'gst') diff --git a/gst/mxf/mxf.c b/gst/mxf/mxf.c index 236e8358..58fa0302 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 dcef0e04..b6719bed 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 73f4a834..a59ac742 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__ */ -- cgit v1.2.1 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: Update TODO --- gst/mxf/mxfdemux.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'gst') diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index b6719bed..b1595fd6 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 * -- cgit v1.2.1