summaryrefslogtreecommitdiffstats
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 15:40:23 +0200
commit48365df8784626dbe9d16220eac15419007471ef (patch)
treea9c3d4941e05a4e5c7f769c49577e99de5787f4f
parent1c0e25e3618f6063a45207fd0f49d33b6c2b4353 (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.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 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;