From 36e81744d1a3be9ecb1b55d5ce8f5ba7c5315368 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Tue, 6 Mar 2018 13:51:32 +0000 Subject: [PATCH] msdk: vpp:Add more filters -- Add Denoise -- Add Rotation https://bugzilla.gnome.org/show_bug.cgi?id=793705 --- sys/msdk/gstmsdkvpp.c | 46 ++++++++++++++++++++++++++++++++++++++++--- sys/msdk/gstmsdkvpp.h | 19 ++++++++++++++++++ sys/msdk/msdk-enums.c | 22 +++++++++++++++++++++ sys/msdk/msdk-enums.h | 5 +++++ 4 files changed, 89 insertions(+), 3 deletions(-) diff --git a/sys/msdk/gstmsdkvpp.c b/sys/msdk/gstmsdkvpp.c index b87bd7c00a..b031a03424 100644 --- a/sys/msdk/gstmsdkvpp.c +++ b/sys/msdk/gstmsdkvpp.c @@ -64,14 +64,18 @@ GST_STATIC_PAD_TEMPLATE ("src", enum { - PROP_0 = 0, - PROP_HARDWARE = 1, - PROP_ASYNC_DEPTH = 2, + PROP_0, + PROP_HARDWARE, + PROP_ASYNC_DEPTH, + PROP_DENOISE, + PROP_ROTATION, PROP_N, }; #define PROP_HARDWARE_DEFAULT TRUE #define PROP_ASYNC_DEPTH_DEFAULT 1 +#define PROP_DENOISE_DEFAULT 0 +#define PROP_ROTATION_DEFAULT MFX_ANGLE_0 #define gst_msdkvpp_parent_class parent_class G_DEFINE_TYPE (GstMsdkVPP, gst_msdkvpp, GST_TYPE_BASE_TRANSFORM); @@ -90,6 +94,15 @@ free_msdk_surface (MsdkSurface * surface) g_slice_free (MsdkSurface, surface); } +static void +gst_msdkvpp_add_extra_param (GstMsdkVPP * thiz, mfxExtBuffer * param) +{ + if (thiz->num_extra_params < MAX_EXTRA_PARAMS) { + thiz->extra_params[thiz->num_extra_params] = param; + thiz->num_extra_params++; + } +} + static gboolean ensure_context (GstBaseTransform * trans) { @@ -712,6 +725,7 @@ gst_msdkvpp_initialize (GstMsdkVPP * thiz) thiz->in_num_surfaces = request[0].NumFrameSuggested; thiz->out_num_surfaces = request[1].NumFrameSuggested; + status = MFXVideoVPP_Init (session, &thiz->param); if (status < MFX_ERR_NONE) { GST_ERROR_OBJECT (thiz, "Init failed (%s)", msdk_status_to_string (status)); @@ -858,6 +872,14 @@ gst_msdkvpp_set_property (GObject * object, guint prop_id, case PROP_ASYNC_DEPTH: thiz->async_depth = g_value_get_uint (value); break; + case PROP_DENOISE: + thiz->denoise_factor = g_value_get_uint (value); + thiz->flags |= GST_MSDK_FLAG_DENOISE; + break; + case PROP_ROTATION: + thiz->rotation = g_value_get_enum (value); + thiz->flags |= GST_MSDK_FLAG_ROTATION; + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -877,6 +899,12 @@ gst_msdkvpp_get_property (GObject * object, guint prop_id, case PROP_ASYNC_DEPTH: g_value_set_uint (value, thiz->async_depth); break; + case PROP_DENOISE: + g_value_set_uint (value, thiz->denoise_factor); + break; + case PROP_ROTATION: + g_value_set_enum (value, thiz->rotation); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -957,6 +985,16 @@ gst_msdkvpp_class_init (GstMsdkVPPClass * klass) 1, 1, PROP_ASYNC_DEPTH_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_DENOISE] = + g_param_spec_uint ("denoise", "Denoising factor", + "Denoising Factor", + 0, 100, PROP_DENOISE_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_ROTATION] = + g_param_spec_enum ("rotation", "Rotation", + "Rotation Angle", gst_msdkvpp_rotation_get_type (), + PROP_ROTATION_DEFAULT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (gobject_class, PROP_N, obj_properties); } @@ -965,6 +1003,8 @@ gst_msdkvpp_init (GstMsdkVPP * thiz) { thiz->hardware = PROP_HARDWARE_DEFAULT; thiz->async_depth = PROP_ASYNC_DEPTH_DEFAULT; + thiz->denoise_factor = PROP_DENOISE_DEFAULT; + thiz->rotation = PROP_ROTATION_DEFAULT; gst_video_info_init (&thiz->sinkpad_info); gst_video_info_init (&thiz->srcpad_info); } diff --git a/sys/msdk/gstmsdkvpp.h b/sys/msdk/gstmsdkvpp.h index c793dfd835..b4c68ffd94 100644 --- a/sys/msdk/gstmsdkvpp.h +++ b/sys/msdk/gstmsdkvpp.h @@ -55,10 +55,16 @@ G_BEGIN_DECLS (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MSDKVPP)) #define MAX_EXTRA_PARAMS 8 +#define MAX_FILTER_ALGORITHMS 7 typedef struct _GstMsdkVPP GstMsdkVPP; typedef struct _GstMsdkVPPClass GstMsdkVPPClass; +typedef enum { + GST_MSDK_FLAG_DENOISE = 1 << 0, + GST_MSDK_FLAG_ROTATION = 1 << 1, +} GstMsdkVppFlags; + struct _GstMsdkVPP { GstBaseTransform element; @@ -86,10 +92,23 @@ struct _GstMsdkVPP gboolean use_video_memory; gboolean shared_context; gboolean add_video_meta; + guint flags; /* element properties */ gboolean hardware; guint async_depth; + guint denoise_factor; + guint rotation; + + /* MFX Filters */ + mfxExtVPPDoUse mfx_vpp_douse; + mfxU32 max_filter_algorithms [MAX_FILTER_ALGORITHMS]; + mfxExtVPPDenoise mfx_denoise; + mfxExtVPPRotation mfx_rotation; + + /* Extended buffers */ + mfxExtBuffer *extra_params[MAX_EXTRA_PARAMS]; + guint num_extra_params; }; struct _GstMsdkVPPClass diff --git a/sys/msdk/msdk-enums.c b/sys/msdk/msdk-enums.c index 5d581c9864..14797154aa 100644 --- a/sys/msdk/msdk-enums.c +++ b/sys/msdk/msdk-enums.c @@ -33,6 +33,7 @@ #include "msdk-enums.h" +/*========= MSDK Encoder Enums =========================*/ GType gst_msdkenc_rate_control_get_type (void) { @@ -154,3 +155,24 @@ gst_msdkenc_adaptive_b_get_type (void) } return type; } + +/*========= MSDK VPP Enums =========================*/ + +GType +gst_msdkvpp_rotation_get_type (void) +{ + static GType type = 0; + + static const GEnumValue values[] = { + {MFX_ANGLE_0, "Unrotated mode", "0"}, + {MFX_ANGLE_90, "Rotated by 90°", "90"}, + {MFX_ANGLE_180, "Rotated by 180°", "180"}, + {MFX_ANGLE_270, "Rotated by 270°", "270"}, + {0, NULL, NULL} + }; + + if (!type) { + type = g_enum_register_static ("GstMsdkVPPRotation", values); + } + return type; +} diff --git a/sys/msdk/msdk-enums.h b/sys/msdk/msdk-enums.h index 2e0e29aca4..dde0cc5eb8 100644 --- a/sys/msdk/msdk-enums.h +++ b/sys/msdk/msdk-enums.h @@ -40,6 +40,7 @@ G_BEGIN_DECLS #define _MFX_TRELLIS_NONE 0 +/*========= MSDK Encoder Enums =========================*/ GType gst_msdkenc_rate_control_get_type (void); @@ -58,5 +59,9 @@ gst_msdkenc_adaptive_i_get_type (void); GType gst_msdkenc_adaptive_b_get_type (void); +/*========= MSDK VPP Enums =========================*/ +GType +gst_msdkvpp_rotation_get_type (void); + G_END_DECLS #endif