summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/mediacapture
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture')
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp112
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h16
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp44
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h6
4 files changed, 98 insertions, 80 deletions
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
index a6bac1a04..d6ee3fdb4 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp
@@ -57,20 +57,6 @@ Q_LOGGING_CATEGORY(qLcMediaCapture, "qt.multimedia.capture")
QGstreamerMediaCapture::QGstreamerMediaCapture()
: gstPipeline("pipeline")
{
- gstAudioInput = new QGstreamerAudioInput(this);
- gstAudioInput->setPipeline(gstPipeline);
- connect(gstAudioInput, &QGstreamerAudioInput::mutedChanged, this, &QGstreamerMediaCapture::mutedChanged);
- connect(gstAudioInput, &QGstreamerAudioInput::volumeChanged, this, &QGstreamerMediaCapture::volumeChanged);
-
- gstAudioOutput = new QGstreamerAudioOutput(this);
- gstAudioOutput->setPipeline(gstPipeline);
- gstAudioTee = QGstElement("tee", "audiotee");
-
- gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee, gstAudioOutput->gstElement());
- gstAudioInput->gstElement().link(gstAudioTee);
- auto pad = gstAudioTee.getRequestPad("src_%u");
- pad.link(gstAudioOutput->gstElement().staticPad("sink"));
-
gstVideoOutput = new QGstreamerVideoOutput(this);
gstVideoOutput->setIsPreview();
gstVideoOutput->setPipeline(gstPipeline);
@@ -179,34 +165,41 @@ QPlatformMediaEncoder *QGstreamerMediaCapture::mediaEncoder()
return m_mediaEncoder;
}
-QAudioDevice QGstreamerMediaCapture::audioInput() const
-{
- return gstAudioInput->audioInput();
-}
-
-bool QGstreamerMediaCapture::setAudioInput(const QAudioDevice &info)
-{
- return gstAudioInput->setAudioInput(info);
-}
-
-bool QGstreamerMediaCapture::isMuted() const
+void QGstreamerMediaCapture::setAudioInput(QPlatformAudioInput *input)
{
- return gstAudioOutput->isMuted();
-}
+ if (gstAudioInput == input)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
+ if (gstAudioInput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioInput = nullptr;
+ if (gstAudioOutput) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ if (!gstAudioTee.isNull()) {
+ gstAudioTee.setStateSync(GST_STATE_NULL);
+ gstPipeline.remove(gstAudioTee);
+ }
+ gstAudioTee = {};
+ }
+ gstAudioInput = static_cast<QGstreamerAudioInput *>(input);
+ if (gstAudioInput)
+ gstAudioInput->setPipeline(gstPipeline);
-void QGstreamerMediaCapture::setMuted(bool muted)
-{
- gstAudioOutput->setMuted(muted);
-}
+ Q_ASSERT(gstAudioTee.isNull());
+ gstAudioTee = QGstElement("tee", "audiotee");
+ gstAudioTee.set("allow-not-linked", true);
+ gstPipeline.add(gstAudioInput->gstElement(), gstAudioTee);
+ gstAudioInput->gstElement().link(gstAudioTee);
-qreal QGstreamerMediaCapture::volume() const
-{
- return gstAudioOutput->volume();
-}
+ if (gstAudioOutput) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
-void QGstreamerMediaCapture::setVolume(qreal volume)
-{
- gstAudioOutput->setVolume(volume);
+ gstPipeline.setState(GST_STATE_PLAYING);
}
void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
@@ -214,17 +207,38 @@ void QGstreamerMediaCapture::setVideoPreview(QVideoSink *sink)
gstVideoOutput->setVideoSink(sink);
}
-QAudioDevice QGstreamerMediaCapture::audioPreview() const
+void QGstreamerMediaCapture::setAudioOutput(QPlatformAudioOutput *output)
{
- return gstAudioOutput->audioOutput();
-}
+ if (gstAudioOutput == output)
+ return;
+ gstPipeline.setStateSync(GST_STATE_PAUSED);
-bool QGstreamerMediaCapture::setAudioPreview(const QAudioDevice &info)
-{
- gstAudioOutput->setAudioOutput(info);
- return true;
+ if (gstAudioOutput) {
+ gstAudioOutput->setPipeline({});
+ gstAudioOutput = nullptr;
+ if (!gstAudioTee.isNull()) {
+ gstAudioOutput->gstElement().setStateSync(GST_STATE_NULL);
+ gstAudioOutputPad.unlinkPeer();
+ gstAudioTee.releaseRequestPad(gstAudioOutputPad);
+ gstAudioOutputPad = {};
+ gstPipeline.remove(gstAudioOutput->gstElement());
+ }
+ setupAudioPipeline();
+ }
+ gstAudioOutput = static_cast<QGstreamerAudioOutput *>(output);
+ if (gstAudioOutput)
+ gstAudioOutput->setPipeline(gstPipeline);
+
+ if (!gstAudioTee.isNull()) {
+ gstPipeline.add(gstAudioOutput->gstElement());
+ gstAudioOutputPad = gstAudioTee.getRequestPad("src_%u");
+ gstAudioOutputPad.link(gstAudioOutput->gstElement().staticPad("sink"));
+ }
+
+ gstPipeline.setState(GST_STATE_PLAYING);
}
+
QGstPad QGstreamerMediaCapture::getAudioPad() const
{
return gstAudioTee.getRequestPad("src_%u");
@@ -247,5 +261,13 @@ void QGstreamerMediaCapture::releaseVideoPad(const QGstPad &pad) const
gstVideoTee.releaseRequestPad(pad);
}
+void QGstreamerMediaCapture::setupAudioPipeline()
+{
+
+ if (!gstAudioInput) {
+ return;
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
index d4ad23292..bf10054d1 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture_p.h
@@ -83,19 +83,10 @@ public:
QPlatformMediaEncoder *mediaEncoder() override;
void setMediaEncoder(QPlatformMediaEncoder *encoder) override;
- bool isMuted() const override;
- void setMuted(bool) override;
- qreal volume() const override;
- void setVolume(qreal volume) override;
-
- QAudioDevice audioInput() const override;
- bool setAudioInput(const QAudioDevice &id) override;
+ void setAudioInput(QPlatformAudioInput *input) override;
void setVideoPreview(QVideoSink *sink) override;
- QAudioDevice audioPreview() const override;
- bool setAudioPreview(const QAudioDevice &info) override;
-
- // void cameraChanged();
+ void setAudioOutput(QPlatformAudioOutput *output) override;
QGstPad getAudioPad() const;
QGstPad getVideoPad() const;
@@ -104,6 +95,8 @@ public:
QGstPipeline pipeline() const { return gstPipeline; }
+ void setupAudioPipeline();
+
private:
friend QGstreamerMediaEncoder;
// Gst elements
@@ -115,6 +108,7 @@ private:
QGstElement gstAudioTee;
QGstElement gstVideoTee;
+ QGstPad gstAudioOutputPad;
QGstreamerAudioOutput *gstAudioOutput = nullptr;
QGstreamerVideoOutput *gstVideoOutput = nullptr;
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index c50f91a6a..81fcecc2e 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -56,7 +56,7 @@
Q_LOGGING_CATEGORY(qLcMediaEncoder, "qt.multimedia.encoder")
-QGstreamerMediaEncoder::QGstreamerMediaEncoder(QMediaEncoder *parent)
+QGstreamerMediaEncoder::QGstreamerMediaEncoder(QMediaRecorder *parent)
: QPlatformMediaEncoder(parent)
{
gstEncoder = QGstElement("encodebin", "encodebin");
@@ -84,27 +84,27 @@ bool QGstreamerMediaEncoder::setOutputLocation(const QUrl &sink)
void QGstreamerMediaEncoder::updateStatus()
{
- static QMediaEncoder::Status statusTable[3][3] = {
+ static QMediaRecorder::Status statusTable[3][3] = {
//Stopped recorder state:
- { QMediaEncoder::StoppedStatus, QMediaEncoder::FinalizingStatus, QMediaEncoder::FinalizingStatus },
+ { QMediaRecorder::StoppedStatus, QMediaRecorder::FinalizingStatus, QMediaRecorder::FinalizingStatus },
//Recording recorder state:
- { QMediaEncoder::StartingStatus, QMediaEncoder::RecordingStatus, QMediaEncoder::PausedStatus },
+ { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus },
//Paused recorder state:
- { QMediaEncoder::StartingStatus, QMediaEncoder::RecordingStatus, QMediaEncoder::PausedStatus }
+ { QMediaRecorder::StartingStatus, QMediaRecorder::RecordingStatus, QMediaRecorder::PausedStatus }
};
- QMediaEncoder::State sessionState = QMediaEncoder::StoppedState;
+ QMediaRecorder::RecorderState sessionState = QMediaRecorder::StoppedState;
auto gstState = gstEncoder.isNull() ? GST_STATE_NULL : gstEncoder.state();
switch (gstState) {
case GST_STATE_PLAYING:
- sessionState = QMediaEncoder::RecordingState;
+ sessionState = QMediaRecorder::RecordingState;
break;
case GST_STATE_PAUSED:
- sessionState = QMediaEncoder::PausedState;
+ sessionState = QMediaRecorder::PausedState;
break;
default:
- sessionState = QMediaEncoder::StoppedState;
+ sessionState = QMediaRecorder::StoppedState;
break;
}
@@ -114,7 +114,7 @@ void QGstreamerMediaEncoder::updateStatus()
statusChanged(newStatus);
}
-void QGstreamerMediaEncoder::handleSessionError(QMediaEncoder::Error code, const QString &description)
+void QGstreamerMediaEncoder::handleSessionError(QMediaRecorder::Error code, const QString &description)
{
error(code, description);
stop();
@@ -153,7 +153,7 @@ bool QGstreamerMediaEncoder::processBusMessage(const QGstreamerMessage &message)
GError *err;
gchar *debug;
gst_message_parse_error(gm, &err, &debug);
- error(QMediaEncoder::ResourceError, QString::fromUtf8(err->message));
+ error(QMediaRecorder::ResourceError, QString::fromUtf8(err->message));
g_error_free(err);
g_free(debug);
}
@@ -264,19 +264,19 @@ static GstEncodingContainerProfile *createEncodingProfile(const QMediaEncoderSet
return containerProfile;
}
-void QGstreamerMediaEncoder::setState(QMediaEncoder::State s)
+void QGstreamerMediaEncoder::setState(QMediaRecorder::RecorderState s)
{
if (s == state())
return;
switch (s) {
- case QMediaEncoder::StoppedState:
+ case QMediaRecorder::StoppedState:
stop();
break;
- case QMediaEncoder::PausedState:
+ case QMediaRecorder::PausedState:
pause();
break;
- case QMediaEncoder::RecordingState:
+ case QMediaRecorder::RecordingState:
record();
break;
}
@@ -288,11 +288,11 @@ void QGstreamerMediaEncoder::record()
if (!m_session)
return;
auto oldState = state();
- stateChanged(QMediaEncoder::RecordingState);
+ stateChanged(QMediaRecorder::RecordingState);
- if (oldState == QMediaEncoder::PausedState) {
+ if (oldState == QMediaRecorder::PausedState) {
// coming from paused state
- stateChanged(QMediaEncoder::RecordingState);
+ stateChanged(QMediaRecorder::RecordingState);
gstEncoder.setState(GST_STATE_PLAYING);
updateStatus();
return;
@@ -317,8 +317,10 @@ void QGstreamerMediaEncoder::record()
gstFileSink.lockState(false);
audioSrcPad = m_session->getAudioPad();
- QGstPad audioPad = gstEncoder.getRequestPad("audio_%u");
- audioSrcPad.link(audioPad);
+ if (!audioSrcPad.isNull()) {
+ QGstPad audioPad = gstEncoder.getRequestPad("audio_%u");
+ audioSrcPad.link(audioPad);
+ }
if (m_resolvedSettings.videoCodec() != QMediaFormat::VideoCodec::Unspecified) {
videoSrcPad = m_session->getVideoPad();
@@ -372,7 +374,7 @@ void QGstreamerMediaEncoder::stop()
qCDebug(qLcMediaEncoder) << ">>>>>>>>>>>>> sending EOS";
gstEncoder.sendEos();
- stateChanged(QMediaEncoder::StoppedState);
+ stateChanged(QMediaRecorder::StoppedState);
updateStatus();
}
diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
index ae4170c5d..3c0238c02 100644
--- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
+++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediaencoder_p.h
@@ -69,7 +69,7 @@ class QGstreamerMessage;
class QGstreamerMediaEncoder : public QPlatformMediaEncoder, QGstreamerBusMessageFilter
{
public:
- QGstreamerMediaEncoder(QMediaEncoder *parent);
+ QGstreamerMediaEncoder(QMediaRecorder *parent);
virtual ~QGstreamerMediaEncoder();
QUrl outputLocation() const override;
@@ -90,7 +90,7 @@ public:
private:
bool processBusMessage(const QGstreamerMessage& message) override;
public:
- void setState(QMediaEncoder::State state) override;
+ void setState(QMediaRecorder::RecorderState state) override;
void record();
void pause();
void stop();
@@ -98,7 +98,7 @@ public:
private:
void updateStatus();
- void handleSessionError(QMediaEncoderBase::Error code, const QString &description);
+ void handleSessionError(QMediaRecorder::Error code, const QString &description);
void finalize();
QDir defaultDir() const;
QString generateFileName(const QDir &dir, const QString &ext) const;