[longomatch] Add an audio pad yo the source when the source has audio



commit daf0e7a3a03d8ba8a426be64eeaed4df5a4080a6
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Fri Oct 29 22:51:05 2010 +0200

    Add an audio pad yo the source when the source has audio

 libcesarplayer/src/gst-camera-capturer.c |   48 ++++++++++++++++++++++++++----
 1 files changed, 42 insertions(+), 6 deletions(-)
---
diff --git a/libcesarplayer/src/gst-camera-capturer.c b/libcesarplayer/src/gst-camera-capturer.c
index 9502cdb..86fb2fc 100644
--- a/libcesarplayer/src/gst-camera-capturer.c
+++ b/libcesarplayer/src/gst-camera-capturer.c
@@ -919,6 +919,39 @@ gst_camera_capture_videosrc_buffer_probe (GstPad * pad, GstBuffer * buf,
   return TRUE;
 }
 
+static gboolean
+add_audio_pad (GstBin * source_bin, GstPad * audio_src_pad)
+{
+  /* audio */
+  GstElement *audio_queue;
+  GstElement * audioconvert;
+  GstPad * queue_sink_pad;
+  GstPad * audioconvert_src_pad;
+  GstPad * ghost_pad;
+
+  audio_queue = gst_element_factory_make ("queue", "audio_queue");
+  audioconvert = gst_element_factory_make ("audioconvert", NULL);
+
+  gst_bin_add_many (source_bin, audio_queue, audioconvert, NULL);
+
+  gst_element_set_state (audio_queue, GST_STATE_PLAYING);
+  gst_element_set_state (audioconvert, GST_STATE_PLAYING);
+
+  queue_sink_pad = gst_element_get_static_pad (audio_queue, "sink");
+  gst_pad_link (audio_src_pad, queue_sink_pad);
+  gst_element_link (audio_queue, audioconvert);
+  gst_object_unref (GST_OBJECT (queue_sink_pad));
+
+  /* add ghostpad */
+  audioconvert_src_pad = gst_element_get_static_pad (audioconvert, "src");
+  ghost_pad = gst_ghost_pad_new ("audio", audioconvert_src_pad);
+  gst_pad_set_active(ghost_pad,TRUE);
+  gst_element_add_pad (GST_ELEMENT (source_bin), ghost_pad);
+  gst_object_unref (GST_OBJECT (audioconvert_src_pad));
+
+  return TRUE;
+}
+
 static void
 cb_new_pad (GstElement * element, GstPad * pad, gpointer data)
 {
@@ -932,9 +965,8 @@ cb_new_pad (GstElement * element, GstPad * pad, gpointer data)
   if (g_strrstr (mime, "video")) {
     sink = gst_bin_get_by_name (bin, "source_video_sink");
     gst_pad_link (pad, gst_element_get_pad (sink, "sink"));
-  }
-  if (g_strrstr (mime, "audio")) {
-    /* Not implemented yet */
+  } else if (g_strrstr (mime, "audio")) {
+    add_audio_pad (bin, pad);
   }
 }
 
@@ -993,6 +1025,7 @@ gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
 {
   GstElement *bin;
   GstElement *decoder;
+  GstElement *video_queue;
   GstElement *deinterlacer;
   GstElement *colorspace;
   GstElement *videorate;
@@ -1004,8 +1037,10 @@ gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
   gcc->priv->device_source =
       gst_element_factory_make (DVVIDEOSRC, "source_device");
   decoder = gst_element_factory_make ("decodebin2", NULL);
-  colorspace = gst_element_factory_make ("ffmpegcolorspace",
+  video_queue = gst_element_factory_make ("queue",
       "source_video_sink");
+  colorspace = gst_element_factory_make ("ffmpegcolorspace",
+      NULL);
   deinterlacer = gst_element_factory_make ("ffdeinterlace", NULL);
   videorate = gst_element_factory_make ("videorate", NULL);
   videoscale = gst_element_factory_make ("videoscale", NULL);
@@ -1016,12 +1051,13 @@ gst_camera_capture_create_dshow_source_bin (GstCameraCapturer * gcc)
       gcc->priv->device_id, NULL);
 
   gst_bin_add_many (GST_BIN (bin), gcc->priv->device_source, decoder,
-      colorspace, deinterlacer, videorate, videoscale, NULL);
+      video_queue, colorspace, deinterlacer, videorate, videoscale, NULL);
   source_caps =
       gst_caps_from_string ("video/x-dv, systemstream=true;"
       "video/x-raw-rgb; video/x-raw-yuv");
   gst_element_link_filtered (gcc->priv->device_source, decoder, source_caps);
-  gst_element_link_many (colorspace, deinterlacer, videorate, videoscale, NULL);
+  gst_element_link_many (video_queue, colorspace, deinterlacer,
+      videorate, videoscale, NULL);
 
   g_signal_connect (decoder, "pad-added", G_CALLBACK (cb_new_pad), bin);
 



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