summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2014-10-29 17:30:30 +0100
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2014-10-29 17:33:48 +0100
commiteeb43989c1cf92aa3bd88e330ecea95bb8ab3319 (patch)
treed89594a5d5852b1b697c094972b164126d7244f9 /gst
parent3656659d1c91f6c7e8c5ccfc1f9ae3be84aaa51c (diff)
vaapipostproc: allow user defined scaling mode.
Add new "scale-method" property to expose the scaling mode to use during video processing. Note that this is only a hint, and the actual behaviour may differ from implementation (VA driver) to implementation.
Diffstat (limited to 'gst')
-rw-r--r--gst/vaapi/gstvaapipostproc.c24
-rw-r--r--gst/vaapi/gstvaapipostproc.h3
2 files changed, 27 insertions, 0 deletions
diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c
index fa6ffe5d..bcddea6e 100644
--- a/gst/vaapi/gstvaapipostproc.c
+++ b/gst/vaapi/gstvaapipostproc.c
@@ -122,6 +122,7 @@ enum {
PROP_SATURATION,
PROP_BRIGHTNESS,
PROP_CONTRAST,
+ PROP_SCALE_METHOD,
};
#define DEFAULT_FORMAT GST_VIDEO_FORMAT_ENCODED
@@ -559,6 +560,11 @@ gst_vaapipostproc_process_vpp(GstBaseTransform *trans, GstBuffer *inbuf,
postproc->contrast))
return GST_FLOW_NOT_SUPPORTED;
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SCALE) &&
+ !gst_vaapi_filter_set_scaling(postproc->filter,
+ postproc->scale_method))
+ return GST_FLOW_NOT_SUPPORTED;
+
inbuf_meta = gst_buffer_get_vaapi_video_meta(inbuf);
if (!inbuf_meta)
goto error_invalid_buffer;
@@ -1439,6 +1445,10 @@ gst_vaapipostproc_set_property(
postproc->contrast = g_value_get_float(value);
postproc->flags |= GST_VAAPI_POSTPROC_FLAG_CONTRAST;
break;
+ case PROP_SCALE_METHOD:
+ postproc->scale_method = g_value_get_enum(value);
+ postproc->flags |= GST_VAAPI_POSTPROC_FLAG_SCALE;
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1492,6 +1502,9 @@ gst_vaapipostproc_get_property(
case PROP_CONTRAST:
g_value_set_float(value, postproc->contrast);
break;
+ case PROP_SCALE_METHOD:
+ g_value_set_enum(value, postproc->scale_method);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1705,6 +1718,17 @@ gst_vaapipostproc_class_init(GstVaapiPostprocClass *klass)
g_object_class_install_property(object_class,
PROP_CONTRAST, filter_op->pspec);
+ /**
+ * GstVaapiPostproc:scale-method:
+ *
+ * The scaling method to use, expressed as an enum value. See
+ * #GstVaapiScaleMethod.
+ */
+ filter_op = find_filter_op(filter_ops, GST_VAAPI_FILTER_OP_SCALING);
+ if (filter_op)
+ g_object_class_install_property(object_class,
+ PROP_SCALE_METHOD, filter_op->pspec);
+
g_ptr_array_unref(filter_ops);
}
diff --git a/gst/vaapi/gstvaapipostproc.h b/gst/vaapi/gstvaapipostproc.h
index c27b29a1..af6fdf9d 100644
--- a/gst/vaapi/gstvaapipostproc.h
+++ b/gst/vaapi/gstvaapipostproc.h
@@ -93,6 +93,7 @@ typedef enum {
* @GST_VAAPI_POSTPROC_FLAG_CONTRAST: Change contrast.
* @GST_VAAPI_POSTPROC_FLAG_DEINTERLACE: Deinterlacing.
* @GST_VAAPI_POSTPROC_FLAG_SIZE: Video scaling.
+ * @GST_VAAPI_POSTPROC_FLAG_SCALE: Video scaling mode.
*
* The set of operations that are to be performed for each frame.
*/
@@ -105,6 +106,7 @@ typedef enum {
GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS = 1 << GST_VAAPI_FILTER_OP_BRIGHTNESS,
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_SCALE = 1 << GST_VAAPI_FILTER_OP_SCALING,
/* Additional custom flags */
GST_VAAPI_POSTPROC_FLAG_CUSTOM = 1 << 20,
@@ -162,6 +164,7 @@ struct _GstVaapiPostproc {
gfloat sharpen_level;
/* Color balance filter values */
+ GstVaapiScaleMethod scale_method;
gfloat hue;
gfloat saturation;
gfloat brightness;