diff options
3 files changed, 63 insertions, 5 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index a4038c589..1ed663b9b 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -338,6 +338,17 @@ void CameraBinSession::setupCaptureResolution() g_object_set(m_camerabin, VIDEO_CAPTURE_CAPS_PROPERTY, NULL, NULL); } + GstElement *mfw_v4lsrc = 0; + if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "video-source")) { + GstElement *videoSrc = 0; + g_object_get(G_OBJECT(m_videoSrc), "video-source", &videoSrc, NULL); + if (videoSrc) { + const char *name = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(gst_element_get_factory(videoSrc))); + if (!qstrcmp(name, "mfw_v4lsrc")) + mfw_v4lsrc = videoSrc; + } + } + resolution = m_viewfinderSettingsControl->resolution(); if (!resolution.isEmpty()) { GstCaps *caps = resolutionToCaps(resolution); @@ -346,10 +357,35 @@ void CameraBinSession::setupCaptureResolution() #endif g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, caps, NULL); gst_caps_unref(caps); + + if (mfw_v4lsrc) { + int capMode = 0; + if (resolution == QSize(320, 240)) + capMode = 1; + else if (resolution == QSize(720, 480)) + capMode = 2; + else if (resolution == QSize(720, 576)) + capMode = 3; + else if (resolution == QSize(1280, 720)) + capMode = 4; + else if (resolution == QSize(1920, 1080)) + capMode = 5; + g_object_set(G_OBJECT(mfw_v4lsrc), "capture-mode", capMode, NULL); + } } else { g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, NULL, NULL); } + const qreal maxFps = m_viewfinderSettingsControl->maximumFrameRate(); + if (!qFuzzyIsNull(maxFps)) { + if (mfw_v4lsrc) { + int n, d; + gst_util_double_to_fraction(maxFps, &n, &d); + g_object_set(G_OBJECT(mfw_v4lsrc), "fps-n", n, NULL); + g_object_set(G_OBJECT(mfw_v4lsrc), "fps-d", d, NULL); + } + } + if (m_videoEncoder) m_videoEncodeControl->applySettings(m_videoEncoder); } diff --git a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp index 3f7d2f0cf..c5cdee40e 100644 --- a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.cpp @@ -38,7 +38,9 @@ QT_BEGIN_NAMESPACE CameraBinViewfinderSettings::CameraBinViewfinderSettings(QObject *parent) - : QCameraViewfinderSettingsControl(parent) + : QCameraViewfinderSettingsControl(parent), + m_minimumFrameRate(0), + m_maximumFrameRate(0) { } @@ -50,10 +52,10 @@ bool CameraBinViewfinderSettings::isViewfinderParameterSupported(ViewfinderParam { switch (parameter) { case Resolution: - return true; - case PixelAspectRatio: case MinimumFrameRate: case MaximumFrameRate: + return true; + case PixelAspectRatio: case PixelFormat: case UserParameter: return false; @@ -66,9 +68,11 @@ QVariant CameraBinViewfinderSettings::viewfinderParameter(ViewfinderParameter pa switch (parameter) { case Resolution: return m_resolution; - case PixelAspectRatio: case MinimumFrameRate: + return m_minimumFrameRate; case MaximumFrameRate: + return m_maximumFrameRate; + case PixelAspectRatio: case PixelFormat: case UserParameter: return QVariant(); @@ -82,9 +86,13 @@ void CameraBinViewfinderSettings::setViewfinderParameter(ViewfinderParameter par case Resolution: m_resolution = value.toSize(); break; - case PixelAspectRatio: case MinimumFrameRate: + m_minimumFrameRate = value.toFloat(); + break; case MaximumFrameRate: + m_maximumFrameRate = value.toFloat(); + break; + case PixelAspectRatio: case PixelFormat: case UserParameter: break; @@ -96,4 +104,14 @@ QSize CameraBinViewfinderSettings::resolution() const return m_resolution; } +qreal CameraBinViewfinderSettings::minimumFrameRate() const +{ + return m_minimumFrameRate; +} + +qreal CameraBinViewfinderSettings::maximumFrameRate() const +{ + return m_maximumFrameRate; +} + QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h index a6d425338..c5030ffb4 100644 --- a/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h +++ b/src/plugins/gstreamer/camerabin/camerabinviewfindersettings.h @@ -52,9 +52,13 @@ public: void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value); QSize resolution() const; + qreal minimumFrameRate() const; + qreal maximumFrameRate() const; private: QSize m_resolution; + qreal m_minimumFrameRate; + qreal m_maximumFrameRate; }; QT_END_NAMESPACE |