From b4d6ab3faeb5b1c3f64016ab99135c5739670685 Mon Sep 17 00:00:00 2001 From: Tim Blechmann Date: Tue, 23 Apr 2024 21:54:57 +0800 Subject: GStreamer: QGstreamerImageCapture - modernisation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * use lambdas for asynchronous invocations * simplify control flow Pick-to: 6.5 6.7 Change-Id: I99695977d177978f1f108949d80fa750c0d72e73 Reviewed-by: Jøger Hansegård Reviewed-by: Artem Dyomin --- .../mediacapture/qgstreamerimagecapture.cpp | 66 +++++++++++----------- .../mediacapture/qgstreamerimagecapture_p.h | 11 ++-- 2 files changed, 39 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp index 5244a1765..cb1d174cd 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp @@ -86,7 +86,9 @@ bool QGstreamerImageCapture::isReadyForCapture() const int QGstreamerImageCapture::capture(const QString &fileName) { - QString path = QMediaStorageLocation::generateFileName(fileName, QStandardPaths::PicturesLocation, QLatin1String("jpg")); + using namespace Qt::Literals; + QString path = QMediaStorageLocation::generateFileName( + fileName, QStandardPaths::PicturesLocation, u"jpg"_s); return doCapture(path); } @@ -231,7 +233,8 @@ void QGstreamerImageCapture::setCaptureSession(QPlatformMediaCaptureSession *ses return; } - connect(m_session, &QPlatformMediaCaptureSession::cameraChanged, this, &QGstreamerImageCapture::onCameraChanged); + connect(m_session, &QPlatformMediaCaptureSession::cameraChanged, this, + &QGstreamerImageCapture::onCameraChanged); onCameraChanged(); } @@ -255,47 +258,42 @@ void QGstreamerImageCapture::onCameraChanged() } } -gboolean QGstreamerImageCapture::saveImageFilter(GstElement *element, - GstBuffer *buffer, - GstPad *pad, - void *appdata) +gboolean QGstreamerImageCapture::saveImageFilter(GstElement *, GstBuffer *buffer, GstPad *, + QGstreamerImageCapture *capture) { - Q_UNUSED(element); - Q_UNUSED(pad); - QGstreamerImageCapture *capture = static_cast(appdata); + capture->saveBufferToImage(buffer); + return true; +} - capture->passImage = false; +void QGstreamerImageCapture::saveBufferToImage(GstBuffer *buffer) +{ + passImage = false; - if (capture->pendingImages.isEmpty()) { - return true; - } + if (pendingImages.isEmpty()) + return; - auto imageData = capture->pendingImages.dequeue(); - if (imageData.filename.isEmpty()) { - return true; - } + auto imageData = pendingImages.dequeue(); + if (imageData.filename.isEmpty()) + return; qCDebug(qLcImageCaptureGst) << "saving image as" << imageData.filename; QFile f(imageData.filename); - if (f.open(QFile::WriteOnly)) { - GstMapInfo info; - if (gst_buffer_map(buffer, &info, GST_MAP_READ)) { - f.write(reinterpret_cast(info.data), info.size); - gst_buffer_unmap(buffer, &info); - } - f.close(); - - static QMetaMethod savedSignal = QMetaMethod::fromSignal(&QGstreamerImageCapture::imageSaved); - savedSignal.invoke(capture, - Qt::QueuedConnection, - Q_ARG(int, imageData.id), - Q_ARG(QString, imageData.filename)); - } else { + if (!f.open(QFile::WriteOnly)) { qCDebug(qLcImageCaptureGst) << " could not open image file for writing"; + return; } - return TRUE; + GstMapInfo info; + if (gst_buffer_map(buffer, &info, GST_MAP_READ)) { + f.write(reinterpret_cast(info.data), info.size); + gst_buffer_unmap(buffer, &info); + } + f.close(); + + QMetaObject::invokeMethod(this, [this, imageData = std::move(imageData)]() mutable { + imageSaved(imageData.id, imageData.filename); + }); } QImageEncoderSettings QGstreamerImageCapture::imageSettings() const @@ -307,9 +305,9 @@ void QGstreamerImageCapture::setImageSettings(const QImageEncoderSettings &setti { if (m_settings != settings) { QSize resolution = settings.resolution(); - if (m_settings.resolution() != resolution && !resolution.isEmpty()) { + if (m_settings.resolution() != resolution && !resolution.isEmpty()) setResolution(resolution); - } + m_settings = settings; } } diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h index 3d8636cbe..fcf9c5d20 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h @@ -15,10 +15,10 @@ // We mean it. // -#include -#include +#include +#include -#include +#include #include #include @@ -58,7 +58,10 @@ private: void setResolution(const QSize &resolution); int doCapture(const QString &fileName); - static gboolean saveImageFilter(GstElement *element, GstBuffer *buffer, GstPad *pad, void *appdata); + static gboolean saveImageFilter(GstElement *element, GstBuffer *buffer, GstPad *pad, + QGstreamerImageCapture *capture); + + void saveBufferToImage(GstBuffer *buffer); QGstreamerMediaCapture *m_session = nullptr; int m_lastId = 0; -- cgit v1.2.3