From dac42b77124239862e31b2b5d23df362b4ce2f91 Mon Sep 17 00:00:00 2001 From: Alexey Fisher Date: Thu, 9 Sep 2010 22:28:21 +0200 Subject: Add two optional filter to video src Add videomaxrate and postproc_tmpnoise as optional filters to empathy_video_src_init. Thay will used if thay are installed. videomaxrate will set maximal framerate to 15fps if some haw webcam will get more than 15fps it will not kill empathy-av with high CPU load. postproc_tmpnoise will reduce video noise produced by most (all) webcams. This will add smoll overhead for load but reduce CPU load of video encoder. Also this should reduce network load (for theoraenc x2) Signed-off-by: Alexey Fisher --- libempathy-gtk/empathy-video-src.c | 67 +++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c index 2beb469b2..b7dea70c3 100644 --- a/libempathy-gtk/empathy-video-src.c +++ b/libempathy-gtk/empathy-video-src.c @@ -105,36 +105,71 @@ static void empathy_video_src_init (EmpathyGstVideoSrc *obj) { EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (obj); - GstElement *scale, *colorspace, *capsfilter; + GstElement *element, *element_back; GstPad *ghost, *src; GstCaps *caps; + gchar *str; + + /* allocate caps here, so we can update it by optional elements */ + caps = gst_caps_new_simple ("video/x-raw-yuv", + "width", G_TYPE_INT, 320, + "height", G_TYPE_INT, 240, + NULL); /* allocate any data required by the object here */ - priv->src = empathy_gst_make_to_bin (GST_BIN (obj), NULL, "gconfvideosrc"); - if (!priv->src) + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + NULL, "gconfvideosrc"))) g_error ("gst-plugins-good is probably missing. exit"); - scale = empathy_gst_make_to_bin (GST_BIN (obj), priv->src, "videoscale"); - if (!scale) + /* we need to save our source to priv->src */ + priv->src = element; + + /* videomaxrate is curently optional plugin, becouse it depend on + * gst-plugins-bad. So we won't fail if it not exist. + * todo: in some time videorate will probably replace videomaxrate */ + /* make a backup of *element before optional GstElement */ + element_back = element; + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + element, "videomaxrate"))) + { + g_warning ("gst-plugins-bad is probably missing."); + element = element_back; + } + else + gst_caps_set_simple (caps, + "framerate", GST_TYPE_FRACTION, 15, 1, + NULL); + + str = gst_caps_to_string (caps); + g_debug ("Current video src caps are : %s", str); + g_free (str); + + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + element, "videoscale"))) g_error ("gst-plugins-base is probably missing. exit"); - colorspace = empathy_gst_make_to_bin (GST_BIN (obj), - scale, "ffmpegcolorspace"); - if (!colorspace) + /* postproc_tmpnois is other optional plugin, it depend on gst-ffmpeg. + * may be some day it will go to gst-plugins-base, than we can restrickt it */ + element_back = element; + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + element, "postproc_tmpnoise"))) + { + g_warning ("gst-ffmpeg is probably missing."); + element = element_back; + } + + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + element, "ffmpegcolorspace"))) g_error ("gst-plugins-base is probably missing. exit"); - capsfilter = empathy_gst_make_to_bin (GST_BIN (obj), scale, "capsfilter"); - if (!capsfilter) + if (!(element = empathy_gst_make_to_bin (GST_BIN (obj), + element, "capsfilter"))) g_error ("core libgstreamer is probably missing. exit"); - caps = gst_caps_new_simple ("video/x-raw-yuv", - "width", G_TYPE_INT, 320, - "height", G_TYPE_INT, 240, - NULL); + g_object_set (G_OBJECT (element), "caps", caps, NULL); - g_object_set (G_OBJECT (capsfilter), "caps", caps, NULL); - src = gst_element_get_static_pad (colorspace, "src"); + src = gst_element_get_static_pad (element, "src"); if (!src) g_error ("src pad not found. exit"); -- cgit