#define SATURATION_MAX 10.0F
#define SATURATION_DEFAULT 1.0F
-#define EPSILON 0.00001F
-
typedef struct ProcampVAAPIContext {
VAAPIVPPContext vpp_ctx; // must be the first field
return (float)output;
}
-static int fequal(float a, float b)
-{
- return fabs(a-b) < EPSILON;
-}
-
static int procamp_vaapi_build_filter_params(AVFilterContext *avctx)
{
VAAPIVPPContext *vpp_ctx = avctx->priv;
return AVERROR(EIO);
}
- if (!fequal(ctx->bright, BRIGHTNESS_DEFAULT)) {
- procamp_params[i].type = VAProcFilterColorBalance;
- procamp_params[i].attrib = VAProcColorBalanceBrightness;
- procamp_params[i].value = map(ctx->bright, BRIGHTNESS_MIN, BRIGHTNESS_MAX,
- procamp_caps[VAProcColorBalanceBrightness-1].range.min_value,
- procamp_caps[VAProcColorBalanceBrightness-1].range.max_value);
- i++;
- }
-
- if (!fequal(ctx->contrast, CONTRAST_DEFAULT)) {
- procamp_params[i].type = VAProcFilterColorBalance;
- procamp_params[i].attrib = VAProcColorBalanceContrast;
- procamp_params[i].value = map(ctx->contrast, CONTRAST_MIN, CONTRAST_MAX,
- procamp_caps[VAProcColorBalanceContrast-1].range.min_value,
- procamp_caps[VAProcColorBalanceContrast-1].range.max_value);
- i++;
- }
-
- if (!fequal(ctx->hue, HUE_DEFAULT)) {
- procamp_params[i].type = VAProcFilterColorBalance;
- procamp_params[i].attrib = VAProcColorBalanceHue;
- procamp_params[i].value = map(ctx->hue, HUE_MIN, HUE_MAX,
- procamp_caps[VAProcColorBalanceHue-1].range.min_value,
- procamp_caps[VAProcColorBalanceHue-1].range.max_value);
- i++;
- }
-
- if (!fequal(ctx->saturation, SATURATION_DEFAULT)) {
- procamp_params[i].type = VAProcFilterColorBalance;
- procamp_params[i].attrib = VAProcColorBalanceSaturation;
- procamp_params[i].value = map(ctx->saturation, SATURATION_MIN, SATURATION_MAX,
- procamp_caps[VAProcColorBalanceSaturation-1].range.min_value,
- procamp_caps[VAProcColorBalanceSaturation-1].range.max_value);
- i++;
- }
+ /* brightness */
+ procamp_params[i].type = VAProcFilterColorBalance;
+ procamp_params[i].attrib = VAProcColorBalanceBrightness;
+ procamp_params[i].value = map(ctx->bright, BRIGHTNESS_MIN, BRIGHTNESS_MAX,
+ procamp_caps[VAProcColorBalanceBrightness-1].range.min_value,
+ procamp_caps[VAProcColorBalanceBrightness-1].range.max_value);
+ i++;
+
+ /* contrast */
+ procamp_params[i].type = VAProcFilterColorBalance;
+ procamp_params[i].attrib = VAProcColorBalanceContrast;
+ procamp_params[i].value = map(ctx->contrast, CONTRAST_MIN, CONTRAST_MAX,
+ procamp_caps[VAProcColorBalanceContrast-1].range.min_value,
+ procamp_caps[VAProcColorBalanceContrast-1].range.max_value);
+ i++;
+
+ /* hue */
+ procamp_params[i].type = VAProcFilterColorBalance;
+ procamp_params[i].attrib = VAProcColorBalanceHue;
+ procamp_params[i].value = map(ctx->hue, HUE_MIN, HUE_MAX,
+ procamp_caps[VAProcColorBalanceHue-1].range.min_value,
+ procamp_caps[VAProcColorBalanceHue-1].range.max_value);
+ i++;
+
+ /* saturation */
+ procamp_params[i].type = VAProcFilterColorBalance;
+ procamp_params[i].attrib = VAProcColorBalanceSaturation;
+ procamp_params[i].value = map(ctx->saturation, SATURATION_MIN, SATURATION_MAX,
+ procamp_caps[VAProcColorBalanceSaturation-1].range.min_value,
+ procamp_caps[VAProcColorBalanceSaturation-1].range.max_value);
+ i++;
return ff_vaapi_vpp_make_param_buffers(avctx,
VAProcFilterParameterBufferType,
AVFilterLink *outlink = avctx->outputs[0];
VAAPIVPPContext *vpp_ctx = avctx->priv;
AVFrame *output_frame = NULL;
- VASurfaceID input_surface, output_surface;
VAProcPipelineParameterBuffer params;
- VARectangle input_region;
int err;
av_log(avctx, AV_LOG_DEBUG, "Filter input: %s, %ux%u (%"PRId64").\n",
if (vpp_ctx->va_context == VA_INVALID_ID)
return AVERROR(EINVAL);
- input_surface = (VASurfaceID)(uintptr_t)input_frame->data[3];
- av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for procamp input.\n",
- input_surface);
-
output_frame = ff_get_video_buffer(outlink, vpp_ctx->output_width,
vpp_ctx->output_height);
if (!output_frame) {
goto fail;
}
- output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3];
- av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for procamp output.\n",
- output_surface);
- memset(¶ms, 0, sizeof(params));
- input_region = (VARectangle) {
- .x = 0,
- .y = 0,
- .width = input_frame->width,
- .height = input_frame->height,
- };
-
- params.surface = input_surface;
- params.surface_region = &input_region;
- params.surface_color_standard =
- ff_vaapi_vpp_colour_standard(input_frame->colorspace);
-
- params.output_region = NULL;
- params.output_background_color = 0xff000000;
- params.output_color_standard = params.surface_color_standard;
-
- params.pipeline_flags = 0;
- params.filter_flags = VA_FRAME_PICTURE;
+ err = av_frame_copy_props(output_frame, input_frame);
+ if (err < 0)
+ goto fail;
+
+ err = ff_vaapi_vpp_init_params(avctx, ¶ms,
+ input_frame, output_frame);
+ if (err < 0)
+ goto fail;
params.filters = &vpp_ctx->filter_buffers[0];
params.num_filters = 1;
- err = ff_vaapi_vpp_render_picture(avctx, ¶ms, output_surface);
+ err = ff_vaapi_vpp_render_picture(avctx, ¶ms, output_frame);
if (err < 0)
goto fail;
- err = av_frame_copy_props(output_frame, input_frame);
- if (err < 0)
- goto fail;
av_frame_free(&input_frame);
av_log(avctx, AV_LOG_DEBUG, "Filter output: %s, %ux%u (%"PRId64").\n",
}
#define OFFSET(x) offsetof(ProcampVAAPIContext, x)
-#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM)
+#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
static const AVOption procamp_vaapi_options[] = {
{ "b", "Output video brightness",
OFFSET(bright), AV_OPT_TYPE_FLOAT, { .dbl = BRIGHTNESS_DEFAULT }, BRIGHTNESS_MIN, BRIGHTNESS_MAX, .flags = FLAGS },