diff options
Diffstat (limited to 'src/multimedia/platform/gstreamer/mediacapture')
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; |