35class QGstreamerImageCapture :
public QPlatformImageCapture,
private QGstreamerBufferProbe
40 static q23::expected<QPlatformImageCapture *, QString> create(QImageCapture *parent);
41 ~QGstreamerImageCapture() override;
43 bool isReadyForCapture()
const override;
44 int capture(
const QString &fileName) override;
45 int captureToBuffer() override;
47 QImageEncoderSettings imageSettings()
const override;
48 void setImageSettings(
const QImageEncoderSettings &settings) override;
50 bool probeBuffer(GstBuffer *buffer) override;
52 void setCaptureSession(QPlatformMediaCaptureSession *session);
54 QGstElement gstElement()
const {
return bin; }
56 void setMetaData(
const QMediaMetaData &m) override;
59 void cameraActiveChanged(
bool active);
60 void onCameraChanged();
63 QGstreamerImageCapture(QImageCapture *parent);
65 void setResolution(
const QSize &resolution);
66 int doCapture(QString fileName);
67 void saveBufferToFile(QGstBufferHandle, QString filename,
int id);
68 void convertBufferToImage(
const QMutexLocker<QRecursiveMutex> &, QGstBufferHandle, QGstCaps,
69 QMediaMetaData,
int id);
71 mutable QRecursiveMutex m_mutex;
72 QGstreamerMediaCaptureSession *m_session =
nullptr;
74 QImageEncoderSettings m_settings;
81 QQueue<PendingImage> pendingImages;
86 QGstElement videoConvert;
92 std::atomic_bool m_captureNextBuffer{};
93 bool cameraActive =
false;
95 QMutex m_pendingFuturesMutex;
96 std::map<
int, QFuture<
void>> m_pendingFutures;
97 std::atomic<
int> m_futureIDAllocator{};
99 template <
typename Functor>
100 void invokeDeferred(Functor &&fn);
102 template <
typename Functor>
103 void runInThreadPool(Functor);