90
89
GST_STATIC_CAPS(gst_vaapipostproc_src_caps_str));
92
/* GstImplementsInterface interface */
93
#if !GST_CHECK_VERSION(1,0,0)
95
gst_vaapipostproc_implements_interface_supported(
96
GstImplementsInterface *iface,
100
return (type == GST_TYPE_VIDEO_CONTEXT);
104
gst_vaapipostproc_implements_iface_init(GstImplementsInterfaceClass *iface)
106
iface->supported = gst_vaapipostproc_implements_interface_supported;
110
/* GstVideoContext interface */
111
#if !GST_CHECK_VERSION(1,1,0)
113
gst_vaapipostproc_set_video_context(
114
GstVideoContext *context,
119
GstVaapiPostproc * const postproc = GST_VAAPIPOSTPROC(context);
121
gst_vaapi_set_display(type, value, &postproc->display);
123
if (postproc->uploader)
124
gst_vaapi_uploader_ensure_display(postproc->uploader, postproc->display);
128
gst_video_context_interface_init(GstVideoContextInterface *iface)
130
iface->set_context = gst_vaapipostproc_set_video_context;
133
#define GstVideoContextClass GstVideoContextInterface
136
91
G_DEFINE_TYPE_WITH_CODE(
138
93
gst_vaapipostproc,
139
94
GST_TYPE_BASE_TRANSFORM,
140
#if !GST_CHECK_VERSION(1,0,0)
141
G_IMPLEMENT_INTERFACE(GST_TYPE_IMPLEMENTS_INTERFACE,
142
gst_vaapipostproc_implements_iface_init);
144
#if !GST_CHECK_VERSION(1,1,0)
145
G_IMPLEMENT_INTERFACE(GST_TYPE_VIDEO_CONTEXT,
146
gst_video_context_interface_init)
95
GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES)
257
#if GST_CHECK_VERSION(1,1,0)
259
gst_vaapipostproc_set_context(GstElement *element, GstContext *context)
261
GstVaapiPostproc * const postproc = GST_VAAPIPOSTPROC(element);
262
GstVaapiDisplay *display = NULL;
264
if (gst_vaapi_video_context_get_display(context, &display)) {
265
GST_INFO_OBJECT(element, "set display %p", display);
266
gst_vaapi_display_replace(&postproc->display, display);
271
208
static inline gboolean
272
209
gst_vaapipostproc_ensure_display(GstVaapiPostproc *postproc)
274
return gst_vaapi_ensure_display(postproc, GST_VAAPI_DISPLAY_TYPE_ANY,
211
return gst_vaapi_plugin_base_ensure_display(GST_VAAPI_PLUGIN_BASE(postproc));
281
217
if (!gst_vaapipostproc_ensure_display(postproc))
284
if (!postproc->uploader) {
285
postproc->uploader = gst_vaapi_uploader_new(postproc->display);
286
if (!postproc->uploader)
290
if (!gst_vaapi_uploader_ensure_display(postproc->uploader,
297
gst_vaapipostproc_ensure_uploader_caps(GstVaapiPostproc *postproc)
299
#if !GST_CHECK_VERSION(1,0,0)
300
if (postproc->is_raw_yuv && !gst_vaapi_uploader_ensure_caps(
301
postproc->uploader, postproc->sinkpad_caps, NULL))
219
if (!gst_vaapi_plugin_base_ensure_uploader(GST_VAAPI_PLUGIN_BASE(postproc)))
369
287
gst_vaapipostproc_destroy(GstVaapiPostproc *postproc)
371
289
ds_reset(&postproc->deinterlace_state);
372
#if GST_CHECK_VERSION(1,0,0)
373
g_clear_object(&postproc->sinkpad_buffer_pool);
375
g_clear_object(&postproc->uploader);
376
290
gst_vaapipostproc_destroy_filter(postproc);
377
gst_vaapi_display_replace(&postproc->display, NULL);
379
292
gst_caps_replace(&postproc->allowed_sinkpad_caps, NULL);
380
gst_caps_replace(&postproc->sinkpad_caps, NULL);
381
293
gst_caps_replace(&postproc->allowed_srcpad_caps, NULL);
382
gst_caps_replace(&postproc->srcpad_caps, NULL);
294
gst_vaapi_plugin_base_close(GST_VAAPI_PLUGIN_BASE(postproc));
399
313
GstVaapiPostproc * const postproc = GST_VAAPIPOSTPROC(trans);
401
315
ds_reset(&postproc->deinterlace_state);
402
gst_vaapi_display_replace(&postproc->display, NULL);
316
gst_vaapi_plugin_base_close(GST_VAAPI_PLUGIN_BASE(postproc));
407
is_interlaced_buffer(GstVaapiPostproc *postproc, GstBuffer *buf)
321
should_deinterlace_buffer(GstVaapiPostproc *postproc, GstBuffer *buf)
409
if (!(postproc->flags & GST_VAAPI_POSTPROC_FLAG_DEINTERLACE))
323
if (!(postproc->flags & GST_VAAPI_POSTPROC_FLAG_DEINTERLACE) ||
324
postproc->deinterlace_mode == GST_VAAPI_DEINTERLACE_MODE_DISABLED)
327
if (postproc->deinterlace_mode == GST_VAAPI_DEINTERLACE_MODE_INTERLACED)
330
g_assert(postproc->deinterlace_mode == GST_VAAPI_DEINTERLACE_MODE_AUTO);
412
332
switch (GST_VIDEO_INFO_INTERLACE_MODE(&postproc->sinkpad_info)) {
333
case GST_VIDEO_INTERLACE_MODE_INTERLEAVED:
335
case GST_VIDEO_INTERLACE_MODE_PROGRESSIVE:
413
337
case GST_VIDEO_INTERLACE_MODE_MIXED:
414
338
#if GST_CHECK_VERSION(1,0,0)
415
if (!GST_BUFFER_FLAG_IS_SET(buf, GST_VIDEO_BUFFER_FLAG_INTERLACED))
339
if (GST_BUFFER_FLAG_IS_SET(buf, GST_VIDEO_BUFFER_FLAG_INTERLACED))
418
if (GST_BUFFER_FLAG_IS_SET(buf, GST_VIDEO_BUFFER_PROGRESSIVE))
342
if (!GST_BUFFER_FLAG_IS_SET(buf, GST_VIDEO_BUFFER_PROGRESSIVE))
347
GST_ERROR("unhandled \"interlace-mode\", disabling deinterlacing" );
428
353
static GstBuffer *
522
447
GstVaapiDeinterlaceMethod deint_method;
523
448
guint flags, deint_flags;
524
449
gboolean tff, deint, deint_refs, deint_changed;
450
GstVaapiRectangle *crop_rect = NULL;
451
#if GST_CHECK_VERSION(1,0,0)
452
GstVaapiRectangle tmp_rect;
526
455
/* Validate filters */
527
456
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_FORMAT) &&
534
463
return GST_FLOW_NOT_SUPPORTED;
536
465
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SHARPEN) &&
537
!gst_vaapi_filter_set_denoising_level(postproc->filter,
466
!gst_vaapi_filter_set_sharpening_level(postproc->filter,
538
467
postproc->sharpen_level))
539
468
return GST_FLOW_NOT_SUPPORTED;
470
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_HUE) &&
471
!gst_vaapi_filter_set_hue(postproc->filter,
473
return GST_FLOW_NOT_SUPPORTED;
475
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SATURATION) &&
476
!gst_vaapi_filter_set_saturation(postproc->filter,
477
postproc->saturation))
478
return GST_FLOW_NOT_SUPPORTED;
480
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS) &&
481
!gst_vaapi_filter_set_brightness(postproc->filter,
482
postproc->brightness))
483
return GST_FLOW_NOT_SUPPORTED;
485
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_CONTRAST) &&
486
!gst_vaapi_filter_set_contrast(postproc->filter,
488
return GST_FLOW_NOT_SUPPORTED;
541
490
inbuf_meta = gst_buffer_get_vaapi_video_meta(inbuf);
543
492
goto error_invalid_buffer;
544
493
inbuf_surface = gst_vaapi_video_meta_get_surface(inbuf_meta);
495
#if GST_CHECK_VERSION(1,0,0)
496
GstVideoCropMeta * const crop_meta =
497
gst_buffer_get_video_crop_meta(inbuf);
499
crop_rect = &tmp_rect;
500
crop_rect->x = crop_meta->x;
501
crop_rect->y = crop_meta->y;
502
crop_rect->width = crop_meta->width;
503
crop_rect->height = crop_meta->height;
507
crop_rect = (GstVaapiRectangle *)
508
gst_vaapi_video_meta_get_render_rect(inbuf_meta);
546
510
timestamp = GST_BUFFER_TIMESTAMP(inbuf);
547
511
tff = GST_BUFFER_FLAG_IS_SET(inbuf, GST_VIDEO_BUFFER_FLAG_TFF);
548
deint = is_interlaced_buffer(postproc, inbuf);
512
deint = should_deinterlace_buffer(postproc, inbuf);
550
514
/* Drop references if deinterlacing conditions changed */
551
515
deint_changed = deint != ds->deint;
552
516
if (deint_changed || (ds->num_surfaces > 0 && tff != ds->tff))
519
deint_method = postproc->deinterlace_method;
520
deint_refs = deint_method_is_advanced(deint_method);
522
GstBuffer * const prev_buf = ds_get_buffer(ds, 0);
523
GstClockTime prev_pts, pts = GST_BUFFER_TIMESTAMP(inbuf);
524
/* Reset deinterlacing state when there is a discontinuity */
525
if (prev_buf && (prev_pts = GST_BUFFER_TIMESTAMP(prev_buf)) != pts) {
526
const GstClockTimeDiff pts_diff = GST_CLOCK_DIFF(prev_pts, pts);
527
if (pts_diff < 0 || (postproc->field_duration > 0 &&
528
pts_diff > postproc->field_duration * 2))
554
533
ds->deint = deint;
557
536
flags = gst_vaapi_video_meta_get_render_flags(inbuf_meta) &
558
~(GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD|
559
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD);
537
~GST_VAAPI_PICTURE_STRUCTURE_MASK;
561
539
/* First field */
562
deint_method = postproc->deinterlace_method;
563
deint_refs = deint_method_is_advanced(deint_method);
564
540
if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_DEINTERLACE) {
565
541
fieldbuf = create_output_buffer(postproc);
716
694
timestamp = GST_BUFFER_TIMESTAMP(inbuf);
717
695
tff = GST_BUFFER_FLAG_IS_SET(inbuf, GST_VIDEO_BUFFER_FLAG_TFF);
718
deint = is_interlaced_buffer(postproc, inbuf);
696
deint = should_deinterlace_buffer(postproc, inbuf);
720
698
flags = gst_vaapi_video_meta_get_render_flags(meta) &
721
~(GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD|
722
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD);
699
~GST_VAAPI_PICTURE_STRUCTURE_MASK;
724
701
/* First field */
725
702
fieldbuf = create_output_buffer(postproc);
849
826
deinterlace = is_deinterlace_enabled(postproc, &vi);
851
828
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_DEINTERLACE;
852
postproc->field_duration = gst_util_uint64_scale(
853
GST_SECOND, GST_VIDEO_INFO_FPS_D(&vi),
854
(1 + deinterlace) * GST_VIDEO_INFO_FPS_N(&vi));
829
postproc->field_duration = GST_VIDEO_INFO_FPS_N(&vi) > 0 ?
830
gst_util_uint64_scale(GST_SECOND, GST_VIDEO_INFO_FPS_D(&vi),
831
(1 + deinterlace) * GST_VIDEO_INFO_FPS_N(&vi)) : 0;
856
833
postproc->is_raw_yuv = GST_VIDEO_INFO_IS_YUV(&vi);
857
#if !GST_CHECK_VERSION(1,0,0)
858
if (postproc->is_raw_yuv) {
859
/* Ensure the uploader is set up for upstream allocated buffers */
860
GstVaapiUploader * const uploader = postproc->uploader;
861
if (!gst_vaapi_uploader_ensure_display(uploader, postproc->display))
863
if (!gst_vaapi_uploader_ensure_caps(uploader, caps, NULL))
929
/* Build list of supported formats */
931
build_format_list_value(GArray *formats, GValue *out_value)
933
GValue v_format = { 0, };
935
#if GST_CHECK_VERSION(1,0,0)
938
g_value_init(out_value, GST_TYPE_LIST);
940
g_value_init(&v_format, G_TYPE_STRING);
941
g_value_set_string(&v_format, "encoded");
942
gst_value_list_append_value(out_value, &v_format);
944
for (i = 0; i < formats->len; i++) {
945
GstVideoFormat const format =
946
g_array_index(formats, GstVideoFormat, i);
948
str = gst_vaapi_video_format_to_string(format);
951
g_value_set_string(&v_format, str);
952
gst_value_list_append_value(out_value, &v_format);
957
g_value_init(out_value, GST_TYPE_LIST);
958
g_value_init(&v_format, GST_TYPE_FOURCC);
959
for (i = 0; i < formats->len; i++) {
960
GstVideoFormat const format =
961
g_array_index(formats, GstVideoFormat, i);
963
fourcc = gst_video_format_to_fourcc(format);
966
gst_value_set_fourcc(&v_format, fourcc);
967
gst_value_list_append_value(out_value, &v_format);
971
g_value_unset(&v_format);
975
896
/* Fixup output caps so that to reflect the supported set of pixel formats */
977
898
expand_allowed_srcpad_caps(GstVaapiPostproc *postproc, GstCaps *caps)
979
GValue value = { 0, };
900
GValue value = G_VALUE_INIT, v_format = G_VALUE_INIT;
980
901
guint i, num_structures;
981
902
gboolean had_filter;
989
910
/* Reset "format" field for each structure */
990
if (!build_format_list_value(postproc->filter_formats, &value))
911
if (!gst_vaapi_value_set_format_list(&value, postproc->filter_formats))
913
if (gst_vaapi_value_set_format(&v_format, GST_VIDEO_FORMAT_ENCODED)) {
914
gst_value_list_prepend_value(&value, &v_format);
915
g_value_unset(&v_format);
993
918
num_structures = gst_caps_get_size(caps);
994
919
for (i = 0; i < num_structures; i++) {
1184
get_source_buffer(GstVaapiPostproc *postproc, GstBuffer *inbuf)
1186
GstVaapiVideoMeta *meta;
1188
#if GST_CHECK_VERSION(1,0,0)
1189
GstVideoFrame src_frame, out_frame;
1192
meta = gst_buffer_get_vaapi_video_meta(inbuf);
1194
return gst_buffer_ref(inbuf);
1196
#if GST_CHECK_VERSION(1,0,0)
1197
if (!postproc->is_raw_yuv)
1198
goto error_invalid_buffer;
1200
if (!postproc->sinkpad_buffer_pool)
1203
if (!gst_buffer_pool_set_active(postproc->sinkpad_buffer_pool, TRUE))
1204
goto error_active_pool;
1207
if (gst_buffer_pool_acquire_buffer(postproc->sinkpad_buffer_pool,
1208
&outbuf, NULL) != GST_FLOW_OK)
1209
goto error_create_buffer;
1211
if (!gst_video_frame_map(&src_frame, &postproc->sinkpad_info, inbuf,
1213
goto error_map_src_buffer;
1215
if (!gst_video_frame_map(&out_frame, &postproc->sinkpad_info, outbuf,
1217
goto error_map_dst_buffer;
1219
if (!gst_video_frame_copy(&out_frame, &src_frame))
1220
goto error_copy_buffer;
1222
gst_video_frame_unmap(&out_frame);
1223
gst_video_frame_unmap(&src_frame);
1224
gst_buffer_copy_into(outbuf, inbuf, GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
1228
error_invalid_buffer:
1230
GST_ERROR("failed to validate source buffer");
1235
GST_ERROR("no buffer pool was negotiated");
1240
GST_ERROR("failed to activate buffer pool");
1243
error_map_dst_buffer:
1245
gst_video_frame_unmap(&src_frame);
1248
error_map_src_buffer:
1250
GST_ERROR("failed to map buffer");
1251
gst_buffer_unref(outbuf);
1255
outbuf = gst_vaapi_uploader_get_buffer(postproc->uploader);
1257
goto error_create_buffer;
1258
if (!gst_vaapi_uploader_process(postproc->uploader, inbuf, outbuf))
1259
goto error_copy_buffer;
1261
gst_buffer_copy_metadata(outbuf, inbuf,
1262
GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS);
1267
error_create_buffer:
1269
GST_ERROR("failed to create buffer");
1274
GST_ERROR("failed to upload buffer to VA surface");
1275
#if GST_CHECK_VERSION(1,0,0)
1276
gst_video_frame_unmap(&out_frame);
1277
gst_video_frame_unmap(&src_frame);
1279
gst_buffer_unref(outbuf);
1284
1108
static GstFlowReturn
1285
1109
gst_vaapipostproc_transform(GstBaseTransform *trans, GstBuffer *inbuf,
1286
1110
GstBuffer *outbuf)
1338
1163
static gboolean
1339
ensure_sinkpad_buffer_pool(GstVaapiPostproc *postproc, GstCaps *caps)
1341
#if GST_CHECK_VERSION(1,0,0)
1342
GstBufferPool *pool;
1344
GstStructure *config;
1348
if (!gst_vaapipostproc_ensure_display(postproc))
1351
if (postproc->sinkpad_buffer_pool) {
1352
config = gst_buffer_pool_get_config(postproc->sinkpad_buffer_pool);
1353
gst_buffer_pool_config_get_params(config, &pool_caps, NULL, NULL, NULL);
1354
need_pool = !gst_caps_is_equal(caps, pool_caps);
1355
gst_structure_free(config);
1358
g_clear_object(&postproc->sinkpad_buffer_pool);
1359
postproc->sinkpad_buffer_size = 0;
1362
pool = gst_vaapi_video_buffer_pool_new(postproc->display);
1364
goto error_create_pool;
1366
gst_video_info_init(&vi);
1367
gst_video_info_from_caps(&vi, caps);
1368
if (GST_VIDEO_INFO_FORMAT(&vi) == GST_VIDEO_FORMAT_ENCODED) {
1369
GST_DEBUG("assume sink pad buffer pool format is NV12");
1370
gst_video_info_set_format(&vi, GST_VIDEO_FORMAT_NV12,
1371
GST_VIDEO_INFO_WIDTH(&vi), GST_VIDEO_INFO_HEIGHT(&vi));
1373
postproc->sinkpad_buffer_size = vi.size;
1375
config = gst_buffer_pool_get_config(pool);
1376
gst_buffer_pool_config_set_params(config, caps,
1377
postproc->sinkpad_buffer_size, 0, 0);
1378
gst_buffer_pool_config_add_option(config,
1379
GST_BUFFER_POOL_OPTION_VAAPI_VIDEO_META);
1380
gst_buffer_pool_config_add_option(config,
1381
GST_BUFFER_POOL_OPTION_VIDEO_META);
1382
if (!gst_buffer_pool_set_config(pool, config))
1383
goto error_pool_config;
1384
postproc->sinkpad_buffer_pool = pool;
1390
GST_ERROR("failed to create buffer pool");
1395
GST_ERROR("failed to reset buffer pool config");
1396
gst_object_unref(pool);
1405
1164
ensure_srcpad_buffer_pool(GstVaapiPostproc *postproc, GstCaps *caps)
1407
1166
GstVideoInfo vi;
1412
1171
gst_video_info_set_format(&vi, postproc->format,
1413
1172
GST_VIDEO_INFO_WIDTH(&vi), GST_VIDEO_INFO_HEIGHT(&vi));
1415
if (!video_info_changed(&vi, &postproc->filter_pool_info))
1174
if (postproc->filter_pool && !video_info_changed(&vi, &postproc->filter_pool_info))
1417
1176
postproc->filter_pool_info = vi;
1419
pool = gst_vaapi_surface_pool_new(postproc->display,
1178
pool = gst_vaapi_surface_pool_new(GST_VAAPI_PLUGIN_BASE_DISPLAY(postproc),
1420
1179
&postproc->filter_pool_info);
1441
1200
if (caps_changed) {
1442
1201
gst_vaapipostproc_destroy(postproc);
1443
gst_caps_replace(&postproc->sinkpad_caps, caps);
1444
gst_caps_replace(&postproc->srcpad_caps, out_caps);
1445
1202
if (!gst_vaapipostproc_create(postproc))
1204
if (!gst_vaapi_plugin_base_set_caps(GST_VAAPI_PLUGIN_BASE(trans),
1449
if (!ensure_sinkpad_buffer_pool(postproc, caps))
1451
1209
if (!ensure_srcpad_buffer_pool(postproc, out_caps))
1476
1234
GstQuery *decide_query, GstQuery *query)
1478
1236
GstVaapiPostproc * const postproc = GST_VAAPIPOSTPROC(trans);
1479
GstCaps *caps = NULL;
1237
GstVaapiPluginBase * const plugin = GST_VAAPI_PLUGIN_BASE(trans);
1482
1239
/* Let vaapidecode allocate the video buffers */
1483
1240
if (!postproc->is_raw_yuv)
1486
gst_query_parse_allocation(query, &caps, &need_pool);
1491
if (!ensure_sinkpad_buffer_pool(postproc, caps))
1493
gst_query_add_allocation_pool(query, postproc->sinkpad_buffer_pool,
1494
postproc->sinkpad_buffer_size, 0, 0);
1497
gst_query_add_allocation_meta(query,
1498
GST_VAAPI_VIDEO_META_API_TYPE, NULL);
1499
gst_query_add_allocation_meta(query,
1500
GST_VIDEO_META_API_TYPE, NULL);
1501
gst_query_add_allocation_meta(query,
1502
GST_VIDEO_CROP_META_API_TYPE, NULL);
1503
gst_query_add_allocation_meta(query,
1504
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
1242
if (!gst_vaapi_plugin_base_propose_allocation(plugin, query))
1510
GST_ERROR("no caps specified");
1560
1293
postproc->sharpen_level = g_value_get_float(value);
1561
1294
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SHARPEN;
1297
postproc->hue = g_value_get_float(value);
1298
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_HUE;
1300
case PROP_SATURATION:
1301
postproc->saturation = g_value_get_float(value);
1302
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SATURATION;
1304
case PROP_BRIGHTNESS:
1305
postproc->brightness = g_value_get_float(value);
1306
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS;
1309
postproc->contrast = g_value_get_float(value);
1310
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_CONTRAST;
1564
1313
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
1601
1350
case PROP_SHARPEN:
1602
1351
g_value_set_float(value, postproc->sharpen_level);
1354
g_value_set_float(value, postproc->hue);
1356
case PROP_SATURATION:
1357
g_value_set_float(value, postproc->saturation);
1359
case PROP_BRIGHTNESS:
1360
g_value_set_float(value, postproc->brightness);
1363
g_value_set_float(value, postproc->contrast);
1605
1366
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
1638
1401
trans_class->prepare_output_buffer =
1639
1402
gst_vaapipostproc_prepare_output_buffer;
1641
#if GST_CHECK_VERSION(1,1,0)
1642
element_class->set_context = gst_vaapipostproc_set_context;
1645
1404
gst_element_class_set_static_metadata(element_class,
1646
1405
"VA-API video postprocessing",
1647
1406
"Filter/Converter/Video",
1771
1530
g_object_class_install_property(object_class,
1772
1531
PROP_SHARPEN, filter_op->pspec);
1534
* GstVaapiPostproc:hue:
1536
* The color hue, expressed as a float value. Range is -180.0 to
1537
* 180.0. Default value is 0.0 and represents no modification.
1539
filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_HUE);
1541
g_object_class_install_property(object_class,
1542
PROP_HUE, filter_op->pspec);
1545
* GstVaapiPostproc:saturation:
1547
* The color saturation, expressed as a float value. Range is 0.0
1548
* to 2.0. Default value is 1.0 and represents no modification.
1550
filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_SATURATION);
1552
g_object_class_install_property(object_class,
1553
PROP_SATURATION, filter_op->pspec);
1556
* GstVaapiPostproc:brightness:
1558
* The color brightness, expressed as a float value. Range is -1.0
1559
* to 1.0. Default value is 0.0 and represents no modification.
1561
filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_BRIGHTNESS);
1563
g_object_class_install_property(object_class,
1564
PROP_BRIGHTNESS, filter_op->pspec);
1567
* GstVaapiPostproc:contrast:
1569
* The color contrast, expressed as a float value. Range is 0.0 to
1570
* 2.0. Default value is 1.0 and represents no modification.
1572
filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_CONTRAST);
1574
g_object_class_install_property(object_class,
1575
PROP_CONTRAST, filter_op->pspec);
1774
1577
g_ptr_array_unref(filter_ops);
1778
1581
gst_vaapipostproc_init(GstVaapiPostproc *postproc)
1583
gst_vaapi_plugin_base_init(GST_VAAPI_PLUGIN_BASE(postproc), GST_CAT_DEFAULT);
1780
1585
postproc->format = DEFAULT_FORMAT;
1781
1586
postproc->deinterlace_mode = DEFAULT_DEINTERLACE_MODE;
1782
1587
postproc->deinterlace_method = DEFAULT_DEINTERLACE_METHOD;