18#include "applicationsink.h"
19#include "../elementfactory.h"
20#include <gst/app/gstappsink.h>
27struct QTGSTREAMERUTILS_NO_EXPORT ApplicationSink::Priv
32 void lazyConstruct(ApplicationSink *self);
33 void setCallbacks(ApplicationSink *self);
35 inline GstAppSink *appSink()
37 return reinterpret_cast<GstAppSink*
>(
static_cast<GstElement*
>(m_appsink));
41 static void eos(GstAppSink *sink, gpointer user_data);
42 static GstFlowReturn new_preroll(GstAppSink *sink, gpointer user_data);
43 static GstFlowReturn new_sample(GstAppSink *sink, gpointer user_data);
45 static void eos_noop(GstAppSink*, gpointer) {}
46 static GstFlowReturn new_preroll_noop(GstAppSink*, gpointer) {
return GST_FLOW_OK; }
47 static GstFlowReturn new_sample_noop(GstAppSink*, gpointer) {
return GST_FLOW_OK; }
50void ApplicationSink::Priv::lazyConstruct(ApplicationSink *self)
53 m_appsink = QGst::ElementFactory::make(
"appsink");
55 qWarning() <<
"Failed to construct appsink";
61void ApplicationSink::Priv::setCallbacks(ApplicationSink *self)
65 static GstAppSinkCallbacks callbacks = { &eos, &new_preroll, &new_sample };
66 gst_app_sink_set_callbacks(appSink(), &callbacks, self, NULL);
68 static GstAppSinkCallbacks callbacks = { &eos_noop, &new_preroll_noop,
70 gst_app_sink_set_callbacks(appSink(), &callbacks, NULL, NULL);
75void ApplicationSink::Priv::eos(GstAppSink* sink, gpointer user_data)
78 static_cast<ApplicationSink*
>(user_data)->eos();
81GstFlowReturn ApplicationSink::Priv::new_preroll(GstAppSink* sink, gpointer user_data)
84 return static_cast<GstFlowReturn
>(
static_cast<ApplicationSink*
>(user_data)->newPreroll());
87GstFlowReturn ApplicationSink::Priv::new_sample(GstAppSink* sink, gpointer user_data)
90 return static_cast<GstFlowReturn
>(
static_cast<ApplicationSink*
>(user_data)->newSample());
96ApplicationSink::ApplicationSink()
101ApplicationSink::~ApplicationSink()
103 d->setCallbacks(NULL);
115 Q_ASSERT(QGlib::Type::fromInstance(appsink).isA(GST_TYPE_APP_SINK));
116 d->setCallbacks(NULL);
117 d->m_appsink = appsink;
118 d->setCallbacks(
this);
125 caps = CapsPtr::wrap(gst_app_sink_get_caps(d->appSink()),
false);
130void ApplicationSink::setCaps(
const CapsPtr & caps)
132 d->lazyConstruct(
this);
134 gst_app_sink_set_caps(d->appSink(), caps);
138bool ApplicationSink::isEos()
const
140 return d->appSink() ? gst_app_sink_is_eos(d->appSink()) :
true;
143uint ApplicationSink::maxBuffers()
const
145 return d->appSink() ? gst_app_sink_get_max_buffers(d->appSink()) : 0;
148void ApplicationSink::setMaxBuffers(uint maxbuffers)
150 d->lazyConstruct(
this);
152 gst_app_sink_set_max_buffers(d->appSink(), maxbuffers);
156bool ApplicationSink::dropEnabled()
const
158 return d->appSink() ? gst_app_sink_get_drop(d->appSink()) :
false;
161void ApplicationSink::enableDrop(
bool enable)
163 d->lazyConstruct(
this);
165 gst_app_sink_set_drop(d->appSink(), enable);
173 buf = SamplePtr::wrap(gst_app_sink_pull_preroll(d->appSink()),
false);
182 buf = SamplePtr::wrap(gst_app_sink_pull_sample(d->appSink()),
false);
187void ApplicationSink::eos()
191FlowReturn ApplicationSink::newPreroll()
196FlowReturn ApplicationSink::newSample()
Helper class for using a GstAppSink.
Wrappers for GStreamer classes.