summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyunjun Ko <zzoon@igalia.com>2016-07-22 11:51:26 +0900
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>2016-07-22 12:08:20 +0200
commitcc6df605a1056082fb3bfea5992081b4cf2f57a7 (patch)
tree153ddc395e36a6929a27f43fb009ed2307a1f218
parentd9ef88230f3aaf17a6e6556fa4a116c3a3423a1d (diff)
vaapipostproc: checking and updating filter parameter only when it's set
This patch is to avoid checking filter value at every frame. https://bugzilla.gnome.org/show_bug.cgi?id=751876
-rw-r--r--gst-libs/gst/vaapi/gstvaapifilter.c81
-rw-r--r--gst-libs/gst/vaapi/gstvaapifilter.h23
-rw-r--r--gst/vaapi/gstvaapipostproc.c153
3 files changed, 217 insertions, 40 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapifilter.c b/gst-libs/gst/vaapi/gstvaapifilter.c
index e2f269c6..6eb74460 100644
--- a/gst-libs/gst/vaapi/gstvaapifilter.c
+++ b/gst-libs/gst/vaapi/gstvaapifilter.c
@@ -1877,3 +1877,84 @@ gst_vaapi_filter_set_skintone (GstVaapiFilter * filter, gboolean enhance)
return op_set_skintone (filter,
find_operation (filter, GST_VAAPI_FILTER_OP_SKINTONE), enhance);
}
+
+static inline gfloat
+op_get_float_default_value (GstVaapiFilter * filter,
+ GstVaapiFilterOpData * op_data)
+{
+#if USE_VA_VPP
+ GParamSpecFloat *const pspec = G_PARAM_SPEC_FLOAT (op_data->pspec);
+ return pspec->default_value;
+#endif
+ return 0.0;
+}
+
+gfloat
+gst_vaapi_filter_get_denoising_level_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_DENOISE));
+}
+
+gfloat
+gst_vaapi_filter_get_sharpening_level_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_SHARPEN));
+}
+
+gfloat
+gst_vaapi_filter_get_hue_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_HUE));
+}
+
+gfloat
+gst_vaapi_filter_get_saturation_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_SATURATION));
+}
+
+gfloat
+gst_vaapi_filter_get_brightness_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_BRIGHTNESS));
+}
+
+gfloat
+gst_vaapi_filter_get_contrast_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return op_get_float_default_value (filter,
+ find_operation (filter, GST_VAAPI_FILTER_OP_CONTRAST));
+}
+
+GstVaapiScaleMethod
+gst_vaapi_filter_get_scaling_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return DEFAULT_SCALING;
+}
+
+gboolean
+gst_vaapi_filter_get_skintone_default (GstVaapiFilter * filter)
+{
+ g_return_val_if_fail (filter != NULL, FALSE);
+
+ return FALSE;
+}
diff --git a/gst-libs/gst/vaapi/gstvaapifilter.h b/gst-libs/gst/vaapi/gstvaapifilter.h
index 6364803c..667dd698 100644
--- a/gst-libs/gst/vaapi/gstvaapifilter.h
+++ b/gst-libs/gst/vaapi/gstvaapifilter.h
@@ -246,4 +246,27 @@ gboolean
gst_vaapi_filter_set_skintone (GstVaapiFilter * filter,
gboolean enhance);
+gfloat
+gst_vaapi_filter_get_denoising_level_default (GstVaapiFilter * filter);
+
+gfloat
+gst_vaapi_filter_get_sharpening_level_default (GstVaapiFilter * filter);
+
+gfloat
+gst_vaapi_filter_get_hue_default (GstVaapiFilter * filter);
+
+gfloat
+gst_vaapi_filter_get_saturation_default (GstVaapiFilter * filter);
+
+gfloat
+gst_vaapi_filter_get_brightness_default (GstVaapiFilter * filter);
+
+gfloat
+gst_vaapi_filter_get_contrast_default (GstVaapiFilter * filter);
+
+GstVaapiScaleMethod
+gst_vaapi_filter_get_scaling_default (GstVaapiFilter * filter);
+
+gboolean
+gst_vaapi_filter_get_skintone_default (GstVaapiFilter * filter);
#endif /* GST_VAAPI_FILTER_H */
diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c
index 43e6582d..19aca684 100644
--- a/gst/vaapi/gstvaapipostproc.c
+++ b/gst/vaapi/gstvaapipostproc.c
@@ -469,6 +469,113 @@ set_best_deint_method (GstVaapiPostproc * postproc, guint flags,
return success;
}
+static gboolean
+check_filter_update (GstVaapiPostproc * postproc)
+{
+ guint filter_flag = postproc->flags;
+ guint op_flag;
+ gint i;
+
+ if (!postproc->has_vpp)
+ return FALSE;
+
+ for (i = GST_VAAPI_FILTER_OP_DENOISE; i <= GST_VAAPI_FILTER_OP_SKINTONE; i++) {
+ op_flag = (filter_flag >> i) & 1;
+ if (op_flag)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+update_filter (GstVaapiPostproc * postproc)
+{
+ /* Validate filters */
+ if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_FORMAT) &&
+ !gst_vaapi_filter_set_format (postproc->filter, postproc->format))
+ return FALSE;
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_DENOISE) {
+ if (!gst_vaapi_filter_set_denoising_level (postproc->filter,
+ postproc->denoise_level))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_denoising_level_default (postproc->filter) ==
+ postproc->denoise_level)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_DENOISE);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_SHARPEN) {
+ if (!gst_vaapi_filter_set_sharpening_level (postproc->filter,
+ postproc->sharpen_level))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_sharpening_level_default (postproc->filter) ==
+ postproc->sharpen_level)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_SHARPEN);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_HUE) {
+ if (!gst_vaapi_filter_set_hue (postproc->filter, postproc->hue))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_hue_default (postproc->filter) == postproc->hue)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_HUE);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_SATURATION) {
+ if (!gst_vaapi_filter_set_saturation (postproc->filter,
+ postproc->saturation))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_saturation_default (postproc->filter) ==
+ postproc->saturation)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_SATURATION);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS) {
+ if (!gst_vaapi_filter_set_brightness (postproc->filter,
+ postproc->brightness))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_brightness_default (postproc->filter) ==
+ postproc->brightness)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_BRIGHTNESS);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_CONTRAST) {
+ if (!gst_vaapi_filter_set_contrast (postproc->filter, postproc->contrast))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_contrast_default (postproc->filter) ==
+ postproc->contrast)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_CONTRAST);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_SCALE) {
+ if (!gst_vaapi_filter_set_scaling (postproc->filter,
+ postproc->scale_method))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_scaling_default (postproc->filter) ==
+ postproc->scale_method)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_SCALE);
+ }
+
+ if (postproc->flags & GST_VAAPI_POSTPROC_FLAG_SKINTONE) {
+ if (!gst_vaapi_filter_set_skintone (postproc->filter,
+ postproc->skintone_enhance))
+ return FALSE;
+
+ if (gst_vaapi_filter_get_skintone_default (postproc->filter) ==
+ postproc->skintone_enhance)
+ postproc->flags &= ~(GST_VAAPI_POSTPROC_FLAG_SKINTONE);
+ }
+
+ return TRUE;
+}
+
static GstFlowReturn
gst_vaapipostproc_process_vpp (GstBaseTransform * trans, GstBuffer * inbuf,
GstBuffer * outbuf)
@@ -489,46 +596,6 @@ gst_vaapipostproc_process_vpp (GstBaseTransform * trans, GstBuffer * inbuf,
GstVaapiRectangle *crop_rect = NULL;
GstVaapiRectangle tmp_rect;
- /* Validate filters */
- if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_FORMAT) &&
- !gst_vaapi_filter_set_format (postproc->filter, postproc->format))
- return GST_FLOW_NOT_SUPPORTED;
-
- if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_DENOISE) &&
- !gst_vaapi_filter_set_denoising_level (postproc->filter,
- postproc->denoise_level))
- return GST_FLOW_NOT_SUPPORTED;
-
- if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SHARPEN) &&
- !gst_vaapi_filter_set_sharpening_level (postproc->filter,
- 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;
-
- if ((postproc->flags & GST_VAAPI_POSTPROC_FLAG_SCALE) &&
- !gst_vaapi_filter_set_scaling (postproc->filter, postproc->scale_method))
- 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);
if (!inbuf_meta)
goto error_invalid_buffer;
@@ -1214,6 +1281,9 @@ gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
if (!ensure_srcpad_buffer_pool (postproc, out_caps))
goto done;
+ if (check_filter_update (postproc))
+ update_filter (postproc);
+
ret = TRUE;
done:
@@ -1364,6 +1434,9 @@ gst_vaapipostproc_set_property (GObject * object,
break;
}
g_mutex_unlock (&postproc->postproc_lock);
+
+ if (check_filter_update (postproc))
+ update_filter (postproc);
}
static void