gst-plugins-bad: camerabin2: Refactoring encodebin usage

Thiago Sousa Santos thiagoss at kemper.freedesktop.org
Fri Mar 11 13:41:34 PST 2011


Module: gst-plugins-bad
Branch: master
Commit: b2f39d1844b1ff81d0b29fe13b1d905ef3c4f191
URL:    http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=b2f39d1844b1ff81d0b29fe13b1d905ef3c4f191

Author: Thiago Santos <thiago.sousa.santos at collabora.co.uk>
Date:   Fri Mar 11 16:20:52 2011 -0300

camerabin2: Refactoring encodebin usage

Refactor some common code regarding encodebin usage in camerabin2

---

 gst/camerabin2/gstcamerabin2.c |   57 ++++++++++++++++++++++++---------------
 gst/camerabin2/gstcamerabin2.h |    2 +
 2 files changed, 37 insertions(+), 22 deletions(-)

diff --git a/gst/camerabin2/gstcamerabin2.c b/gst/camerabin2/gstcamerabin2.c
index 8b93ad8..327d6e3 100644
--- a/gst/camerabin2/gstcamerabin2.c
+++ b/gst/camerabin2/gstcamerabin2.c
@@ -782,6 +782,24 @@ gst_camera_bin_video_profile_has_audio (GstCameraBin * camera)
   return FALSE;
 }
 
+static GstPadLinkReturn
+gst_camera_bin_link_encodebin (GstCameraBin * camera, GstElement * element,
+    gint padtype)
+{
+  GstPadLinkReturn ret;
+  GstPad *srcpad;
+  GstPad *sinkpad = NULL;
+
+  srcpad = gst_element_get_static_pad (element, "src");
+  sinkpad = encodebin_find_pad (camera->encodebin, padtype);
+
+  ret = gst_pad_link (srcpad, sinkpad);
+  gst_object_unref (sinkpad);
+  gst_object_unref (srcpad);
+
+  return ret;
+}
+
 /**
  * gst_camera_bin_create_elements:
  * @param camera: the #GstCameraBin
@@ -800,6 +818,7 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
   gboolean new_src = FALSE;
   gboolean new_audio_src = FALSE;
   gboolean has_audio;
+  gboolean profile_switched = FALSE;
 
   if (!camera->elements_created) {
 
@@ -843,8 +862,8 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
       gst_caps_unref (caps);
 
       camera->video_profile = (GstEncodingProfile *) prof;
+      camera->profile_switch = TRUE;
     }
-    g_object_set (camera->encodebin, "profile", camera->video_profile, NULL);
 
     camera->videobin_queue =
         gst_element_factory_make ("queue", "videobin-queue");
@@ -868,17 +887,6 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
     gst_element_link_many (camera->videobin_queue, camera->videobin_capsfilter,
         NULL);
     gst_element_link (camera->encodebin, camera->videosink);
-    {
-      GstPad *srcpad;
-      GstPad *sinkpad = NULL;
-
-      srcpad = gst_element_get_static_pad (camera->videobin_capsfilter, "src");
-      sinkpad = encodebin_find_pad (camera->encodebin, VIDEO_PAD);
-
-      gst_pad_link (srcpad, sinkpad);
-      gst_object_unref (sinkpad);
-      gst_object_unref (srcpad);
-    }
 
     gst_element_link_many (camera->imagebin_queue, camera->imagebin_capsfilter,
         camera->imagebin, NULL);
@@ -898,6 +906,15 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
     g_object_set (camera->videosink, "location", camera->video_location, NULL);
     g_object_set (camera->imagebin, "location", camera->image_location, NULL);
   }
+  if (camera->profile_switch) {
+    g_object_set (camera->encodebin, "profile", camera->video_profile, NULL);
+    gst_camera_bin_link_encodebin (camera, camera->videobin_capsfilter,
+        VIDEO_PAD);
+    camera->profile_switch = FALSE;
+
+    /* used to trigger relinking further down */
+    profile_switched = TRUE;
+  }
 
   /* check if we need to replace the camera src */
   if (camera->src) {
@@ -996,17 +1013,10 @@ gst_camera_bin_create_elements (GstCameraBin * camera)
     gst_element_link_many (camera->audio_src, camera->audio_queue,
         camera->audio_volume,
         camera->audio_capsfilter, camera->audio_convert, NULL);
-    {
-      GstPad *srcpad;
-      GstPad *sinkpad = NULL;
-
-      srcpad = gst_element_get_static_pad (camera->audio_convert, "src");
-      sinkpad = encodebin_find_pad (camera->encodebin, AUDIO_PAD);
+  }
 
-      gst_pad_link (srcpad, sinkpad);
-      gst_object_unref (srcpad);
-      gst_object_unref (sinkpad);
-    }
+  if ((profile_switched && has_audio) || new_audio_src) {
+    gst_camera_bin_link_encodebin (camera, camera->audio_convert, AUDIO_PAD);
   }
 
   camera->elements_created = TRUE;
@@ -1227,8 +1237,11 @@ gst_camera_bin_set_property (GObject * object, guint prop_id,
         g_object_set (camera->src, "preview-caps", camera->preview_caps, NULL);
       break;
     case PROP_VIDEO_ENCODING_PROFILE:
+      if (camera->video_profile)
+        gst_encoding_profile_unref (camera->video_profile);
       camera->video_profile =
           (GstEncodingProfile *) gst_value_dup_mini_object (value);
+      camera->profile_switch = TRUE;
       break;
     case PROP_IMAGE_FILTER:
       if (camera->user_image_filter)
diff --git a/gst/camerabin2/gstcamerabin2.h b/gst/camerabin2/gstcamerabin2.h
index 8d5c660..0518d93 100644
--- a/gst/camerabin2/gstcamerabin2.h
+++ b/gst/camerabin2/gstcamerabin2.h
@@ -73,6 +73,8 @@ struct _GstCameraBin
   /* Index of the auto incrementing file index for video recordings */
   gint video_index;
 
+  gboolean profile_switch;
+
   /* properties */
   gint mode;
   gchar *video_location;



More information about the gstreamer-commits mailing list