From 178c0401685a56541995ca1ac9b5f6a4b543626d Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 5 Feb 2015 16:37:58 +0100 Subject: [PATCH] GStreamer: some improvements with the camerabin's capture settings. - Don't pretend we support changing the image or video capture settings while the camera is active. The pipeline needs to be restarted in order to renegotiate caps. - Improved retrieving the supported capture resolutions and frame rates when using wrappercamerabinsrc. We now always get the supported values directly from the video source. Change-Id: I107193288e370af105a25d16568a8f5a76022ada Reviewed-by: Christian Stromme --- .../gstreamer/camerabin/camerabincontrol.cpp | 10 ++- .../gstreamer/camerabin/camerabinsession.cpp | 63 ++++++++++++------- .../gstreamer/camerabin/camerabinsession.h | 3 +- 3 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp index 8d1f9fd4..bc60d3a5 100644 --- a/src/plugins/gstreamer/camerabin/camerabincontrol.cpp +++ b/src/plugins/gstreamer/camerabin/camerabincontrol.cpp @@ -249,16 +249,14 @@ bool CameraBinControl::canChangeProperty(PropertyChangeType changeType, QCamera: Q_UNUSED(status); switch (changeType) { - case QCameraControl::CaptureMode: - return status != QCamera::ActiveStatus; - break; - case QCameraControl::ImageEncodingSettings: - case QCameraControl::VideoEncodingSettings: case QCameraControl::Viewfinder: return true; + case QCameraControl::CaptureMode: + case QCameraControl::ImageEncodingSettings: + case QCameraControl::VideoEncodingSettings: case QCameraControl::ViewfinderSettings: default: - return false; + return status != QCamera::ActiveStatus; } } diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 356ad8db..ed7e7d41 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -1174,14 +1174,47 @@ static bool rateLessThan(const QPair &r1, const QPair &r2) return r1.first*r2.second < r2.first*r1.second; } +GstCaps *CameraBinSession::supportedCaps(QCamera::CaptureModes mode) const +{ + GstCaps *supportedCaps = 0; + + // When using wrappercamerabinsrc, get the supported caps directly from the video source element. + // This makes sure we only get the caps actually supported by the video source element. + if (m_videoSrc) { + GstPad *pad = gst_element_get_static_pad(m_videoSrc, "src"); + if (pad) { + supportedCaps = qt_gst_pad_get_caps(pad); + gst_object_unref(GST_OBJECT(pad)); + } + } + + // Otherwise, let the camerabin handle this. + if (!supportedCaps) { + const gchar *prop; + switch (mode) { + case QCamera::CaptureStillImage: + prop = SUPPORTED_IMAGE_CAPTURE_CAPS_PROPERTY; + break; + case QCamera::CaptureVideo: + prop = SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY; + break; + case QCamera::CaptureViewfinder: + default: + prop = SUPPORTED_VIEWFINDER_CAPS_PROPERTY; + break; + } + + g_object_get(G_OBJECT(m_camerabin), prop, &supportedCaps, NULL); + } + + return supportedCaps; +} + QList< QPair > CameraBinSession::supportedFrameRates(const QSize &frameSize, bool *continuous) const { QList< QPair > res; - GstCaps *supportedCaps = 0; - g_object_get(G_OBJECT(m_camerabin), - SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY, - &supportedCaps, NULL); + GstCaps *supportedCaps = this->supportedCaps(QCamera::CaptureVideo); if (!supportedCaps) return res; @@ -1284,11 +1317,7 @@ QList CameraBinSession::supportedResolutions(QPair rate, if (continuous) *continuous = false; - GstCaps *supportedCaps = 0; - g_object_get(G_OBJECT(m_camerabin), - (mode == QCamera::CaptureStillImage) ? - SUPPORTED_IMAGE_CAPTURE_CAPS_PROPERTY : SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY, - &supportedCaps, NULL); + GstCaps *supportedCaps = this->supportedCaps(mode); #if CAMERABIN_DEBUG qDebug() << "Source caps:" << supportedCaps; @@ -1422,21 +1451,7 @@ void CameraBinSession::updateSupportedViewfinderSettings() { m_supportedViewfinderSettings.clear(); - GstCaps *supportedCaps = 0; - - // When using wrappercamerabinsrc, get the supported caps directly from the video source element. - // This makes sure we only get the caps actually supported by the video source element. - if (m_videoSrc) { - GstPad *pad = gst_element_get_static_pad(m_videoSrc, "src"); - if (pad) { - supportedCaps = qt_gst_pad_get_caps(pad); - gst_object_unref(GST_OBJECT(pad)); - } - } - - // Otherwise, let the camerabin handle this. - if (!supportedCaps) - g_object_get(G_OBJECT(m_camerabin), SUPPORTED_VIEWFINDER_CAPS_PROPERTY, &supportedCaps, NULL); + GstCaps *supportedCaps = this->supportedCaps(QCamera::CaptureViewfinder); // Convert caps to QCameraViewfinderSettings if (supportedCaps) { diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.h b/src/plugins/gstreamer/camerabin/camerabinsession.h index f957c55d..71590a7d 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.h +++ b/src/plugins/gstreamer/camerabin/camerabinsession.h @@ -179,6 +179,7 @@ public slots: private slots: void handleViewfinderChange(); + void setupCaptureResolution(); private: void load(); @@ -191,8 +192,8 @@ private: void setError(int error, const QString &errorString); bool setupCameraBin(); - void setupCaptureResolution(); void setAudioCaptureCaps(); + GstCaps *supportedCaps(QCamera::CaptureModes mode) const; void updateSupportedViewfinderSettings(); static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d);