Add resolution and fps on mfw_v4lsrc
Add support for changing resolution and frame rate with mfw_v4lsrc.
This is essential for embedded applications that are not happy with
the default VGA@30.
This makes constructs like the following functional on devices like
i.MX6 with MIPI cameras:
Camera { viewfinder { resolution: "320x240"; maximumFrameRate: 15 } }
Change-Id: Ia297afdb5ca51c6e55ad45dce37fdab7da3a5cfb
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
This commit is contained in:
@@ -338,6 +338,17 @@ void CameraBinSession::setupCaptureResolution()
|
|||||||
g_object_set(m_camerabin, VIDEO_CAPTURE_CAPS_PROPERTY, NULL, NULL);
|
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();
|
resolution = m_viewfinderSettingsControl->resolution();
|
||||||
if (!resolution.isEmpty()) {
|
if (!resolution.isEmpty()) {
|
||||||
GstCaps *caps = resolutionToCaps(resolution);
|
GstCaps *caps = resolutionToCaps(resolution);
|
||||||
@@ -346,10 +357,35 @@ void CameraBinSession::setupCaptureResolution()
|
|||||||
#endif
|
#endif
|
||||||
g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, caps, NULL);
|
g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, caps, NULL);
|
||||||
gst_caps_unref(caps);
|
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 {
|
} else {
|
||||||
g_object_set(m_camerabin, VIEWFINDER_CAPS_PROPERTY, NULL, NULL);
|
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)
|
if (m_videoEncoder)
|
||||||
m_videoEncodeControl->applySettings(m_videoEncoder);
|
m_videoEncodeControl->applySettings(m_videoEncoder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,9 @@
|
|||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
CameraBinViewfinderSettings::CameraBinViewfinderSettings(QObject *parent)
|
CameraBinViewfinderSettings::CameraBinViewfinderSettings(QObject *parent)
|
||||||
: QCameraViewfinderSettingsControl(parent)
|
: QCameraViewfinderSettingsControl(parent),
|
||||||
|
m_minimumFrameRate(0),
|
||||||
|
m_maximumFrameRate(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,10 +52,10 @@ bool CameraBinViewfinderSettings::isViewfinderParameterSupported(ViewfinderParam
|
|||||||
{
|
{
|
||||||
switch (parameter) {
|
switch (parameter) {
|
||||||
case Resolution:
|
case Resolution:
|
||||||
return true;
|
|
||||||
case PixelAspectRatio:
|
|
||||||
case MinimumFrameRate:
|
case MinimumFrameRate:
|
||||||
case MaximumFrameRate:
|
case MaximumFrameRate:
|
||||||
|
return true;
|
||||||
|
case PixelAspectRatio:
|
||||||
case PixelFormat:
|
case PixelFormat:
|
||||||
case UserParameter:
|
case UserParameter:
|
||||||
return false;
|
return false;
|
||||||
@@ -66,9 +68,11 @@ QVariant CameraBinViewfinderSettings::viewfinderParameter(ViewfinderParameter pa
|
|||||||
switch (parameter) {
|
switch (parameter) {
|
||||||
case Resolution:
|
case Resolution:
|
||||||
return m_resolution;
|
return m_resolution;
|
||||||
case PixelAspectRatio:
|
|
||||||
case MinimumFrameRate:
|
case MinimumFrameRate:
|
||||||
|
return m_minimumFrameRate;
|
||||||
case MaximumFrameRate:
|
case MaximumFrameRate:
|
||||||
|
return m_maximumFrameRate;
|
||||||
|
case PixelAspectRatio:
|
||||||
case PixelFormat:
|
case PixelFormat:
|
||||||
case UserParameter:
|
case UserParameter:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
@@ -82,9 +86,13 @@ void CameraBinViewfinderSettings::setViewfinderParameter(ViewfinderParameter par
|
|||||||
case Resolution:
|
case Resolution:
|
||||||
m_resolution = value.toSize();
|
m_resolution = value.toSize();
|
||||||
break;
|
break;
|
||||||
case PixelAspectRatio:
|
|
||||||
case MinimumFrameRate:
|
case MinimumFrameRate:
|
||||||
|
m_minimumFrameRate = value.toFloat();
|
||||||
|
break;
|
||||||
case MaximumFrameRate:
|
case MaximumFrameRate:
|
||||||
|
m_maximumFrameRate = value.toFloat();
|
||||||
|
break;
|
||||||
|
case PixelAspectRatio:
|
||||||
case PixelFormat:
|
case PixelFormat:
|
||||||
case UserParameter:
|
case UserParameter:
|
||||||
break;
|
break;
|
||||||
@@ -96,4 +104,14 @@ QSize CameraBinViewfinderSettings::resolution() const
|
|||||||
return m_resolution;
|
return m_resolution;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal CameraBinViewfinderSettings::minimumFrameRate() const
|
||||||
|
{
|
||||||
|
return m_minimumFrameRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
qreal CameraBinViewfinderSettings::maximumFrameRate() const
|
||||||
|
{
|
||||||
|
return m_maximumFrameRate;
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
@@ -52,9 +52,13 @@ public:
|
|||||||
void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value);
|
void setViewfinderParameter(ViewfinderParameter parameter, const QVariant &value);
|
||||||
|
|
||||||
QSize resolution() const;
|
QSize resolution() const;
|
||||||
|
qreal minimumFrameRate() const;
|
||||||
|
qreal maximumFrameRate() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSize m_resolution;
|
QSize m_resolution;
|
||||||
|
qreal m_minimumFrameRate;
|
||||||
|
qreal m_maximumFrameRate;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|||||||
Reference in New Issue
Block a user