qtmobility/plugins/multimedia/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp
--- a/qtmobility/plugins/multimedia/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/multimedia/gstreamer/mediacapture/qgstreamerrecordercontrol.cpp Mon May 03 13:18:40 2010 +0300
@@ -40,6 +40,9 @@
****************************************************************************/
#include "qgstreamerrecordercontrol.h"
+#include "qgstreameraudioencode.h"
+#include "qgstreamervideoencode.h"
+#include "qgstreamermediacontainercontrol.h"
#include <QtCore/QDebug>
QGstreamerRecorderControl::QGstreamerRecorderControl(QGstreamerCaptureSession *session)
@@ -100,9 +103,9 @@
void QGstreamerRecorderControl::record()
{
m_session->dumpGraph("before-record");
- if (!m_hasPreviewState || m_session->state() != QGstreamerCaptureSession::StoppedState)
+ if (!m_hasPreviewState || m_session->state() != QGstreamerCaptureSession::StoppedState) {
m_session->setState(QGstreamerCaptureSession::RecordingState);
- else
+ } else
emit error(QMediaRecorder::ResourceError, tr("Service has not been started"));
m_session->dumpGraph("after-record");
@@ -111,9 +114,9 @@
void QGstreamerRecorderControl::pause()
{
m_session->dumpGraph("before-pause");
- if (!m_hasPreviewState || m_session->state() != QGstreamerCaptureSession::StoppedState)
+ if (!m_hasPreviewState || m_session->state() != QGstreamerCaptureSession::StoppedState) {
m_session->setState(QGstreamerCaptureSession::PausedState);
- else
+ } else
emit error(QMediaRecorder::ResourceError, tr("Service has not been started"));
}
@@ -126,3 +129,100 @@
m_session->setState(QGstreamerCaptureSession::PreviewState);
}
}
+
+void QGstreamerRecorderControl::applySettings()
+{
+ //Check the codecs are compatible with container,
+ //and choose the compatible codecs/container if omitted
+ QGstreamerAudioEncode *audioEncodeControl = m_session->audioEncodeControl();
+ QGstreamerVideoEncode *videoEncodeControl = m_session->videoEncodeControl();
+ QGstreamerMediaContainerControl *mediaContainerControl = m_session->mediaContainerControl();
+
+ bool needAudio = m_session->captureMode() & QGstreamerCaptureSession::Audio;
+ bool needVideo = m_session->captureMode() & QGstreamerCaptureSession::Video;
+
+ QStringList containerCandidates;
+ if (mediaContainerControl->containerMimeType().isEmpty())
+ containerCandidates = mediaContainerControl->supportedContainers();
+ else
+ containerCandidates << mediaContainerControl->containerMimeType();
+
+
+ QStringList audioCandidates;
+ if (needAudio) {
+ QAudioEncoderSettings audioSettings = audioEncodeControl->audioSettings();
+ if (audioSettings.codec().isEmpty())
+ audioCandidates = audioEncodeControl->supportedAudioCodecs();
+ else
+ audioCandidates << audioSettings.codec();
+ }
+
+ QStringList videoCandidates;
+ if (needVideo) {
+ QVideoEncoderSettings videoSettings = videoEncodeControl->videoSettings();
+ if (videoSettings.codec().isEmpty())
+ videoCandidates = videoEncodeControl->supportedVideoCodecs();
+ else
+ videoCandidates << videoSettings.codec();
+ }
+
+ QString container;
+ QString audioCodec;
+ QString videoCodec;
+
+ foreach (const QString &containerCandidate, containerCandidates) {
+ QSet<QString> supportedTypes = mediaContainerControl->supportedStreamTypes(containerCandidate);
+
+ audioCodec.clear();
+ videoCodec.clear();
+
+ if (needAudio) {
+ bool found = false;
+ foreach (const QString &audioCandidate, audioCandidates) {
+ QSet<QString> audioTypes = audioEncodeControl->supportedStreamTypes(audioCandidate);
+ if (!audioTypes.intersect(supportedTypes).isEmpty()) {
+ found = true;
+ audioCodec = audioCandidate;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ }
+
+ if (needVideo) {
+ bool found = false;
+ foreach (const QString &videoCandidate, videoCandidates) {
+ QSet<QString> videoTypes = videoEncodeControl->supportedStreamTypes(videoCandidate);
+ if (!videoTypes.intersect(supportedTypes).isEmpty()) {
+ found = true;
+ videoCodec = videoCandidate;
+ break;
+ }
+ }
+ if (!found)
+ continue;
+ }
+
+ container = containerCandidate;
+ break;
+ }
+
+ if (container.isEmpty()) {
+ emit error(QMediaRecorder::FormatError, tr("Not compatible codecs and container format."));
+ } else {
+ mediaContainerControl->setContainerMimeType(container);
+
+ if (needAudio) {
+ QAudioEncoderSettings audioSettings = audioEncodeControl->audioSettings();
+ audioSettings.setCodec(audioCodec);
+ audioEncodeControl->setAudioSettings(audioSettings);
+ }
+
+ if (needVideo) {
+ QVideoEncoderSettings videoSettings = videoEncodeControl->videoSettings();
+ videoSettings.setCodec(videoCodec);
+ videoEncodeControl->setVideoSettings(videoSettings);
+ }
+ }
+}