camerabin: Do not wrongly fail when starting a capture
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Wed, 29 Sep 2010 20:34:00 +0000 (17:34 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Wed, 29 Sep 2010 21:42:27 +0000 (18:42 -0300)
If the elements are in NULL/READY and changing state to
PAUSED/PLAYING while a capture is started
camerabin might not set the active_bin properly causing the
capture start to fail.

This patch fixes it by checking the current and pending state
of the branches instead of only the current one

gst/camerabin/gstcamerabin.c

index 5f2ef6d..000b69d 100644 (file)
@@ -963,15 +963,17 @@ static void
 gst_camerabin_change_mode (GstCameraBin * camera, gint mode)
 {
   if (camera->mode != mode || !camera->active_bin) {
-    GstState state;
+    GstState state, pending_state;
 
     GST_DEBUG_OBJECT (camera, "setting mode: %d (old_mode=%d)",
         mode, camera->mode);
     /* Interrupt ongoing capture */
     gst_camerabin_do_stop (camera);
     camera->mode = mode;
-    gst_element_get_state (GST_ELEMENT (camera), &state, NULL, 0);
-    if (state == GST_STATE_PAUSED || state == GST_STATE_PLAYING) {
+    gst_element_get_state (GST_ELEMENT (camera), &state, &pending_state, 0);
+    if (state == GST_STATE_PAUSED || state == GST_STATE_PLAYING ||
+        pending_state == GST_STATE_PAUSED
+        || pending_state == GST_STATE_PLAYING) {
       if (camera->active_bin) {
         GST_DEBUG_OBJECT (camera, "stopping active bin");
         gst_element_set_state (camera->active_bin, GST_STATE_READY);