diff options
author | Ari Parkkila <ari.parkkila@qt.io> | 2023-01-20 10:03:17 +0200 |
---|---|---|
committer | Ari Parkkila <ari.parkkila@qt.io> | 2023-02-02 15:40:23 +0200 |
commit | 48365df8784626dbe9d16220eac15419007471ef (patch) | |
tree | a9c3d4941e05a4e5c7f769c49577e99de5787f4f | |
parent | 1c0e25e3618f6063a45207fd0f49d33b6c2b4353 (diff) |
Handle resolution change in QGstreamerImageCapture
Add filter element in gstreamer queue and update size of
captured image when image settings are changed.
Task-number: QTBUG-98506
Change-Id: I87d8ed20cf5326f9f5db76626e476499a2e1d491
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit f27ba7f8759db070525ef4cbaae757a34d80a306)
-rw-r--r-- | src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp | 28 | ||||
-rw-r--r-- | src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h | 2 |
2 files changed, 27 insertions, 3 deletions
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp index 92bda67f2..793834d03 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp @@ -38,12 +38,13 @@ QGstreamerImageCapture::QGstreamerImageCapture(QImageCapture *parent) encoder = QGstElement("jpegenc", "jpegEncoder"); muxer = QGstElement("jifmux", "jpegMuxer"); sink = QGstElement("fakesink","imageCaptureSink"); + filter = QGstElement("capsfilter", "filter"); // imageCaptureSink do not wait for a preroll buffer when going READY -> PAUSED // as no buffer will arrive until capture() is called sink.set("async", false); - bin.add(queue, videoConvert, encoder, muxer, sink); - queue.link(videoConvert, encoder, muxer, sink); + bin.add(queue, filter, videoConvert, encoder, muxer, sink); + queue.link(filter, videoConvert, encoder, muxer, sink); bin.addGhostPad(queue, "sink"); addProbeToPad(queue.staticPad("src").pad(), false); @@ -119,6 +120,24 @@ int QGstreamerImageCapture::doCapture(const QString &fileName) return m_lastId; } +void QGstreamerImageCapture::setResolution(const QSize &resolution) +{ + auto padCaps = QGstCaps(gst_pad_get_current_caps(bin.staticPad("sink").pad()), QGstCaps::HasRef); + if (padCaps.isNull()) { + qDebug() << "Camera not ready"; + return; + } + auto caps = QGstCaps(gst_caps_copy(padCaps.get()), QGstCaps::HasRef); + if (caps.isNull()) { + return; + } + gst_caps_set_simple(caps.get(), + "width", G_TYPE_INT, resolution.width(), + "height", G_TYPE_INT, resolution.height(), + nullptr); + filter.set("caps", caps); +} + bool QGstreamerImageCapture::probeBuffer(GstBuffer *buffer) { if (!passImage) @@ -264,8 +283,11 @@ QImageEncoderSettings QGstreamerImageCapture::imageSettings() const void QGstreamerImageCapture::setImageSettings(const QImageEncoderSettings &settings) { if (m_settings != settings) { + QSize resolution = settings.resolution(); + 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 b76649631..a41426a8d 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h @@ -53,6 +53,7 @@ public Q_SLOTS: void onCameraChanged(); private: + void setResolution(const QSize &resolution); int doCapture(const QString &fileName); static gboolean saveImageFilter(GstElement *element, GstBuffer *buffer, GstPad *pad, void *appdata); @@ -70,6 +71,7 @@ private: QGstBin bin; QGstElement queue; + QGstElement filter; QGstElement videoConvert; QGstElement encoder; QGstElement muxer; |