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");
29 if (tee.isNull() ||
sink.isNull())
35 tee.releaseRequestPad(
source);
42 return videoOutput.error();
48 : capturePipeline(
QGstPipeline::
create(
"mediaCapturePipeline")), gstVideoOutput(videoOutput)
60 gst_system_clock_obtain(),
62 gst_pipeline_use_clock(capturePipeline.
pipeline(), systemClock.get());
66 capturePipeline.
setState(GST_STATE_PLAYING);
94 setCameraActive(
false);
101 &QGstreamerMediaCapture::setCameraActive);
103 setCameraActive(
true);
109void QGstreamerMediaCapture::setCameraActive(
bool activate)
115 gstVideoTee.
set(
"allow-not-linked",
true);
117 capturePipeline.
add(gstVideoOutput->
gstElement(), cameraElement, gstVideoTee);
145 return m_imageCapture;
151 if (m_imageCapture == control)
155 if (m_imageCapture) {
158 imageCaptureSink = {};
162 m_imageCapture = control;
163 if (m_imageCapture) {
172 capturePipeline.
dumpGraph(
"imageCapture");
180 if (m_mediaEncoder == control)
185 m_mediaEncoder = control;
195 return m_mediaEncoder;
202 QGstCaps caps = gstVideoTee.sink().currentCaps();
204 encoderVideoCapsFilter =
205 QGstElement::createFromFactory(
"capsfilter",
"encoderVideoCapsFilter");
206 Q_ASSERT(encoderVideoCapsFilter);
207 encoderVideoCapsFilter.set(
"caps", caps);
209 capturePipeline.add(encoderVideoCapsFilter);
211 encoderVideoCapsFilter.src().link(videoSink);
212 linkTeeToPad(gstVideoTee, encoderVideoCapsFilter.sink());
213 encoderVideoSink = encoderVideoCapsFilter.sink();
217 QGstCaps caps = gstAudioTee.sink().currentCaps();
219 encoderAudioCapsFilter =
220 QGstElement::createFromFactory(
"capsfilter",
"encoderAudioCapsFilter");
221 Q_ASSERT(encoderAudioCapsFilter);
222 encoderAudioCapsFilter.set(
"caps", caps);
224 capturePipeline.add(encoderAudioCapsFilter);
226 encoderAudioCapsFilter.src().link(audioSink);
227 linkTeeToPad(gstAudioTee, encoderAudioCapsFilter.sink());
228 encoderAudioSink = encoderAudioCapsFilter.sink();
236 if (!encoderVideoCapsFilter.
isNull()) {
237 encoderVideoCapsFilter.src().unlinkPeer();
238 unlinkTeeFromPad(gstVideoTee, encoderVideoCapsFilter.sink());
239 capturePipeline.stopAndRemoveElements(encoderVideoCapsFilter);
240 encoderVideoCapsFilter = {};
243 if (!encoderAudioCapsFilter.
isNull()) {
247 encoderAudioCapsFilter = {};
250 encoderAudioSink = {};
251 encoderVideoSink = {};
257 if (gstAudioInput ==
input)
264 if (gstAudioOutput) {
278 gstAudioTee.
set(
"allow-not-linked",
true);
279 capturePipeline.
add(gstAudioInput->
gstElement(), gstAudioTee);
282 if (gstAudioOutput) {
302 if (gstAudioOutput ==
output)
306 if (gstAudioOutput && gstAudioInput) {
313 if (gstAudioOutput && gstAudioInput) {
333#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 remove)(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)
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]