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 09:54:41 +0200 |
commit | f27ba7f8759db070525ef4cbaae757a34d80a306 (patch) | |
tree | d9de9a9f9da66042e7805e545fa4dfc42ca275a0 /src/plugins/multimedia | |
parent | 060028c7150d86313acd8365ec1d20be09bd88c4 (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
Pick-to: 6.4 6.5
Change-Id: I87d8ed20cf5326f9f5db76626e476499a2e1d491
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
Diffstat (limited to 'src/plugins/multimedia')
-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 e4b368b12..a54fbd8d5 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture.cpp @@ -57,12 +57,13 @@ QGstreamerImageCapture::QGstreamerImageCapture(QGstElement videoconvert, QGstEle queue.set("max-size-time", quint64(0)); 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); @@ -138,6 +139,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) @@ -283,8 +302,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 87d805802..b677a471a 100644 --- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h +++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h @@ -56,6 +56,7 @@ private: QGstreamerImageCapture(QGstElement videoconvert, QGstElement jpegenc, QGstElement jifmux, QImageCapture *parent); + void setResolution(const QSize &resolution); int doCapture(const QString &fileName); static gboolean saveImageFilter(GstElement *element, GstBuffer *buffer, GstPad *pad, void *appdata); @@ -73,6 +74,7 @@ private: QGstBin bin; QGstElement queue; + QGstElement filter; QGstElement videoConvert; QGstElement encoder; QGstElement muxer; |