diff options
author | Shixiang Zheng <shixiang.zheng@rock-chips.com> | 2019-03-14 20:20:10 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2019-03-18 11:15:26 +0800 |
commit | b2a750b7c6b47a8582965fcb188c8c1e681d1bce (patch) | |
tree | 62eb63cd5bb2e1dc78ad53a736f97b7dcf7421ee | |
parent | d787c5f0e054c360ee5ff527459fc6fe8db7c207 (diff) |
video/rockchip: rga2 fix the issue of yuv422p format conversion
Change-Id: I5213a7be831e7a5166231f4e7179ce4a564a14fb
Signed-off-by: Shixiang Zheng <shixiang.zheng@rock-chips.com>
-rw-r--r-- | drivers/video/rockchip/rga2/rga2_drv.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c index 5aee946dd272..e96dec2a0716 100644 --- a/drivers/video/rockchip/rga2/rga2_drv.c +++ b/drivers/video/rockchip/rga2/rga2_drv.c @@ -474,6 +474,19 @@ static void rga2_printf_cmd_buf(u32 *cmd_buf) #endif +static bool is_yuv422p_format(u32 format) +{ + bool ret = false; + + switch (format) { + case RGA2_FORMAT_YCbCr_422_P: + case RGA2_FORMAT_YCrCb_422_P: + ret = true; + break; + } + return ret; +} + static inline void rga2_write(u32 b, u32 r) { *((volatile unsigned int *)(rga2_drvdata->rga_base + r)) = b; @@ -1123,12 +1136,18 @@ static int rga2_get_img_info(rga_img_info_t *img, *psgt = sgt; img->yrgb_addr = img->uv_addr; img->uv_addr = img->yrgb_addr + (vir_w * vir_h); - img->v_addr = img->uv_addr + (vir_w * vir_h) / 4; + if (is_yuv422p_format(img->format)) + img->v_addr = img->uv_addr + (vir_w * vir_h) / 2; + else + img->v_addr = img->uv_addr + (vir_w * vir_h) / 4; } } else { img->yrgb_addr = img->uv_addr; img->uv_addr = img->yrgb_addr + (vir_w * vir_h); - img->v_addr = img->uv_addr + (vir_w * vir_h) / 4; + if (is_yuv422p_format(img->format)) + img->v_addr = img->uv_addr + (vir_w * vir_h) / 2; + else + img->v_addr = img->uv_addr + (vir_w * vir_h) / 4; } return ret; @@ -1338,6 +1357,12 @@ static int rga2_convert_dma_buf(struct rga2_req *req) req->src1.v_addr = req->src1.uv_addr + (req->src1.vir_w * req->src1.vir_h) / 4; } + if (is_yuv422p_format(req->src.format)) + req->src.v_addr = req->src.uv_addr + (req->src_vir_w * req->src.vir_h) / 2; + if (is_yuv422p_format(req->dst.format)) + req->dst.v_addr = req->dst.uv_addr + (req->dst_vir_w * req->dst.vir_h) / 2; + if (is_yuv422p_format(req->src1.format)) + req->src1.v_addr = req->src1.uv_addr + (req->src1_vir_w * req->dst.vir_h) / 2; return 0; } |