ext/dv/gstdvdec.c: Reset segment info on flush.
authorWim Taymans <wim.taymans@gmail.com>
Wed, 14 Jun 2006 15:59:56 +0000 (15:59 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Wed, 14 Jun 2006 15:59:56 +0000 (15:59 +0000)
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.

ChangeLog
ext/dv/gstdvdec.c
ext/dv/gstdvdemux.c

index 0ac887d3daf65c3ddea55267b83ed2cb8368f0e3..9a260252e4f9aa288c4b8d30eb2d2f98444f5a3b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-06-14  Wim Taymans  <wim@fluendo.com>
+
+       * 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.
+
 2006-06-14  Wim Taymans  <wim@fluendo.com>
 
        * ext/dv/gstdvdemux.c: (gst_dvdemux_demux_frame):
index 42b9848805d96e2f2433b938483166c4df621bba..730981209c44adc1dfd1000173140aeda2c319eb 100644 (file)
@@ -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;
index bd2c3ac3fd7fc3abe413a5cf456ea9d91884cd71..1d005fb5513ea7ff93c43183704e24b15c131ad3 100644 (file)
@@ -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;