videodecoder/encoder: Call reset() always between start() and stop() and never outside
authorSebastian Dröge <slomo@circular-chaos.org>
Fri, 26 Jul 2013 08:22:32 +0000 (10:22 +0200)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 26 Jul 2013 08:22:32 +0000 (10:22 +0200)
gst-libs/gst/video/gstvideodecoder.c
gst-libs/gst/video/gstvideoencoder.c

index 37337ae..398c039 100644 (file)
@@ -2033,13 +2033,12 @@ gst_video_decoder_change_state (GstElement * element, GstStateChange transition)
         goto open_failed;
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
-      GST_VIDEO_DECODER_STREAM_LOCK (decoder);
-      gst_video_decoder_reset (decoder, TRUE);
-      GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
-
       /* Initialize device/library if needed */
       if (decoder_class->start && !decoder_class->start (decoder))
         goto start_failed;
+      GST_VIDEO_DECODER_STREAM_LOCK (decoder);
+      gst_video_decoder_reset (decoder, TRUE);
+      GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
       break;
     default:
       break;
@@ -2049,12 +2048,11 @@ gst_video_decoder_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      if (decoder_class->stop && !decoder_class->stop (decoder))
-        goto stop_failed;
-
       GST_VIDEO_DECODER_STREAM_LOCK (decoder);
       gst_video_decoder_reset (decoder, TRUE);
       GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+      if (decoder_class->stop && !decoder_class->stop (decoder))
+        goto stop_failed;
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
       /* close device/library if needed */
index 48b6b1c..58a6ab7 100644 (file)
@@ -1365,11 +1365,11 @@ gst_video_encoder_change_state (GstElement * element, GstStateChange transition)
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       /* Initialize device/library if needed */
+      if (encoder_class->start && !encoder_class->start (encoder))
+        goto start_failed;
       GST_VIDEO_ENCODER_STREAM_LOCK (encoder);
       gst_video_encoder_reset (encoder, TRUE);
       GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder);
-      if (encoder_class->start && !encoder_class->start (encoder))
-        goto start_failed;
       break;
     default:
       break;
@@ -1379,11 +1379,11 @@ gst_video_encoder_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
-      if (encoder_class->stop && !encoder_class->stop (encoder))
-        goto stop_failed;
       GST_VIDEO_ENCODER_STREAM_LOCK (encoder);
       gst_video_encoder_reset (encoder, TRUE);
       GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder);
+      if (encoder_class->stop && !encoder_class->stop (encoder))
+        goto stop_failed;
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
       /* close device/library if needed */