From ef8f5defd2ca3f2916b4d36902da6aa4f0b49998 Mon Sep 17 00:00:00 2001 From: Halley Zhao Date: Fri, 1 Nov 2013 10:22:17 +0800 Subject: [PATCH] vaapipostproc: add support for denoise and sharpen filters. Signed-off-by: Gwenole Beauchesne --- gst/vaapi/gstvaapipostproc.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ gst/vaapi/gstvaapipostproc.h | 4 ++++ 2 files changed, 51 insertions(+) diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c index 06ea528..c3ead79 100755 --- a/gst/vaapi/gstvaapipostproc.c +++ b/gst/vaapi/gstvaapipostproc.c @@ -139,6 +139,8 @@ enum { PROP_FORCE_ASPECT_RATIO, PROP_DEINTERLACE_MODE, PROP_DEINTERLACE_METHOD, + PROP_DENOISE, + PROP_SHARPEN, }; #define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED @@ -470,6 +472,16 @@ gst_vaapipostproc_process_vpp(GstBaseTransform *trans, GstBuffer *inbuf, !gst_vaapi_filter_set_format(postproc->filter, postproc->format)) return GST_FLOW_NOT_SUPPORTED; + if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_DENOISE) && + !gst_vaapi_filter_set_denoising_level(postproc->filter, + postproc->denoise_level)) + return GST_FLOW_NOT_SUPPORTED; + + if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SHARPEN) && + !gst_vaapi_filter_set_denoising_level(postproc->filter, + postproc->sharpen_level)) + return GST_FLOW_NOT_SUPPORTED; + inbuf_meta = gst_buffer_get_vaapi_video_meta(inbuf); if (!inbuf_meta) goto error_invalid_buffer; @@ -1446,6 +1458,14 @@ gst_vaapipostproc_set_property( case PROP_DEINTERLACE_METHOD: postproc->deinterlace_method = g_value_get_enum(value); break; + case PROP_DENOISE: + postproc->denoise_level = g_value_get_float(value); + postproc->flags |= GST_VAAPI_POSTPROC_FLAG_DENOISE; + break; + case PROP_SHARPEN: + postproc->sharpen_level = g_value_get_float(value); + postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SHARPEN; + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1481,6 +1501,12 @@ gst_vaapipostproc_get_property( case PROP_DEINTERLACE_METHOD: g_value_set_enum(value, postproc->deinterlace_method); break; + case PROP_DENOISE: + g_value_set_float(value, postproc->denoise_level); + break; + case PROP_SHARPEN: + g_value_set_float(value, postproc->sharpen_level); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1626,6 +1652,27 @@ gst_vaapipostproc_class_init(GstVaapiPostprocClass *klass) TRUE, G_PARAM_READWRITE)); + /** + * GstVaapiPostproc:denoise: + * + * The level of noise reduction to apply. + */ + filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_DENOISE); + if (filter_op) + g_object_class_install_property(object_class, + PROP_DENOISE, filter_op->pspec); + + /** + * GstVaapiPostproc:sharpen: + * + * The level of sharpening to apply for positive values, or the + * level of blurring for negative values. + */ + filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_SHARPEN); + if (filter_op) + g_object_class_install_property(object_class, + PROP_SHARPEN, filter_op->pspec); + g_ptr_array_unref(filter_ops); } diff --git a/gst/vaapi/gstvaapipostproc.h b/gst/vaapi/gstvaapipostproc.h index 7340c3f..6d3364d 100755 --- a/gst/vaapi/gstvaapipostproc.h +++ b/gst/vaapi/gstvaapipostproc.h @@ -165,6 +165,10 @@ struct _GstVaapiPostproc { GstVaapiDeinterlaceState deinterlace_state; GstClockTime field_duration; + /* Basic filter values */ + gfloat denoise_level; + gfloat sharpen_level; + guint is_raw_yuv : 1; guint use_vpp : 1; guint keep_aspect : 1; -- 2.7.4