summaryrefslogtreecommitdiffstats
path: root/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/gstreamer/camerabin/camerabinrecorder.cpp')
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinrecorder.cpp111
1 files changed, 84 insertions, 27 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp b/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp
index 8b8495c1e..8e75e71ae 100644
--- a/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinrecorder.cpp
@@ -47,12 +47,18 @@
#include <gst/pbutils/encoding-profile.h>
+QT_BEGIN_NAMESPACE
+
CameraBinRecorder::CameraBinRecorder(CameraBinSession *session)
:QMediaRecorderControl(session),
m_session(session),
- m_state(QMediaRecorder::StoppedState)
+ m_state(QMediaRecorder::StoppedState),
+ m_status(QMediaRecorder::UnloadedStatus)
{
- connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateState()));
+ connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateStatus()));
+ connect(m_session, SIGNAL(pendingStateChanged(QCamera::State)), SLOT(updateStatus()));
+ connect(m_session, SIGNAL(busyChanged(bool)), SLOT(updateStatus()));
+
connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64)));
connect(m_session, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool)));
}
@@ -77,13 +83,43 @@ QMediaRecorder::State CameraBinRecorder::state() const
return m_state;
}
-void CameraBinRecorder::updateState()
+QMediaRecorder::Status CameraBinRecorder::status() const
{
- if (m_session->state() != QCamera::ActiveState &&
- m_state != QMediaRecorder::StoppedState) {
- m_session->stopVideoRecording();
- emit stateChanged(m_state = QMediaRecorder::StoppedState);
+ return m_status;
+}
+
+void CameraBinRecorder::updateStatus()
+{
+ QCamera::State sessionState = m_session->state();
+
+ QMediaRecorder::State oldState = m_state;
+ QMediaRecorder::Status oldStatus = m_status;
+
+ if (sessionState == QCamera::ActiveState &&
+ m_session->captureMode().testFlag(QCamera::CaptureVideo)) {
+
+ if (m_state == QMediaRecorder::RecordingState) {
+ m_status = QMediaRecorder::RecordingStatus;
+ } else {
+ m_status = m_session->isBusy() ?
+ QMediaRecorder::FinalizingStatus :
+ QMediaRecorder::LoadedStatus;
+ }
+ } else {
+ if (m_state == QMediaRecorder::RecordingState) {
+ m_state = QMediaRecorder::StoppedState;
+ m_session->stopVideoRecording();
+ }
+ m_status = m_session->pendingState() == QCamera::ActiveState ?
+ QMediaRecorder::LoadingStatus :
+ QMediaRecorder::UnloadedStatus;
}
+
+ if (m_state != oldState)
+ emit stateChanged(m_state);
+
+ if (m_status != oldStatus)
+ emit statusChanged(m_status);
}
qint64 CameraBinRecorder::duration() const
@@ -91,29 +127,13 @@ qint64 CameraBinRecorder::duration() const
return m_session->duration();
}
-void CameraBinRecorder::record()
-{
- if (m_session->state() == QCamera::ActiveState) {
- m_session->recordVideo();
- emit stateChanged(m_state = QMediaRecorder::RecordingState);
- } else
- emit error(QMediaRecorder::ResourceError, tr("Service has not been started"));
-}
-void CameraBinRecorder::pause()
+void CameraBinRecorder::applySettings()
{
- emit error(QMediaRecorder::ResourceError, tr("QMediaRecorder::pause() is not supported by camerabin2."));
+ //settings are applied during camera startup
}
-void CameraBinRecorder::stop()
-{
- if (m_session->state() == QCamera::ActiveState) {
- m_session->stopVideoRecording();
- emit stateChanged(m_state = QMediaRecorder::StoppedState);
- }
-}
-
-void CameraBinRecorder::applySettings()
+GstEncodingContainerProfile *CameraBinRecorder::videoProfile()
{
GstEncodingContainerProfile *containerProfile = m_session->mediaContainerControl()->createProfile();
@@ -125,7 +145,42 @@ void CameraBinRecorder::applySettings()
gst_encoding_container_profile_add_profile(containerProfile, videoProfile);
}
- g_object_set (G_OBJECT(m_session->cameraBin()), "video-profile", containerProfile, NULL);
+ return containerProfile;
+}
+
+void CameraBinRecorder::setState(QMediaRecorder::State state)
+{
+ if (m_state == state)
+ return;
+
+ QMediaRecorder::State oldState = m_state;
+ QMediaRecorder::Status oldStatus = m_status;
+
+ switch (state) {
+ case QMediaRecorder::StoppedState:
+ m_state = state;
+ m_status = QMediaRecorder::FinalizingStatus;
+ m_session->stopVideoRecording();
+ break;
+ case QMediaRecorder::PausedState:
+ emit error(QMediaRecorder::ResourceError, tr("QMediaRecorder::pause() is not supported by camerabin2."));
+ break;
+ case QMediaRecorder::RecordingState:
+ if (m_session->state() == QCamera::ActiveState) {
+ m_session->recordVideo();
+ m_state = state;
+ m_status = QMediaRecorder::RecordingStatus;
+ emit actualLocationChanged(m_session->outputLocation());
+ } else {
+ emit error(QMediaRecorder::ResourceError, tr("Service has not been started"));
+ }
+ }
+
+ if (m_state != oldState)
+ emit stateChanged(m_state);
+
+ if (m_status != oldStatus)
+ emit statusChanged(m_status);
}
bool CameraBinRecorder::isMuted() const
@@ -137,3 +192,5 @@ void CameraBinRecorder::setMuted(bool muted)
{
m_session->setMuted(muted);
}
+
+QT_END_NAMESPACE