summaryrefslogtreecommitdiffstats
path: root/src/plugins/multimedia
diff options
context:
space:
mode:
authorAri Parkkila <ari.parkkila@qt.io>2023-01-20 10:03:17 +0200
committerAri Parkkila <ari.parkkila@qt.io>2023-02-02 09:54:41 +0200
commitf27ba7f8759db070525ef4cbaae757a34d80a306 (patch)
treed9de9a9f9da66042e7805e545fa4dfc42ca275a0 /src/plugins/multimedia
parent060028c7150d86313acd8365ec1d20be09bd88c4 (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.cpp28
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamerimagecapture_p.h2
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;