diff options
-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; |