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 <christian.stromme@theqtcompany.com>
This commit is contained in:
@@ -249,16 +249,14 @@ bool CameraBinControl::canChangeProperty(PropertyChangeType changeType, QCamera:
|
|||||||
Q_UNUSED(status);
|
Q_UNUSED(status);
|
||||||
|
|
||||||
switch (changeType) {
|
switch (changeType) {
|
||||||
case QCameraControl::CaptureMode:
|
|
||||||
return status != QCamera::ActiveStatus;
|
|
||||||
break;
|
|
||||||
case QCameraControl::ImageEncodingSettings:
|
|
||||||
case QCameraControl::VideoEncodingSettings:
|
|
||||||
case QCameraControl::Viewfinder:
|
case QCameraControl::Viewfinder:
|
||||||
return true;
|
return true;
|
||||||
|
case QCameraControl::CaptureMode:
|
||||||
|
case QCameraControl::ImageEncodingSettings:
|
||||||
|
case QCameraControl::VideoEncodingSettings:
|
||||||
case QCameraControl::ViewfinderSettings:
|
case QCameraControl::ViewfinderSettings:
|
||||||
default:
|
default:
|
||||||
return false;
|
return status != QCamera::ActiveStatus;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1174,14 +1174,47 @@ static bool rateLessThan(const QPair<int,int> &r1, const QPair<int,int> &r2)
|
|||||||
return r1.first*r2.second < r2.first*r1.second;
|
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<int,int> > CameraBinSession::supportedFrameRates(const QSize &frameSize, bool *continuous) const
|
QList< QPair<int,int> > CameraBinSession::supportedFrameRates(const QSize &frameSize, bool *continuous) const
|
||||||
{
|
{
|
||||||
QList< QPair<int,int> > res;
|
QList< QPair<int,int> > res;
|
||||||
|
|
||||||
GstCaps *supportedCaps = 0;
|
GstCaps *supportedCaps = this->supportedCaps(QCamera::CaptureVideo);
|
||||||
g_object_get(G_OBJECT(m_camerabin),
|
|
||||||
SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY,
|
|
||||||
&supportedCaps, NULL);
|
|
||||||
|
|
||||||
if (!supportedCaps)
|
if (!supportedCaps)
|
||||||
return res;
|
return res;
|
||||||
@@ -1284,11 +1317,7 @@ QList<QSize> CameraBinSession::supportedResolutions(QPair<int,int> rate,
|
|||||||
if (continuous)
|
if (continuous)
|
||||||
*continuous = false;
|
*continuous = false;
|
||||||
|
|
||||||
GstCaps *supportedCaps = 0;
|
GstCaps *supportedCaps = this->supportedCaps(mode);
|
||||||
g_object_get(G_OBJECT(m_camerabin),
|
|
||||||
(mode == QCamera::CaptureStillImage) ?
|
|
||||||
SUPPORTED_IMAGE_CAPTURE_CAPS_PROPERTY : SUPPORTED_VIDEO_CAPTURE_CAPS_PROPERTY,
|
|
||||||
&supportedCaps, NULL);
|
|
||||||
|
|
||||||
#if CAMERABIN_DEBUG
|
#if CAMERABIN_DEBUG
|
||||||
qDebug() << "Source caps:" << supportedCaps;
|
qDebug() << "Source caps:" << supportedCaps;
|
||||||
@@ -1422,21 +1451,7 @@ void CameraBinSession::updateSupportedViewfinderSettings()
|
|||||||
{
|
{
|
||||||
m_supportedViewfinderSettings.clear();
|
m_supportedViewfinderSettings.clear();
|
||||||
|
|
||||||
GstCaps *supportedCaps = 0;
|
GstCaps *supportedCaps = this->supportedCaps(QCamera::CaptureViewfinder);
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
// Convert caps to QCameraViewfinderSettings
|
// Convert caps to QCameraViewfinderSettings
|
||||||
if (supportedCaps) {
|
if (supportedCaps) {
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ public slots:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleViewfinderChange();
|
void handleViewfinderChange();
|
||||||
|
void setupCaptureResolution();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void load();
|
void load();
|
||||||
@@ -191,8 +192,8 @@ private:
|
|||||||
void setError(int error, const QString &errorString);
|
void setError(int error, const QString &errorString);
|
||||||
|
|
||||||
bool setupCameraBin();
|
bool setupCameraBin();
|
||||||
void setupCaptureResolution();
|
|
||||||
void setAudioCaptureCaps();
|
void setAudioCaptureCaps();
|
||||||
|
GstCaps *supportedCaps(QCamera::CaptureModes mode) const;
|
||||||
void updateSupportedViewfinderSettings();
|
void updateSupportedViewfinderSettings();
|
||||||
static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d);
|
static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user