summaryrefslogtreecommitdiff
authorPengcheng Chen <pengcheng.chen@amlogic.com>2017-05-24 06:58:47 (GMT)
committer Pengcheng Chen <pengcheng.chen@amlogic.com>2017-05-24 08:10:25 (GMT)
commitbf1752db2c2e2d36053eaae55095df3f3ed801c5 (patch)
treea13f3860bd6d7ca872e61e40852eeda5c37fe739
parent4ee45c349e66d3af128643599bd4e3b82ccf5974 (diff)
downloadsystem-bf1752db2c2e2d36053eaae55095df3f3ed801c5.zip
system-bf1752db2c2e2d36053eaae55095df3f3ed801c5.tar.gz
system-bf1752db2c2e2d36053eaae55095df3f3ed801c5.tar.bz2
PD#144703: ge2dlib: fix yv12 format phy addr error caused green color frame issue [1/2]
1. fix yv12 format width, height set error issue. 2. anroid yv12 format is YCrCb while ge2d support YCbCr,need swap addr. Change-Id: I8bd26a1cf5a5b1f0a88136c48a134aa19f536e12 Signed-off-by: Pengcheng Chen <pengcheng.chen@amlogic.com>
Diffstat
-rw-r--r--libge2d/ge2d_port.c81
-rw-r--r--libge2d/include/ge2d_com.h2
2 files changed, 44 insertions, 39 deletions
diff --git a/libge2d/ge2d_port.c b/libge2d/ge2d_port.c
index b6c46e3..ef7ab90 100644
--- a/libge2d/ge2d_port.c
+++ b/libge2d/ge2d_port.c
@@ -119,8 +119,7 @@ static int is_no_alpha(int format)
static int is_nv21(int format)
{
- if ((format == PIXEL_FORMAT_YCrCb_420_SP)||
- (format == PIXEL_FORMAT_YV12))
+ if (format == PIXEL_FORMAT_YCrCb_420_SP)
return 1;
else
return 0;
@@ -243,12 +242,13 @@ static int ge2d_fillrectangle_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
ge2d_config_ex.dst_planes[0].w = d_canvas_w;
ge2d_config_ex.dst_planes[0].h = d_canvas_h;
- ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h);
- ge2d_config_ex.dst_planes[1].w = d_canvas_w;
- ge2d_config_ex.dst_planes[1].h = d_canvas_h/4;
- ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4;
- ge2d_config_ex.dst_planes[2].w = d_canvas_w;
- ge2d_config_ex.dst_planes[2].h = d_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h)*5/4;
+ ge2d_config_ex.dst_planes[1].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[1].h = d_canvas_h/2;
+ ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h);
+ ge2d_config_ex.dst_planes[2].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[2].h = d_canvas_h/2;
} else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset;
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
@@ -399,12 +399,13 @@ static int ge2d_blit_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd;
ge2d_config_ex.src_planes[0].w = s_canvas_w;
ge2d_config_ex.src_planes[0].h = s_canvas_h;
- ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h);
- ge2d_config_ex.src_planes[1].w = s_canvas_w;
- ge2d_config_ex.src_planes[1].h = s_canvas_h/4;
- ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h)*5/4;
- ge2d_config_ex.src_planes[2].w = s_canvas_w;
- ge2d_config_ex.src_planes[2].h = s_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h)*5/4;
+ ge2d_config_ex.src_planes[1].w = s_canvas_w/2;
+ ge2d_config_ex.src_planes[1].h = s_canvas_h/2;
+ ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h);
+ ge2d_config_ex.src_planes[2].w = s_canvas_w/2;
+ ge2d_config_ex.src_planes[2].h = s_canvas_h/2;
} else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset;
ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd;
@@ -449,12 +450,13 @@ static int ge2d_blit_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
ge2d_config_ex.dst_planes[0].w = d_canvas_w;
ge2d_config_ex.dst_planes[0].h = d_canvas_h;
- ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h);
- ge2d_config_ex.dst_planes[1].w = d_canvas_w;
- ge2d_config_ex.dst_planes[1].h = d_canvas_h/4;
- ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4;
- ge2d_config_ex.dst_planes[2].w = d_canvas_w;
- ge2d_config_ex.dst_planes[2].h = d_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h)*5/4;
+ ge2d_config_ex.dst_planes[1].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[1].h = d_canvas_h/2;
+ ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h);
+ ge2d_config_ex.dst_planes[2].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[2].h = d_canvas_h/2;
} else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset;
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
@@ -655,12 +657,13 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd;
ge2d_config_ex.src_planes[0].w = s_canvas_w;
ge2d_config_ex.src_planes[0].h = s_canvas_h;
- ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h);
- ge2d_config_ex.src_planes[1].w = s_canvas_w;
- ge2d_config_ex.src_planes[1].h = s_canvas_h/4;
- ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h)*5/4;
- ge2d_config_ex.src_planes[2].w = s_canvas_w;
- ge2d_config_ex.src_planes[2].h = s_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.src_planes[1].addr = (s_canvas_w * s_canvas_h)*5/4;
+ ge2d_config_ex.src_planes[1].w = s_canvas_w/2;
+ ge2d_config_ex.src_planes[1].h = s_canvas_h/2;
+ ge2d_config_ex.src_planes[2].addr = (s_canvas_w * s_canvas_h);
+ ge2d_config_ex.src_planes[2].w = s_canvas_w/2;
+ ge2d_config_ex.src_planes[2].h = s_canvas_h/2;
} else if (input_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.src_planes[0].addr = input_buffer_info->offset;
ge2d_config_ex.src_planes[0].shared_fd = input_buffer_info->shared_fd;
@@ -706,12 +709,13 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd;
ge2d_config_ex.src2_planes[0].w = s2_canvas_w;
ge2d_config_ex.src2_planes[0].h = s2_canvas_h;
- ge2d_config_ex.src2_planes[1].addr = (s2_canvas_w * s2_canvas_h);
- ge2d_config_ex.src2_planes[1].w = s2_canvas_w;
- ge2d_config_ex.src2_planes[1].h = s2_canvas_h/4;
- ge2d_config_ex.src2_planes[2].addr = (s2_canvas_w * s2_canvas_h)*5/4;
- ge2d_config_ex.src2_planes[2].w = s2_canvas_w;
- ge2d_config_ex.src2_planes[2].h = s2_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.src2_planes[1].addr = (s2_canvas_w * s2_canvas_h)*5/4;
+ ge2d_config_ex.src2_planes[1].w = s2_canvas_w/2;
+ ge2d_config_ex.src2_planes[1].h = s2_canvas_h/2;
+ ge2d_config_ex.src2_planes[2].addr = (s2_canvas_w * s2_canvas_h);
+ ge2d_config_ex.src2_planes[2].w = s2_canvas_w/2;
+ ge2d_config_ex.src2_planes[2].h = s2_canvas_h/2;
} else if (input2_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.src2_planes[0].addr = input2_buffer_info->offset;
ge2d_config_ex.src2_planes[0].shared_fd = input2_buffer_info->shared_fd;
@@ -756,12 +760,13 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo)
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
ge2d_config_ex.dst_planes[0].w = d_canvas_w;
ge2d_config_ex.dst_planes[0].h = d_canvas_h;
- ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h);
- ge2d_config_ex.dst_planes[1].w = d_canvas_w;
- ge2d_config_ex.dst_planes[1].h = d_canvas_h/4;
- ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h)*5/4;
- ge2d_config_ex.dst_planes[2].w = d_canvas_w;
- ge2d_config_ex.dst_planes[2].h = d_canvas_h/4;
+ /* android is ycrcb,kernel is ycbcr,swap the addr */
+ ge2d_config_ex.dst_planes[1].addr = (d_canvas_w * d_canvas_h)*5/4;
+ ge2d_config_ex.dst_planes[1].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[1].h = d_canvas_h/2;
+ ge2d_config_ex.dst_planes[2].addr = (d_canvas_w * d_canvas_h);
+ ge2d_config_ex.dst_planes[2].w = d_canvas_w/2;
+ ge2d_config_ex.dst_planes[2].h = d_canvas_h/2;
} else if (output_buffer_info->format == PIXEL_FORMAT_YCbCr_422_SP) {
ge2d_config_ex.dst_planes[0].addr = output_buffer_info->offset;
ge2d_config_ex.dst_planes[0].shared_fd = output_buffer_info->shared_fd;
diff --git a/libge2d/include/ge2d_com.h b/libge2d/include/ge2d_com.h
index 1e18764..275ebd8 100644
--- a/libge2d/include/ge2d_com.h
+++ b/libge2d/include/ge2d_com.h
@@ -11,7 +11,7 @@
#include <cutils/log.h>
-#define __DEBUG
+//#define __DEBUG
#ifdef __DEBUG
#define D_GE2D(fmt, args...) ALOGD("GE2D Debug: " fmt, ## args)