Message ID | 3db17e1a60e852047c7f9c7ca7c237edab354104.1492768073.git.jsarha@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Jyri, Thank you for the patch. On Friday 21 Apr 2017 12:51:16 Jyri Sarha wrote: > From: Tomi Valkeinen <tomi.valkeinen@ti.com> > > At the moment the driver always uses limited range when doing YUV-RGB > conversions. This patch adds full-range tables, and makes the code to > always use full-range tables. > > In the future we should allow the user to select the color range instead > of hardcoding it. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > Signed-off-by: Jyri Sarha <jsarha@ti.com> > --- > drivers/gpu/drm/omapdrm/dss/dispc.c | 33 +++++++++++++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c > b/drivers/gpu/drm/omapdrm/dss/dispc.c index b53e63d..f2a2d08 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dispc.c > +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c > @@ -799,6 +799,8 @@ static void dispc_setup_color_conv_coef(void) > { > int i; > int num_ovl = dss_feat_get_num_ovls(); > + /* always use full range for now */ > + bool use_full_range = true; > > /* YUV -> RGB, ITU-R BT.601, limited range */ > const struct csc_coef_yuv2rgb coefs_yuv2rgb_bt601_lim = { > @@ -808,6 +810,14 @@ static void dispc_setup_color_conv_coef(void) > false, /* limited range */ > }; > > + /* YUV -> RGB, ITU-R BT.601, full range */ > + const struct csc_coef_yuv2rgb coefs_yuv2rgb_bt601_full = { > + 256, 0, 358, /* ry, rcb, rcr */ > + 256, -88, -182, /* gy, gcb, gcr */ > + 256, 452, 0, /* by, bcb, bcr */ > + true, /* full range */ > + }; Shouldn't all those tables be static const ? With that fixed, Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > + > /* RGB -> YUV, ITU-R BT.601, limited range */ > const struct csc_coef_rgb2yuv coefs_rgb2yuv_bt601_lim = { > 66, 129, 25, /* yr, yg, yb */ > @@ -816,11 +826,30 @@ static void dispc_setup_color_conv_coef(void) > false, /* limited range */ > }; > > + /* RGB -> YUV, ITU-R BT.601, full range */ > + const struct csc_coef_rgb2yuv coefs_rgb2yuv_bt601_full = { > + 77, 150, 29, /* yr, yg, yb */ > + -43, -85, 128, /* cbr, cbg, cbb */ > + 128, -107, -21, /* crr, crg, crb */ > + true, /* full range */ > + }; > + > + const struct csc_coef_yuv2rgb *yuv2rgb; > + const struct csc_coef_rgb2yuv *rgb2yuv; > + > + if (use_full_range) { > + yuv2rgb = &coefs_yuv2rgb_bt601_full; > + rgb2yuv = &coefs_rgb2yuv_bt601_full; > + } else { > + yuv2rgb = &coefs_yuv2rgb_bt601_lim; > + rgb2yuv = &coefs_rgb2yuv_bt601_lim; > + } > + > for (i = 1; i < num_ovl; i++) > - dispc_ovl_write_color_conv_coef(i, &coefs_yuv2rgb_bt601_lim); > + dispc_ovl_write_color_conv_coef(i, yuv2rgb); > > if (dispc.feat->has_writeback) > - dispc_wb_write_color_conv_coef(&coefs_rgb2yuv_bt601_lim); > + dispc_wb_write_color_conv_coef(rgb2yuv); > } > > static void dispc_ovl_set_ba0(enum omap_plane_id plane, u32 paddr)
diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c index b53e63d..f2a2d08 100644 --- a/drivers/gpu/drm/omapdrm/dss/dispc.c +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c @@ -799,6 +799,8 @@ static void dispc_setup_color_conv_coef(void) { int i; int num_ovl = dss_feat_get_num_ovls(); + /* always use full range for now */ + bool use_full_range = true; /* YUV -> RGB, ITU-R BT.601, limited range */ const struct csc_coef_yuv2rgb coefs_yuv2rgb_bt601_lim = { @@ -808,6 +810,14 @@ static void dispc_setup_color_conv_coef(void) false, /* limited range */ }; + /* YUV -> RGB, ITU-R BT.601, full range */ + const struct csc_coef_yuv2rgb coefs_yuv2rgb_bt601_full = { + 256, 0, 358, /* ry, rcb, rcr */ + 256, -88, -182, /* gy, gcb, gcr */ + 256, 452, 0, /* by, bcb, bcr */ + true, /* full range */ + }; + /* RGB -> YUV, ITU-R BT.601, limited range */ const struct csc_coef_rgb2yuv coefs_rgb2yuv_bt601_lim = { 66, 129, 25, /* yr, yg, yb */ @@ -816,11 +826,30 @@ static void dispc_setup_color_conv_coef(void) false, /* limited range */ }; + /* RGB -> YUV, ITU-R BT.601, full range */ + const struct csc_coef_rgb2yuv coefs_rgb2yuv_bt601_full = { + 77, 150, 29, /* yr, yg, yb */ + -43, -85, 128, /* cbr, cbg, cbb */ + 128, -107, -21, /* crr, crg, crb */ + true, /* full range */ + }; + + const struct csc_coef_yuv2rgb *yuv2rgb; + const struct csc_coef_rgb2yuv *rgb2yuv; + + if (use_full_range) { + yuv2rgb = &coefs_yuv2rgb_bt601_full; + rgb2yuv = &coefs_rgb2yuv_bt601_full; + } else { + yuv2rgb = &coefs_yuv2rgb_bt601_lim; + rgb2yuv = &coefs_rgb2yuv_bt601_lim; + } + for (i = 1; i < num_ovl; i++) - dispc_ovl_write_color_conv_coef(i, &coefs_yuv2rgb_bt601_lim); + dispc_ovl_write_color_conv_coef(i, yuv2rgb); if (dispc.feat->has_writeback) - dispc_wb_write_color_conv_coef(&coefs_rgb2yuv_bt601_lim); + dispc_wb_write_color_conv_coef(rgb2yuv); } static void dispc_ovl_set_ba0(enum omap_plane_id plane, u32 paddr)