mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
vaapipostproc: add skin tone enhancement
Added the 'skin-tone-enhancement' property to vaapostproc. https://bugzilla.gnome.org/show_bug.cgi?id=744088
This commit is contained in:
parent
b524990e07
commit
1ef8c10aa8
4 changed files with 117 additions and 0 deletions
|
@ -278,6 +278,7 @@ enum
|
||||||
PROP_CONTRAST = GST_VAAPI_FILTER_OP_CONTRAST,
|
PROP_CONTRAST = GST_VAAPI_FILTER_OP_CONTRAST,
|
||||||
PROP_DEINTERLACING = GST_VAAPI_FILTER_OP_DEINTERLACING,
|
PROP_DEINTERLACING = GST_VAAPI_FILTER_OP_DEINTERLACING,
|
||||||
PROP_SCALING = GST_VAAPI_FILTER_OP_SCALING,
|
PROP_SCALING = GST_VAAPI_FILTER_OP_SCALING,
|
||||||
|
PROP_SKINTONE = GST_VAAPI_FILTER_OP_SKINTONE,
|
||||||
|
|
||||||
N_PROPERTIES
|
N_PROPERTIES
|
||||||
};
|
};
|
||||||
|
@ -399,6 +400,16 @@ init_properties (void)
|
||||||
"Scaling method to use",
|
"Scaling method to use",
|
||||||
GST_VAAPI_TYPE_SCALE_METHOD,
|
GST_VAAPI_TYPE_SCALE_METHOD,
|
||||||
DEFAULT_SCALING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
DEFAULT_SCALING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVaapiFilter:skin-tone-enhancement:
|
||||||
|
*
|
||||||
|
* Apply the skin tone enhancement algorithm.
|
||||||
|
*/
|
||||||
|
g_properties[PROP_SKINTONE] = g_param_spec_boolean ("skin-tone-enhancement",
|
||||||
|
"Skin tone enhancement",
|
||||||
|
"Apply the skin tone enhancement algorithm",
|
||||||
|
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -447,6 +458,10 @@ op_data_new (GstVaapiFilterOp op, GParamSpec * pspec)
|
||||||
op_data->va_cap_size = sizeof (VAProcFilterCap);
|
op_data->va_cap_size = sizeof (VAProcFilterCap);
|
||||||
op_data->va_buffer_size = sizeof (VAProcFilterParameterBuffer);
|
op_data->va_buffer_size = sizeof (VAProcFilterParameterBuffer);
|
||||||
break;
|
break;
|
||||||
|
case GST_VAAPI_FILTER_OP_SKINTONE:
|
||||||
|
op_data->va_type = VAProcFilterSkinToneEnhancement;
|
||||||
|
op_data->va_buffer_size = sizeof (VAProcFilterParameterBuffer);
|
||||||
|
break;
|
||||||
case GST_VAAPI_FILTER_OP_HUE:
|
case GST_VAAPI_FILTER_OP_HUE:
|
||||||
op_data->va_subtype = VAProcColorBalanceHue;
|
op_data->va_subtype = VAProcColorBalanceHue;
|
||||||
goto op_colorbalance;
|
goto op_colorbalance;
|
||||||
|
@ -628,6 +643,11 @@ get_operations_ordered (GstVaapiFilter * filter, GPtrArray * default_ops)
|
||||||
if (op_data->va_type != va_type)
|
if (op_data->va_type != va_type)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (op_data->va_cap_size == 0) { /* no caps, like skintone */
|
||||||
|
g_ptr_array_add (ops, op_data_ref (op_data));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!filter_caps) {
|
if (!filter_caps) {
|
||||||
filter_caps = vpp_get_filter_caps (filter, va_type,
|
filter_caps = vpp_get_filter_caps (filter, va_type,
|
||||||
op_data->va_cap_size, &num_filter_caps);
|
op_data->va_cap_size, &num_filter_caps);
|
||||||
|
@ -878,6 +898,46 @@ op_set_deinterlace (GstVaapiFilter * filter, GstVaapiFilterOpData * op_data,
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update skin tone enhancement */
|
||||||
|
#if USE_VA_VPP
|
||||||
|
gboolean
|
||||||
|
op_set_skintone_unlocked (GstVaapiFilter * filter,
|
||||||
|
GstVaapiFilterOpData * op_data, gboolean value)
|
||||||
|
{
|
||||||
|
VAProcFilterParameterBuffer *buf;
|
||||||
|
|
||||||
|
if (!op_data || !op_ensure_buffer (filter, op_data))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
op_data->is_enabled = value;
|
||||||
|
if (!op_data->is_enabled)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
buf = vaapi_map_buffer (filter->va_display, op_data->va_buffer);
|
||||||
|
if (!buf)
|
||||||
|
return FALSE;
|
||||||
|
buf->type = op_data->va_type;
|
||||||
|
buf->value = 0;
|
||||||
|
vaapi_unmap_buffer (filter->va_display, op_data->va_buffer, NULL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
op_set_skintone (GstVaapiFilter * filter, GstVaapiFilterOpData * op_data,
|
||||||
|
gboolean enhance)
|
||||||
|
{
|
||||||
|
gboolean success = FALSE;
|
||||||
|
|
||||||
|
#if USE_VA_VPP
|
||||||
|
GST_VAAPI_DISPLAY_LOCK (filter->display);
|
||||||
|
success = op_set_skintone_unlocked (filter, op_data, enhance);
|
||||||
|
GST_VAAPI_DISPLAY_UNLOCK (filter->display);
|
||||||
|
#endif
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
deint_refs_set (GArray * refs, GstVaapiSurface ** surfaces, guint num_surfaces)
|
deint_refs_set (GArray * refs, GstVaapiSurface ** surfaces, guint num_surfaces)
|
||||||
{
|
{
|
||||||
|
@ -1300,6 +1360,10 @@ gst_vaapi_filter_set_operation (GstVaapiFilter * filter, GstVaapiFilterOp op,
|
||||||
case GST_VAAPI_FILTER_OP_SCALING:
|
case GST_VAAPI_FILTER_OP_SCALING:
|
||||||
return gst_vaapi_filter_set_scaling (filter, value ?
|
return gst_vaapi_filter_set_scaling (filter, value ?
|
||||||
g_value_get_enum (value) : DEFAULT_SCALING);
|
g_value_get_enum (value) : DEFAULT_SCALING);
|
||||||
|
case GST_VAAPI_FILTER_OP_SKINTONE:
|
||||||
|
return op_set_skintone (filter, op_data,
|
||||||
|
(value ? g_value_get_boolean (value) :
|
||||||
|
G_PARAM_SPEC_BOOLEAN (op_data->pspec)->default_value));
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1789,3 +1853,23 @@ gst_vaapi_filter_set_scaling (GstVaapiFilter * filter,
|
||||||
filter->scale_method = method;
|
filter->scale_method = method;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_filter_set_skintone:
|
||||||
|
* @filter: a #GstVaapiFilter
|
||||||
|
* @enhance: %TRUE if enable the skin tone enhancement algorithm
|
||||||
|
*
|
||||||
|
* Applies the skin tone enhancement algorithm.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if the operation is supported, %FALSE
|
||||||
|
* otherwise.
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_filter_set_skintone (GstVaapiFilter * filter,
|
||||||
|
gboolean enhance)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (filter != NULL, FALSE);
|
||||||
|
|
||||||
|
return op_set_skintone (filter,
|
||||||
|
find_operation (filter, GST_VAAPI_FILTER_OP_SKINTONE), enhance);
|
||||||
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ typedef struct _GstVaapiFilterOpInfo GstVaapiFilterOpInfo;
|
||||||
* @GST_VAAPI_FILTER_OP_BRIGHTNESS: Change brightness (float).
|
* @GST_VAAPI_FILTER_OP_BRIGHTNESS: Change brightness (float).
|
||||||
* @GST_VAAPI_FILTER_OP_CONTRAST: Change contrast (float).
|
* @GST_VAAPI_FILTER_OP_CONTRAST: Change contrast (float).
|
||||||
* @GST_VAAPI_FILTER_OP_SCALING: Change scaling method (#GstVaapiScaleMethod).
|
* @GST_VAAPI_FILTER_OP_SCALING: Change scaling method (#GstVaapiScaleMethod).
|
||||||
|
* @GST_VAAPI_FILTER_OP_SKINTONE: Skin tone enhancement (bool).
|
||||||
*
|
*
|
||||||
* The set of operations that could be applied to the filter.
|
* The set of operations that could be applied to the filter.
|
||||||
*/
|
*/
|
||||||
|
@ -55,6 +56,7 @@ typedef enum {
|
||||||
GST_VAAPI_FILTER_OP_CONTRAST,
|
GST_VAAPI_FILTER_OP_CONTRAST,
|
||||||
GST_VAAPI_FILTER_OP_DEINTERLACING,
|
GST_VAAPI_FILTER_OP_DEINTERLACING,
|
||||||
GST_VAAPI_FILTER_OP_SCALING,
|
GST_VAAPI_FILTER_OP_SCALING,
|
||||||
|
GST_VAAPI_FILTER_OP_SKINTONE,
|
||||||
} GstVaapiFilterOp;
|
} GstVaapiFilterOp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -240,4 +242,8 @@ gboolean
|
||||||
gst_vaapi_filter_set_scaling (GstVaapiFilter * filter,
|
gst_vaapi_filter_set_scaling (GstVaapiFilter * filter,
|
||||||
GstVaapiScaleMethod method);
|
GstVaapiScaleMethod method);
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_filter_set_skintone (GstVaapiFilter * filter,
|
||||||
|
gboolean enhance);
|
||||||
|
|
||||||
#endif /* GST_VAAPI_FILTER_H */
|
#endif /* GST_VAAPI_FILTER_H */
|
||||||
|
|
|
@ -104,6 +104,7 @@ enum
|
||||||
PROP_BRIGHTNESS,
|
PROP_BRIGHTNESS,
|
||||||
PROP_CONTRAST,
|
PROP_CONTRAST,
|
||||||
PROP_SCALE_METHOD,
|
PROP_SCALE_METHOD,
|
||||||
|
PROP_SKIN_TONE_ENHANCEMENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
|
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
|
||||||
|
@ -522,6 +523,11 @@ gst_vaapipostproc_process_vpp (GstBaseTransform * trans, GstBuffer * inbuf,
|
||||||
!gst_vaapi_filter_set_scaling (postproc->filter, postproc->scale_method))
|
!gst_vaapi_filter_set_scaling (postproc->filter, postproc->scale_method))
|
||||||
return GST_FLOW_NOT_SUPPORTED;
|
return GST_FLOW_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SKINTONE) &&
|
||||||
|
!gst_vaapi_filter_set_skintone (postproc->filter,
|
||||||
|
postproc->skintone_enhance))
|
||||||
|
return GST_FLOW_NOT_SUPPORTED;
|
||||||
|
|
||||||
inbuf_meta = gst_buffer_get_vaapi_video_meta (inbuf);
|
inbuf_meta = gst_buffer_get_vaapi_video_meta (inbuf);
|
||||||
if (!inbuf_meta)
|
if (!inbuf_meta)
|
||||||
goto error_invalid_buffer;
|
goto error_invalid_buffer;
|
||||||
|
@ -1352,6 +1358,10 @@ gst_vaapipostproc_set_property (GObject * object,
|
||||||
postproc->scale_method = g_value_get_enum (value);
|
postproc->scale_method = g_value_get_enum (value);
|
||||||
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SCALE;
|
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SCALE;
|
||||||
break;
|
break;
|
||||||
|
case PROP_SKIN_TONE_ENHANCEMENT:
|
||||||
|
postproc->skintone_enhance = g_value_get_boolean (value);
|
||||||
|
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SKINTONE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1404,6 +1414,9 @@ gst_vaapipostproc_get_property (GObject * object,
|
||||||
case PROP_SCALE_METHOD:
|
case PROP_SCALE_METHOD:
|
||||||
g_value_set_enum (value, postproc->scale_method);
|
g_value_set_enum (value, postproc->scale_method);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SKIN_TONE_ENHANCEMENT:
|
||||||
|
g_value_set_boolean (value, postproc->skintone_enhance);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1619,6 +1632,16 @@ gst_vaapipostproc_class_init (GstVaapiPostprocClass * klass)
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_SCALE_METHOD, filter_op->pspec);
|
PROP_SCALE_METHOD, filter_op->pspec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVaapiPostproc:skin-tone-enhancement:
|
||||||
|
*
|
||||||
|
* Apply the skin tone enhancement algorithm.
|
||||||
|
*/
|
||||||
|
filter_op = find_filter_op (filter_ops, GST_VAAPI_FILTER_OP_SKINTONE);
|
||||||
|
if (filter_op)
|
||||||
|
g_object_class_install_property (object_class,
|
||||||
|
PROP_SKIN_TONE_ENHANCEMENT, filter_op->pspec);
|
||||||
|
|
||||||
g_ptr_array_unref (filter_ops);
|
g_ptr_array_unref (filter_ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ typedef enum
|
||||||
* @GST_VAAPI_POSTPROC_FLAG_DEINTERLACE: Deinterlacing.
|
* @GST_VAAPI_POSTPROC_FLAG_DEINTERLACE: Deinterlacing.
|
||||||
* @GST_VAAPI_POSTPROC_FLAG_SIZE: Video scaling.
|
* @GST_VAAPI_POSTPROC_FLAG_SIZE: Video scaling.
|
||||||
* @GST_VAAPI_POSTPROC_FLAG_SCALE: Video scaling mode.
|
* @GST_VAAPI_POSTPROC_FLAG_SCALE: Video scaling mode.
|
||||||
|
* @GST_VAAPI_POSTPROC_FLAG_SKINTONE: Skin tone enhancement.
|
||||||
*
|
*
|
||||||
* The set of operations that are to be performed for each frame.
|
* The set of operations that are to be performed for each frame.
|
||||||
*/
|
*/
|
||||||
|
@ -100,6 +101,7 @@ typedef enum
|
||||||
GST_VAAPI_POSTPROC_FLAG_CONTRAST = 1 << GST_VAAPI_FILTER_OP_CONTRAST,
|
GST_VAAPI_POSTPROC_FLAG_CONTRAST = 1 << GST_VAAPI_FILTER_OP_CONTRAST,
|
||||||
GST_VAAPI_POSTPROC_FLAG_DEINTERLACE = 1 << GST_VAAPI_FILTER_OP_DEINTERLACING,
|
GST_VAAPI_POSTPROC_FLAG_DEINTERLACE = 1 << GST_VAAPI_FILTER_OP_DEINTERLACING,
|
||||||
GST_VAAPI_POSTPROC_FLAG_SCALE = 1 << GST_VAAPI_FILTER_OP_SCALING,
|
GST_VAAPI_POSTPROC_FLAG_SCALE = 1 << GST_VAAPI_FILTER_OP_SCALING,
|
||||||
|
GST_VAAPI_POSTPROC_FLAG_SKINTONE = 1 << GST_VAAPI_FILTER_OP_SKINTONE,
|
||||||
|
|
||||||
/* Additional custom flags */
|
/* Additional custom flags */
|
||||||
GST_VAAPI_POSTPROC_FLAG_CUSTOM = 1 << 20,
|
GST_VAAPI_POSTPROC_FLAG_CUSTOM = 1 << 20,
|
||||||
|
@ -164,6 +166,8 @@ struct _GstVaapiPostproc
|
||||||
gfloat brightness;
|
gfloat brightness;
|
||||||
gfloat contrast;
|
gfloat contrast;
|
||||||
|
|
||||||
|
gboolean skintone_enhance;
|
||||||
|
|
||||||
guint get_va_surfaces:1;
|
guint get_va_surfaces:1;
|
||||||
guint has_vpp:1;
|
guint has_vpp:1;
|
||||||
guint use_vpp:1;
|
guint use_vpp:1;
|
||||||
|
|
Loading…
Reference in a new issue