From 778a0bf950696d4eae1071b4a49bcccf2225bfe4 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 14 Jun 2006 15:59:56 +0000 Subject: ext/dv/gstdvdec.c: Reset segment info on flush. Original commit message from CVS: * ext/dv/gstdvdec.c: (gst_dvdec_class_init), (gst_dvdec_init), (gst_dvdec_finalize), (gst_dvdec_sink_event), (gst_dvdec_change_state): Reset segment info on flush. Alloc segment in _init, free in _finalize. * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek): Don't send segments twice. --- ext/dv/gstdvdec.c | 23 +++++++++++++++++++---- ext/dv/gstdvdemux.c | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) (limited to 'ext/dv') diff --git a/ext/dv/gstdvdec.c b/ext/dv/gstdvdec.c index 42b98488..73098120 100644 --- a/ext/dv/gstdvdec.c +++ b/ext/dv/gstdvdec.c @@ -141,6 +141,7 @@ gst_dvdec_quality_get_type (void) GST_BOILERPLATE (GstDVDec, gst_dvdec, GstElement, GST_TYPE_ELEMENT); +static void gst_dvdec_finalize (GObject * object); static gboolean gst_dvdec_sink_setcaps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_dvdec_chain (GstPad * pad, GstBuffer * buffer); static gboolean gst_dvdec_sink_event (GstPad * pad, GstEvent * event); @@ -177,6 +178,7 @@ gst_dvdec_class_init (GstDVDecClass * klass) gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + gobject_class->finalize = gst_dvdec_finalize; gobject_class->set_property = gst_dvdec_set_property; gobject_class->get_property = gst_dvdec_get_property; @@ -228,6 +230,17 @@ gst_dvdec_init (GstDVDec * dvdec, GstDVDecClass * g_class) dvdec->clamp_luma = FALSE; dvdec->clamp_chroma = FALSE; dvdec->quality = DV_DEFAULT_QUALITY; + dvdec->segment = gst_segment_new (); +} + +static void +gst_dvdec_finalize (GObject * object) +{ + GstDVDec *dvdec = GST_DVDEC (object); + + gst_segment_free (dvdec->segment); + + G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean @@ -293,6 +306,9 @@ gst_dvdec_sink_event (GstPad * pad, GstEvent * event) dvdec = GST_DVDEC (gst_pad_get_parent (pad)); switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_STOP: + gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); + break; case GST_EVENT_NEWSEGMENT:{ gboolean update; gdouble rate; @@ -302,14 +318,16 @@ gst_dvdec_sink_event (GstPad * pad, GstEvent * event) /* Once -good depends on core >= 0.10.6, use newsegment_full */ gst_event_parse_new_segment (event, &update, &rate, &format, &start, &stop, &position); + GST_DEBUG_OBJECT (dvdec, "Got NEWSEGMENT [%" GST_TIME_FORMAT " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); + gst_segment_set_newsegment (dvdec->segment, update, rate, format, start, stop, position); - } break; + } default: break; } @@ -447,7 +465,6 @@ gst_dvdec_change_state (GstElement * element, GstStateChange transition) dv_decoder_new (0, dvdec->clamp_luma, dvdec->clamp_chroma); dvdec->decoder->quality = qualities[dvdec->quality]; dv_set_error_log (dvdec->decoder, NULL); - dvdec->segment = gst_segment_new (); gst_segment_init (dvdec->segment, GST_FORMAT_UNDEFINED); /* * Enable this function call when libdv2 0.100 or higher is more @@ -469,8 +486,6 @@ gst_dvdec_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_PAUSED_TO_READY: dv_decoder_free (dvdec->decoder); dvdec->decoder = NULL; - gst_segment_free (dvdec->segment); - dvdec->segment = NULL; break; case GST_STATE_CHANGE_READY_TO_NULL: break; diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c index bd2c3ac3..1d005fb5 100644 --- a/ext/dv/gstdvdemux.c +++ b/ext/dv/gstdvdemux.c @@ -1080,6 +1080,8 @@ gst_dvdemux_handle_pull_seek (GstDVDemux * demux, GstPad * pad, gst_event_new_new_segment (FALSE, demux->time_segment.rate, demux->time_segment.format, demux->time_segment.last_stop, stop, demux->time_segment.time)); + + demux->need_segment = FALSE; } demux->running = TRUE; -- cgit