You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavfi/{denoise, procamp, scale, sharpness}_vaapi: Add passthrough mode
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
This commit is contained in:
		| @@ -95,6 +95,7 @@ int ff_vaapi_vpp_config_input(AVFilterLink *inlink) | ||||
| int ff_vaapi_vpp_config_output(AVFilterLink *outlink) | ||||
| { | ||||
|     AVFilterContext *avctx = outlink->src; | ||||
|     AVFilterLink   *inlink = avctx->inputs[0]; | ||||
|     VAAPIVPPContext *ctx   = avctx->priv; | ||||
|     AVVAAPIHWConfig *hwconfig = NULL; | ||||
|     AVHWFramesConstraints *constraints = NULL; | ||||
| @@ -111,6 +112,17 @@ int ff_vaapi_vpp_config_output(AVFilterLink *outlink) | ||||
|     if (!ctx->output_height) | ||||
|         ctx->output_height = avctx->inputs[0]->h; | ||||
|  | ||||
|     outlink->w = ctx->output_width; | ||||
|     outlink->h = ctx->output_height; | ||||
|  | ||||
|     if (ctx->passthrough) { | ||||
|         if (inlink->hw_frames_ctx) | ||||
|             outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); | ||||
|         av_log(ctx, AV_LOG_VERBOSE, "Using VAAPI filter passthrough mode.\n"); | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     av_assert0(ctx->input_frames); | ||||
|     ctx->device_ref = av_buffer_ref(ctx->input_frames->device_ref); | ||||
|     if (!ctx->device_ref) { | ||||
| @@ -214,9 +226,6 @@ int ff_vaapi_vpp_config_output(AVFilterLink *outlink) | ||||
|         return AVERROR(EIO); | ||||
|     } | ||||
|  | ||||
|     outlink->w = ctx->output_width; | ||||
|     outlink->h = ctx->output_height; | ||||
|  | ||||
|     if (ctx->build_filter_params) { | ||||
|         err = ctx->build_filter_params(avctx); | ||||
|         if (err < 0) | ||||
|   | ||||
| @@ -56,6 +56,8 @@ typedef struct VAAPIVPPContext { | ||||
|     VABufferID         filter_buffers[VAProcFilterCount]; | ||||
|     int                nb_filter_buffers; | ||||
|  | ||||
|     int passthrough; | ||||
|  | ||||
|     int (*build_filter_params)(AVFilterContext *avctx); | ||||
|  | ||||
|     void (*pipeline_uninit)(AVFilterContext *avctx); | ||||
|   | ||||
| @@ -131,6 +131,9 @@ static int misc_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) | ||||
|            av_get_pix_fmt_name(input_frame->format), | ||||
|            input_frame->width, input_frame->height, input_frame->pts); | ||||
|  | ||||
|     if (vpp_ctx->passthrough) | ||||
|         return ff_filter_frame(outlink, input_frame); | ||||
|  | ||||
|     if (vpp_ctx->va_context == VA_INVALID_ID) | ||||
|         return AVERROR(EINVAL); | ||||
|  | ||||
| @@ -176,11 +179,14 @@ fail: | ||||
| static av_cold int denoise_vaapi_init(AVFilterContext *avctx) | ||||
| { | ||||
|     VAAPIVPPContext *vpp_ctx = avctx->priv; | ||||
|     DenoiseVAAPIContext *ctx = avctx->priv; | ||||
|  | ||||
|     ff_vaapi_vpp_ctx_init(avctx); | ||||
|     vpp_ctx->pipeline_uninit     = ff_vaapi_vpp_pipeline_uninit; | ||||
|     vpp_ctx->build_filter_params = denoise_vaapi_build_filter_params; | ||||
|     vpp_ctx->output_format       = AV_PIX_FMT_NONE; | ||||
|     if (ctx->denoise == DENOISE_DEFAULT) | ||||
|         vpp_ctx->passthrough = 1; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -188,11 +194,14 @@ static av_cold int denoise_vaapi_init(AVFilterContext *avctx) | ||||
| static av_cold int sharpness_vaapi_init(AVFilterContext *avctx) | ||||
| { | ||||
|     VAAPIVPPContext *vpp_ctx = avctx->priv; | ||||
|     SharpnessVAAPIContext *ctx = avctx->priv; | ||||
|  | ||||
|     ff_vaapi_vpp_ctx_init(avctx); | ||||
|     vpp_ctx->pipeline_uninit     = ff_vaapi_vpp_pipeline_uninit; | ||||
|     vpp_ctx->build_filter_params = sharpness_vaapi_build_filter_params; | ||||
|     vpp_ctx->output_format       = AV_PIX_FMT_NONE; | ||||
|     if (ctx->sharpness == SHARPNESS_DEFAULT) | ||||
|         vpp_ctx->passthrough = 1; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -136,6 +136,9 @@ static int procamp_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame | ||||
|            av_get_pix_fmt_name(input_frame->format), | ||||
|            input_frame->width, input_frame->height, input_frame->pts); | ||||
|  | ||||
|     if (vpp_ctx->passthrough) | ||||
|         return ff_filter_frame(outlink, input_frame); | ||||
|  | ||||
|     if (vpp_ctx->va_context == VA_INVALID_ID) | ||||
|         return AVERROR(EINVAL); | ||||
|  | ||||
| @@ -179,11 +182,18 @@ fail: | ||||
| static av_cold int procamp_vaapi_init(AVFilterContext *avctx) | ||||
| { | ||||
|     VAAPIVPPContext *vpp_ctx = avctx->priv; | ||||
|     ProcampVAAPIContext *ctx = avctx->priv; | ||||
|     float eps = 1.0e-10f; | ||||
|  | ||||
|     ff_vaapi_vpp_ctx_init(avctx); | ||||
|     vpp_ctx->pipeline_uninit     = ff_vaapi_vpp_pipeline_uninit; | ||||
|     vpp_ctx->build_filter_params = procamp_vaapi_build_filter_params; | ||||
|     vpp_ctx->output_format       = AV_PIX_FMT_NONE; | ||||
|     if (fabs(ctx->saturation - SATURATION_DEFAULT) < eps && | ||||
|         fabs(ctx->bright - BRIGHTNESS_DEFAULT) < eps && | ||||
|         fabs(ctx->contrast - CONTRAST_DEFAULT) < eps && | ||||
|         fabs(ctx->hue - HUE_DEFAULT) < eps) | ||||
|         vpp_ctx->passthrough = 1; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|   | ||||
| @@ -85,6 +85,16 @@ static int scale_vaapi_config_output(AVFilterLink *outlink) | ||||
|     ff_scale_adjust_dimensions(inlink, &vpp_ctx->output_width, &vpp_ctx->output_height, | ||||
|                                ctx->force_original_aspect_ratio, ctx->force_divisible_by); | ||||
|  | ||||
|     if (inlink->w == vpp_ctx->output_width && inlink->h == vpp_ctx->output_height && | ||||
|         (vpp_ctx->input_frames->sw_format == vpp_ctx->output_format || | ||||
|          vpp_ctx->output_format == AV_PIX_FMT_NONE) && | ||||
|         ctx->colour_primaries == AVCOL_PRI_UNSPECIFIED && | ||||
|         ctx->colour_transfer == AVCOL_TRC_UNSPECIFIED && | ||||
|         ctx->colour_matrix == AVCOL_SPC_UNSPECIFIED && | ||||
|         ctx->colour_range == AVCOL_RANGE_UNSPECIFIED && | ||||
|         ctx->chroma_location == AVCHROMA_LOC_UNSPECIFIED) | ||||
|         vpp_ctx->passthrough = 1; | ||||
|  | ||||
|     err = ff_vaapi_vpp_config_output(outlink); | ||||
|     if (err < 0) | ||||
|         return err; | ||||
| @@ -111,6 +121,9 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) | ||||
|            av_get_pix_fmt_name(input_frame->format), | ||||
|            input_frame->width, input_frame->height, input_frame->pts); | ||||
|  | ||||
|    if (vpp_ctx->passthrough) | ||||
|        return ff_filter_frame(outlink, input_frame); | ||||
|  | ||||
|     if (vpp_ctx->va_context == VA_INVALID_ID) | ||||
|         return AVERROR(EINVAL); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user