6#define GST_CAT_DEFAULT gst_qgc_video_sink_bin_debug
9#define DEFAULT_ENABLE_LAST_SAMPLE FALSE
10#define DEFAULT_FORCE_ASPECT_RATIO TRUE
11#define DEFAULT_PAR_N 0
12#define DEFAULT_PAR_D 1
13#define DEFAULT_SYNC TRUE
15#define PROP_ENABLE_LAST_SAMPLE_NAME "enable-last-sample"
16#define PROP_LAST_SAMPLE_NAME "last-sample"
17#define PROP_WIDGET_NAME "widget"
18#define PROP_FORCE_ASPECT_RATIO_NAME "force-aspect-ratio"
19#define PROP_PIXEL_ASPECT_RATIO_NAME "pixel-aspect-ratio"
20#define PROP_SYNC_NAME "sync"
45#define gst_qgc_video_sink_bin_parent_class parent_class
48 gst_qgc_video_sink_bin,
50 GST_DEBUG_CATEGORY_INIT(
54 "QGC Video Sink Bin"));
70 GObjectClass *object_class = G_OBJECT_CLASS(klass);
71 GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
79 "enable-last-sample",
"Enable last sample",
80 "Retain the most recent buffer for UI snapshotting",
82 (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
86 "last-sample",
"Last sample",
87 "Last preroll/played sample held by the sink",
89 (GParamFlags)(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)
93 "widget",
"QQuickItem",
94 "Owning QML item – handed off to qml6glsink",
95 (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
99 "force-aspect-ratio",
"Force aspect ratio",
100 "Maintain original pixel aspect during scaling",
102 (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
106 "pixel-aspect-ratio",
"Pixel aspect ratio",
107 "Pixel aspect ratio of the display surface",
111 (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
116 "Synchronise frame presentation to the pipeline clock",
118 (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
125 G_TYPE_FROM_CLASS(klass),
134 gst_element_class_set_static_metadata(element_class,
135 "QGC Video Sink Bin",
"Sink/Video/Bin",
136 "GL accelerated video sink wrapper used by QGroundControl",
137 "QGroundControl team"
144 self->glsinkbin = gst_element_factory_make(
"glsinkbin", NULL);
145 if (!self->glsinkbin) {
146 GST_ERROR_OBJECT(self,
"gst_element_factory_make('glsinkbin') failed");
150 self->qmlglsink = gst_element_factory_make(
"qml6glsink", NULL);
151 if (!self->qmlglsink) {
152 GST_ERROR_OBJECT(self,
"gst_element_factory_make('qml6glsink') failed");
156 g_object_set(self->glsinkbin,
157 "sink", self->qmlglsink,
161 g_return_if_fail(gst_bin_add(GST_BIN(self), self->glsinkbin));
163 g_signal_connect(self->glsinkbin,
168 GstPad *sinkpad = gst_element_get_static_pad(self->glsinkbin,
"sink");
170 GST_ERROR_OBJECT(self,
"gst_element_get_static_pad('sink') failed");
174 GstPad *ghostpad = gst_ghost_pad_new(
"sink", sinkpad);
176 GST_ERROR_OBJECT(self,
"gst_ghost_pad_new('sink') failed");
177 gst_object_unref(sinkpad);
181 if (!gst_element_add_pad(GST_ELEMENT(self), ghostpad)) {
182 GST_ERROR_OBJECT(self,
"gst_element_add_pad() failed");
186 gst_object_unref(sinkpad);
193 GstQgcVideoSinkBin *self = GST_QGC_VIDEO_SINK_BIN(
object);
197 g_object_set(self->glsinkbin,
199 g_value_get_boolean(value),
203 g_object_set(self->qmlglsink,
205 g_value_get_pointer(value),
209 g_object_set(self->glsinkbin,
211 g_value_get_boolean(value),
215 const gint num = gst_value_get_fraction_numerator(value);
216 const gint den = gst_value_get_fraction_denominator(value);
217 g_object_set(self->qmlglsink,
225 g_object_set(self->glsinkbin,
227 g_value_get_boolean(value),
231 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
239 GstQgcVideoSinkBin *self = GST_QGC_VIDEO_SINK_BIN(
object);
243 gboolean enable = FALSE;
244 g_object_get(self->glsinkbin,
248 g_value_set_boolean(value, enable);
252 GstSample *sample = NULL;
253 g_object_get(self->glsinkbin,
257 gst_value_set_sample(value, sample);
259 gst_sample_unref(sample);
264 gpointer widget = NULL;
265 g_object_get(self->qmlglsink,
269 g_value_set_pointer(value, widget);
273 gboolean enable = FALSE;
274 g_object_get(self->glsinkbin,
278 g_value_set_boolean(value, enable);
282 gint num = 0, den = 1;
283 g_object_get(self->qmlglsink,
287 gst_value_set_fraction(value, num, den);
291 gboolean enable = FALSE;
292 g_object_get(self->glsinkbin,
296 g_value_set_boolean(value, enable);
300 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
308 GstBin *glsinkbin = GST_BIN(
object);
309 GstQgcVideoSinkBin *qgcVideoSinkBin = GST_QGC_VIDEO_SINK_BIN(udata);
311 qgcVideoSinkBin->glsinkbin = GST_ELEMENT(glsinkbin);
312 qgcVideoSinkBin->qmlglsink = gst_element_factory_make(
"qml6glsink", NULL);
313 if (!qgcVideoSinkBin->qmlglsink) {
314 GST_ERROR_OBJECT(qgcVideoSinkBin,
"gst_element_factory_make('qml6glsink') failed");
318 return qgcVideoSinkBin->qmlglsink;
324 GstQgcVideoSinkBin *self = GST_QGC_VIDEO_SINK_BIN(
object);
328 G_OBJECT_CLASS(parent_class)->dispose(
object);
334 GstQgcVideoSinkBin *self = GST_QGC_VIDEO_SINK_BIN(
object);
338 G_OBJECT_CLASS(parent_class)->finalize(
object);
struct _GstElement GstElement
void qgc_element_init(GstPlugin *plugin)
static void gst_qgc_video_sink_bin_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
G_DEFINE_TYPE_WITH_CODE(GstQgcVideoSinkBin, gst_qgc_video_sink_bin, GST_TYPE_BIN, GST_DEBUG_CATEGORY_INIT(gst_qgc_video_sink_bin_debug, "qgcsinkbin", 0, "QGC Video Sink Bin"))
@ PROP_ENABLE_LAST_SAMPLE
@ PROP_FORCE_ASPECT_RATIO
@ PROP_PIXEL_ASPECT_RATIO
static GParamSpec * properties[PROP_LAST]
GST_ELEMENT_REGISTER_DEFINE_WITH_CODE(qgcvideosinkbin,"qgcvideosinkbin", GST_RANK_NONE,(gst_qgc_video_sink_bin_get_type()), qgc_element_init(plugin))
static void gst_qgc_video_sink_bin_class_init(GstQgcVideoSinkBinClass *klass)
#define PROP_FORCE_ASPECT_RATIO_NAME
#define DEFAULT_FORCE_ASPECT_RATIO
#define PROP_ENABLE_LAST_SAMPLE_NAME
#define DEFAULT_ENABLE_LAST_SAMPLE
static GstElement * gst_qgc_video_sink_bin_on_glsinkbin_create_element(GstElement *object, gpointer udata)
#define PROP_PIXEL_ASPECT_RATIO_NAME
static void gst_qgc_video_sink_bin_finalize(GObject *object)
GST_DEBUG_CATEGORY_STATIC(gst_qgc_video_sink_bin_debug)
static void gst_qgc_video_sink_bin_dispose(GObject *object)
static void gst_qgc_video_sink_bin_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
#define PROP_LAST_SAMPLE_NAME
static guint gst_qgc_video_sink_bin_signals[SIGNAL_LAST]
static void gst_qgc_video_sink_bin_init(GstQgcVideoSinkBin *self)
#define GST_TYPE_QGC_VIDEO_SINK_BIN