From: Carl-Anton Ingmarsson Date: Wed, 19 Aug 2009 20:02:19 +0000 (+0200) Subject: vdpauvideopostprocess: add sharpening property X-Git-Tag: 1.19.3~507^2~18119 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a7ea771f3638919b5ae2f7a8c63b83b5b969ee31;p=platform%2Fupstream%2Fgstreamer.git vdpauvideopostprocess: add sharpening property --- diff --git a/sys/vdpau/gstvdpvideopostprocess.c b/sys/vdpau/gstvdpvideopostprocess.c index 32dd37a..e6c9ab7 100644 --- a/sys/vdpau/gstvdpvideopostprocess.c +++ b/sys/vdpau/gstvdpvideopostprocess.c @@ -67,7 +67,8 @@ enum PROP_FORCE_ASPECT_RATIO, PROP_DEINTERLACE_MODE, PROP_DEINTERLACE_METHOD, - PROP_NOISE_REDUCTION + PROP_NOISE_REDUCTION, + PROP_SHARPENING }; /* the capabilities of the inputs and outputs. @@ -136,6 +137,28 @@ gst_vdp_deinterlace_modes_get_type (void) } static void +gst_vdp_vpp_set_attribute_float (GstVdpVideoPostProcess * vpp, + VdpVideoMixerAttribute attribute, gfloat value) +{ + VdpVideoMixerAttribute attributes[1]; + const void *attribute_values[1]; + VdpStatus status; + + attributes[0] = attribute; + attribute_values[0] = &value; + + status = + vpp->device->vdp_video_mixer_set_attribute_values (vpp->mixer, 1, + attributes, attribute_values); + if (status != VDP_STATUS_OK) { + GST_WARNING_OBJECT (vpp, + "Couldn't set noise reduction level on mixer, " + "error returned from vdpau was: %s", + vpp->device->vdp_get_error_string (status)); + } +} + +static void gst_vdp_vpp_activate_feature (GstVdpVideoPostProcess * vpp, VdpVideoMixerFeature feature, gboolean activate) { @@ -378,6 +401,8 @@ gst_vdp_vpp_create_mixer (GstVdpVideoPostProcess * vpp, GstVdpDevice * device) } if (vpp->noise_reduction > 0.0) features[n_features++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION; + if (vpp->sharpening != 0.0) + features[n_features++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS; status = device->vdp_video_mixer_create (device->device, n_features, features, @@ -393,20 +418,12 @@ gst_vdp_vpp_create_mixer (GstVdpVideoPostProcess * vpp, GstVdpDevice * device) vpp->device = g_object_ref (device); if (vpp->noise_reduction > 0.0) { - VdpVideoMixerAttribute attributes[1]; - const void *attribute_values[1]; - - attributes[0] = VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL; - attribute_values[0] = &vpp->noise_reduction; - - status = - vpp->device->vdp_video_mixer_set_attribute_values (vpp->mixer, 1, - attributes, attribute_values); - if (status != VDP_STATUS_OK) { - GST_WARNING_OBJECT (vpp, "Couldn't set noise reduction level on mixer, " - "error returned from vdpau was: %s", - vpp->device->vdp_get_error_string (status)); - } + gst_vdp_vpp_set_attribute_float (vpp, + VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL, vpp->noise_reduction); + } + if (vpp->sharpening != 0.0) { + gst_vdp_vpp_set_attribute_float (vpp, + VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL, vpp->sharpening); } return GST_FLOW_OK; @@ -838,6 +855,9 @@ gst_vdp_vpp_get_property (GObject * object, guint property_id, GValue * value, case PROP_NOISE_REDUCTION: g_value_set_boolean (value, vpp->noise_reduction); break; + case PROP_SHARPENING: + g_value_set_float (value, vpp->sharpening); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -886,10 +906,6 @@ gst_vdp_vpp_set_property (GObject * object, guint property_id, break; if (vpp->device) { - VdpVideoMixerAttribute attributes[1]; - const void *attribute_values[1]; - VdpStatus status; - if (vpp->noise_reduction == 0.0) gst_vdp_vpp_activate_feature (vpp, VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION, FALSE); @@ -898,18 +914,32 @@ gst_vdp_vpp_set_property (GObject * object, guint property_id, gst_vdp_vpp_activate_feature (vpp, VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION, TRUE); - attributes[0] = VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL; - attribute_values[0] = &vpp->noise_reduction; - - status = - vpp->device->vdp_video_mixer_set_attribute_values (vpp->mixer, 1, - attributes, attribute_values); - if (status != VDP_STATUS_OK) { - GST_WARNING_OBJECT (vpp, - "Couldn't set noise reduction level on mixer, " - "error returned from vdpau was: %s", - vpp->device->vdp_get_error_string (status)); - } + gst_vdp_vpp_set_attribute_float (vpp, + VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL, + vpp->noise_reduction); + } + break; + } + case PROP_SHARPENING: + { + gfloat old_value; + + old_value = vpp->sharpening; + vpp->sharpening = g_value_get_float (value); + if (vpp->sharpening == old_value) + break; + + if (vpp->device) { + if (vpp->sharpening == 0.0) + gst_vdp_vpp_activate_feature (vpp, + VDP_VIDEO_MIXER_FEATURE_SHARPNESS, FALSE); + + if (old_value == 0.0) + gst_vdp_vpp_activate_feature (vpp, + VDP_VIDEO_MIXER_FEATURE_SHARPNESS, TRUE); + + gst_vdp_vpp_set_attribute_float (vpp, + VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL, vpp->sharpening); } break; } @@ -975,6 +1005,11 @@ gst_vdp_vpp_class_init (GstVdpVideoPostProcessClass * klass) "The amount of noise reduction that should be done", 0.0, 1.0, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SHARPENING, + g_param_spec_float ("sharpening", "Sharpening", + "The amount of sharpening or blurring to be applied", -1.0, 1.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + gstelement_class->change_state = gst_vdp_vpp_change_state; } @@ -989,6 +1024,7 @@ gst_vdp_vpp_init (GstVdpVideoPostProcess * vpp, vpp->method = GST_VDP_DEINTERLACE_METHOD_BOB; vpp->noise_reduction = 0.0; + vpp->sharpening = 0.0; /* SRC PAD */ vpp->srcpad = gst_pad_new_from_static_template (&src_template, "src"); diff --git a/sys/vdpau/gstvdpvideopostprocess.h b/sys/vdpau/gstvdpvideopostprocess.h index 57b9266..1eed7af 100644 --- a/sys/vdpau/gstvdpvideopostprocess.h +++ b/sys/vdpau/gstvdpvideopostprocess.h @@ -83,6 +83,7 @@ struct _GstVdpVideoPostProcess GstVdpDeinterlaceMethods method; gfloat noise_reduction; + gfloat sharpening; }; struct _GstVdpVideoPostProcessClass