88
87
static const char gst_vaapisink_sink_caps_str[] =
89
88
#if GST_CHECK_VERSION(1,1,0)
90
89
GST_VIDEO_CAPS_MAKE_WITH_FEATURES(
91
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, "{ ENCODED, NV12, I420, YV12 }");
90
GST_CAPS_FEATURE_MEMORY_VAAPI_SURFACE, "{ ENCODED, NV12, I420, YV12 }") ";"
91
GST_VIDEO_CAPS_MAKE(GST_VIDEO_FORMATS_ALL);
93
93
#if GST_CHECK_VERSION(1,0,0)
94
94
GST_VIDEO_CAPS_MAKE(GST_VIDEO_FORMATS_ALL) "; "
108
108
GST_STATIC_CAPS(gst_vaapisink_sink_caps_str));
110
/* GstImplementsInterface interface */
111
#if !GST_CHECK_VERSION(1,0,0)
113
gst_vaapisink_implements_interface_supported(
114
GstImplementsInterface *iface,
118
return (type == GST_TYPE_VIDEO_CONTEXT ||
119
type == GST_TYPE_VIDEO_OVERLAY);
123
gst_vaapisink_implements_iface_init(GstImplementsInterfaceClass *iface)
125
iface->supported = gst_vaapisink_implements_interface_supported;
129
/* GstVideoContext interface */
130
#if !GST_CHECK_VERSION(1,1,0)
132
gst_vaapisink_set_video_context(GstVideoContext *context, const gchar *type,
135
GstVaapiSink *sink = GST_VAAPISINK (context);
136
gst_vaapi_set_display (type, value, &sink->display);
140
gst_vaapisink_video_context_iface_init(GstVideoContextInterface *iface)
142
iface->set_context = gst_vaapisink_set_video_context;
111
gst_vaapisink_has_interface(GstVaapiPluginBase *plugin, GType type)
113
return type == GST_TYPE_VIDEO_OVERLAY;
147
117
gst_vaapisink_video_overlay_iface_init(GstVideoOverlayInterface *iface);
152
122
GST_TYPE_VIDEO_SINK,
153
#if !GST_CHECK_VERSION(1,0,0)
154
G_IMPLEMENT_INTERFACE(GST_TYPE_IMPLEMENTS_INTERFACE,
155
gst_vaapisink_implements_iface_init);
157
#if !GST_CHECK_VERSION(1,1,0)
158
G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_CONTEXT,
159
gst_vaapisink_video_context_iface_init);
123
GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES
161
124
G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_OVERLAY,
162
125
gst_vaapisink_video_overlay_iface_init))
187
155
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer);
190
gst_vaapisink_video_overlay_set_window_handle(GstVideoOverlay *overlay, guintptr window)
158
gst_vaapisink_video_overlay_set_window_handle(GstVideoOverlay *overlay,
192
161
GstVaapiSink * const sink = GST_VAAPISINK(overlay);
162
GstVaapiDisplayType display_type;
164
if (!gst_vaapisink_ensure_display(sink))
166
display_type = GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink);
194
168
/* Disable GLX rendering when vaapisink is using a foreign X
195
169
window. It's pretty much useless */
196
if (sink->display_type == GST_VAAPI_DISPLAY_TYPE_GLX)
197
sink->display_type = GST_VAAPI_DISPLAY_TYPE_X11;
170
if (display_type == GST_VAAPI_DISPLAY_TYPE_GLX) {
171
display_type = GST_VAAPI_DISPLAY_TYPE_X11;
172
gst_vaapi_plugin_base_set_display_type(GST_VAAPI_PLUGIN_BASE(sink),
199
176
sink->foreign_window = TRUE;
201
switch (sink->display_type) {
178
switch (display_type) {
203
180
case GST_VAAPI_DISPLAY_TYPE_X11:
204
181
gst_vaapisink_ensure_window_xid(sink, window);
235
212
gst_vaapisink_video_overlay_expose(GstVideoOverlay *overlay)
237
214
GstVaapiSink * const sink = GST_VAAPISINK(overlay);
238
GstBaseSink * const base_sink = GST_BASE_SINK(overlay);
241
if (sink->use_overlay)
242
buffer = sink->video_buffer ? gst_buffer_ref(sink->video_buffer) : NULL;
244
#if GST_CHECK_VERSION(1,0,0)
245
GstSample * const sample = gst_base_sink_get_last_sample(base_sink);
248
buffer = gst_buffer_ref(gst_sample_get_buffer(sample));
249
gst_sample_unref(sample);
251
buffer = gst_base_sink_get_last_buffer(base_sink);
255
gst_vaapisink_show_frame(base_sink, buffer);
256
gst_buffer_unref(buffer);
216
if (sink->video_buffer)
217
gst_vaapisink_show_frame(GST_BASE_SINK_CAST(sink), sink->video_buffer);
345
304
static inline gboolean
346
305
gst_vaapisink_ensure_display(GstVaapiSink *sink)
348
GstVaapiDisplayType display_type;
307
return gst_vaapi_plugin_base_ensure_display(GST_VAAPI_PLUGIN_BASE(sink));
311
gst_vaapisink_display_changed(GstVaapiPluginBase *plugin)
313
GstVaapiSink * const sink = GST_VAAPISINK(plugin);
349
314
GstVaapiRenderMode render_mode;
350
const gboolean had_display = sink->display != NULL;
352
if (!gst_vaapi_ensure_display(sink, sink->display_type, &sink->display))
355
display_type = gst_vaapi_display_get_display_type(sink->display);
356
if (display_type != sink->display_type || (!had_display && sink->display)) {
357
GST_INFO("created %s %p", get_display_type_name(display_type),
359
sink->display_type = display_type;
362
gst_vaapi_display_get_render_mode(sink->display, &render_mode) &&
363
render_mode == GST_VAAPI_RENDER_MODE_OVERLAY;
364
GST_DEBUG("use %s rendering mode", sink->use_overlay ? "overlay" : "texture");
366
sink->use_rotation = gst_vaapi_display_has_property(
367
sink->display, GST_VAAPI_DISPLAY_PROP_ROTATION);
316
GST_INFO("created %s %p", get_display_type_name(plugin->display_type),
320
gst_vaapi_display_get_render_mode(plugin->display, &render_mode) &&
321
render_mode == GST_VAAPI_RENDER_MODE_OVERLAY;
322
GST_DEBUG("use %s rendering mode",
323
sink->use_overlay ? "overlay" : "texture");
325
sink->use_rotation = gst_vaapi_display_has_property(plugin->display,
326
GST_VAAPI_DISPLAY_PROP_ROTATION);
505
459
static inline gboolean
506
460
gst_vaapisink_ensure_window(GstVaapiSink *sink, guint width, guint height)
508
GstVaapiDisplay * const display = sink->display;
462
GstVaapiDisplay * const display = GST_VAAPI_PLUGIN_BASE_DISPLAY(sink);
510
464
if (!sink->window) {
511
switch (sink->display_type) {
465
const GstVaapiDisplayType display_type =
466
GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink);
467
switch (display_type) {
513
469
case GST_VAAPI_DISPLAY_TYPE_GLX:
514
470
sink->window = gst_vaapi_window_glx_new(display, width, height);
551
508
if (!gst_vaapisink_ensure_display(sink))
510
display = GST_VAAPI_PLUGIN_BASE_DISPLAY(sink);
554
gst_vaapi_display_lock(sink->display);
512
gst_vaapi_display_lock(display);
556
gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(sink->display)),
514
gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(display)),
559
517
&x, &y, &width, &height, &border_width, &depth
561
gst_vaapi_display_unlock(sink->display);
519
gst_vaapi_display_unlock(display);
563
521
if ((width != sink->window_width || height != sink->window_height) &&
564
522
!configure_notify_event_pending(sink, xid, width, height)) {
575
533
gst_vaapi_window_replace(&sink->window, NULL);
577
switch (sink->display_type) {
535
switch (GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink)) {
579
537
case GST_VAAPI_DISPLAY_TYPE_GLX:
580
sink->window = gst_vaapi_window_glx_new_with_xid(sink->display, xid);
538
sink->window = gst_vaapi_window_glx_new_with_xid(display, xid);
583
541
case GST_VAAPI_DISPLAY_TYPE_X11:
584
sink->window = gst_vaapi_window_x11_new_with_xid(sink->display, xid);
542
sink->window = gst_vaapi_window_x11_new_with_xid(display, xid);
587
GST_ERROR("unsupported display type %d", sink->display_type);
545
GST_ERROR("unsupported display type %d",
546
GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink));
590
549
return sink->window != NULL;
634
gst_vaapisink_ensure_video_buffer_pool(GstVaapiSink *sink, GstCaps *caps)
636
#if GST_CHECK_VERSION(1,0,0)
639
GstStructure *config;
643
if (!gst_vaapisink_ensure_display(sink))
646
if (sink->video_buffer_pool) {
647
config = gst_buffer_pool_get_config(sink->video_buffer_pool);
648
gst_buffer_pool_config_get_params(config, &pool_caps, NULL, NULL, NULL);
649
need_pool = !gst_caps_is_equal(caps, pool_caps);
650
gst_structure_free(config);
653
g_clear_object(&sink->video_buffer_pool);
654
sink->video_buffer_size = 0;
657
pool = gst_vaapi_video_buffer_pool_new(sink->display);
659
goto error_create_pool;
661
gst_video_info_init(&vi);
662
gst_video_info_from_caps(&vi, caps);
663
if (GST_VIDEO_INFO_FORMAT(&vi) == GST_VIDEO_FORMAT_ENCODED) {
664
GST_DEBUG("assume video buffer pool format is NV12");
665
gst_video_info_set_format(&vi, GST_VIDEO_FORMAT_NV12,
666
GST_VIDEO_INFO_WIDTH(&vi), GST_VIDEO_INFO_HEIGHT(&vi));
668
sink->video_buffer_size = vi.size;
670
config = gst_buffer_pool_get_config(pool);
671
gst_buffer_pool_config_set_params(config, caps, sink->video_buffer_size,
673
gst_buffer_pool_config_add_option(config,
674
GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META);
675
gst_buffer_pool_config_add_option(config,
676
GST_BUFFER_POOL_OPTION_VIDEO_META);
677
if (!gst_buffer_pool_set_config(pool, config))
678
goto error_pool_config;
679
sink->video_buffer_pool = pool;
685
GST_ERROR("failed to create buffer pool");
690
GST_ERROR("failed to reset buffer pool config");
691
gst_object_unref(pool);
700
594
gst_vaapisink_start(GstBaseSink *base_sink)
702
596
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
598
if (!gst_vaapi_plugin_base_open(GST_VAAPI_PLUGIN_BASE(sink)))
704
600
return gst_vaapisink_ensure_uploader(sink);
764
659
#define gst_vaapisink_get_caps gst_vaapisink_get_caps_impl
663
update_colorimetry(GstVaapiSink *sink, GstVideoColorimetry *cinfo)
665
#if GST_CHECK_VERSION(1,0,0)
666
if (gst_video_colorimetry_matches(cinfo,
667
GST_VIDEO_COLORIMETRY_BT601))
668
sink->color_standard = GST_VAAPI_COLOR_STANDARD_ITUR_BT_601;
669
else if (gst_video_colorimetry_matches(cinfo,
670
GST_VIDEO_COLORIMETRY_BT709))
671
sink->color_standard = GST_VAAPI_COLOR_STANDARD_ITUR_BT_709;
672
else if (gst_video_colorimetry_matches(cinfo,
673
GST_VIDEO_COLORIMETRY_SMPTE240M))
674
sink->color_standard = GST_VAAPI_COLOR_STANDARD_SMPTE_240M;
676
sink->color_standard = 0;
678
GST_DEBUG("colorimetry %s", gst_video_colorimetry_to_string(cinfo));
768
683
gst_vaapisink_set_caps(GstBaseSink *base_sink, GstCaps *caps)
685
GstVaapiPluginBase * const plugin = GST_VAAPI_PLUGIN_BASE(base_sink);
770
686
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
771
GstVideoInfo * const vip = &sink->video_info;
687
GstVideoInfo * const vip = GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO(sink);
688
GstVaapiDisplay *display;
772
689
guint win_width, win_height;
691
if (!gst_vaapisink_ensure_display(sink))
693
display = GST_VAAPI_PLUGIN_BASE_DISPLAY(sink);
775
if (sink->display_type == GST_VAAPI_DISPLAY_TYPE_DRM)
696
if (GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink) == GST_VAAPI_DISPLAY_TYPE_DRM)
779
if (!gst_vaapisink_ensure_video_buffer_pool(sink, caps))
700
if (!gst_vaapi_plugin_base_set_caps(plugin, caps, NULL))
782
if (!gst_video_info_from_caps(vip, caps))
784
sink->use_video_raw = GST_VIDEO_INFO_IS_YUV(vip);
785
703
sink->video_width = GST_VIDEO_INFO_WIDTH(vip);
786
704
sink->video_height = GST_VIDEO_INFO_HEIGHT(vip);
787
705
sink->video_par_n = GST_VIDEO_INFO_PAR_N(vip);
789
707
GST_DEBUG("video pixel-aspect-ratio %d/%d",
790
708
sink->video_par_n, sink->video_par_d);
710
update_colorimetry(sink, &vip->colorimetry);
792
711
gst_caps_replace(&sink->caps, caps);
794
if (!gst_vaapisink_ensure_display(sink))
797
#if !GST_CHECK_VERSION(1,0,0)
798
if (sink->use_video_raw) {
799
/* Ensure the uploader is set up for upstream allocated buffers */
800
if (!gst_vaapi_uploader_ensure_display(sink->uploader, sink->display))
802
if (!gst_vaapi_uploader_ensure_caps(sink->uploader, caps, NULL))
807
713
gst_vaapisink_ensure_rotation(sink, FALSE);
809
715
gst_vaapisink_ensure_window_size(sink, &win_width, &win_height);
1049
#if GST_CHECK_VERSION(1,0,0)
1050
static GstFlowReturn
1051
gst_vaapisink_get_render_buffer(GstVaapiSink *sink, GstBuffer *src_buffer,
1052
GstBuffer **out_buffer_ptr)
1054
GstVaapiVideoMeta *meta;
1055
GstBuffer *out_buffer;
1056
GstBufferPoolAcquireParams params = { 0, };
1057
GstVideoFrame src_frame, out_frame;
1060
meta = gst_buffer_get_vaapi_video_meta(src_buffer);
1062
*out_buffer_ptr = gst_buffer_ref(src_buffer);
1066
if (!sink->use_video_raw) {
1067
GST_ERROR("unsupported video buffer");
1068
return GST_FLOW_EOS;
1071
GST_DEBUG("buffer %p not from our pool, copying", src_buffer);
1073
*out_buffer_ptr = NULL;
1074
if (!sink->video_buffer_pool)
1077
if (!gst_buffer_pool_set_active(sink->video_buffer_pool, TRUE))
1078
goto error_activate_pool;
1080
params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
1081
ret = gst_buffer_pool_acquire_buffer(sink->video_buffer_pool, &out_buffer,
1083
if (ret != GST_FLOW_OK)
1084
goto error_create_buffer;
1086
if (!gst_video_frame_map(&src_frame, &sink->video_info, src_buffer,
1088
goto error_map_src_buffer;
1090
if (!gst_video_frame_map(&out_frame, &sink->video_info, out_buffer,
1092
goto error_map_dst_buffer;
1094
gst_video_frame_copy(&out_frame, &src_frame);
1095
gst_video_frame_unmap(&out_frame);
1096
gst_video_frame_unmap(&src_frame);
1098
*out_buffer_ptr = out_buffer;
1103
GST_ERROR("no buffer pool was negotiated");
1104
return GST_FLOW_ERROR;
1105
error_activate_pool:
1106
GST_ERROR("failed to activate buffer pool");
1107
return GST_FLOW_ERROR;
1108
error_create_buffer:
1109
GST_WARNING("failed to create image. Skipping this frame");
1111
error_map_dst_buffer:
1112
gst_video_frame_unmap(&src_frame);
1114
error_map_src_buffer:
1115
GST_WARNING("failed to map buffer. Skipping this frame");
1116
gst_buffer_unref(out_buffer);
1120
static GstFlowReturn
1121
gst_vaapisink_get_render_buffer(GstVaapiSink *sink, GstBuffer *src_buffer,
1122
GstBuffer **out_buffer_ptr)
1124
GstVaapiVideoMeta *meta;
1125
GstBuffer *out_buffer;
1127
*out_buffer_ptr = NULL;
1128
meta = gst_buffer_get_vaapi_video_meta(src_buffer);
1130
out_buffer = gst_buffer_ref(src_buffer);
1131
else if (sink->use_video_raw) {
1132
out_buffer = gst_vaapi_uploader_get_buffer(sink->uploader);
1134
goto error_create_buffer;
1137
GST_ERROR("unsupported video buffer");
1138
return GST_FLOW_EOS;
1141
if (sink->use_video_raw &&
1142
!gst_vaapi_uploader_process(sink->uploader, src_buffer, out_buffer))
1143
goto error_copy_buffer;
1145
*out_buffer_ptr = out_buffer;
1149
error_create_buffer:
1150
GST_WARNING("failed to create buffer. Skipping this frame");
1153
GST_WARNING("failed to copy buffers. Skipping this frame");
1154
gst_buffer_unref(out_buffer);
1159
963
static GstFlowReturn
1160
964
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *src_buffer)
1162
966
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
1163
967
GstVaapiVideoMeta *meta;
968
GstVaapiSurfaceProxy *proxy;
1164
969
GstVaapiSurface *surface;
1165
970
GstBuffer *buffer;
1186
ret = gst_vaapisink_get_render_buffer(sink, src_buffer, &buffer);
1187
if (ret != GST_FLOW_OK || !buffer)
992
ret = gst_vaapi_plugin_base_get_input_buffer(GST_VAAPI_PLUGIN_BASE(sink),
993
src_buffer, &buffer);
994
if (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_SUPPORTED)
1190
997
meta = gst_buffer_get_vaapi_video_meta(buffer);
1191
if (sink->display != gst_vaapi_video_meta_get_display(meta))
1192
gst_vaapi_display_replace(&sink->display,
1193
gst_vaapi_video_meta_get_display(meta));
998
GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(sink,
999
gst_vaapi_video_meta_get_display(meta));
1198
1001
gst_vaapisink_ensure_rotation(sink, TRUE);
1003
proxy = gst_vaapi_video_meta_get_surface_proxy(meta);
1007
/* Valide view component to display */
1008
view_id = GST_VAAPI_SURFACE_PROXY_VIEW_ID(proxy);
1009
if (G_UNLIKELY(sink->view_id == -1))
1010
sink->view_id = view_id;
1011
else if (sink->view_id != view_id) {
1012
gst_buffer_unref(buffer);
1200
1016
surface = gst_vaapi_video_meta_get_surface(meta);
1216
1032
flags = gst_vaapi_video_meta_get_render_flags(meta);
1034
/* Append default color standard obtained from caps if none was
1035
available on a per-buffer basis */
1036
if (!(flags & GST_VAAPI_COLOR_STANDARD_MASK))
1037
flags |= sink->color_standard;
1218
1039
if (!gst_vaapi_apply_composition(surface, src_buffer))
1219
1040
GST_WARNING("could not update subtitles");
1221
switch (sink->display_type) {
1042
switch (GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink)) {
1223
1044
case GST_VAAPI_DISPLAY_TYPE_DRM:
1224
1045
success = TRUE;
1266
1087
static gboolean
1267
1088
gst_vaapisink_propose_allocation(GstBaseSink *base_sink, GstQuery *query)
1269
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
1270
GstCaps *caps = NULL;
1273
gst_query_parse_allocation(query, &caps, &need_pool);
1278
if (!gst_vaapisink_ensure_video_buffer_pool(sink, caps))
1280
gst_query_add_allocation_pool(query, sink->video_buffer_pool,
1281
sink->video_buffer_size, 0, 0);
1284
gst_query_add_allocation_meta(query,
1285
GST_VAAPI_VIDEO_META_API_TYPE, NULL);
1286
gst_query_add_allocation_meta(query,
1287
GST_VIDEO_META_API_TYPE, NULL);
1288
gst_query_add_allocation_meta(query,
1289
GST_VIDEO_CROP_META_API_TYPE, NULL);
1090
GstVaapiPluginBase * const plugin = GST_VAAPI_PLUGIN_BASE(base_sink);
1092
if (!gst_vaapi_plugin_base_propose_allocation(plugin, query))
1095
gst_query_add_allocation_meta(query, GST_VIDEO_CROP_META_API_TYPE, NULL);
1290
1096
gst_query_add_allocation_meta(query,
1291
1097
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
1297
GST_ERROR("no caps specified");
1302
1101
static GstFlowReturn
1303
gst_vaapisink_buffer_alloc(
1304
GstBaseSink *base_sink,
1311
GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
1317
if (!sink->use_video_raw) {
1318
/* Note: this code path is rarely used but for raw YUV formats
1319
from custom pipeline. Otherwise, GstBaseSink::set_caps() is
1320
called first, and GstBaseSink::buffer_alloc() is not called
1321
in VA surface format mode */
1322
if (!gst_video_info_from_caps(&vi, caps))
1323
return GST_FLOW_NOT_SUPPORTED;
1324
if (!GST_VIDEO_INFO_IS_YUV(&vi))
1328
if (!gst_vaapi_uploader_ensure_display(sink->uploader, sink->display))
1329
return GST_FLOW_NOT_SUPPORTED;
1330
if (!gst_vaapi_uploader_ensure_caps(sink->uploader, caps, NULL))
1331
return GST_FLOW_NOT_SUPPORTED;
1333
buf = gst_vaapi_uploader_get_buffer(sink->uploader);
1335
GST_WARNING("failed to allocate resources for raw YUV buffer");
1336
return GST_FLOW_NOT_SUPPORTED;
1344
#if GST_CHECK_VERSION(1,1,0)
1346
gst_vaapisink_set_context(GstElement *element, GstContext *context)
1348
GstVaapiSink * const sink = GST_VAAPISINK(element);
1349
GstVaapiDisplay *display = NULL;
1351
if (gst_vaapi_video_context_get_display(context, &display)) {
1352
GST_INFO_OBJECT(element, "set display %p", display);
1353
gst_vaapi_display_replace(&sink->display, display);
1102
gst_vaapisink_buffer_alloc(GstBaseSink *base_sink, guint64 offset, guint size,
1103
GstCaps *caps, GstBuffer **outbuf_ptr)
1105
return gst_vaapi_plugin_base_allocate_input_buffer(
1106
GST_VAAPI_PLUGIN_BASE(base_sink), caps, outbuf_ptr);
1226
gst_vaapisink_set_bus(GstElement *element, GstBus *bus)
1228
/* Make sure to allocate a VA display in the sink element first,
1229
so that upstream elements could query a display that was
1230
allocated here, and that exactly matches what the user
1231
requested through the "display" property */
1232
if (!GST_ELEMENT_BUS(element) && bus)
1233
gst_vaapisink_ensure_display(GST_VAAPISINK(element));
1235
GST_ELEMENT_CLASS(gst_vaapisink_parent_class)->set_bus(element, bus);
1459
1239
gst_vaapisink_class_init(GstVaapiSinkClass *klass)
1461
1241
GObjectClass * const object_class = G_OBJECT_CLASS(klass);
1462
1242
GstElementClass * const element_class = GST_ELEMENT_CLASS(klass);
1463
1243
GstBaseSinkClass * const basesink_class = GST_BASE_SINK_CLASS(klass);
1244
GstVaapiPluginBaseClass * const base_plugin_class =
1245
GST_VAAPI_PLUGIN_BASE_CLASS(klass);
1464
1246
GstPadTemplate *pad_template;
1466
1248
GST_DEBUG_CATEGORY_INIT(gst_debug_vaapisink,
1467
1249
GST_PLUGIN_NAME, 0, GST_PLUGIN_DESC);
1251
gst_vaapi_plugin_base_class_init(base_plugin_class);
1252
base_plugin_class->has_interface = gst_vaapisink_has_interface;
1253
base_plugin_class->display_changed = gst_vaapisink_display_changed;
1469
1255
object_class->finalize = gst_vaapisink_finalize;
1470
1256
object_class->set_property = gst_vaapisink_set_property;
1471
1257
object_class->get_property = gst_vaapisink_get_property;
1578
1370
"Force aspect ratio",
1579
1371
"When enabled, scaling will respect original aspect ratio",
1581
G_PARAM_READWRITE));
1373
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
1376
* GstVaapiSink:view-id:
1378
* When not set to -1, the displayed frame will always be the one
1379
* that matches the view-id of the very first displayed frame. Any
1380
* other number will indicate the desire to display the supplied
1383
g_object_class_install_property
1386
g_param_spec_int("view-id",
1388
"ID of the view component of interest to display",
1390
G_PARAM_READWRITE));
1585
1394
gst_vaapisink_init(GstVaapiSink *sink)
1396
GstVaapiPluginBase * const plugin = GST_VAAPI_PLUGIN_BASE(sink);
1398
gst_vaapi_plugin_base_init(plugin, GST_CAT_DEFAULT);
1399
gst_vaapi_plugin_base_set_display_type(plugin, DEFAULT_DISPLAY_TYPE);
1587
1401
sink->caps = NULL;
1588
sink->display = NULL;
1589
1402
sink->window = NULL;
1590
1403
sink->window_width = 0;
1591
1404
sink->window_height = 0;