[longomatch] Add audio support to the camera capturer



commit 7feeb28e4183e0f42576f0fb3b76697bd638467f
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Tue Nov 2 01:33:10 2010 +0100

    Add audio support to the camera capturer

 libcesarplayer/src/gst-camera-capturer.c |   42 +++++++++++++++++-------------
 1 files changed, 24 insertions(+), 18 deletions(-)
---
diff --git a/libcesarplayer/src/gst-camera-capturer.c b/libcesarplayer/src/gst-camera-capturer.c
index 86fb2fc..b963e69 100644
--- a/libcesarplayer/src/gst-camera-capturer.c
+++ b/libcesarplayer/src/gst-camera-capturer.c
@@ -958,22 +958,25 @@ cb_new_pad (GstElement * element, GstPad * pad, gpointer data)
   GstCaps *caps;
   const gchar *mime;
   GstElement *sink;
-  GstBin *bin = GST_BIN (data);
+  GstCameraCapturer *gcc = GST_CAMERA_CAPTURER (data);
 
   caps = gst_pad_get_caps (pad);
   mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));
   if (g_strrstr (mime, "video")) {
-    sink = gst_bin_get_by_name (bin, "source_video_sink");
+    sink = gst_bin_get_by_name (GST_BIN(gcc->priv->videosrc), "source_video_sink");
     gst_pad_link (pad, gst_element_get_pad (sink, "sink"));
   } else if (g_strrstr (mime, "audio")) {
-    add_audio_pad (bin, pad);
+    add_audio_pad (GST_BIN(gcc->priv->videosrc), pad);
+    gcc->priv->audiosrc = gcc->priv->videosrc;
+    g_object_set (gcc->priv->camerabin, "audio-source", gcc->priv->audiosrc,
+        NULL);
   }
 }
 
 /* On linux GStreamer packages provided by distributions might still have the
  * dv1394src clock bug and the dvdemuxer buffers duration bug. That's why we
  * can't use decodebin2 and we need to force the use of ffdemux_dv */
-static GstElement *
+static gboolean
 gst_camera_capture_create_dv1394_source_bin (GstCameraCapturer * gcc)
 {
   GstElement *bin;
@@ -988,6 +991,8 @@ gst_camera_capture_create_dv1394_source_bin (GstCameraCapturer * gcc)
   GstPad *src_pad;
 
   bin = gst_bin_new ("videosource");
+  gcc->priv->videosrc = bin;
+
   gcc->priv->device_source =
       gst_element_factory_make (DVVIDEOSRC, "source_device");
   demuxer = gst_element_factory_make ("ffdemux_dv", NULL);
@@ -1010,17 +1015,17 @@ gst_camera_capture_create_dv1394_source_bin (GstCameraCapturer * gcc)
   gst_element_link_many (queue1, decoder, queue2, deinterlacer, videorate,
       colorspace, videoscale, NULL);
 
-  g_signal_connect (demuxer, "pad-added", G_CALLBACK (cb_new_pad), bin);
+  g_signal_connect (demuxer, "pad-added", G_CALLBACK (cb_new_pad), gcc);
 
   /* add ghostpad */
   src_pad = gst_element_get_static_pad (videoscale, "src");
-  gst_element_add_pad (bin, gst_ghost_pad_new ("src", src_pad));
+  gst_element_add_pad (bin, gst_ghost_pad_new ("video", src_pad));
   gst_object_unref (GST_OBJECT (src_pad));
 
-  return bin;
+  return TRUE;
 }
 
-static GstElement *
+static gboolean
 gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
 {
   GstElement *bin;
@@ -1034,6 +1039,8 @@ gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
   GstCaps *source_caps;
 
   bin = gst_bin_new ("videosource");
+  gcc->priv->videosrc = bin;
+
   gcc->priv->device_source =
       gst_element_factory_make (DVVIDEOSRC, "source_device");
   decoder = gst_element_factory_make ("decodebin2", NULL);
@@ -1059,14 +1066,14 @@ gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
   gst_element_link_many (video_queue, colorspace, deinterlacer,
       videorate, videoscale, NULL);
 
-  g_signal_connect (decoder, "pad-added", G_CALLBACK (cb_new_pad), bin);
+  g_signal_connect (decoder, "pad-added", G_CALLBACK (cb_new_pad), gcc);
 
   /* add ghostpad */
   src_pad = gst_element_get_static_pad (videoscale, "src");
-  gst_element_add_pad (bin, gst_ghost_pad_new ("src", src_pad));
+  gst_element_add_pad (bin, gst_ghost_pad_new ("video", src_pad));
   gst_object_unref (GST_OBJECT (src_pad));
 
-  return bin;
+  return TRUE;
 }
 
 gboolean
@@ -1085,14 +1092,12 @@ gst_camera_capturer_set_source (GstCameraCapturer * gcc,
   switch (gcc->priv->source_type) {
     case GST_CAMERA_CAPTURE_SOURCE_TYPE_DV:
     {
-      gcc->priv->videosrc = gst_camera_capture_create_dv1394_source_bin (gcc);
-      /*gcc->priv->audiosrc = gcc->priv->videosrc; */
+      gst_camera_capture_create_dv1394_source_bin (gcc);
       break;
     }
     case GST_CAMERA_CAPTURE_SOURCE_TYPE_DSHOW:
     {
-      gcc->priv->videosrc = gst_camera_capture_create_dshow_source_bin (gcc);
-      /*gcc->priv->audiosrc = gcc->priv->videosrc; */
+      gst_camera_capture_create_dshow_source_bin (gcc);
       break;
     }
     case GST_CAMERA_CAPTURE_SOURCE_TYPE_RAW:
@@ -1115,9 +1120,12 @@ gst_camera_capturer_set_source (GstCameraCapturer * gcc,
 
   g_object_set (gcc->priv->camerabin, "video-source", gcc->priv->videosrc,
       NULL);
+  if (gcc->priv->audiosrc)
+    g_object_set (gcc->priv->camerabin, "audio-source", gcc->priv->audiosrc,
+        NULL);
 
   /* Install pad probe to store the last buffer */
-  videosrcpad = gst_element_get_pad (gcc->priv->videosrc, "src");
+  videosrcpad = gst_element_get_pad (gcc->priv->videosrc, "video");
   gst_pad_add_buffer_probe (videosrcpad,
       G_CALLBACK (gst_camera_capture_videosrc_buffer_probe), gcc);
   return TRUE;
@@ -1151,8 +1159,6 @@ gst_camera_capturer_new (gchar * filename, GError ** err)
   g_object_set (gcc->priv->camerabin, "mode", 1, NULL);
 
 
-  GST_INFO_OBJECT (gcc, "Disabling audio");
-  flags = GST_CAMERABIN_FLAG_DISABLE_AUDIO;
 #ifdef WIN32
   flags |= GST_CAMERABIN_FLAG_VIEWFINDER_COLOR_CONVERSION;
 #endif



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]