summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShixiang Zheng <shixiang.zheng@rock-chips.com>2019-03-14 20:20:10 +0800
committerTao Huang <huangtao@rock-chips.com>2019-03-18 11:15:26 +0800
commitb2a750b7c6b47a8582965fcb188c8c1e681d1bce (patch)
tree62eb63cd5bb2e1dc78ad53a736f97b7dcf7421ee
parentd787c5f0e054c360ee5ff527459fc6fe8db7c207 (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.c29
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;
}