13#include <QtCore/qloggingcategory.h>
14#include <QtCore/private/quniquehandle_p.h>
20 if (tee.isNull() ||
sink.isNull())
23 auto source = tee.getRequestPad(
"src_%u");
31 return videoOutput.error();
37 : capturePipeline(
QGstPipeline::
create(
"mediaCapturePipeline")), gstVideoOutput(videoOutput)
49 gst_system_clock_obtain(),
51 gst_pipeline_use_clock(capturePipeline.
pipeline(), systemClock.get());
55 capturePipeline.
setState(GST_STATE_PLAYING);
83 setCameraActive(
false);
90 &QGstreamerMediaCapture::setCameraActive);
92 setCameraActive(
true);
98void QGstreamerMediaCapture::setCameraActive(
bool activate)
104 gstVideoTee.
set(
"allow-not-linked",
true);
106 capturePipeline.
add(gstVideoOutput->
gstElement(), cameraElement, gstVideoTee);
116 if (encoderVideoCapsFilter)
136 return m_imageCapture;
142 if (m_imageCapture == control)
146 if (m_imageCapture) {
149 imageCaptureSink = {};
153 m_imageCapture = control;
154 if (m_imageCapture) {
163 capturePipeline.
dumpGraph(
"imageCapture");
171 if (m_mediaEncoder == control)
176 m_mediaEncoder = control;
186 return m_mediaEncoder;
193 QGstCaps caps = gstVideoTee.sink().currentCaps();
195 encoderVideoCapsFilter =
196 QGstElement::createFromFactory(
"capsfilter",
"encoderVideoCapsFilter");
197 Q_ASSERT(encoderVideoCapsFilter);
198 encoderVideoCapsFilter.set(
"caps", caps);
200 capturePipeline.add(encoderVideoCapsFilter);
202 encoderVideoCapsFilter.src().link(videoSink);
203 linkTeeToPad(gstVideoTee, encoderVideoCapsFilter.sink());
204 encoderVideoSink = encoderVideoCapsFilter.sink();
208 QGstCaps caps = gstAudioTee.sink().currentCaps();
210 encoderAudioCapsFilter =
211 QGstElement::createFromFactory(
"capsfilter",
"encoderAudioCapsFilter");
212 Q_ASSERT(encoderAudioCapsFilter);
213 encoderAudioCapsFilter.set(
"caps", caps);
215 capturePipeline.add(encoderAudioCapsFilter);
217 encoderAudioCapsFilter.src().link(audioSink);
218 linkTeeToPad(gstAudioTee, encoderAudioCapsFilter.sink());
219 encoderAudioSink = encoderAudioCapsFilter.sink();
227 if (encoderVideoCapsFilter) {
230 encoderVideoCapsFilter = {};
233 if (encoderAudioCapsFilter) {
236 encoderAudioCapsFilter = {};
239 encoderAudioSink = {};
240 encoderVideoSink = {};
246 if (gstAudioInput ==
input)
251 if (encoderAudioCapsFilter)
254 if (gstAudioOutput) {
267 gstAudioTee.
set(
"allow-not-linked",
true);
268 capturePipeline.
add(gstAudioInput->
gstElement(), gstAudioTee);
271 if (gstAudioOutput) {
291 if (gstAudioOutput ==
output)
295 if (gstAudioOutput && gstAudioInput) {
302 if (gstAudioOutput && gstAudioInput) {
322#include "moc_qgstreamermediacapture_p.cpp"
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void add)(const Ts &...ts)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void stopAndRemoveElements)(Ts... ts)
GstStateChangeReturn setState(GstState state)
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
bool syncStateWithParent()
QGstPad staticPad(const char *name) const
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
void set(const char *property, const char *str)
GstStateChangeReturn setState(GstState state)
GstPipeline * pipeline() const
void dumpGraph(const char *fileName)
void setInStoppedState(bool stopped)
void modifyPipelineWhileNotRunning(Functor &&fn)
QGstElement gstElement() const
bool isActive() const override
QGstElement gstElement() const
QGstElement gstElement() const
void setCaptureSession(QPlatformMediaCaptureSession *session)
void setPipeline(const QGstPipeline &pipeline)
QGstreamerVideoSink * gstreamerVideoSink() const
QGstElement gstElement() const
void setVideoSink(QVideoSink *sink)
static QMaybe< QGstreamerVideoOutput * > create(QObject *parent=nullptr)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
void setParent(QObject *parent)
Makes the object a child of parent.
static bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
\threadsafe
The QVideoSink class represents a generic sink for video data.
Combined button and popup list for selecting options.
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void qLinkGstElements)(const Ts &...ts)
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void qUnlinkGstElements)(const Ts &...ts)
GLsizei GLsizei GLchar * source
GLsizei GLenum GLboolean sink
GLenum GLenum GLenum input
QT_BEGIN_NAMESPACE typedef uchar * output
if(qFloatDistance(a, b)<(1<< 7))
[0]