diff --git a/0001-gstcamerabin-Fix-spelling-error-in-debug-logging.patch b/0001-gstcamerabin-Fix-spelling-error-in-debug-logging.patch new file mode 100644 index 0000000..f98e03a --- /dev/null +++ b/0001-gstcamerabin-Fix-spelling-error-in-debug-logging.patch @@ -0,0 +1,26 @@ +From 62c58f011e7069aa45e980930cdfa2d937920a77 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +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 +--- + 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 + diff --git a/0002-camerabin-Add-a-camerabin_create_view_finder_caps-he.patch b/0002-camerabin-Add-a-camerabin_create_view_finder_caps-he.patch new file mode 100644 index 0000000..3edb6ec --- /dev/null +++ b/0002-camerabin-Add-a-camerabin_create_view_finder_caps-he.patch @@ -0,0 +1,121 @@ +From a07a1138a8cf8ad1029845dfe4cfdf5a0a36e670 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +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 +--- + 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 + diff --git a/0003-camerabin-Add-gst_camerabin_get_video_source_propert.patch b/0003-camerabin-Add-gst_camerabin_get_video_source_propert.patch new file mode 100644 index 0000000..3950bb7 --- /dev/null +++ b/0003-camerabin-Add-gst_camerabin_get_video_source_propert.patch @@ -0,0 +1,97 @@ +From 1ef6977002ef18631f81646f198ef6a667ef8f73 Mon Sep 17 00:00:00 2001 +From: Hans de Goede +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 +--- + 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 + diff --git a/0004-camerabin-Set-src_filter-and-zoom_src_filter-caps-wh.patch b/0004-camerabin-Set-src_filter-and-zoom_src_filter-caps-wh.patch new file mode 100644 index 0000000..ade66be --- /dev/null +++ b/0004-camerabin-Set-src_filter-and-zoom_src_filter-caps-wh.patch @@ -0,0 +1,74 @@ +From 9ea00bf5e7043cab7da93abcb345b2f5c65285de Mon Sep 17 00:00:00 2001 +From: Hans de Goede +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 +--- + 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 + diff --git a/gstreamer-plugins-bad-free.spec b/gstreamer-plugins-bad-free.spec index 655dbcc..7f7ac3c 100644 --- a/gstreamer-plugins-bad-free.spec +++ b/gstreamer-plugins-bad-free.spec @@ -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 - 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 0.10.23-5 - bump release and rebuild (linked with old libs on PPC)