Speedup camerabin pipeline element creation (rhbz#797188, gnome#677698)

- Re-enable building of -extras package accidentally disabled by the spec-file
  re-organization done in 0.10.23-3
- Add teletextdec and musicbrainz plugins to -extras
- Minor spec-file cleanups
This commit is contained in:
Hans de Goede 2012-06-08 18:31:28 +02:00
parent 27af02f648
commit ef2d6c3f66
5 changed files with 351 additions and 18 deletions

View File

@ -0,0 +1,26 @@
From 62c58f011e7069aa45e980930cdfa2d937920a77 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 8 Jun 2012 10:57:54 +0200
Subject: [PATCH 1/4] gstcamerabin: Fix spelling error in debug logging
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
gst/camerabin/gstcamerabin.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c
index a17e02c..8a36970 100644
--- a/gst/camerabin/gstcamerabin.c
+++ b/gst/camerabin/gstcamerabin.c
@@ -1517,7 +1517,7 @@ gst_camerabin_set_capsfilter_caps (GstCameraBin * camera, GstCaps * new_caps)
if (camera->src_zoom_filter)
g_object_set (G_OBJECT (camera->src_zoom_filter), "caps", new_caps, NULL);
gst_camerabin_update_aspect_filter (camera, new_caps);
- GST_INFO_OBJECT (camera, "udpated");
+ GST_INFO_OBJECT (camera, "updated");
}
/*
--
1.7.10.2

View File

@ -0,0 +1,121 @@
From a07a1138a8cf8ad1029845dfe4cfdf5a0a36e670 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 8 Jun 2012 11:31:05 +0200
Subject: [PATCH 2/4] camerabin: Add a camerabin_create_view_finder_caps()
helper function
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
gst/camerabin/gstcamerabin.c | 72 +++++++++++++++++++++++-------------------
1 file changed, 40 insertions(+), 32 deletions(-)
diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c
index 8a36970..3f87ff9 100644
--- a/gst/camerabin/gstcamerabin.c
+++ b/gst/camerabin/gstcamerabin.c
@@ -505,22 +505,15 @@ GST_BOILERPLATE_FULL (GstCameraBin, gst_camerabin, GstPipeline,
*/
/*
- * camerabin_setup_src_elements:
+ * camerabin_create_view_finder_caps:
* @camera: camerabin object
*
- * This function updates camerabin capsfilters according
- * to fps, resolution and zoom that have been configured
- * to camerabin.
+ * This function creates new view_finder_caps, according to
+ * fps and resolution that have been configured to camerabin.
*/
-static void
-camerabin_setup_src_elements (GstCameraBin * camera)
+static GstCaps *camerabin_create_view_finder_caps (GstCameraBin * camera)
{
GstStructure *st;
- GstCaps *new_caps;
- gboolean detect_framerate = FALSE;
-
- /* clear video update status */
- camera->video_capture_caps_update = FALSE;
if (!camera->view_finder_caps) {
st = gst_structure_from_string (CAMERABIN_DEFAULT_VF_CAPS, NULL);
@@ -529,39 +522,54 @@ camerabin_setup_src_elements (GstCameraBin * camera)
0));
}
- gst_camerabin_monitor_video_source_properties (camera);
-
if (camera->app_width > 0 && camera->app_height > 0) {
gst_structure_set (st,
"width", G_TYPE_INT, camera->app_width,
"height", G_TYPE_INT, camera->app_height, NULL);
}
- if (camera->app_fps_n > 0 && camera->app_fps_d > 0) {
- if (camera->night_mode) {
- GST_INFO_OBJECT (camera, "night mode, lowest allowed fps will be forced");
- camera->pre_night_fps_n = camera->app_fps_n;
- camera->pre_night_fps_d = camera->app_fps_d;
- detect_framerate = TRUE;
- } else {
- gst_structure_set (st,
- "framerate", GST_TYPE_FRACTION, camera->app_fps_n,
- camera->app_fps_d, NULL);
- new_caps = gst_caps_new_full (st, NULL);
- }
+ if (!camera->night_mode && camera->app_fps_n > 0 && camera->app_fps_d > 0) {
+ gst_structure_set (st,
+ "framerate", GST_TYPE_FRACTION, camera->app_fps_n,
+ camera->app_fps_d, NULL);
} else {
- GST_DEBUG_OBJECT (camera, "no framerate specified");
- detect_framerate = TRUE;
- }
-
- if (detect_framerate) {
- GST_DEBUG_OBJECT (camera, "detecting allowed framerate");
/* Remove old framerate if any */
if (gst_structure_has_field (st, "framerate")) {
gst_structure_remove_field (st, "framerate");
}
- new_caps = gst_caps_new_full (st, NULL);
+ }
+
+ /* The returned caps take ownership of the structure st */
+ return gst_caps_new_full (st, NULL);
+}
+/*
+ * camerabin_setup_src_elements:
+ * @camera: camerabin object
+ *
+ * This function updates camerabin capsfilters according
+ * to fps, resolution and zoom that have been configured
+ * to camerabin.
+ */
+static void
+camerabin_setup_src_elements (GstCameraBin * camera)
+{
+ GstCaps *new_caps;
+
+ /* clear video update status */
+ camera->video_capture_caps_update = FALSE;
+
+ gst_camerabin_monitor_video_source_properties (camera);
+
+ new_caps = camerabin_create_view_finder_caps (camera);
+
+ if (camera->night_mode || camera->app_fps_n <= 0 || camera->app_fps_d <= 0) {
+ if (camera->night_mode) {
+ GST_INFO_OBJECT (camera, "night mode, lowest allowed fps will be forced");
+ camera->pre_night_fps_n = camera->app_fps_n;
+ camera->pre_night_fps_d = camera->app_fps_d;
+ }
+ GST_DEBUG_OBJECT (camera, "detecting allowed framerate");
/* Set allowed framerate for the resolution */
gst_camerabin_set_allowed_framerate (camera, new_caps);
}
--
1.7.10.2

View File

@ -0,0 +1,97 @@
From 1ef6977002ef18631f81646f198ef6a667ef8f73 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 8 Jun 2012 11:41:17 +0200
Subject: [PATCH 3/4] camerabin: Add
gst_camerabin_get_video_source_properties() helper
function
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
gst/camerabin/gstcamerabin.c | 31 +++++++++++++++++++++++++------
1 file changed, 25 insertions(+), 6 deletions(-)
diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c
index 3f87ff9..a36d5b5 100644
--- a/gst/camerabin/gstcamerabin.c
+++ b/gst/camerabin/gstcamerabin.c
@@ -347,6 +347,7 @@ static void gst_camerabin_scene_mode_notify_cb (GObject * video_source,
GParamSpec * pspec, gpointer user_data);
static void gst_camerabin_zoom_notify_cb (GObject * video_source,
GParamSpec * pspec, gpointer user_data);
+static void gst_camerabin_get_video_source_properties (GstCameraBin * camera);
static void gst_camerabin_monitor_video_source_properties (GstCameraBin *
camera);
static void gst_camerabin_configure_format (GstCameraBin * camera,
@@ -528,6 +529,8 @@ static GstCaps *camerabin_create_view_finder_caps (GstCameraBin * camera)
"height", G_TYPE_INT, camera->app_height, NULL);
}
+ gst_camerabin_get_video_source_properties (camera);
+
if (!camera->night_mode && camera->app_fps_n > 0 && camera->app_fps_d > 0) {
gst_structure_set (st,
"framerate", GST_TYPE_FRACTION, camera->app_fps_n,
@@ -559,8 +562,6 @@ camerabin_setup_src_elements (GstCameraBin * camera)
/* clear video update status */
camera->video_capture_caps_update = FALSE;
- gst_camerabin_monitor_video_source_properties (camera);
-
new_caps = camerabin_create_view_finder_caps (camera);
if (camera->night_mode || camera->app_fps_n <= 0 || camera->app_fps_d <= 0) {
@@ -574,6 +575,8 @@ camerabin_setup_src_elements (GstCameraBin * camera)
gst_camerabin_set_allowed_framerate (camera, new_caps);
}
+ gst_camerabin_monitor_video_source_properties (camera);
+
/* Set default zoom method */
if (camera->src_zoom_scale) {
g_object_set (camera->src_zoom_scale, "method",
@@ -2660,6 +2663,26 @@ gst_camerabin_zoom_notify_cb (GObject * video_source, GParamSpec * pspec,
}
/*
+ * gst_camerabin_monitor_get_video_source_properties:
+ * @camera: camerabin object
+ *
+ * Get properties from video source photography interface property scene mode.
+ *
+ */
+static void
+gst_camerabin_get_video_source_properties (GstCameraBin * camera)
+{
+ if (GST_IS_ELEMENT (camera->src_vid_src) &&
+ gst_element_implements_interface (camera->src_vid_src,
+ GST_TYPE_PHOTOGRAPHY)) {
+ gint scene_mode;
+ g_object_get (G_OBJECT (camera->src_vid_src), "scene-mode", &scene_mode,
+ NULL);
+ camera->night_mode = scene_mode == GST_PHOTOGRAPHY_SCENE_MODE_NIGHT;
+ }
+}
+
+/*
* gst_camerabin_monitor_video_source_properties:
* @camera: camerabin object
*
@@ -2674,15 +2697,11 @@ gst_camerabin_monitor_video_source_properties (GstCameraBin * camera)
if (GST_IS_ELEMENT (camera->src_vid_src) &&
gst_element_implements_interface (camera->src_vid_src,
GST_TYPE_PHOTOGRAPHY)) {
- gint scene_mode;
GST_DEBUG_OBJECT (camera,
"connecting to %" GST_PTR_FORMAT " - notify::scene-mode",
camera->src_vid_src);
g_signal_connect (G_OBJECT (camera->src_vid_src), "notify::scene-mode",
(GCallback) gst_camerabin_scene_mode_notify_cb, camera);
- g_object_get (G_OBJECT (camera->src_vid_src), "scene-mode", &scene_mode,
- NULL);
- camera->night_mode = scene_mode == GST_PHOTOGRAPHY_SCENE_MODE_NIGHT;
GST_DEBUG_OBJECT (camera,
"connecting to %" GST_PTR_FORMAT " - notify::zoom",
--
1.7.10.2

View File

@ -0,0 +1,74 @@
From 9ea00bf5e7043cab7da93abcb345b2f5c65285de Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 8 Jun 2012 13:39:37 +0200
Subject: [PATCH 4/4] camerabin: Set src_filter and zoom_src_filter caps while
creating the pipeline
We (Fedora) have been receiving bug reports for cheese, about cheese
taking 30-60 seconds before showing video, and pausing the same amount of
time when changing the resolution for example.
I've managed to reproduce this with a Logitech Webcam Pro 9000, which
supports a large list of resolutions at about 5 different framerates /
resolution, in my case with an unmodified gst-plugins-bad-0.10.23, the
camerabin_create_src_elements function takes approx 7 seconds.
Running under gdb and interrupting the execution during these 7 seconds
consistenly points to gst_caps_intersect_full.
Part of the problem is cheese setting the
GST_CAMERABIN_FLAG_SOURCE_COLOR_CONVERSION flag, which means that after
the first ffmpegcsp element in the pipe the total number of caps is
x resolutions * y framerates * z formats, where both x (due to the camera)
and z (due to ffmpegcsp) being large. intersecting this with the capabilities
of other parts of the pipeline simply leads to an explosion of combinations
which pegs my core i5 CPU @3.1GHz for 7 seconds!
This patch fixes this issue by setting up the capsfilter elements in the pipe
with an initial filter, greatly reducing the number of combinations when doing
cap intersecting.
This reduces the time spend in camerabin_create_src_elements from approx 7
to 0.2 seconds. And when patching cheese to use the default camerabin flags,
(so removing the first ffmpegcsp element) from approx 0.7 to 0.04 seconds
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
gst/camerabin/gstcamerabin.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/gst/camerabin/gstcamerabin.c b/gst/camerabin/gstcamerabin.c
index a36d5b5..6d7d30f 100644
--- a/gst/camerabin/gstcamerabin.c
+++ b/gst/camerabin/gstcamerabin.c
@@ -606,6 +606,7 @@ camerabin_create_src_elements (GstCameraBin * camera)
gboolean ret = FALSE;
GstBin *cbin = GST_BIN (camera);
gchar *driver_name = NULL;
+ GstCaps *filter_caps;
/* Add application set or default video src element */
if (!(camera->src_vid_src = gst_camerabin_setup_default_element (cbin,
@@ -625,6 +626,10 @@ camerabin_create_src_elements (GstCameraBin * camera)
gst_camerabin_create_and_add_element (cbin, "capsfilter",
"src-capsfilter")))
goto done;
+
+ filter_caps = camerabin_create_view_finder_caps (camera);
+ g_object_set (G_OBJECT (camera->src_filter), "caps", filter_caps, NULL);
+
if (camera->flags & GST_CAMERABIN_FLAG_SOURCE_RESIZE) {
if (!(camera->src_zoom_crop =
gst_camerabin_create_and_add_element (cbin, "videocrop",
@@ -638,6 +643,8 @@ camerabin_create_src_elements (GstCameraBin * camera)
gst_camerabin_create_and_add_element (cbin, "capsfilter",
"src-resize-capsfilter")))
goto done;
+ g_object_set (G_OBJECT (camera->src_zoom_filter), "caps", filter_caps,
+ NULL);
}
if (camera->app_video_filter) {
if (!gst_camerabin_add_element (cbin, camera->app_video_filter)) {
--
1.7.10.2

View File

@ -6,15 +6,15 @@
# Turn of extras package on RHEL.
%if ! 0%{?rhel}
%bcond_with extras
%else
%bcond_without extras
%else
%bcond_with extras
%endif
Summary: GStreamer streaming media framework "bad" plug-ins
Name: gstreamer-plugins-bad-free
Version: 0.10.23
Release: 5%{?dist}
Release: 6%{?dist}
# The freeze and nfs plugins are LGPLv2 (only)
License: LGPLv2+ and LGPLv2
Group: Applications/Multimedia
@ -26,7 +26,11 @@ Source: gst-plugins-bad-free-%{version}.tar.xz
Source1: gst-p-bad-cleanup.sh
# Based on upstream 04909e2c50e68
Patch0: vp8enc-bitrate-fix.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
# https://bugzilla.gnome.org/show_bug.cgi?id=677698 / rhbz#797188
Patch1: 0001-gstcamerabin-Fix-spelling-error-in-debug-logging.patch
Patch2: 0002-camerabin-Add-a-camerabin_create_view_finder_caps-he.patch
Patch3: 0003-camerabin-Add-gst_camerabin_get_video_source_propert.patch
Patch4: 0004-camerabin-Set-src_filter-and-zoom_src_filter-caps-wh.patch
Requires: %{gstreamer} >= %{gst_minver}
BuildRequires: %{gstreamer}-devel >= %{gst_minver}
@ -69,6 +73,7 @@ BuildRequires: libdc1394-devel
%endif
BuildRequires: libkate-devel
BuildRequires: libmodplug-devel
BuildRequires: libmusicbrainz-devel
BuildRequires: libtimidity-devel
BuildRequires: libvdpau-devel
BuildRequires: opencv-devel
@ -78,6 +83,7 @@ BuildRequires: slv2-devel
BuildRequires: soundtouch-devel
BuildRequires: wildmidi-devel
BuildRequires: zbar-devel
BuildRequires: zvbi-devel
%endif
Obsoletes: gstreamer-plugins-flumpegdemux < 0.10.15-9
@ -116,6 +122,7 @@ sources (mythtv), sinks (fbdev) and effects (pitch) which are not used
very much and require additional libraries to be installed.
%endif
%package devel
Summary: Development files for the GStreamer media framework "bad" plug-ins
Group: Development/Libraries
@ -150,30 +157,32 @@ aren't tested well enough, or the code is not of good enough quality.
%prep
%setup -q -n gst-plugins-bad-%{version}
%patch0 -p1 -b .vp8enc_bitrate
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%build
%configure \
--with-package-name="Fedora gstreamer-plugins-bad package" \
--with-package-origin="http://download.fedora.redhat.com/fedora" \
%{!?with_extras:--disable-fbdev --disable-decklink --disable-linsys} \
--enable-debug --disable-static --enable-gtk-doc --enable-experimental \
--disable-divx
--disable-divx --disable-dts --disable-faac --disable-faad --disable-nas \
--disable-mimic --disable-libmms --disable-mpeg2enc --disable-mplex \
--disable-neon --disable-openal --disable-rtmp --disable-xvid
make %{?_smp_mflags}
%{__make} %{?_smp_mflags}
%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR="%{buildroot}"
make install DESTDIR="$RPM_BUILD_ROOT"
%find_lang gst-plugins-bad-%{majorminor}
# Clean out files that should not be part of the rpm.
%{__rm} -f %{buildroot}%{_libdir}/gstreamer-%{majorminor}/*.la
%{__rm} -f %{buildroot}%{_libdir}/*.la
%clean
%{__rm} -rf %{buildroot}
rm $RPM_BUILD_ROOT%{_libdir}/gstreamer-%{majorminor}/*.la
rm $RPM_BUILD_ROOT%{_libdir}/*.la
%post -p /sbin/ldconfig
@ -182,7 +191,6 @@ sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%files -f gst-plugins-bad-%{majorminor}.lang
%defattr(-,root,root,-)
%doc AUTHORS COPYING README REQUIREMENTS
#%{_datadir}/gstreamer-%{majorminor}
%{_libdir}/libgstbasecamerabinsrc-%{majorminor}.so.*
@ -290,7 +298,6 @@ sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%if %{with extras}
%files extras
%defattr(-,root,root,-)
# Plugins with external dependencies
%{_libdir}/gstreamer-%{majorminor}/libgstassrender.so
%{_libdir}/gstreamer-%{majorminor}/libgstcdaudio.so
@ -308,7 +315,9 @@ sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%{_libdir}/gstreamer-%{majorminor}/libgstschro.so
%{_libdir}/gstreamer-%{majorminor}/libgstsdl.so
%{_libdir}/gstreamer-%{majorminor}/libgstsoundtouch.so
%{_libdir}/gstreamer-%{majorminor}/libgstteletextdec.so
%{_libdir}/gstreamer-%{majorminor}/libgsttimidity.so
%{_libdir}/gstreamer-%{majorminor}/libgsttrm.so
%{_libdir}/gstreamer-%{majorminor}/libgstvdpau.so
%{_libdir}/gstreamer-%{majorminor}/libgstwildmidi.so
%{_libdir}/gstreamer-%{majorminor}/libgstzbar.so
@ -319,7 +328,6 @@ sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%endif
%files devel
%defattr(-,root,root,-)
%{_libdir}/libgstbasecamerabinsrc-%{majorminor}.so
%{_libdir}/libgstbasevideo-%{majorminor}.so
%{_libdir}/libgstcodecparsers-%{majorminor}.so
@ -343,11 +351,18 @@ sed -i 's/opencv <= 2.2.0/opencv <= 2.4.0/g' configure
%{_libdir}/pkgconfig/gstreamer-plugins-bad-%{majorminor}.pc
%files devel-docs
%defattr(-,root,root,-)
%doc %{_datadir}/gtk-doc/html/gst-plugins-bad-plugins-%{majorminor}
%doc %{_datadir}/gtk-doc/html/gst-plugins-bad-libs-%{majorminor}
%changelog
* Fri Jun 08 2012 Hans de Goede <hdegoede@redhat.com> - 0.10.23-6
- Speedup camerabin pipeline element creation (rhbz#797188, gnome#677698)
- Re-enable building of -extras package accidentally disabled by the spec-file
re-organization done in 0.10.23-3
- Add teletextdec and musicbrainz plugins to -extras
- Minor spec-file cleanups
* Fri Jun 01 2012 Karsten Hopp <karsten@redhat.com> 0.10.23-5
- bump release and rebuild (linked with old libs on PPC)