drm/amd/display: fix YCbCr420 blank color
[Why] YCbCr420 packing format uses two chanels for luma, and 1 channel for both chroma component. Our previous implementation did not account for this and results in every other pixel having very high luma value, showing greyish color instead of black. YCbCr444 = <Y1, Cb1, Cr1>; <Y2, Cb2, Cr2> ..... YCbCr420 = <Y1, Y2, Cb1>; <Y3, Y4, Cr1> ..... [How] Program the second channel with the black color value for luma as well. Signed-off-by: Eric Yang <Eric.Yang2@amd.com> Reviewed-by: Hugo Hu <Hugo.Hu@amd.com> Acked-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
d71589f290
commit
12750d1647
@ -1267,10 +1267,19 @@ static void program_scaler(const struct dc *dc,
|
||||
pipe_ctx->plane_res.scl_data.lb_params.depth,
|
||||
&pipe_ctx->stream->bit_depth_params);
|
||||
|
||||
if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color)
|
||||
if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color) {
|
||||
/*
|
||||
* The way 420 is packed, 2 channels carry Y component, 1 channel
|
||||
* alternate between Cb and Cr, so both channels need the pixel
|
||||
* value for Y
|
||||
*/
|
||||
if (pipe_ctx->stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
|
||||
color.color_r_cr = color.color_g_y;
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color(
|
||||
pipe_ctx->stream_res.tg,
|
||||
&color);
|
||||
}
|
||||
|
||||
pipe_ctx->plane_res.xfm->funcs->transform_set_scaler(pipe_ctx->plane_res.xfm,
|
||||
&pipe_ctx->plane_res.scl_data);
|
||||
|
@ -2159,6 +2159,15 @@ static void dcn10_blank_pixel_data(
|
||||
color_space = stream->output_color_space;
|
||||
color_space_to_black_color(dc, color_space, &black_color);
|
||||
|
||||
/*
|
||||
* The way 420 is packed, 2 channels carry Y component, 1 channel
|
||||
* alternate between Cb and Cr, so both channels need the pixel
|
||||
* value for Y
|
||||
*/
|
||||
if (stream->timing.pixel_encoding == PIXEL_ENCODING_YCBCR420)
|
||||
black_color.color_r_cr = black_color.color_g_y;
|
||||
|
||||
|
||||
if (stream_res->tg->funcs->set_blank_color)
|
||||
stream_res->tg->funcs->set_blank_color(
|
||||
stream_res->tg,
|
||||
|
Loading…
Reference in New Issue
Block a user