summaryrefslogtreecommitdiffstats
path: root/src/plugins/gstreamer/camerabin/camerabinsession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/gstreamer/camerabin/camerabinsession.cpp')
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp98
1 files changed, 55 insertions, 43 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
index 2e5c53a4d..e61615bc1 100644
--- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
@@ -39,6 +39,7 @@
**
****************************************************************************/
#include "camerabinsession.h"
+#include "camerabincontrol.h"
#include "camerabinrecorder.h"
#include "camerabincontainer.h"
#include "camerabinaudioencoder.h"
@@ -152,6 +153,7 @@ CameraBinSession::CameraBinSession(QObject *parent)
m_busHelper = new QGstreamerBusHelper(m_bus, this);
m_busHelper->installMessageFilter(this);
+ m_cameraControl = new CameraBinControl(this);
m_audioEncodeControl = new CameraBinAudioEncoder(this);
m_videoEncodeControl = new CameraBinVideoEncoder(this);
m_imageEncodeControl = new CameraBinImageEncoder(this);
@@ -169,6 +171,10 @@ CameraBinSession::CameraBinSession(QObject *parent)
m_captureDestinationControl = new CameraBinCaptureDestination(this);
m_captureBufferFormatControl = new CameraBinCaptureBufferFormat(this);
+ QByteArray envFlags = qgetenv("QT_GSTREAMER_CAMERABIN_FLAGS");
+ if (!envFlags.isEmpty())
+ g_object_set(G_OBJECT(m_camerabin), "flags", envFlags.toInt(), NULL);
+
//post image preview in RGB format
g_object_set(G_OBJECT(m_camerabin), POST_PREVIEWS_PROPERTY, TRUE, NULL);
@@ -197,19 +203,10 @@ GstPhotography *CameraBinSession::photography()
return GST_PHOTOGRAPHY(m_camerabin);
}
- if (!m_videoSrc) {
- m_videoSrc = buildCameraSource();
-
- if (m_videoSrc)
- g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL);
- else
- g_object_get(m_camerabin, CAMERA_SOURCE_PROPERTY, &m_videoSrc, NULL);
+ GstElement * const source = buildCameraSource();
- m_videoInputHasChanged = false;
- }
-
- if (m_videoSrc && GST_IS_PHOTOGRAPHY(m_videoSrc))
- return GST_PHOTOGRAPHY(m_videoSrc);
+ if (source && GST_IS_PHOTOGRAPHY(source))
+ return GST_PHOTOGRAPHY(source);
return 0;
}
@@ -225,17 +222,8 @@ CameraBinSession::CameraRole CameraBinSession::cameraRole() const
*/
bool CameraBinSession::setupCameraBin()
{
- if (m_videoInputHasChanged) {
- m_videoSrc = buildCameraSource();
-
- if (m_videoSrc)
- g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL);
- else
- g_object_get(m_camerabin, CAMERA_SOURCE_PROPERTY, &m_videoSrc, NULL);
-
- m_videoInputHasChanged = false;
- }
-
+ if (!buildCameraSource())
+ return false;
if (m_viewfinderHasChanged) {
if (m_viewfinderElement)
@@ -370,28 +358,43 @@ GstElement *CameraBinSession::buildCameraSource()
#if CAMERABIN_DEBUG
qDebug() << Q_FUNC_INFO;
#endif
+ if (!m_videoInputHasChanged)
+ return m_videoSrc;
+ m_videoInputHasChanged = false;
+
GstElement *videoSrc = 0;
+ g_object_get(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, &videoSrc, NULL);
- QList<QByteArray> candidates;
- candidates << "subdevsrc" << "wrappercamerabinsrc";
- QByteArray sourceElementName;
+ // If the QT_GSTREAMER_CAMERABIN_SRC environment variable has been set use the source
+ // it recommends.
+ const QByteArray envCandidate = qgetenv("QT_GSTREAMER_CAMERABIN_SRC");
+ if (!m_videoSrc && !envCandidate.isEmpty()) {
+ m_videoSrc = gst_element_factory_make(envCandidate.constData(), "camera_source");
+ }
- foreach (sourceElementName, candidates) {
- videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source");
- if (videoSrc)
- break;
+ // If gstreamer has set a default source use it.
+ if (!m_videoSrc)
+ m_videoSrc = videoSrc;
+
+ // If there's no better guidance try the names of some known camera source elements.
+ if (!m_videoSrc) {
+ const QList<QByteArray> candidates = QList<QByteArray>()
+ << "subdevsrc"
+ << "wrappercamerabinsrc";
+
+ foreach (const QByteArray &sourceElementName, candidates) {
+ m_videoSrc = gst_element_factory_make(sourceElementName.constData(), "camera_source");
+ if (m_videoSrc)
+ break;
+ }
}
- if (videoSrc && !m_inputDevice.isEmpty()) {
+ if (m_videoSrc && !m_inputDevice.isEmpty()) {
#if CAMERABIN_DEBUG
qDebug() << "set camera device" << m_inputDevice;
#endif
- if (sourceElementName == "subdevsrc") {
- if (m_inputDevice == QLatin1String("secondary"))
- g_object_set(G_OBJECT(videoSrc), "camera-device", 1, NULL);
- else
- g_object_set(G_OBJECT(videoSrc), "camera-device", 0, NULL);
- } else if (sourceElementName == "wrappercamerabinsrc") {
+
+ if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "video-source")) {
GstElement *src = 0;
if (m_videoInputFactory)
@@ -401,12 +404,21 @@ GstElement *CameraBinSession::buildCameraSource()
if (src) {
g_object_set(G_OBJECT(src), "device", m_inputDevice.toUtf8().constData(), NULL);
- g_object_set(G_OBJECT(videoSrc), "video-source", src, NULL);
+ g_object_set(G_OBJECT(m_videoSrc), "video-source", src, NULL);
+ }
+ } else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_videoSrc), "camera-device")) {
+ if (m_inputDevice == QLatin1String("secondary")) {
+ g_object_set(G_OBJECT(m_videoSrc), "camera-device", 1, NULL);
+ } else {
+ g_object_set(G_OBJECT(m_videoSrc), "camera-device", 0, NULL);
}
}
}
- return videoSrc;
+ if (m_videoSrc != videoSrc)
+ g_object_set(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL);
+
+ return m_videoSrc;
}
void CameraBinSession::captureImage(int requestId, const QString &fileName)
@@ -440,6 +452,8 @@ void CameraBinSession::setCaptureMode(QCamera::CaptureModes mode)
g_object_set(m_camerabin, MODE_PROPERTY, CAMERABIN_VIDEO_MODE, NULL);
break;
}
+
+ m_recorderControl->updateStatus();
}
QUrl CameraBinSession::outputLocation() const
@@ -494,7 +508,7 @@ QString CameraBinSession::generateFileName(const QString &prefix, const QDir &di
{
int lastClip = 0;
foreach(QString fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(ext))) {
- int imgNumber = fileName.mid(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt();
+ int imgNumber = fileName.midRef(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt();
lastClip = qMax(lastClip, imgNumber);
}
@@ -626,9 +640,7 @@ void CameraBinSession::setState(QCamera::State newState)
m_viewfinderInterface->stopRenderer();
gst_element_set_state(m_camerabin, GST_STATE_NULL);
- m_videoSrc = buildCameraSource();
- g_object_set(m_camerabin, CAMERA_SOURCE_PROPERTY, m_videoSrc, NULL);
- m_videoInputHasChanged = false;
+ buildCameraSource();
}
#ifdef USE_READY_STATE_ON_LOADED
gst_element_set_state(m_camerabin, GST_STATE_READY);