summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao, Halley <halley.zhao@intel.com>2013-12-13 04:14:41 +0800
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2014-01-15 11:49:49 +0100
commit467bf95c0906098f848a7aa81416c3a16760dad8 (patch)
tree257799bf8faaf93755372b0c217b2d7db5dce19e
parentdb5465c2d6627766184c767adfc4f69e815366c9 (diff)
downloadgst-vaapi-467bf95c0906098f848a7aa81416c3a16760dad8.tar.gz
vaapipostproc: add support for colorbalance filters.
Add support for hue, saturation, brightness and constrat adjustments. Also fix cap info local copy to match the really expected cap subtype of interest. https://bugzilla.gnome.org/show_bug.cgi?id=720376 Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
-rwxr-xr-xgst-libs/gst/vaapi/gstvaapifilter.c8
-rw-r--r--gst/vaapi/gstvaapipostproc.c96
-rw-r--r--gst/vaapi/gstvaapipostproc.h6
3 files changed, 106 insertions, 4 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapifilter.c b/gst-libs/gst/vaapi/gstvaapifilter.c
index 68aeb8cb..c6e02fa0 100755
--- a/gst-libs/gst/vaapi/gstvaapifilter.c
+++ b/gst-libs/gst/vaapi/gstvaapifilter.c
@@ -483,14 +483,14 @@ op_data_ensure_caps(GstVaapiFilterOpData *op_data, gpointer filter_caps,
guint num_filter_caps)
{
guchar *filter_cap = filter_caps;
- guint i;
+ guint i, va_num_caps = num_filter_caps;
// Find the VA filter cap matching the op info sub-type
if (op_data->va_subtype) {
for (i = 0; i < num_filter_caps; i++) {
/* XXX: sub-type shall always be the first field */
if (op_data->va_subtype == *(guint *)filter_cap) {
- num_filter_caps = 1;
+ va_num_caps= 1;
break;
}
filter_cap += op_data->va_cap_size;
@@ -500,11 +500,11 @@ op_data_ensure_caps(GstVaapiFilterOpData *op_data, gpointer filter_caps,
}
op_data->va_caps = g_memdup(filter_cap,
- op_data->va_cap_size * num_filter_caps);
+ op_data->va_cap_size * va_num_caps);
if (!op_data->va_caps)
return FALSE;
- op_data->va_num_caps = num_filter_caps;
+ op_data->va_num_caps = va_num_caps;
return TRUE;
}
diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c
index ace0e614..21942523 100644
--- a/gst/vaapi/gstvaapipostproc.c
+++ b/gst/vaapi/gstvaapipostproc.c
@@ -105,6 +105,10 @@ enum {
PROP_DEINTERLACE_METHOD,
PROP_DENOISE,
PROP_SHARPEN,
+ PROP_HUE,
+ PROP_SATURATION,
+ PROP_BRIGHTNESS,
+ PROP_CONTRAST,
};
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
@@ -448,6 +452,26 @@ gst_vaapipostproc_process_vpp(GstBaseTransform *trans, GstBuffer *inbuf,
postproc->sharpen_level))
return GST_FLOW_NOT_SUPPORTED;
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_HUE) &&
+ !gst_vaapi_filter_set_hue(postproc->filter,
+ postproc->hue))
+ return GST_FLOW_NOT_SUPPORTED;
+
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SATURATION) &&
+ !gst_vaapi_filter_set_saturation(postproc->filter,
+ postproc->saturation))
+ return GST_FLOW_NOT_SUPPORTED;
+
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS) &&
+ !gst_vaapi_filter_set_brightness(postproc->filter,
+ postproc->brightness))
+ return GST_FLOW_NOT_SUPPORTED;
+
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_CONTRAST) &&
+ !gst_vaapi_filter_set_contrast(postproc->filter,
+ postproc->contrast))
+ return GST_FLOW_NOT_SUPPORTED;
+
inbuf_meta = gst_buffer_get_vaapi_video_meta(inbuf);
if (!inbuf_meta)
goto error_invalid_buffer;
@@ -1226,6 +1250,22 @@ gst_vaapipostproc_set_property(
postproc->sharpen_level = g_value_get_float(value);
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SHARPEN;
break;
+ case PROP_HUE:
+ postproc->hue = g_value_get_float(value);
+ postproc->flags |= GST_VAAPI_POSTPROC_FLAG_HUE;
+ break;
+ case PROP_SATURATION:
+ postproc->saturation = g_value_get_float(value);
+ postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SATURATION;
+ break;
+ case PROP_BRIGHTNESS:
+ postproc->brightness = g_value_get_float(value);
+ postproc->flags |= GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS;
+ break;
+ case PROP_CONTRAST:
+ postproc->contrast = g_value_get_float(value);
+ postproc->flags |= GST_VAAPI_POSTPROC_FLAG_CONTRAST;
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1267,6 +1307,18 @@ gst_vaapipostproc_get_property(
case PROP_SHARPEN:
g_value_set_float(value, postproc->sharpen_level);
break;
+ case PROP_HUE:
+ g_value_set_float(value, postproc->hue);
+ break;
+ case PROP_SATURATION:
+ g_value_set_float(value, postproc->saturation);
+ break;
+ case PROP_BRIGHTNESS:
+ g_value_set_float(value, postproc->brightness);
+ break;
+ case PROP_CONTRAST:
+ g_value_set_float(value, postproc->contrast);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1435,6 +1487,50 @@ gst_vaapipostproc_class_init(GstVaapiPostprocClass *klass)
g_object_class_install_property(object_class,
PROP_SHARPEN, filter_op->pspec);
+ /**
+ * GstVaapiPostproc:hue:
+ *
+ * The color hue, expressed as a float value. Range is -180.0 to
+ * 180.0. Default value is 0.0 and represents no modification.
+ */
+ filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_HUE);
+ if (filter_op)
+ g_object_class_install_property(object_class,
+ PROP_HUE, filter_op->pspec);
+
+ /**
+ * GstVaapiPostproc:saturation:
+ *
+ * The color saturation, expressed as a float value. Range is 0.0
+ * to 2.0. Default value is 1.0 and represents no modification.
+ */
+ filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_SATURATION);
+ if (filter_op)
+ g_object_class_install_property(object_class,
+ PROP_SATURATION, filter_op->pspec);
+
+ /**
+ * GstVaapiPostproc:brightness:
+ *
+ * The color brightness, expressed as a float value. Range is -1.0
+ * to 1.0. Default value is 0.0 and represents no modification.
+ */
+ filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_BRIGHTNESS);
+ if (filter_op)
+ g_object_class_install_property(object_class,
+ PROP_BRIGHTNESS, filter_op->pspec);
+
+ /**
+ * GstVaapiPostproc:contrast:
+ *
+ * The color contrast, expressed as a float value. Range is 0.0 to
+ * 2.0. Default value is 1.0 and represents no modification.
+ */
+ filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_CONTRAST);
+ if (filter_op)
+ g_object_class_install_property(object_class,
+ PROP_CONTRAST, filter_op->pspec);
+
g_ptr_array_unref(filter_ops);
}
diff --git a/gst/vaapi/gstvaapipostproc.h b/gst/vaapi/gstvaapipostproc.h
index 93b4495d..7159b533 100644
--- a/gst/vaapi/gstvaapipostproc.h
+++ b/gst/vaapi/gstvaapipostproc.h
@@ -160,6 +160,12 @@ struct _GstVaapiPostproc {
gfloat denoise_level;
gfloat sharpen_level;
+ /* Color balance filter values */
+ gfloat hue;
+ gfloat saturation;
+ gfloat brightness;
+ gfloat contrast;
+
guint is_raw_yuv : 1;
guint use_vpp : 1;
guint keep_aspect : 1;