camerabin: always force image-profile to have variable framerate
authorThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 4 May 2012 20:05:38 +0000 (17:05 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.com>
Fri, 4 May 2012 22:50:52 +0000 (19:50 -0300)
image-encodebin can't use videorate as it always store one buffer
to be able to do its timestamps/duration math. As image captures
only push one buffer at a time, this videorate behavior breaks
camerabin usage.

gst/camerabin2/gstcamerabin2.c

index 7c7871832a2d57bf825fdfb55fd1d1f90d7a9456..a63c8681d5e8f01e910a05afdaa0b920df5fa7aa 100644 (file)
@@ -2215,6 +2215,25 @@ gst_camera_bin_set_property (GObject * object, guint prop_id,
       if (camera->image_profile)
         gst_encoding_profile_unref (camera->image_profile);
       camera->image_profile = (GstEncodingProfile *) g_value_dup_object (value);
+
+      /* make sure we set variable framerate here to prevent videorate from
+       * being used in encodebin. It will always keep a buffer stored
+       * internally and push it when a second one arrives. This breaks
+       * the image capture */
+      if (GST_IS_ENCODING_VIDEO_PROFILE (camera->image_profile))
+        gst_encoding_video_profile_set_variableframerate (
+            (GstEncodingVideoProfile *) camera->image_profile, TRUE);
+      else if (GST_IS_ENCODING_CONTAINER_PROFILE (camera->image_profile)) {
+        const GList *profs =
+            gst_encoding_container_profile_get_profiles (
+            (GstEncodingContainerProfile *) camera->image_profile);
+        for (; profs; profs = g_list_next (profs)) {
+          if (GST_IS_ENCODING_VIDEO_PROFILE (profs->data)) {
+            gst_encoding_video_profile_set_variableframerate (profs->data,
+                TRUE);
+          }
+        }
+      }
       camera->image_profile_switch = TRUE;
       break;
     case PROP_FLAGS: