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:
Yoann Lopes
2015-02-05 16:37:58 +01:00
parent 656da3d4d6
commit 178c040168
3 changed files with 45 additions and 31 deletions

View File

@@ -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;
} }
} }

View File

@@ -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) {

View File

@@ -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);