mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
ge2d: add option for rgb_to_yuv to 709 or 601 [1/1]
PD#OTT-3711 Problem: color parameters are wrong while displaying images on NativeImagePlayer Solution: add a macro BT_STANDARD for 709 or 601 Verify: verified on W400 Change-Id: I0703ef17748c8267b86e85a4366cac88d3e41ee1 Signed-off-by: Jian Cao <jian.cao@amlogic.com>
This commit is contained in:
@@ -624,7 +624,7 @@ void ge2d_set_dp_gen(struct ge2d_dp_gen_s *cfg)
|
||||
);
|
||||
} else
|
||||
ge2d_reg_set_bits(GE2D_ANTIFLICK_CTRL0, 0, 31, 1);
|
||||
if (cfg->use_matrix_default == MATRIX_YCC_TO_RGB) {
|
||||
if (cfg->use_matrix_default & MATRIX_YCC_TO_RGB) {
|
||||
/* ycbcr(16-235) to rgb(0-255) */
|
||||
cfg->matrix_coef[0] = 0x4a8;
|
||||
cfg->matrix_coef[1] = 0;
|
||||
@@ -641,27 +641,43 @@ void ge2d_set_dp_gen(struct ge2d_dp_gen_s *cfg)
|
||||
cfg->matrix_sat_in_en = 1;
|
||||
cfg->matrix_minus_16_ctrl = 0x4;
|
||||
cfg->matrix_sign_ctrl = 0x3;
|
||||
} else if (cfg->use_matrix_default == MATRIX_RGB_TO_YCC) {
|
||||
/* rgb(0-255) to ycbcr(16-235) */
|
||||
/* 0.257 0.504 0.098 */
|
||||
/* -0.148 -0.291 0.439 */
|
||||
/* 0.439 -0.368 -0.071 */
|
||||
cfg->matrix_coef[0] = 0x107;
|
||||
cfg->matrix_coef[1] = 0x204;
|
||||
cfg->matrix_coef[2] = 0x64;
|
||||
cfg->matrix_coef[3] = 0x1f68;
|
||||
cfg->matrix_coef[4] = 0x1ed6;
|
||||
cfg->matrix_coef[5] = 0x1c2;
|
||||
cfg->matrix_coef[6] = 0x1c2;
|
||||
cfg->matrix_coef[7] = 0x1e87;
|
||||
cfg->matrix_coef[8] = 0x1fb7;
|
||||
} else if (cfg->use_matrix_default & MATRIX_RGB_TO_YCC) {
|
||||
if (cfg->use_matrix_default & MATRIX_BT_709) {
|
||||
/* VDIN_MATRIX_RGB_YUV709 */
|
||||
/* 0 0.183 0.614 0.062 16 */
|
||||
/* 0 -0.101 -0.338 0.439 128 */
|
||||
/* 0 0.439 -0.399 -0.04 128 */
|
||||
cfg->matrix_coef[0] = 0xbb;
|
||||
cfg->matrix_coef[1] = 0x275;
|
||||
cfg->matrix_coef[2] = 0x3f;
|
||||
cfg->matrix_coef[3] = 0x1f99;
|
||||
cfg->matrix_coef[4] = 0x1ea6;
|
||||
cfg->matrix_coef[5] = 0x1c2;
|
||||
cfg->matrix_coef[6] = 0x1c2;
|
||||
cfg->matrix_coef[7] = 0x1e67;
|
||||
cfg->matrix_coef[8] = 0x1fd7;
|
||||
} else {
|
||||
/* rgb(0-255) to ycbcr(16-235) */
|
||||
/* 0.257 0.504 0.098 */
|
||||
/* -0.148 -0.291 0.439 */
|
||||
/* 0.439 -0.368 -0.071 */
|
||||
cfg->matrix_coef[0] = 0x107;
|
||||
cfg->matrix_coef[1] = 0x204;
|
||||
cfg->matrix_coef[2] = 0x64;
|
||||
cfg->matrix_coef[3] = 0x1f68;
|
||||
cfg->matrix_coef[4] = 0x1ed6;
|
||||
cfg->matrix_coef[5] = 0x1c2;
|
||||
cfg->matrix_coef[6] = 0x1c2;
|
||||
cfg->matrix_coef[7] = 0x1e87;
|
||||
cfg->matrix_coef[8] = 0x1fb7;
|
||||
}
|
||||
cfg->matrix_offset[0] = 16;
|
||||
cfg->matrix_offset[1] = 128;
|
||||
cfg->matrix_offset[2] = 128;
|
||||
cfg->matrix_sat_in_en = 0;
|
||||
cfg->matrix_minus_16_ctrl = 0;
|
||||
cfg->matrix_sign_ctrl = 0;
|
||||
} else if (cfg->use_matrix_default == MATRIX_FULL_RANGE_YCC_TO_RGB) {
|
||||
} else if (cfg->use_matrix_default & MATRIX_FULL_RANGE_YCC_TO_RGB) {
|
||||
/* ycbcr (0-255) to rgb(0-255) */
|
||||
/* 1, 0, 1.402 */
|
||||
/* 1, -0.34414, -0.71414 */
|
||||
@@ -681,7 +697,7 @@ void ge2d_set_dp_gen(struct ge2d_dp_gen_s *cfg)
|
||||
cfg->matrix_sat_in_en = 0;
|
||||
cfg->matrix_minus_16_ctrl = 0;
|
||||
cfg->matrix_sign_ctrl = 0x3;
|
||||
} else if (cfg->use_matrix_default == MATRIX_RGB_TO_FULL_RANGE_YCC) {
|
||||
} else if (cfg->use_matrix_default & MATRIX_RGB_TO_FULL_RANGE_YCC) {
|
||||
cfg->matrix_coef[0] = 0x132;
|
||||
cfg->matrix_coef[1] = 0x259;
|
||||
cfg->matrix_coef[2] = 0x75;
|
||||
|
||||
@@ -57,6 +57,9 @@ static inline void _set_src1_format(struct ge2d_src1_data_s *src1_data_cfg,
|
||||
dp_gen_cfg->use_matrix_default =
|
||||
(format_dst & GE2D_FORMAT_FULL_RANGE) ?
|
||||
MATRIX_RGB_TO_FULL_RANGE_YCC : MATRIX_RGB_TO_YCC;
|
||||
dp_gen_cfg->use_matrix_default |=
|
||||
((format_dst & GE2D_FORMAT_BT_STANDARD) ?
|
||||
MATRIX_BT_709 : MATRIX_BT_601);
|
||||
dp_gen_cfg->conv_matrix_en = 1;
|
||||
} else
|
||||
dp_gen_cfg->conv_matrix_en = 0;
|
||||
@@ -110,6 +113,9 @@ static inline void _set_dst_format(
|
||||
dp_gen_cfg->use_matrix_default =
|
||||
(format_dst & GE2D_FORMAT_FULL_RANGE) ?
|
||||
MATRIX_RGB_TO_FULL_RANGE_YCC : MATRIX_RGB_TO_YCC;
|
||||
dp_gen_cfg->use_matrix_default |=
|
||||
((format_dst & GE2D_FORMAT_BT_STANDARD) ?
|
||||
MATRIX_BT_709 : MATRIX_BT_601);
|
||||
dp_gen_cfg->conv_matrix_en = 1;
|
||||
} else
|
||||
dp_gen_cfg->conv_matrix_en = 0;
|
||||
|
||||
@@ -449,16 +449,25 @@ static int render_frame_block(void)
|
||||
new_vf->type =
|
||||
VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_FIELD |
|
||||
VIDTYPE_VIU_NV21 | VIDTYPE_PIC;
|
||||
/* indicate the vframe is a full range frame */
|
||||
/* indicate the vframe is a limited range frame */
|
||||
new_vf->signal_type =
|
||||
/* HD default 709 limit */
|
||||
(1 << 29) /* video available */
|
||||
| (5 << 26) /* unspecified */
|
||||
| (1 << 25) /* full */
|
||||
| (1 << 24) /* color available */
|
||||
| (1 << 16) /* bt709 */
|
||||
| (1 << 8) /* bt709 */
|
||||
| (1 << 0); /* bt709 */
|
||||
(1 << 29) /* video available */
|
||||
| (5 << 26) /* unspecified */
|
||||
| (0 << 25) /* limited */
|
||||
| (1 << 24); /* color available */
|
||||
if (dev->disp_width >= ZOOM_WIDTH && dev->disp_height >= ZOOM_HEIGHT) {
|
||||
/* >= 720p, use 709 */
|
||||
new_vf->signal_type |=
|
||||
(1 << 16) /* bt709 */
|
||||
| (1 << 8) /* bt709 */
|
||||
| (1 << 0); /* bt709 */
|
||||
} else {
|
||||
/* < 720p, use 709 */
|
||||
new_vf->signal_type |=
|
||||
(3 << 16) /* bt601 */
|
||||
| (3 << 8) /* bt601 */
|
||||
| (3 << 0); /* bt601 */
|
||||
}
|
||||
new_vf->duration_pulldown = 0;
|
||||
new_vf->index = index;
|
||||
new_vf->pts = 0;
|
||||
@@ -978,7 +987,11 @@ int picdec_fill_buffer(struct vframe_s *vf, struct ge2d_context_s *context,
|
||||
aml_pr_info(1, "dst 2 addr is %x\n", (unsigned int)cs2.addr);
|
||||
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
|
||||
if (picdec_device.output_format_mode)
|
||||
ge2d_config->dst_para.format = GE2D_FORMAT_S24_YUV444;
|
||||
/* set dst format with bt601 or bt709 */
|
||||
ge2d_config->dst_para.format =
|
||||
GE2D_FORMAT_S24_YUV444 |
|
||||
((vf->signal_type & (0xff << 16)) == (1 << 16) ?
|
||||
GE2D_FORMAT_BT709 : GE2D_FORMAT_BT601);
|
||||
else
|
||||
ge2d_config->dst_para.format = GE2D_FORMAT_M24_NV21;
|
||||
ge2d_config->dst_para.fill_color_en = 0;
|
||||
|
||||
@@ -128,10 +128,17 @@ enum ge2d_memtype_s {
|
||||
#define FILTER_TYPE_GAU0_BOT 5
|
||||
#define FILTER_TYPE_GAU1 6
|
||||
|
||||
#define MATRIX_YCC_TO_RGB 1
|
||||
#define MATRIX_RGB_TO_YCC 2
|
||||
#define MATRIX_FULL_RANGE_YCC_TO_RGB 3
|
||||
#define MATRIX_RGB_TO_FULL_RANGE_YCC 4
|
||||
#define MATRIX_YCC_TO_RGB (1 << 0)
|
||||
#define MATRIX_RGB_TO_YCC (1 << 1)
|
||||
#define MATRIX_FULL_RANGE_YCC_TO_RGB (1 << 2)
|
||||
#define MATRIX_RGB_TO_FULL_RANGE_YCC (1 << 3)
|
||||
#define MATRIX_BT_STANDARD (1 << 4)
|
||||
#define MATRIX_BT_601 (0 << 4)
|
||||
#define MATRIX_BT_709 (1 << 4)
|
||||
|
||||
#define GE2D_FORMAT_BT_STANDARD (1 << 28)
|
||||
#define GE2D_FORMAT_BT601 (0 << 28)
|
||||
#define GE2D_FORMAT_BT709 (1 << 28)
|
||||
|
||||
|
||||
#define GE2D_ENDIAN_SHIFT 24
|
||||
|
||||
Reference in New Issue
Block a user