display: add color balance properties.

Add support for hue, saturation, brightness and contrast attributes.
This commit is contained in:
Gwenole Beauchesne 2012-08-28 13:59:50 +02:00
parent 4dad571526
commit fafcf0e13c
2 changed files with 173 additions and 0 deletions

View file

@ -65,6 +65,10 @@ enum {
PROP_HEIGHT,
PROP_RENDER_MODE,
PROP_ROTATION,
PROP_HUE,
PROP_SATURATION,
PROP_BRIGHTNESS,
PROP_CONTRAST,
N_PROPERTIES
};
@ -79,6 +83,12 @@ get_attribute(GstVaapiDisplay *display, VADisplayAttribType type, gint *value);
static gboolean
set_attribute(GstVaapiDisplay *display, VADisplayAttribType type, gint value);
static gboolean
get_color_balance(GstVaapiDisplay *display, guint prop_id, gfloat *v);
static gboolean
set_color_balance(GstVaapiDisplay *display, guint prop_id, gfloat v);
static inline GstVaapiDisplayCache *
get_display_cache(void)
{
@ -361,6 +371,12 @@ find_property_by_type(GArray *properties, VADisplayAttribType type)
}
#endif
static inline const GstVaapiProperty *
find_property_by_pspec(GstVaapiDisplay *display, GParamSpec *pspec)
{
return find_property(display->priv->properties, pspec->name);
}
static void
gst_vaapi_display_calculate_pixel_aspect_ratio(GstVaapiDisplay *display)
{
@ -608,6 +624,18 @@ gst_vaapi_display_create(GstVaapiDisplay *display)
case VADisplayAttribRotation:
prop.name = GST_VAAPI_DISPLAY_PROP_ROTATION;
break;
case VADisplayAttribHue:
prop.name = GST_VAAPI_DISPLAY_PROP_HUE;
break;
case VADisplayAttribSaturation:
prop.name = GST_VAAPI_DISPLAY_PROP_SATURATION;
break;
case VADisplayAttribBrightness:
prop.name = GST_VAAPI_DISPLAY_PROP_BRIGHTNESS;
break;
case VADisplayAttribContrast:
prop.name = GST_VAAPI_DISPLAY_PROP_CONTRAST;
break;
default:
prop.name = NULL;
break;
@ -732,6 +760,12 @@ gst_vaapi_display_set_property(
case PROP_ROTATION:
gst_vaapi_display_set_rotation(display, g_value_get_enum(value));
break;
case PROP_HUE:
case PROP_SATURATION:
case PROP_BRIGHTNESS:
case PROP_CONTRAST:
set_color_balance(display, prop_id, g_value_get_float(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@ -771,6 +805,16 @@ gst_vaapi_display_get_property(
case PROP_ROTATION:
g_value_set_enum(value, gst_vaapi_display_get_rotation(display));
break;
case PROP_HUE:
case PROP_SATURATION:
case PROP_BRIGHTNESS:
case PROP_CONTRAST: {
gfloat v;
if (!get_color_balance(display, prop_id, &v))
v = G_PARAM_SPEC_FLOAT(pspec)->default_value;
g_value_set_float(value, v);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@ -864,6 +908,58 @@ gst_vaapi_display_class_init(GstVaapiDisplayClass *klass)
DEFAULT_ROTATION,
G_PARAM_READWRITE);
/**
* GstVaapiDisplay:hue:
*
* The VA display hue, expressed as a float value. Range is -180.0
* to 180.0. Default value is 0.0 and represents no modification.
*/
g_properties[PROP_HUE] =
g_param_spec_float(GST_VAAPI_DISPLAY_PROP_HUE,
"hue",
"The display hue value",
-180.0, 180.0, 0.0,
G_PARAM_READWRITE);
/**
* GstVaapiDisplay:saturation:
*
* The VA display saturation, expressed as a float value. Range is
* 0.0 to 2.0. Default value is 1.0 and represents no modification.
*/
g_properties[PROP_SATURATION] =
g_param_spec_float(GST_VAAPI_DISPLAY_PROP_SATURATION,
"saturation",
"The display saturation value",
0.0, 2.0, 1.0,
G_PARAM_READWRITE);
/**
* GstVaapiDisplay:brightness:
*
* The VA display brightness, expressed as a float value. Range is
* -1.0 to 1.0. Default value is 0.0 and represents no modification.
*/
g_properties[PROP_BRIGHTNESS] =
g_param_spec_float(GST_VAAPI_DISPLAY_PROP_BRIGHTNESS,
"brightness",
"The display brightness value",
-1.0, 1.0, 0.0,
G_PARAM_READWRITE);
/**
* GstVaapiDisplay:contrast:
*
* The VA display contrast, expressed as a float value. Range is
* 0.0 to 2.0. Default value is 1.0 and represents no modification.
*/
g_properties[PROP_CONTRAST] =
g_param_spec_float(GST_VAAPI_DISPLAY_PROP_CONTRAST,
"contrast",
"The display contrast value",
0.0, 2.0, 1.0,
G_PARAM_READWRITE);
g_object_class_install_properties(object_class, N_PROPERTIES, g_properties);
}
@ -1539,3 +1635,72 @@ gst_vaapi_display_set_rotation(
g_object_notify_by_pspec(G_OBJECT(display), g_properties[PROP_ROTATION]);
return TRUE;
}
/* Get color balance attributes */
static gboolean
get_color_balance(GstVaapiDisplay *display, guint prop_id, gfloat *v)
{
GParamSpecFloat * const pspec = G_PARAM_SPEC_FLOAT(g_properties[prop_id]);
const GstVaapiProperty *prop;
const VADisplayAttribute *attr;
gfloat out_value;
gint value;
if (!pspec)
return FALSE;
prop = find_property_by_pspec(display, &pspec->parent_instance);
if (!prop)
return FALSE;
attr = &prop->attribute;
if (!get_attribute(display, attr->type, &value))
return FALSE;
/* Scale wrt. the medium ("default") value */
out_value = pspec->default_value;
if (value > attr->value)
out_value += ((gfloat)(value - attr->value) /
(attr->max_value - attr->value) *
(pspec->maximum - pspec->default_value));
else if (value < attr->value)
out_value -= ((gfloat)(attr->value - value) /
(attr->value - attr->min_value) *
(pspec->default_value - pspec->minimum));
*v = out_value;
return TRUE;
}
/* Set color balance attribute */
static gboolean
set_color_balance(GstVaapiDisplay *display, guint prop_id, gfloat v)
{
GParamSpecFloat * const pspec = G_PARAM_SPEC_FLOAT(g_properties[prop_id]);
const GstVaapiProperty *prop;
const VADisplayAttribute *attr;
gint value;
if (!pspec)
return FALSE;
prop = find_property_by_pspec(display, &pspec->parent_instance);
if (!prop)
return FALSE;
attr = &prop->attribute;
/* Scale wrt. the medium ("default") value */
value = attr->value;
if (v > pspec->default_value)
value += ((v - pspec->default_value) /
(pspec->maximum - pspec->default_value) *
(attr->max_value - attr->value));
else if (v < pspec->default_value)
value -= ((pspec->default_value - v) /
(pspec->default_value - pspec->minimum) *
(attr->value - attr->min_value));
if (!set_attribute(display, attr->type, value))
return FALSE;
g_object_notify_by_pspec(G_OBJECT(display), g_properties[prop_id]);
return TRUE;
}

View file

@ -100,9 +100,17 @@ struct _GstVaapiDisplayInfo {
* GstVaapiDisplayProperties:
* @GST_VAAPI_DISPLAY_PROP_RENDER_MODE: rendering mode (#GstVaapiRenderMode).
* @GST_VAAPI_DISPLAY_PROP_ROTATION: rotation angle (#GstVaapiRotation).
* @GST_VAAPI_DISPLAY_PROP_HUE: hue (float: [-180 ; 180], default: 0).
* @GST_VAAPI_DISPLAY_PROP_SATURATION: saturation (float: [0 ; 2], default: 1).
* @GST_VAAPI_DISPLAY_PROP_BRIGHTNESS: brightness (float: [-1 ; 1], default: 0).
* @GST_VAAPI_DISPLAY_PROP_CONTRAST: contrast (float: [0 ; 2], default: 1).
*/
#define GST_VAAPI_DISPLAY_PROP_RENDER_MODE "render-mode"
#define GST_VAAPI_DISPLAY_PROP_ROTATION "rotation"
#define GST_VAAPI_DISPLAY_PROP_HUE "hue"
#define GST_VAAPI_DISPLAY_PROP_SATURATION "saturation"
#define GST_VAAPI_DISPLAY_PROP_BRIGHTNESS "brightness"
#define GST_VAAPI_DISPLAY_PROP_CONTRAST "contrast"
/**
* GstVaapiDisplay: