summaryrefslogtreecommitdiff
authorRico Yang <wei.yang@amlogic.com>2019-11-25 15:45:36 (GMT)
committer Zhi Zhou <zhi.zhou@amlogic.com>2019-11-27 15:42:42 (GMT)
commit6ecf0542c8fb767509ddbde1c2c5a90ce03629a1 (patch)
tree0d525f583d92ea4340ffbd29be20496df8cc6e3e
parentb0d2d512bdef6279acef5ecf52a18b84c12b82f7 (diff)
downloadmedia_modules-6ecf0542c8fb767509ddbde1c2c5a90ce03629a1.zip
media_modules-6ecf0542c8fb767509ddbde1c2c5a90ce03629a1.tar.gz
media_modules-6ecf0542c8fb767509ddbde1c2c5a90ce03629a1.tar.bz2
h264_enc: set colorspace to bt709 for 720p and above [1/1]
PD#SWPL-15982 Problem: h264 encoder set colorspace to bt709 for all resolution Solution: set colorspace to bt709 for 720p and above only Verify: verified on franklin Change-Id: Ic1755181681de32750473548f96a25c05fa10044 Signed-off-by: Rico Yang <wei.yang@amlogic.com>
Diffstat
-rw-r--r--drivers/frame_sink/encoder/h264/encoder.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/drivers/frame_sink/encoder/h264/encoder.c b/drivers/frame_sink/encoder/h264/encoder.c
index 7b83dd2..dbc3dc7 100644
--- a/drivers/frame_sink/encoder/h264/encoder.c
+++ b/drivers/frame_sink/encoder/h264/encoder.c
@@ -1067,6 +1067,8 @@ static int scale_frame(struct encode_wq_s *wq,
src_left = request->crop_left;
src_width = request->src_w - src_left - request->crop_right;
src_height = request->src_h - src_top - request->crop_bottom;
+ pr_err("request->fmt=%d, %d %d, canvas=%d\n", request->fmt, FMT_NV21, FMT_BGR888, canvas);
+
if (canvas) {
if ((request->fmt == FMT_NV21)
|| (request->fmt == FMT_NV12)) {
@@ -1075,6 +1077,9 @@ static int scale_frame(struct encode_wq_s *wq,
} else if (request->fmt == FMT_BGR888) {
src_canvas = src_addr & 0xffffff;
input_format = GE2D_FORMAT_S24_RGB; //Opposite color after ge2d
+ } else if (request->fmt == FMT_RGBA8888) {
+ src_canvas = src_addr & 0xffffff;
+ input_format = GE2D_FORMAT_S32_ABGR;
} else {
src_canvas = src_addr & 0xffffff;
input_format = GE2D_FORMAT_M24_YUV420;
@@ -1101,6 +1106,7 @@ static int scale_frame(struct encode_wq_s *wq,
} else if (request->fmt == FMT_BGR888) {
src_canvas_w =
((request->src_w + 31) >> 5) << 5;
+
canvas_config(ENC_CANVAS_OFFSET + 9,
src_addr,
src_canvas_w * 3, src_h,
@@ -1108,6 +1114,18 @@ static int scale_frame(struct encode_wq_s *wq,
CANVAS_BLKMODE_LINEAR);
src_canvas = ENC_CANVAS_OFFSET + 9;
input_format = GE2D_FORMAT_S24_RGB; //Opposite color after ge2d
+ } else if (request->fmt == FMT_RGBA8888) {
+ src_canvas_w =
+ ((request->src_w + 31) >> 5) << 5;
+ canvas_config(
+ ENC_CANVAS_OFFSET + 9,
+ src_addr,
+ src_canvas_w * 4,
+ src_h,
+ CANVAS_ADDR_NOWRAP,
+ CANVAS_BLKMODE_LINEAR);
+ src_canvas = ENC_CANVAS_OFFSET + 9;
+ input_format = GE2D_FORMAT_S32_ABGR; //Opposite color after ge2d
} else {
src_canvas_w =
((request->src_w + 63) >> 6) << 6;
@@ -1133,17 +1151,22 @@ static int scale_frame(struct encode_wq_s *wq,
input_format = GE2D_FORMAT_M24_YUV420;
}
}
+
dst_canvas_w = ((dst_w + 31) >> 5) << 5;
+
canvas_config(ENC_CANVAS_OFFSET + 6,
wq->mem.scaler_buff_start_addr,
dst_canvas_w, dst_h,
CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
+
canvas_config(ENC_CANVAS_OFFSET + 7,
wq->mem.scaler_buff_start_addr + dst_canvas_w * dst_h,
dst_canvas_w, dst_h / 2,
CANVAS_ADDR_NOWRAP, CANVAS_BLKMODE_LINEAR);
+
dst_canvas = ((ENC_CANVAS_OFFSET + 7) << 8) |
(ENC_CANVAS_OFFSET + 6);
+
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
@@ -1152,18 +1175,20 @@ static int scale_frame(struct encode_wq_s *wq,
canvas_read((src_canvas >> 8) & 0xff, &cs1);
canvas_read((src_canvas >> 16) & 0xff, &cs2);
ge2d_config->src_planes[0].addr = cs0.addr;
- ge2d_config->src_planes[0].w = cs0.width;
- ge2d_config->src_planes[0].h = cs0.height;
+ ge2d_config->src_planes[0].w = dst_w * 4;//cs0.width;
+ ge2d_config->src_planes[0].h = dst_h;//cs0.height;
ge2d_config->src_planes[1].addr = cs1.addr;
ge2d_config->src_planes[1].w = cs1.width;
ge2d_config->src_planes[1].h = cs1.height;
ge2d_config->src_planes[2].addr = cs2.addr;
ge2d_config->src_planes[2].w = cs2.width;
ge2d_config->src_planes[2].h = cs2.height;
+
canvas_read(dst_canvas & 0xff, &cd);
+
ge2d_config->dst_planes[0].addr = cd.addr;
- ge2d_config->dst_planes[0].w = cd.width;
- ge2d_config->dst_planes[0].h = cd.height;
+ ge2d_config->dst_planes[0].w = dst_w * 4;//cd.width;
+ ge2d_config->dst_planes[0].h = dst_h;//cd.height;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
@@ -1177,13 +1202,18 @@ static int scale_frame(struct encode_wq_s *wq,
ge2d_config->src_para.color = 0xffffffff;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
- ge2d_config->src_para.width = request->src_w;
- ge2d_config->src_para.height = request->src_h;
+ ge2d_config->src_para.width = dst_w;//request->src_w;
+ ge2d_config->src_para.height = dst_h;//request->src_h;
ge2d_config->src2_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.canvas_index = dst_canvas;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format =
GE2D_FORMAT_M24_NV21 | GE2D_LITTLE_ENDIAN;
+
+ if (wq->pic.encoder_width >= 1280 && wq->pic.encoder_height >= 720) {
+ ge2d_config->dst_para.format |= GE2D_FORMAT_BT_STANDARD;
+ }
+
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
@@ -1196,6 +1226,7 @@ static int scale_frame(struct encode_wq_s *wq,
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
+
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
pr_err("++ge2d configing error.\n");
return -1;
@@ -1225,6 +1256,7 @@ static s32 set_input_format(struct encode_wq_s *wq,
picsize_x = ((wq->pic.encoder_width + 15) >> 4) << 4;
picsize_y = ((wq->pic.encoder_height + 15) >> 4) << 4;
oformat = 0;
+
if ((request->type == LOCAL_BUFF)
|| (request->type == PHYSICAL_BUFF)
|| (request->type == DMA_BUFF)) {
@@ -2670,6 +2702,17 @@ static s32 convert_request(struct encode_wq_s *wq, u32 *cmd_info)
wq->request.src_w = cmd_info[13];
wq->request.src_h = cmd_info[14];
wq->request.scale_enable = cmd_info[15];
+
+ pr_err("hwenc: wq->pic.encoder_width:%d, wq->pic.encoder_height:%d, request fmt=%d\n",
+ wq->pic.encoder_width, wq->pic.encoder_height, wq->request.fmt);
+
+ if (wq->pic.encoder_width >= 1280 && wq->pic.encoder_height >= 720 && wq->request.fmt == FMT_RGBA8888) {
+ wq->request.scale_enable = 1;
+ wq->request.src_w = wq->pic.encoder_width;
+ wq->request.src_h = wq->pic.encoder_height;
+ pr_err("hwenc: force wq->request.scale_enable=%d\n", wq->request.scale_enable);
+ }
+
wq->request.nr_mode =
(nr_mode > 0) ? nr_mode : cmd_info[16];
if (cmd == ENCODER_IDR)
@@ -3216,6 +3259,7 @@ static long amvenc_avc_ioctl(struct file *file, u32 cmd, ulong arg)
wq->mem.bufspec.max_height, (void *)wq);
return -1;
}
+ pr_err("hwenc: AMVENC_AVC_IOC_CONFIG_INIT: w:%d, h:%d\n", wq->pic.encoder_width, wq->pic.encoder_height);
wq->pic.encoder_width = addr_info[2];
wq->pic.encoder_height = addr_info[3];
if (wq->pic.encoder_width *