From patchwork Tue Aug 30 07:02:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 332 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp2098422vsd; Tue, 30 Aug 2016 01:07:05 -0700 (PDT) X-Received: by 10.28.173.205 with SMTP id w196mr2591466wme.86.1472544424664; Tue, 30 Aug 2016 01:07:04 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 127si3331231wmt.49.2016.08.30.01.07.01; Tue, 30 Aug 2016 01:07:04 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D04A1689BDC; Tue, 30 Aug 2016 11:06:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f171.google.com (mail-pf0-f171.google.com [209.85.192.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9AB396898E8 for ; Tue, 30 Aug 2016 10:07:22 +0300 (EEST) Received: by mail-pf0-f171.google.com with SMTP id h186so4886335pfg.3 for ; Tue, 30 Aug 2016 00:07:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=to:from:subject:message-id:date:user-agent:mime-version; bh=WDtfPe6Gd3uqKv3Kkj8iG86V4fcHSGY19pPPie6MJE4=; b=Xrq5tMf7Rw/dHHUP7iVL/A5XxcmGgBctLzbJHIoLfyE19Z6OS+me5C/H2Bb4Cub7lE tc0aRrDHrl844hw7MJfc5GmIPqwm+FJpLjidRK56pSIHLDliJj9Zozso3ncD6cCYlQR/ u/8h0Wyw73BOsxvVLVhX6IlUXgRgctcDMuqQYesIZfEED1hJ0lr8Daz9GqAW0KAMtY11 OyVWNvLsGCKvVKNtDA8kZP3HT6GjEFKvdRv9pQsjCuIgcObghmi7dWznPwIlDzszPEUT CvDNWAGtKMDnIJtdtKrQXywmwTPNfg5/PWidkM3sBwW5QdMIwn4R6ziMgl7e+hHtSdzE cODQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version; bh=WDtfPe6Gd3uqKv3Kkj8iG86V4fcHSGY19pPPie6MJE4=; b=j8m6PHDAI+ph/QWlyqIcot6T8WycxXC3tMQF8UEjdlQ2KTcHcebxQ+SNr0KPG2rFMV IsE/zP1FKSipdqUkFFsUD1ObEa6vUT6BS3lK5Os5uTO3ONr2SalMP0J8R7xQYelaZu58 VjHQ97tHinYThiRlOLx7FEr45VsHgWMy5pJUClX4s2oc+vlis5INaKfgF1dVOtIPB3Lu ExT4SjtjM1/IErm2E+M8lA4E0woTFFOdGnBKi2dJf2EY5OtGhy2iAn4sdX7cx+UmrKh4 5udAwpsrBtrJ/WI2J62mYXD8qfw++FaicrlY5iKzRxny4V4FUKHxaDRwD4okwAGSAK65 8y0g== X-Gm-Message-State: AE9vXwP9WqiNeIHIZn/F/jKpkRcJ6Uf5e3Z8VpXvibjW1exNe4F8El4gxubp20yITcEvNA== X-Received: by 10.98.25.8 with SMTP id 8mr3560473pfz.94.1472540538934; Tue, 30 Aug 2016 00:02:18 -0700 (PDT) Received: from [10.239.204.48] (fmdmzpr04-ext.fm.intel.com. [192.55.55.39]) by smtp.gmail.com with ESMTPSA id zk7sm54077641pac.41.2016.08.30.00.02.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Aug 2016 00:02:18 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org, sw@jkqxz.net, jun.zhao@intel.com From: Jun Zhao Message-ID: <70dd02fd-0118-e43f-db70-19c56646f211@gmail.com> Date: Tue, 30 Aug 2016 15:02:14 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Disposition: attachment; filename*0="0001-lavf-scale_vaapi-add-denoise-sharpless-support.patch" X-Content-Filtered-By: Mailman/MimeDel 2.1.20 Subject: [FFmpeg-devel] lavf : scale_vaapi : add denoise/sharpless support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From 78421d6b3a4da21dc1e7793777946cf057fc6cfe Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Tue, 30 Aug 2016 14:36:00 +0800 Subject: [PATCH] lavf : scale_vaapi : add denoise/sharpless support. add denoise/sharpless support, used scope [-1, 100] as the input scope. Signed-off-by: Jun Zhao --- libavfilter/vf_scale_vaapi.c | 115 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/libavfilter/vf_scale_vaapi.c b/libavfilter/vf_scale_vaapi.c index 8dd5acf..06bb128 100644 --- a/libavfilter/vf_scale_vaapi.c +++ b/libavfilter/vf_scale_vaapi.c @@ -53,6 +53,16 @@ typedef struct ScaleVAAPIContext { int output_width; int output_height; + VAProcFilterCap denoise_caps; + int support_denoise; + int denoise; // enable denoise algo. level is the optional + // value from the interval [-1, 100], -1 means disabled + + VAProcFilterCap sharpless_caps; + int support_sharpless; + int sharpless; // enable sharpless. level is the optional value + // from the interval [-1, 100], -1 means disabled + } ScaleVAAPIContext; @@ -117,6 +127,8 @@ static int scale_vaapi_config_output(AVFilterLink *outlink) AVVAAPIFramesContext *va_frames; VAStatus vas; int err, i; + unsigned int num_denoise_caps = 1; + unsigned int num_sharpless_caps = 1; scale_vaapi_pipeline_uninit(ctx); @@ -225,6 +237,29 @@ static int scale_vaapi_config_output(AVFilterLink *outlink) goto fail; } + vas = vaQueryVideoProcFilterCaps(ctx->hwctx->display, ctx->va_context, + VAProcFilterNoiseReduction, + &ctx->denoise_caps, &num_denoise_caps); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_WARNING, "Failed to query denoise caps " + "context: %d (%s).\n", vas, vaErrorStr(vas)); + ctx->support_denoise = -1; + } else { + ctx->support_denoise = 1; + } + + vas = vaQueryVideoProcFilterCaps(ctx->hwctx->display, ctx->va_context, + VAProcFilterSharpening, + &ctx->sharpless_caps, &num_sharpless_caps); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_WARNING, "Failed to query sharpless caps " + "context: %d (%s).\n", vas, vaErrorStr(vas)); + ctx->support_sharpless = -1; + } else { + ctx->support_sharpless = 1; + } + + av_freep(&hwconfig); av_hwframe_constraints_free(&constraints); return 0; @@ -250,6 +285,14 @@ static int vaapi_proc_colour_standard(enum AVColorSpace av_cs) } } +static float map_to_range( + int input, int in_min, int in_max, + float out_min, float out_max) +{ + return (input - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + + static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) { AVFilterContext *avctx = inlink->dst; @@ -259,6 +302,10 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) VASurfaceID input_surface, output_surface; VAProcPipelineParameterBuffer params; VABufferID params_id; + VABufferID denoise_id; + VABufferID sharpless_id; + VABufferID filter_bufs[8]; + int num_filter_bufs = 0; VAStatus vas; int err; @@ -290,6 +337,43 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) av_log(ctx, AV_LOG_DEBUG, "Using surface %#x for scale output.\n", output_surface); + if (ctx->denoise != -1 && ctx->support_denoise) { + VAProcFilterParameterBuffer denoise; + denoise.type = VAProcFilterNoiseReduction; + denoise.value = map_to_range(ctx->denoise, 0, 100, + ctx->denoise_caps.range.min_value, + ctx->denoise_caps.range.max_value); + vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, + VAProcFilterParameterBufferType, sizeof(denoise), 1, + &denoise, &denoise_id); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_ERROR, "Failed to create denoise parameter buffer: " + "%d (%s).\n", vas, vaErrorStr(vas)); + err = AVERROR(EIO); + goto fail; + } + filter_bufs[num_filter_bufs++] = denoise_id; + } + + if (ctx->sharpless != -1 && ctx->support_sharpless) { + VAProcFilterParameterBuffer sharpless; + sharpless.type = VAProcFilterSharpening; + sharpless.value = map_to_range(ctx->sharpless, + ctx->sharpless_caps.range.min_value, + ctx->sharpless_caps.range.max_value, + 0, 100); + vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, + VAProcFilterParameterBufferType, sizeof(sharpless), 1, + &sharpless, &sharpless_id); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_ERROR, "Failed to create sharpless parameter buffer: " + "%d (%s).\n", vas, vaErrorStr(vas)); + err = AVERROR(EIO); + goto fail; + } + filter_bufs[num_filter_bufs++] = sharpless_id; + } + memset(¶ms, 0, sizeof(params)); params.surface = input_surface; @@ -304,6 +388,11 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) params.pipeline_flags = 0; params.filter_flags = VA_FILTER_SCALING_HQ; + if (num_filter_bufs) { + params.filters = filter_bufs; + params.num_filters = num_filter_bufs; + } + vas = vaBeginPicture(ctx->hwctx->display, ctx->va_context, output_surface); if (vas != VA_STATUS_SUCCESS) { @@ -351,6 +440,28 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) goto fail; } + // This doesn't get freed automatically for some reason. + if (ctx->denoise != -1 && ctx->support_denoise) { + vas = vaDestroyBuffer(ctx->hwctx->display, denoise_id); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_ERROR, "Failed to free denoise parameter buffer: " + "%d (%s).\n", vas, vaErrorStr(vas)); + err = AVERROR(EIO); + goto fail; + } + } + + // This doesn't get freed automatically for some reason. + if (ctx->sharpless != -1 && ctx->support_sharpless) { + vas = vaDestroyBuffer(ctx->hwctx->display, sharpless_id); + if (vas != VA_STATUS_SUCCESS) { + av_log(ctx, AV_LOG_ERROR, "Failed to free sharpless parameter buffer: " + "%d (%s).\n", vas, vaErrorStr(vas)); + err = AVERROR(EIO); + goto fail; + } + } + av_frame_copy_props(output_frame, input_frame); av_frame_free(&input_frame); @@ -418,6 +529,10 @@ static const AVOption scale_vaapi_options[] = { OFFSET(output_height), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, { "format", "Output video format (software format of hardware frames)", OFFSET(output_format_string), AV_OPT_TYPE_STRING, .flags = FLAGS }, + { "denoise", "denoise level [-1, 100], -1 means disabled", + OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 100, .flags = FLAGS }, + { "sharpless", "sharpless level [-1, 100], -1 means disabled", + OFFSET(sharpless), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 100, .flags = FLAGS }, { NULL }, };