diff --git a/src/amd/vpelib/src/chip/vpe10/inc/vpe10_dpp.h b/src/amd/vpelib/src/chip/vpe10/inc/vpe10_dpp.h index 82bdbffcd9a..164eb633cb4 100644 --- a/src/amd/vpelib/src/chip/vpe10/inc/vpe10_dpp.h +++ b/src/amd/vpelib/src/chip/vpe10/inc/vpe10_dpp.h @@ -870,7 +870,7 @@ void vpe10_dpp_cnv_program_pre_dgam(struct dpp *dpp, enum color_transfer_func tr void vpe10_dpp_program_cnv_bias_scale(struct dpp *dpp, struct bias_and_scale *bias_and_scale); -void vpe10_dpp_cnv_program_alpha_keyer(struct dpp *dpp, struct cnv_color_keyer_params *color_keyer); +void vpe10_dpp_cnv_program_alpha_keyer(struct dpp *dpp, enum vpe_surface_pixel_format format, bool enable_luma_key, float lower_luma_bound, float upper_luma_bound); void vpe10_dpp_program_input_transfer_func(struct dpp *dpp, struct transfer_func *input_tf); diff --git a/src/amd/vpelib/src/chip/vpe10/vpe10_dpp.c b/src/amd/vpelib/src/chip/vpe10/vpe10_dpp.c index 42bdaef66c4..071f020e502 100644 --- a/src/amd/vpelib/src/chip/vpe10/vpe10_dpp.c +++ b/src/amd/vpelib/src/chip/vpe10/vpe10_dpp.c @@ -346,26 +346,37 @@ void vpe10_dpp_cnv_program_pre_dgam(struct dpp *dpp, enum color_transfer_func tr VPCNVC_PRE_DEGAM, 0, PRE_DEGAM_MODE, pre_degam_en, PRE_DEGAM_SELECT, degamma_lut_selection); } -void vpe10_dpp_cnv_program_alpha_keyer(struct dpp *dpp, struct cnv_color_keyer_params *color_keyer) +void vpe10_dpp_cnv_program_alpha_keyer( + struct dpp *dpp, + enum vpe_surface_pixel_format format, + bool enable_luma_key, + float lower_luma_bound, + float upper_luma_bound) { + uint32_t lower_luma_bound_int = (uint32_t)lower_luma_bound * 65535; + uint32_t upper_luma_bound_int = (uint32_t)upper_luma_bound * 65535; + PROGRAM_ENTRY(); - REG_SET_2(VPCNVC_COLOR_KEYER_CONTROL, 0, COLOR_KEYER_EN, color_keyer->color_keyer_en, - COLOR_KEYER_MODE, color_keyer->color_keyer_mode); + REG_SET_2(VPCNVC_COLOR_KEYER_CONTROL, 0, + COLOR_KEYER_EN, enable_luma_key, + COLOR_KEYER_MODE, CNV_COLOR_KEYER_MODE_RANGE_00); - REG_SET_2(VPCNVC_COLOR_KEYER_ALPHA, 0, COLOR_KEYER_ALPHA_LOW, - color_keyer->color_keyer_alpha_low, COLOR_KEYER_ALPHA_HIGH, - color_keyer->color_keyer_alpha_high); + REG_SET_2(VPCNVC_COLOR_KEYER_ALPHA, 0, + COLOR_KEYER_ALPHA_LOW, lower_luma_bound_int, + COLOR_KEYER_ALPHA_HIGH, upper_luma_bound_int); - REG_SET_2(VPCNVC_COLOR_KEYER_RED, 0, COLOR_KEYER_RED_LOW, color_keyer->color_keyer_red_low, - COLOR_KEYER_RED_HIGH, color_keyer->color_keyer_red_high); + REG_SET_2(VPCNVC_COLOR_KEYER_RED, 0, + COLOR_KEYER_RED_LOW, lower_luma_bound_int, + COLOR_KEYER_RED_HIGH, upper_luma_bound_int); - REG_SET_2(VPCNVC_COLOR_KEYER_GREEN, 0, COLOR_KEYER_GREEN_LOW, - color_keyer->color_keyer_green_low, COLOR_KEYER_GREEN_HIGH, - color_keyer->color_keyer_green_high); + REG_SET_2(VPCNVC_COLOR_KEYER_GREEN, 0, + COLOR_KEYER_GREEN_LOW, lower_luma_bound_int, + COLOR_KEYER_GREEN_HIGH, upper_luma_bound_int); - REG_SET_2(VPCNVC_COLOR_KEYER_BLUE, 0, COLOR_KEYER_BLUE_LOW, color_keyer->color_keyer_blue_low, - COLOR_KEYER_BLUE_HIGH, color_keyer->color_keyer_blue_high); + REG_SET_2(VPCNVC_COLOR_KEYER_BLUE, 0, + COLOR_KEYER_BLUE_LOW, lower_luma_bound_int, + COLOR_KEYER_BLUE_HIGH, upper_luma_bound_int); } uint32_t vpe10_get_line_buffer_size() diff --git a/src/amd/vpelib/src/core/inc/common.h b/src/amd/vpelib/src/core/inc/common.h index b50a45c0968..4b36dbcd668 100644 --- a/src/amd/vpelib/src/core/inc/common.h +++ b/src/amd/vpelib/src/core/inc/common.h @@ -75,6 +75,8 @@ bool vpe_is_yuv444_8(enum vpe_surface_pixel_format format); bool vpe_is_yuv444_10(enum vpe_surface_pixel_format format); bool vpe_is_yuv444(enum vpe_surface_pixel_format format); +bool vpe_is_yuv(enum vpe_surface_pixel_format format); + enum color_depth vpe_get_color_depth(enum vpe_surface_pixel_format format); bool vpe_has_per_pixel_alpha(enum vpe_surface_pixel_format format); diff --git a/src/amd/vpelib/src/core/inc/dpp.h b/src/amd/vpelib/src/core/inc/dpp.h index b0d6fe077ee..5edf1a15f1e 100644 --- a/src/amd/vpelib/src/core/inc/dpp.h +++ b/src/amd/vpelib/src/core/inc/dpp.h @@ -47,21 +47,8 @@ struct cnv_alpha_2bit_lut { enum CNV_COLOR_KEYER_MODE { CNV_COLOR_KEYER_MODE_FORCE_00 = 0, CNV_COLOR_KEYER_MODE_FORCE_FF = 1, - CNV_COLOR_KEYER_MODE_RANGE_00 = 2, - CNV_COLOR_KEYER_MODE_RANGE_FF = 3 -}; - -struct cnv_color_keyer_params { - int color_keyer_en; - int color_keyer_mode; - int color_keyer_alpha_low; - int color_keyer_alpha_high; - int color_keyer_red_low; - int color_keyer_red_high; - int color_keyer_green_low; - int color_keyer_green_high; - int color_keyer_blue_low; - int color_keyer_blue_high; + CNV_COLOR_KEYER_MODE_RANGE_FF = 2, + CNV_COLOR_KEYER_MODE_RANGE_00 = 3 }; enum input_csc_select { @@ -85,7 +72,7 @@ struct dpp_funcs { void (*program_cnv_bias_scale)(struct dpp *dpp, struct bias_and_scale *bias_and_scale); - void (*program_alpha_keyer)(struct dpp *dpp, struct cnv_color_keyer_params *color_keyer); + void (*program_alpha_keyer)(struct dpp *dpp, enum vpe_surface_pixel_format format, bool enable_luma_key, float lower_luma_bound, float upper_luma_bound); void (*program_input_transfer_func)(struct dpp *dpp, struct transfer_func *input_tf); diff --git a/src/amd/vpelib/src/core/vpelib.c b/src/amd/vpelib/src/core/vpelib.c index 9614b350753..02830b12e71 100644 --- a/src/amd/vpelib/src/core/vpelib.c +++ b/src/amd/vpelib/src/core/vpelib.c @@ -346,10 +346,14 @@ static enum vpe_status populate_input_streams(struct vpe_priv *vpe_priv, const s stream_ctx = &stream_ctx_base[i]; stream_ctx->stream_type = VPE_STREAM_TYPE_INPUT; stream_ctx->stream_idx = (int32_t)i; + stream_ctx->per_pixel_alpha = vpe_has_per_pixel_alpha(param->streams[i].surface_info.format); + if (vpe_priv->init.debug.bypass_per_pixel_alpha) { stream_ctx->per_pixel_alpha = false; + } else if (param->streams[i].enable_luma_key) { + stream_ctx->per_pixel_alpha = true; } if (param->streams[i].horizontal_mirror && !input_h_mirror && output_h_mirror) stream_ctx->flip_horizonal_output = true;