diff options
Diffstat (limited to 'src/plugins/gstreamer/camerabin')
5 files changed, 27 insertions, 30 deletions
diff --git a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp index 910c6c2ce..f27cd7f35 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinimagecapture.cpp @@ -82,8 +82,8 @@ CameraBinImageCapture::CameraBinImageCapture(CameraBinSession *session) connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateState())); connect(m_session, SIGNAL(imageExposed(int)), this, SIGNAL(imageExposed(int))); connect(m_session, SIGNAL(imageCaptured(int,QImage)), this, SIGNAL(imageCaptured(int,QImage))); - connect(m_session, SIGNAL(busMessage(QGstreamerMessage)), SLOT(handleBusMessage(QGstreamerMessage))); + m_session->bus()->installMessageFilter(this); g_signal_connect(G_OBJECT(m_session->cameraBin()), IMAGE_DONE_SIGNAL, G_CALLBACK(handleImageSaved), this); } @@ -281,7 +281,7 @@ gboolean CameraBinImageCapture::jpegBufferProbe(GstPad *pad, GstBuffer *buffer, return destination & QCameraImageCapture::CaptureToFile; } -void CameraBinImageCapture::handleBusMessage(const QGstreamerMessage &message) +bool CameraBinImageCapture::processBusMessage(const QGstreamerMessage &message) { //Install metadata event and buffer probes @@ -298,7 +298,7 @@ void CameraBinImageCapture::handleBusMessage(const QGstreamerMessage &message) if (newState == GST_STATE_READY) { GstElement *element = GST_ELEMENT(GST_MESSAGE_SRC(gm)); if (!element) - return; + return false; QString elementName = QString::fromLatin1(gst_element_get_name(element)); if (elementName.contains("jpegenc") && element != m_jpegEncoderElement) { @@ -339,4 +339,6 @@ void CameraBinImageCapture::handleBusMessage(const QGstreamerMessage &message) } } } + + return false; } diff --git a/src/plugins/gstreamer/camerabin/camerabinimagecapture.h b/src/plugins/gstreamer/camerabin/camerabinimagecapture.h index 6cc910dbe..ddb04e1ea 100644 --- a/src/plugins/gstreamer/camerabin/camerabinimagecapture.h +++ b/src/plugins/gstreamer/camerabin/camerabinimagecapture.h @@ -48,9 +48,10 @@ QT_USE_NAMESPACE -class CameraBinImageCapture : public QCameraImageCaptureControl +class CameraBinImageCapture : public QCameraImageCaptureControl, public QGstreamerBusMessageFilter { Q_OBJECT + Q_INTERFACES(QGstreamerBusMessageFilter) public: CameraBinImageCapture(CameraBinSession *session); virtual ~CameraBinImageCapture(); @@ -62,9 +63,10 @@ public: int capture(const QString &fileName); void cancelCapture(); + bool processBusMessage(const QGstreamerMessage &message); + private slots: void updateState(); - void handleBusMessage(const QGstreamerMessage &message); private: static gboolean metadataEventProbe(GstPad *pad, GstEvent *event, CameraBinImageCapture *); diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.cpp b/src/plugins/gstreamer/camerabin/camerabinservice.cpp index 75d820bfd..93bcc6993 100644 --- a/src/plugins/gstreamer/camerabin/camerabinservice.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinservice.cpp @@ -160,17 +160,16 @@ QMediaControl *CameraBinService::requestControl(const char *name) if (!m_videoOutput) { if (qstrcmp(name, QVideoRendererControl_iid) == 0) { m_videoOutput = m_videoRenderer; - m_captureSession->setViewfinder(m_videoRenderer); } else if (qstrcmp(name, QVideoWindowControl_iid) == 0) { m_videoOutput = m_videoWindow; - m_captureSession->setViewfinder(m_videoWindow); } else if (qstrcmp(name, QVideoWidgetControl_iid) == 0) { - m_captureSession->setViewfinder(m_videoWidgetControl); m_videoOutput = m_videoWidgetControl; } - if (m_videoOutput) + if (m_videoOutput) { + m_captureSession->setViewfinder(m_videoOutput); return m_videoOutput; + } } if (qstrcmp(name,QAudioEndpointSelector_iid) == 0) diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index d1552c0af..fbcc85266 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -145,8 +145,8 @@ CameraBinSession::CameraBinSession(QObject *parent) m_bus = gst_element_get_bus(m_pipeline); m_busHelper = new QGstreamerBusHelper(m_bus, this); - m_busHelper->installSyncEventFilter(this); - connect(m_busHelper, SIGNAL(message(QGstreamerMessage)), SLOT(handleBusMessage(QGstreamerMessage))); + m_busHelper->installMessageFilter(this); + m_audioEncodeControl = new CameraBinAudioEncoder(this); m_videoEncodeControl = new CameraBinVideoEncoder(this); m_imageEncodeControl = new CameraBinImageEncoder(this); @@ -534,6 +534,8 @@ void CameraBinSession::setViewfinder(QObject *viewfinder) this, SLOT(handleViewfinderChange())); disconnect(m_viewfinder, SIGNAL(readyChanged(bool)), this, SIGNAL(readyChanged(bool))); + + m_busHelper->removeMessageFilter(m_viewfinder); } m_viewfinder = viewfinder; @@ -544,6 +546,8 @@ void CameraBinSession::setViewfinder(QObject *viewfinder) this, SLOT(handleViewfinderChange())); connect(m_viewfinder, SIGNAL(readyChanged(bool)), this, SIGNAL(readyChanged(bool))); + + m_busHelper->installMessageFilter(m_viewfinder); } emit viewfinderChanged(); @@ -795,24 +799,14 @@ bool CameraBinSession::processSyncMessage(const QGstreamerMessage &message) } } - if (gst_structure_has_name(gm->structure, "prepare-xwindow-id")) { - if (m_viewfinderInterface) - m_viewfinderInterface->precessNewStream(); - - return true; - } - if (gst_structure_has_name(gm->structure, GST_PHOTOGRAPHY_AUTOFOCUS_DONE)) m_cameraFocusControl->handleFocusMessage(gm); - - if (m_viewfinderInterface && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_viewfinderElement)) - m_viewfinderInterface->handleSyncMessage(gm); } return false; } -void CameraBinSession::handleBusMessage(const QGstreamerMessage &message) +bool CameraBinSession::processBusMessage(const QGstreamerMessage &message) { GstMessage* gm = message.rawMessage(); @@ -911,12 +905,9 @@ void CameraBinSession::handleBusMessage(const QGstreamerMessage &message) } //qDebug() << "New session state:" << ENUM_NAME(CameraBinSession,"State",m_state); } - - if (m_viewfinderInterface && GST_MESSAGE_SRC(gm) == GST_OBJECT_CAST(m_viewfinderElement)) - m_viewfinderInterface->handleBusMessage(gm); - - emit busMessage(message); } + + return false; } void CameraBinSession::recordVideo() diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.h b/src/plugins/gstreamer/camerabin/camerabinsession.h index 5504bb505..cc646cbfd 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.h +++ b/src/plugins/gstreamer/camerabin/camerabinsession.h @@ -76,10 +76,13 @@ public: virtual GstElement *buildElement() = 0; }; -class CameraBinSession : public QObject, public QGstreamerSyncEventFilter +class CameraBinSession : public QObject, + public QGstreamerBusMessageFilter, + public QGstreamerSyncMessageFilter { Q_OBJECT Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) + Q_INTERFACES(QGstreamerBusMessageFilter QGstreamerSyncMessageFilter) public: enum CameraRole { FrontCamera, // Secondary camera @@ -91,6 +94,7 @@ public: GstPhotography *photography(); GstElement *cameraBin() { return m_pipeline; } + QGstreamerBusHelper *bus() { return m_busHelper; } CameraRole cameraRole() const; @@ -146,6 +150,7 @@ public: bool isMuted() const; bool processSyncMessage(const QGstreamerMessage &message); + bool processBusMessage(const QGstreamerMessage &message); signals: void stateChanged(QCamera::State state); @@ -157,7 +162,6 @@ signals: void viewfinderChanged(); void readyChanged(bool); void busyChanged(bool); - void busMessage(const QGstreamerMessage &message); public slots: void setDevice(const QString &device); @@ -167,7 +171,6 @@ public slots: void setMuted(bool); private slots: - void handleBusMessage(const QGstreamerMessage &message); void handleViewfinderChange(); private: |