diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2010-09-14 14:38:17 +0800 |
---|---|---|
committer | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2010-09-14 14:38:17 +0800 |
commit | 9d7af3cbb13bb74ccc28427a7261be514f7cb241 (patch) | |
tree | b2ce90eed594106bc733e2f1824e9149d2cfad6a | |
parent | b28a581a457842fb703b3ed85110e1e4c68f3707 (diff) | |
download | gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar.gz gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar.bz2 gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar.lz gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar.xz gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.tar.zst gsoc2013-empathy-9d7af3cbb13bb74ccc28427a7261be514f7cb241.zip |
Change videosrc element ordering
GStreamers basetransform has a nasty issue where its caps negotiation doesn't
keep the ordering of caps when unioning, as a result of this linking the
pipeline as "<src> ! videoscale ! colorspace ! video/x-raw-yuv" means at the
<src> element yuv is no longer preferred.
Changing the pipeline to be "<src> ! colorspace ! videoscale ! video/x-raw-yuv"
forces the videoscale to only negotiate video/x-raw-yuv, which in turns ensures
the colorspace and <src> element pick the right colorspace.
In combination with emulated formats in v4l2src picking the wrong colorspace
causes quite a performance hit (the src would do a color conversion in libv4l,
while the colorspace element would later convert it back to a colorspace
actually native to the src device!)
-rw-r--r-- | libempathy-gtk/empathy-video-src.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c index 9c7b28fd2..5c865daaa 100644 --- a/libempathy-gtk/empathy-video-src.c +++ b/libempathy-gtk/empathy-video-src.c @@ -147,9 +147,21 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj) g_free (str); if ((element = empathy_gst_add_to_bin (GST_BIN (obj), + element, "ffmpegcolorspace")) == NULL) + g_error ("Failed to add \"ffmpegcolorspace\" (gst-plugins-base missing?)"); + + if ((element = empathy_gst_add_to_bin (GST_BIN (obj), element, "videoscale")) == NULL) g_error ("Failed to add \"videoscale\", (gst-plugins-base missing?)"); + if ((element = empathy_gst_add_to_bin (GST_BIN (obj), + element, "capsfilter")) == NULL) + g_error ( + "Failed to add \"capsfilter\" (gstreamer core elements missing?)"); + + g_object_set (G_OBJECT (element), "caps", caps, NULL); + + /* optionally add postproc_tmpnoise to improve the performance of encoders */ element_back = element; if ((element = empathy_gst_add_to_bin (GST_BIN (obj), @@ -159,17 +171,6 @@ empathy_video_src_init (EmpathyGstVideoSrc *obj) element = element_back; } - if ((element = empathy_gst_add_to_bin (GST_BIN (obj), - element, "ffmpegcolorspace")) == NULL) - g_error ("Failed to add \"ffmpegcolorspace\" (gst-plugins-base missing?)"); - - if ((element = empathy_gst_add_to_bin (GST_BIN (obj), - element, "capsfilter")) == NULL) - g_error ( - "Failed to add \"capsfilter\" (gstreamer core elements missing?)"); - - g_object_set (G_OBJECT (element), "caps", caps, NULL); - src = gst_element_get_static_pad (element, "src"); g_assert (src != NULL); |