ppmgr: add compatibility with doublewrite. [1/1]

PD#SWPL-9350

Problem:
For output with compressed and uncompressed formats,
ppmgr recognizes the compressed format and returns directly.

Solution:
add compatibility with doublewrite.

Verify:
on u212

Change-Id: I9fffa720deee80b5db4ef21086c4638a630f9a80
Signed-off-by: renjiang.han <renjiang.han@amlogic.com>
This commit is contained in:
renjiang.han
2019-06-12 17:06:39 +08:00
committed by Gongwei Chen
parent 1f4c27e21f
commit 26ca83e283
3 changed files with 171 additions and 739 deletions

View File

@@ -72,6 +72,7 @@ struct ppmgr_device_t {
struct io_mapping *mapping;
void __iomem *vir_addr;
struct platform_device *pdev;
unsigned int ppmgr_debug;
};
struct ppmgr_dev_reg_s {

View File

@@ -434,6 +434,30 @@ static ssize_t bypass_write(struct class *cla, struct class_attribute *attr,
return count;
}
static ssize_t ppmgr_debug_read(struct class *cla,
struct class_attribute *attr, char *buf)
{
return snprintf(buf,
80,
"current ppmgr_debug is %d\n",
ppmgr_device.ppmgr_debug);
}
static ssize_t ppmgr_debug_write(struct class *cla,
struct class_attribute *attr, const char *buf, size_t count)
{
long tmp;
int ret = kstrtol(buf, 0, &tmp);
if (ret != 0) {
PPMGRDRV_ERR("ERROR converting %s to long int!\n", buf);
return ret;
}
ppmgr_device.ppmgr_debug = tmp;
return count;
}
static ssize_t rect_read(struct class *cla, struct class_attribute *attr,
char *buf)
{
@@ -1264,6 +1288,10 @@ __ATTR(bypass,
0644,
bypass_read,
bypass_write),
__ATTR(ppmgr_debug,
0644,
ppmgr_debug_read,
ppmgr_debug_write),
__ATTR(disp,
0644,
@@ -1594,6 +1622,7 @@ int init_ppmgr_device(void)
ppmgr_device.tb_detect_period = 0;
ppmgr_device.tb_detect_buf_len = 8;
ppmgr_device.tb_detect_init_mute = 0;
ppmgr_device.ppmgr_debug = 0;
PPMGRDRV_INFO("ppmgr_dev major:%d\n", ret);
ppmgr_device.cla = init_ppmgr_cls();

View File

@@ -782,54 +782,83 @@ static void vf_rotate_adjust(struct vframe_s *vf, struct vframe_s *new_vf,
int angle)
{
int w = 0, h = 0, disp_w = 0, disp_h = 0;
int input_height = 0, input_width = 0;
int scale_down_value = 1;
int interlace_mode = 0;
#ifdef CONFIG_AMLOGIC_POST_PROCESS_MANAGER_3D_PROCESS
scale_down_value = ppmgr_device.scale_down + 1;
#endif
disp_w = ppmgr_device.disp_width / scale_down_value;
disp_h = ppmgr_device.disp_height / scale_down_value;
interlace_mode = vf->type & VIDTYPE_TYPEMASK;
input_width = vf->width;
if (interlace_mode)
input_height = vf->height * 2;
else
input_height = vf->height;
if (ppmgr_device.ppmgr_debug)
PPMGRVPP_INFO("disp_width: %d, disp_height: %d\n",
disp_w, disp_h);
if (angle & 1) {
int ar = (vf->ratio_control
>> DISP_RATIO_ASPECT_RATIO_BIT) & 0x3ff;
if (ppmgr_device.ppmgr_debug == 2)
ar = 0;
/* h = min((int)vf->width, disp_h); */
h = min_t(int, vf->width, disp_h);
if (input_width > input_height) {
h = min_t(int, input_width, disp_h);
if (ar == 0)
w = vf->height * h / vf->width;
else
w = (ar * h) >> 8;
if (ar == 0 || ar == 0x3ff)
w = input_height * h / input_width;
else
w = (ar * h) >> 8;
if (w > disp_w) {
h = (h * disp_w) / w;
w = disp_w;
if (w > disp_w) {
h = (h * disp_w) / w;
w = disp_w;
}
} else {
w = min_t(int, input_height, disp_w);
if (ar == 0 || ar == 0x3ff)
h = input_width * w / input_height;
else
h = (w << 8) / ar;
if (h > disp_h) {
w = (w * disp_h) / h;
h = disp_h;
}
}
if (ppmgr_device.ppmgr_debug)
PPMGRVPP_INFO("width: %d, height: %d, ar: %d\n",
w, h, ar);
new_vf->ratio_control = DISP_RATIO_PORTRAIT_MODE;
new_vf->ratio_control |=
(h * 0x100 / w) << DISP_RATIO_ASPECT_RATIO_BIT;
/*set video aspect ratio*/
} else {
if ((vf->width < disp_w) && (vf->height < disp_h)) {
w = vf->width;
h = vf->height;
if ((input_width < disp_w) && (input_height < disp_h)) {
w = input_width;
h = input_height;
} else {
if ((vf->width * disp_h) > (disp_w * vf->height)) {
if ((input_width * disp_h) > (disp_w * input_height)) {
w = disp_w;
h = disp_w * vf->height / vf->width;
h = disp_w * input_height / input_width;
} else {
h = disp_h;
w = disp_h * vf->width / vf->height;
w = disp_h * input_width / input_height;
}
}
new_vf->ratio_control = vf->ratio_control;
}
if (h > 1080) {
w = w * 1080 / h;
h = 1080;
if (h > 1280) {
w = w * 1280 / h;
h = 1280;
}
new_vf->width = w;
@@ -1060,609 +1089,9 @@ static int process_vf_tb_detect(struct vframe_s *vf,
}
#endif
static int process_vf_deinterlace_nv21(struct vframe_s *vf,
struct ge2d_context_s *context,
struct config_para_ex_s *ge2d_config)
{
struct canvas_s cs0, cs1, cs2, cd;
if (!vf)
return -1;
if (vf->type & VIDTYPE_MVC)
return 0;
if (vf->type & VIDTYPE_COMPRESS)
return 0;
if ((vf->canvas0Addr == vf->canvas1Addr) || (ppmgr_device.angle == 0)) {
/*printk("++ppmgr interlace skip.\n");*/
return 0;
}
/* operation top line*/
/* Y data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read(vf->canvas0Addr & 0xff, &cs0);
canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1);
canvas_read((vf->canvas0Addr >> 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[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(PPMGR_DEINTERLACE_BUF_NV21_CANVAS, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = vf->canvas0Addr;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FORMAT_M24_NV21;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width;
ge2d_config->src_para.height = vf->height / 2;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_NV21_CANVAS;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = (GE2D_FORMAT_S24_YUV444T & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width;
ge2d_config->dst_para.height = vf->height / 2;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width, vf->height / 2, 0, 0,
vf->width, vf->height / 2);
/* operation bottom line*/
/*Y data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read(vf->canvas1Addr & 0xff, &cs0);
canvas_read((vf->canvas1Addr >> 8) & 0xff, &cs1);
canvas_read((vf->canvas1Addr >> 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[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(PPMGR_DEINTERLACE_BUF_NV21_CANVAS, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = vf->canvas1Addr;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FORMAT_M24_NV21;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width;
ge2d_config->src_para.height = vf->height / 2;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_NV21_CANVAS;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = (GE2D_FORMAT_S24_YUV444B & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width;
ge2d_config->dst_para.height = vf->height / 2;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width, vf->height / 2, 0, 0,
vf->width, vf->height / 2);
return 2;
}
static int process_vf_deinterlace(struct vframe_s *vf,
struct ge2d_context_s *context,
struct config_para_ex_s *ge2d_config)
{
struct canvas_s cs, cd;
int ret = 0;
if (!vf)
return -1;
if (vf->type & VIDTYPE_MVC)
return 0;
if (vf->type & VIDTYPE_COMPRESS)
return 0;
if ((vf->canvas0Addr == vf->canvas1Addr) || (ppmgr_device.bypass)
|| (ppmgr_device.angle == 0)) {
/*printk("++ppmgr interlace skip.\n");*/
return 0;
}
if (vf->type & VIDTYPE_VIU_NV21) {
ret = process_vf_deinterlace_nv21(vf, context, ge2d_config);
return ret;
}
/* operation top line*/
/* Y data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read(vf->canvas0Addr & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = vf->canvas0Addr & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_Y;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width;
ge2d_config->src_para.height = vf->height / 2;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_Y
| (GE2D_FORMAT_M24_YUV420T & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width;
ge2d_config->dst_para.height = vf->height / 2;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width, vf->height / 2, 0, 0,
vf->width, vf->height / 2);
/*U data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 1, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = (vf->canvas0Addr >> 8) & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_CB;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width / 2;
ge2d_config->src_para.height = vf->height / 4;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS + 1;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_CB
| (GE2D_FORMAT_M24_YUV420T & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width / 2;
ge2d_config->dst_para.height = vf->height / 4;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width / 2, vf->height / 4, 0, 0,
vf->width / 2, vf->height / 4);
/*V data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read((vf->canvas0Addr >> 16) & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 2, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = (vf->canvas0Addr >> 16) & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_CR;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width / 2;
ge2d_config->src_para.height = vf->height / 4;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS + 2;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_CR
| (GE2D_FORMAT_M24_YUV420T & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width / 2;
ge2d_config->dst_para.height = vf->height / 4;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width / 2, vf->height / 4, 0, 0,
vf->width / 2, vf->height / 4);
/* operation bottom line*/
/*Y data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read(vf->canvas1Addr & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = vf->canvas1Addr & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_Y;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width;
ge2d_config->src_para.height = vf->height / 2;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_Y
| (GE2D_FORMAT_M24_YUV420B & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width;
ge2d_config->dst_para.height = vf->height / 2;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width, vf->height / 2, 0, 0,
vf->width, vf->height / 2);
/*U data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read((vf->canvas1Addr >> 8) & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 1, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = (vf->canvas1Addr >> 8) & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_CB;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width / 2;
ge2d_config->src_para.height = vf->height / 4;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS + 1;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_CB
| (GE2D_FORMAT_M24_YUV420B & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width / 2;
ge2d_config->dst_para.height = vf->height / 4;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width / 2, vf->height / 4, 0, 0,
vf->width / 2, vf->height / 4);
/*V data*/
ge2d_config->alu_const_color = 0;
ge2d_config->bitmask_en = 0;
ge2d_config->src1_gb_alpha = 0;
ge2d_config->dst_xy_swap = 0;
canvas_read((vf->canvas1Addr >> 16) & 0xff, &cs);
ge2d_config->src_planes[0].addr = cs.addr;
ge2d_config->src_planes[0].w = cs.width;
ge2d_config->src_planes[0].h = cs.height;
ge2d_config->src_planes[1].addr = 0;
ge2d_config->src_planes[1].w = 0;
ge2d_config->src_planes[1].h = 0;
ge2d_config->src_planes[2].addr = 0;
ge2d_config->src_planes[2].w = 0;
ge2d_config->src_planes[2].h = 0;
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 2, &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[1].addr = 0;
ge2d_config->dst_planes[1].w = 0;
ge2d_config->dst_planes[1].h = 0;
ge2d_config->dst_planes[2].addr = 0;
ge2d_config->dst_planes[2].w = 0;
ge2d_config->dst_planes[2].h = 0;
ge2d_config->src_key.key_enable = 0;
ge2d_config->src_key.key_mask = 0;
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_key.key_color = 0;
ge2d_config->src_para.canvas_index = (vf->canvas1Addr >> 16) & 0xff;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->src_para.format = GE2D_FMT_S8_CR;
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
ge2d_config->src_para.y_rev = 0;
ge2d_config->src_para.color = 0;
ge2d_config->src_para.top = 0;
ge2d_config->src_para.left = 0;
ge2d_config->src_para.width = vf->width / 2;
ge2d_config->src_para.height = vf->height / 4;
ge2d_config->dst_para.canvas_index = PPMGR_DEINTERLACE_BUF_CANVAS + 2;
ge2d_config->dst_para.mem_type = CANVAS_TYPE_INVALID;
ge2d_config->dst_para.format = GE2D_FMT_S8_CR
| (GE2D_FORMAT_M24_YUV420B & (3 << 3));
ge2d_config->dst_para.fill_color_en = 0;
ge2d_config->dst_para.fill_mode = 0;
ge2d_config->dst_para.x_rev = 0;
ge2d_config->dst_para.y_rev = 0;
ge2d_config->dst_xy_swap = 0;
ge2d_config->dst_para.color = 0;
ge2d_config->dst_para.top = 0;
ge2d_config->dst_para.left = 0;
ge2d_config->dst_para.width = vf->width / 2;
ge2d_config->dst_para.height = vf->height / 4;
if (ge2d_context_config_ex(context, ge2d_config) < 0) {
PPMGRVPP_ERR("++ge2d configing error.\n");
return -1;
}
stretchblt_noalpha(context, 0, 0, vf->width / 2, vf->height / 4, 0, 0,
vf->width / 2, vf->height / 4);
/*printk("++ppmgr interlace success.\n");*/
return 1;
}
static void process_vf_rotate(struct vframe_s *vf,
struct ge2d_context_s *context,
struct config_para_ex_s *ge2d_config,
int deinterlace)
struct config_para_ex_s *ge2d_config)
{
struct vframe_s *new_vf;
struct ppframe_s *pp_vf;
@@ -1736,9 +1165,37 @@ static void process_vf_rotate(struct vframe_s *vf,
if (vf->type & VIDTYPE_MVC)
pp_vf->dec_frame = vf;
if (vf->type & VIDTYPE_COMPRESS)
pp_vf->dec_frame = vf;
if (vf->type & VIDTYPE_COMPRESS) {
if (vf->canvas0Addr != (u32)-1) {
canvas_copy(vf->canvas0Addr & 0xff,
PPMGR2_CANVAS_INDEX_SRC);
canvas_copy((vf->canvas0Addr >> 8) & 0xff,
PPMGR2_CANVAS_INDEX_SRC + 1);
canvas_copy((vf->canvas0Addr >> 16) & 0xff,
PPMGR2_CANVAS_INDEX_SRC + 2);
} else if (vf->plane_num > 0) {
canvas_config_config(PPMGR2_CANVAS_INDEX_SRC,
&vf->canvas0_config[0]);
if (vf->plane_num == 2) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 1,
&vf->canvas0_config[1]);
} else if (vf->plane_num == 3) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 2,
&vf->canvas0_config[2]);
}
vf->canvas0Addr =
(PPMGR2_CANVAS_INDEX_SRC)
| ((PPMGR2_CANVAS_INDEX_SRC + 1) << 8)
| ((PPMGR2_CANVAS_INDEX_SRC + 2) << 16);
} else {
pp_vf->dec_frame = vf;
if (ppmgr_device.ppmgr_debug)
PPMGRVPP_INFO("vframe is compress!\n");
}
}
if (pp_vf->dec_frame) {
/* bypass mode */
*new_vf = *vf;
@@ -1791,6 +1248,7 @@ static void process_vf_rotate(struct vframe_s *vf,
if ((interlace_mode == VIDTYPE_INTERLACE_TOP)
|| (interlace_mode == VIDTYPE_INTERLACE_BOTTOM))
vf->height >>= 1;
#ifndef CONFIG_AMLOGIC_POST_PROCESS_MANAGER_PPSCALER
vf_rotate_adjust(vf, new_vf, cur_angle);
#else
@@ -2054,116 +1512,63 @@ static void process_vf_rotate(struct vframe_s *vf,
ge2d_config->src_key.key_mode = 0;
ge2d_config->src_para.mem_type = CANVAS_TYPE_INVALID;
if (deinterlace) {
switch (deinterlace) {
case 1:
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS, &cs0);
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 1, &cs1);
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 2, &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[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;
ge2d_config->src_para.canvas_index =
(PPMGR_DEINTERLACE_BUF_CANVAS)
| ((PPMGR_DEINTERLACE_BUF_CANVAS + 1) << 8)
| ((PPMGR_DEINTERLACE_BUF_CANVAS + 2) << 16);
src_vf = *vf;
if (vf->canvas0Addr == (u32)-1) {
canvas_config_config(PPMGR2_CANVAS_INDEX_SRC,
&src_vf.canvas0_config[0]);
if (src_vf.plane_num == 2) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 1,
&src_vf.canvas0_config[1]);
ge2d_config->src_para.format = GE2D_FORMAT_M24_YUV420;
break;
case 2:
canvas_read(PPMGR_DEINTERLACE_BUF_NV21_CANVAS, &cs0);
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_para.canvas_index =
PPMGR_DEINTERLACE_BUF_NV21_CANVAS;
ge2d_config->src_para.format = GE2D_FORMAT_M24_YUV444;
break;
default:
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS, &cs0);
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 1, &cs1);
canvas_read(PPMGR_DEINTERLACE_BUF_CANVAS + 2, &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[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;
ge2d_config->src_para.canvas_index =
(PPMGR_DEINTERLACE_BUF_CANVAS)
| ((PPMGR_DEINTERLACE_BUF_CANVAS + 1) << 8)
| ((PPMGR_DEINTERLACE_BUF_CANVAS + 2) << 16);
ge2d_config->src_para.format = GE2D_FORMAT_M24_YUV420;
break;
} else if (src_vf.plane_num == 3) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 2,
&src_vf.canvas0_config[2]);
}
src_vf.canvas0Addr =
(PPMGR2_CANVAS_INDEX_SRC)
| ((PPMGR2_CANVAS_INDEX_SRC + 1) << 8)
| ((PPMGR2_CANVAS_INDEX_SRC + 2) << 16);
ge2d_config->src_planes[0].addr =
src_vf.canvas0_config[0].phy_addr;
ge2d_config->src_planes[0].w =
src_vf.canvas0_config[0].width;
ge2d_config->src_planes[0].h =
src_vf.canvas0_config[0].height;
ge2d_config->src_planes[1].addr =
src_vf.canvas0_config[1].phy_addr;
ge2d_config->src_planes[1].w =
src_vf.canvas0_config[1].width;
ge2d_config->src_planes[1].h =
src_vf.canvas0_config[1].height << 1;
if (src_vf.plane_num == 3) {
ge2d_config->src_planes[2].addr =
src_vf.canvas0_config[2].phy_addr;
ge2d_config->src_planes[2].w =
src_vf.canvas0_config[2].width;
ge2d_config->src_planes[2].h =
src_vf.canvas0_config[2].height << 1;
}
ge2d_config->src_para.canvas_index = src_vf.canvas0Addr;
} else {
src_vf = *vf;
if (vf->canvas0Addr == (u32)-1) {
canvas_config_config(PPMGR2_CANVAS_INDEX_SRC,
&src_vf.canvas0_config[0]);
if (src_vf.plane_num == 2) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 1,
&src_vf.canvas0_config[1]);
} else if (src_vf.plane_num == 3) {
canvas_config_config(
PPMGR2_CANVAS_INDEX_SRC + 2,
&src_vf.canvas0_config[2]);
}
src_vf.canvas0Addr =
(PPMGR2_CANVAS_INDEX_SRC)
| ((PPMGR2_CANVAS_INDEX_SRC + 1) << 8)
| ((PPMGR2_CANVAS_INDEX_SRC + 2) << 16);
ge2d_config->src_planes[0].addr =
src_vf.canvas0_config[0].phy_addr;
ge2d_config->src_planes[0].w =
src_vf.canvas0_config[0].width;
ge2d_config->src_planes[0].h =
src_vf.canvas0_config[0].height;
ge2d_config->src_planes[1].addr =
src_vf.canvas0_config[1].phy_addr;
ge2d_config->src_planes[1].w =
src_vf.canvas0_config[1].width;
ge2d_config->src_planes[1].h =
src_vf.canvas0_config[1].height << 1;
if (src_vf.plane_num == 3) {
ge2d_config->src_planes[2].addr =
src_vf.canvas0_config[2].phy_addr;
ge2d_config->src_planes[2].w =
src_vf.canvas0_config[2].width;
ge2d_config->src_planes[2].h =
src_vf.canvas0_config[2].height << 1;
}
ge2d_config->src_para.canvas_index = src_vf.canvas0Addr;
} else {
canvas_read(vf->canvas0Addr & 0xff, &cs0);
canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1);
canvas_read((vf->canvas0Addr >> 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[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;
ge2d_config->src_para.canvas_index = vf->canvas0Addr;
}
ge2d_config->src_para.format = get_input_format(vf);
canvas_read(vf->canvas0Addr & 0xff, &cs0);
canvas_read((vf->canvas0Addr >> 8) & 0xff, &cs1);
canvas_read((vf->canvas0Addr >> 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[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;
ge2d_config->src_para.canvas_index = vf->canvas0Addr;
}
ge2d_config->src_para.format = get_input_format(vf);
ge2d_config->src_para.fill_color_en = 0;
ge2d_config->src_para.fill_mode = 0;
ge2d_config->src_para.x_rev = 0;
@@ -2905,9 +2310,11 @@ static int ppmgr_task(void *data)
vf = get_cur_dispbuf();
if (!is_valid_ppframe(to_ppframe(vf)))
continue;
if (vf && (vf->type & VIDTYPE_COMPRESS))
if ((vf->type & VIDTYPE_COMPRESS) &&
(vf->plane_num < 1) &&
(vf->canvas0Addr == (u32)-1)) {
continue;
}
if (vf) {
if (process_vf_adjust(vf,
context,
@@ -2933,9 +2340,11 @@ static int ppmgr_task(void *data)
vf = get_cur_dispbuf();
if (!is_valid_ppframe(to_ppframe(vf)))
continue;
if (vf->type & VIDTYPE_COMPRESS)
if ((vf->type & VIDTYPE_COMPRESS) &&
(vf->plane_num < 1) &&
(vf->canvas0Addr == (u32)-1)) {
continue;
}
process_vf_change(vf, context, &ge2d_config);
vf_notify_receiver(
PROVIDER_NAME,
@@ -3015,11 +2424,6 @@ static int ppmgr_task(void *data)
if (process_type == TYPE_NONE) {
int ret = 0;
if (platform_type != PLATFORM_TV)
ret = process_vf_deinterlace(vf,
context,
&ge2d_config);
process_vf_rotate(vf,
context,
&ge2d_config,
@@ -3312,11 +2716,9 @@ SKIP_DETECT:
skip_picture =
ppmgr_device.tb_detect_period;
#endif
ret = process_vf_deinterlace(vf, context, &ge2d_config);
process_vf_rotate(
vf, context,
&ge2d_config,
(ret > 0) ? ret : 0);
&ge2d_config);
#endif
vf_notify_receiver(
PROVIDER_NAME,