nt9856x/code/application/source/cardv/SrcCode/UIApp/AppDisp_PipView.c
2023-03-28 15:07:53 +08:00

756 lines
28 KiB
C
Executable File

#include "vf_gfx.h"
#include <kwrap/error_no.h>
#include "System/SysCommon.h"
#include "System/SysMain.h"
#include "UIApp/Movie/UIAppMovie.h"
#include "UIWnd/UIFlow.h"
//#include "UIWnd/SPORTCAM/UIInfo/UIInfo.h"
#include "AppDisp_PipView.h"
///////////////////////////////////////////////////////////////////////////////
#define __MODULE__ PipView
#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
#include <kwrap/debug.h>
///////////////////////////////////////////////////////////////////////////////
void PipView_SetStyle(UINT32 uiStyle)
{
if (uiStyle >= DUALCAM_SETTING_MAX) {
uiStyle = DUALCAM_FRONT;
}
UI_SetData(FL_DUAL_CAM, uiStyle);
UI_SetData(FL_DUAL_CAM_MENU, uiStyle);
}
INT32 PipView_CopyData(HD_VIDEO_FRAME *pSrcImg, IRECT *pSrcRegion, HD_VIDEO_FRAME *pDstImg, IRECT *pDstRegion)
{
HD_RESULT hd_ret;
VF_GFX_COPY vf_copy = {0};
// set src
if ((hd_ret = vf_init_ex(&vf_copy.src_img, pSrcImg->dim.w, pSrcImg->dim.h, pSrcImg->pxlfmt, pSrcImg->loff, pSrcImg->phy_addr)) != HD_OK) {
//if ((hd_ret = vf_init(&vf_copy.src_img, pSrcImg->dim.w, pSrcImg->dim.h, pSrcImg->pxlfmt, pSrcImg->loff[0], pSrcImg->phy_addr[0], pSrcImg->loff[0]*pSrcImg->dim.h*3/2)) != HD_OK) {
DBG_ERR("vf_init_ex src failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set dest
if ((hd_ret = vf_init_ex(&vf_copy.dst_img, pDstImg->dim.w, pDstImg->dim.h, pDstImg->pxlfmt, pDstImg->loff, pDstImg->phy_addr)) != HD_OK) {
//if ((hd_ret = vf_init(&vf_copy.dst_img, pDstImg->dim.w, pDstImg->dim.h, pDstImg->pxlfmt, pDstImg->loff[0], pDstImg->phy_addr[0], pDstImg->loff[0]*pDstImg->dim.h*3/2)) != HD_OK) {
DBG_ERR("vf_init_ex dst failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set config
vf_copy.engine = 0;
vf_copy.alpha = 255;
if (pSrcRegion == REGION_MATCH_IMG) {
vf_copy.src_region.x = 0;
vf_copy.src_region.y = 0;
vf_copy.src_region.w = pSrcImg->dim.w;
vf_copy.src_region.h = pSrcImg->dim.h;
} else {
vf_copy.src_region.x = pSrcRegion->x;
vf_copy.src_region.y = pSrcRegion->y;
vf_copy.src_region.w = pSrcRegion->w;
vf_copy.src_region.h = pSrcRegion->h;
}
if (pDstRegion == REGION_MATCH_IMG) {
vf_copy.dst_pos.x = 0;
vf_copy.dst_pos.y = 0;
} else {
vf_copy.dst_pos.x = pDstRegion->x;
vf_copy.dst_pos.y = pDstRegion->y;
}
if ((hd_ret = vf_gfx_copy(&vf_copy)) != HD_OK) {
DBG_ERR("vf_gfx_copy failed(%d)\r\n", hd_ret);
}
return E_OK;
}
INT32 PipView_ScaleData(HD_VIDEO_FRAME *pSrcImg, IRECT *pSrcRegion, HD_VIDEO_FRAME *pDstImg, IRECT *pDstRegion)
{
HD_RESULT hd_ret;
VF_GFX_SCALE vf_scale = {0};
// set src
if ((hd_ret = vf_init_ex(&vf_scale.src_img, pSrcImg->dim.w, pSrcImg->dim.h, pSrcImg->pxlfmt, pSrcImg->loff, pSrcImg->phy_addr)) != HD_OK) {
DBG_ERR("vf_init_ex src failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set dest
if ((hd_ret = vf_init_ex(&vf_scale.dst_img, pDstImg->dim.w, pDstImg->dim.h, pDstImg->pxlfmt, pDstImg->loff, pDstImg->phy_addr)) != HD_OK) {
DBG_ERR("vf_init_ex dst failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set config
vf_scale.engine = 0;
if (pSrcRegion == REGION_MATCH_IMG) {
vf_scale.src_region.x = 0;
vf_scale.src_region.y = 0;
vf_scale.src_region.w = pSrcImg->dim.w;
vf_scale.src_region.h = pSrcImg->dim.h;
} else {
vf_scale.src_region.x = pSrcRegion->x;
vf_scale.src_region.y = pSrcRegion->y;
vf_scale.src_region.w = pSrcRegion->w;
vf_scale.src_region.h = pSrcRegion->h;
}
if (pDstRegion == REGION_MATCH_IMG) {
vf_scale.dst_region.x = 0;
vf_scale.dst_region.y = 0;
vf_scale.dst_region.w = pDstImg->dim.w;
vf_scale.dst_region.h = pDstImg->dim.h;
} else {
vf_scale.dst_region.x = pDstRegion->x;
vf_scale.dst_region.y = pDstRegion->y;
vf_scale.dst_region.w = pDstRegion->w;
vf_scale.dst_region.h = pDstRegion->h;
}
vf_scale.quality = HD_GFX_SCALE_QUALITY_BILINEAR;
if ((hd_ret = vf_gfx_scale(&vf_scale, 1)) != HD_OK) {
DBG_ERR("vf_gfx_scale failed(%d)\r\n", hd_ret);
}
return E_OK;
}
INT32 PipView_FillDataBlack(HD_VIDEO_FRAME *pDstImg, IRECT *pDstRegion)
{
//return E_OK;
VF_GFX_DRAW_RECT fill_rect = {0};
HD_RESULT hd_ret;
memcpy((void *)&(fill_rect.dst_img), (void *)(pDstImg), sizeof(HD_VIDEO_FRAME));
fill_rect.color = COLOR_RGB_BLACK;
if (pDstRegion != REGION_MATCH_IMG) {
fill_rect.rect.x = pDstRegion->x;
fill_rect.rect.y = pDstRegion->y;
fill_rect.rect.w = pDstRegion->w;
fill_rect.rect.h = pDstRegion->h;
}else{
fill_rect.rect.x = 0;
fill_rect.rect.y = 0;
fill_rect.rect.w = pDstImg->dim.w;
fill_rect.rect.h = pDstImg->dim.h;
}
fill_rect.type = HD_GFX_RECT_SOLID;
fill_rect.thickness = 0;
fill_rect.engine = 0;
if ((hd_ret = vf_gfx_draw_rect(&fill_rect)) != HD_OK) {
DBG_ERR("vf_gfx_draw_rect failed(%d)\r\n", hd_ret);
}
return E_OK;
}
INT32 PipView_RotateData(HD_VIDEO_FRAME *pSrcImg, IRECT *pSrcRegion, HD_VIDEO_FRAME *pDstImg, IPOINT *pDstLocation, UINT32 RotateDir)
{
HD_RESULT hd_ret;
VF_GFX_ROTATE vf_rotate = {0};
// set src
if ((hd_ret = vf_init_ex(&vf_rotate.src_img, pSrcImg->dim.w, pSrcImg->dim.h, pSrcImg->pxlfmt, pSrcImg->loff, pSrcImg->phy_addr)) != HD_OK) {
DBG_ERR("vf_init_ex src failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set dest
if ((hd_ret = vf_init_ex(&vf_rotate.dst_img, pDstImg->dim.w, pDstImg->dim.h, pDstImg->pxlfmt, pDstImg->loff, pDstImg->phy_addr)) != HD_OK) {
DBG_ERR("vf_init_ex dst failed(%d)\r\n", hd_ret);
return E_SYS;
}
// set config
if (pSrcRegion == REGION_MATCH_IMG) {
vf_rotate.src_region.x = 0;
vf_rotate.src_region.y = 0;
vf_rotate.src_region.w = pSrcImg->dim.w;
vf_rotate.src_region.h = pSrcImg->dim.h;
} else {
vf_rotate.src_region.x = pSrcRegion->x;
vf_rotate.src_region.y = pSrcRegion->y;
vf_rotate.src_region.w = pSrcRegion->w;
vf_rotate.src_region.h = pSrcRegion->h;
}
vf_rotate.dst_pos.x = pDstLocation->x;
vf_rotate.dst_pos.y = pDstLocation->y;
vf_rotate.angle = RotateDir;
if ((hd_ret = vf_gfx_rotate(&vf_rotate)) != HD_OK) {
DBG_ERR("vf_gfx_rotate failed(%d)\r\n", hd_ret);
return E_SYS;
}
return E_OK;
}
INT32 PipView_OnDraw_2sensor(APPDISP_VIEW_DRAW *pDraw)
{
//IRECT src_region;
IRECT dst_region;
UINT32 dual_cam;
#if (DUALCAM_PIP_BEHIND_FLIP)
IPOINT dstLocation = {0, 0};
#endif
if (1)//(pDraw->viewcnt == 2)
{
//dual_cam = UI_GetData(FL_DUAL_CAM);
dual_cam = (System_GetState(SYS_STATE_CURRMODE) == PRIMARY_MODE_MOVIE) ? MovieExe_GetPipStyle(): UI_GetData(FL_DUAL_CAM);
if (dual_cam == DUALCAM_FRONT)
{
// img1
if (pDraw->p_src_img[0] && (pDraw->p_dst_img != pDraw->p_src_img[0])) {
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK);
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w;
dst_region.h = pDraw->p_dst_img->dim.h;
//PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, REGION_MATCH_IMG);
PipView_CopyData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, REGION_MATCH_IMG);
}
}
else if (dual_cam == DUALCAM_BEHIND || dual_cam == DUALCAM_LR_BEHIND_FULL)
{
// img2
if (pDraw->p_src_img[1] && (pDraw->p_dst_img != pDraw->p_src_img[1])) {
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK); //mark for latency
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, REGION_MATCH_IMG);
#else
// flip rear image to destination buffer
PipView_RotateData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
#endif
}
}
else if (dual_cam == DUALCAM_BOTH2)
{
// rear image is bigger
if (pDraw->p_src_img[1] && (pDraw->p_dst_img != pDraw->p_src_img[1])) {
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK);
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, REGION_MATCH_IMG);
#else
// flip rear image to destination buffer
PipView_RotateData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
#endif
}
// front image is smaller
if (pDraw->p_src_img[0]) {
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h / 2;
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}
else if (dual_cam == DUALCAM_BOTH)
{
// front image is bigger
if (pDraw->p_src_img[0] && (pDraw->p_dst_img != pDraw->p_src_img[0])) {
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK);
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, REGION_MATCH_IMG);
}
// rear image is smaller
if (pDraw->p_src_img[1]) {
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h / 2;
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
#else
// flip rear image to destination buffer
IRECT dstRegion;
// scale rear image to top-right corner of destination buffer (size 1/4)
dstRegion.x = pDraw->p_dst_img->dim.w / 2;
dstRegion.y = 0;
dstRegion.w = ALIGN_CEIL_4(pDraw->p_dst_img->dim.w / 2);
dstRegion.h = ALIGN_CEIL_4(pDraw->p_dst_img->dim.h / 2);
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dstRegion);
// flip and paste scaled image from top-right to top-left of destination buffer
dstLocation.x = 0;
dstLocation.y = 0;
PipView_RotateData(pDraw->p_dst_img, &dstRegion, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
// paste top-right of front image to destination buffer
if (pDraw->p_src_img[0]) {
PipView_ScaleData(pDraw->p_src_img[0], &dstRegion, pDraw->p_dst_img, &dstRegion);
}
#endif
}
}
#if 0
else if (dual_cam == DUALCAM_CUSTOM_4)
{ // Rx, Tx1, 1:1
if(pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
}
//DBG_DUMP("src[1] w=%d, %d, src[2] w=%d, %d, dst_img=%d, %d\r\n",pDraw->p_src_img[1]->Width,pDraw->p_src_img[1]->Height,pDraw->p_src_img[2]->Width,pDraw->p_src_img[2]->Height,pDraw->p_dst_img->Width,pDraw->p_dst_img->Height);
// img1
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->Width / 2;
dst_region.h = pDraw->p_dst_img->Height;
if(pDraw->p_src_img[0] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
GxImg_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = pDraw->p_dst_img->Width / 2;
dst_region.y = 0;
if(pDraw->p_src_img[1] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
GxImg_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
#else
IPOINT dstLocation;
IRECT SrcRegion;
SrcRegion.x = 0;
SrcRegion.y = 0;
SrcRegion.w = pDraw->p_dst_img->Width/2;
SrcRegion.h = pDraw->p_dst_img->Height;
dstLocation.x = pDraw->p_dst_img->Width/2;
dstLocation.y = 0;
GxImg_RotatePasteData(pDraw->p_src_img[1], &SrcRegion, pDraw->p_dst_img, &dstLocation, GX_IMAGE_ROTATE_HRZ, GX_IMAGE_ROTATE_ENG2);
#endif
}
}
#endif
else// if (dual_cam == DUALCAM_LR_FULL)
{
ISIZE img_ratio;
USIZE disp_aspect_ratio = GxVideo_GetDeviceAspect(DOUT1);
IRECT src_region;
static UINT32 i1 = 0;
if ((pDraw->p_dst_img != pDraw->p_src_img[0]) && (pDraw->p_dst_img != pDraw->p_src_img[1])) {
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK);
}
Movie_GetRecSize(0, &img_ratio);
if (i1++ < 2) {
DBG_DUMP("DUALCAM_LR_FULL: src_img[0] w %d, h %d, src_img[1] w %d, h %d, dst_img w %d, h %d\r\n",
pDraw->p_src_img[0]->dim.w, pDraw->p_src_img[0]->dim.h,
pDraw->p_src_img[1]->dim.w, pDraw->p_src_img[1]->dim.h,
pDraw->p_dst_img->dim.w, pDraw->p_dst_img->dim.h);
DBG_DUMP("DUALCAM_LR_FULL: img_ratio w %d, h %d, disp_aspect_ratio w %d, h %d\r\n",
img_ratio.w, img_ratio.h, disp_aspect_ratio.w, disp_aspect_ratio.h);
}
if ((img_ratio.w * disp_aspect_ratio.h) > (disp_aspect_ratio.w * img_ratio.h) ||
(img_ratio.w * disp_aspect_ratio.h * 2) > (disp_aspect_ratio.w * img_ratio.h)) {
if (pDraw->p_src_img[1]) {
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
// crop rear image and copy to right of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = ALIGN_CEIL_4((pDraw->p_src_img[1]->dim.w - src_region.w) / 2);
src_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = pDraw->p_dst_img->dim.w / 2;
dst_region.y = 0;
PipView_ScaleData(pDraw->p_src_img[1], &src_region, pDraw->p_dst_img, &dst_region);
#else
// crop rear image and copy to left of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = ALIGN_CEIL_4((pDraw->p_src_img[1]->dim.w - src_region.w) / 2);
src_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = 0;
dst_region.y = 0;
PipView_ScaleData(pDraw->p_src_img[1], &src_region, pDraw->p_dst_img, &dst_region);
// flip and paste cropped rear image from left to right of destination buffer
dstLocation.x = pDraw->p_dst_img->dim.w / 2;
dstLocation.y = 0;
PipView_RotateData(pDraw->p_dst_img, &dst_region, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
#endif
}
if (pDraw->p_src_img[0]) {
// crop front image and copy to left of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = ALIGN_CEIL_4((pDraw->p_src_img[0]->dim.w - src_region.w) / 2);
src_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = 0;
dst_region.y = 0;
PipView_ScaleData(pDraw->p_src_img[0], &src_region, pDraw->p_dst_img, &dst_region);
}
} else {
if (pDraw->p_src_img[1]) {
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
// crop rear image and copy to right of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = 0;
src_region.y = ALIGN_CEIL_4((pDraw->p_src_img[1]->dim.h - src_region.h) / 2);
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = pDraw->p_dst_img->dim.w / 2;
dst_region.y = 0;
if (i1 < 5) {
DBG_DUMP("src_region[1]: x %d, y %d, w %d, h %d, dst_region[1]: x %d, y %d, w %d, h %d\r\n",
src_region.x, src_region.y, src_region.w, src_region.h,
dst_region.x, dst_region.y, dst_region.w, dst_region.h);
}
PipView_ScaleData(pDraw->p_src_img[1], &src_region, pDraw->p_dst_img, &dst_region);
#else
// crop rear image and copy to left of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = 0;
src_region.y = ALIGN_CEIL_4((pDraw->p_src_img[1]->dim.h - src_region.h) / 2);
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = 0;
dst_region.y = 0;
PipView_ScaleData(pDraw->p_src_img[1], &src_region, pDraw->p_dst_img, &dst_region);
// flip and paste cropped rear image from left to right of destination buffer
dstLocation.x = pDraw->p_dst_img->dim.w / 2;
dstLocation.y = 0;
PipView_RotateData(pDraw->p_dst_img, &dst_region, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
#endif
}
if (pDraw->p_src_img[0]) {
// crop front image and copy to left of destination buffer
src_region.w = pDraw->p_dst_img->dim.w / 2;
src_region.h = pDraw->p_dst_img->dim.h;
src_region.x = 0;
src_region.y = ALIGN_CEIL_4((pDraw->p_src_img[0]->dim.h - src_region.h) / 2);
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h;
dst_region.x = 0;
dst_region.y = 0;
if (i1 < 2) {
DBG_DUMP("src_region[0] x %d, y %d, w %d, h %d, dst_region[0] x %d, y %d, w %d, h %d\r\n",
src_region.x, src_region.y, src_region.w, src_region.h,
dst_region.x, dst_region.y, dst_region.w, dst_region.h);
}
PipView_ScaleData(pDraw->p_src_img[0], &src_region, pDraw->p_dst_img, &dst_region);
}
}
}
}
return E_OK;
}
#if 1 // TODO!!!
INT32 PipView_OnDraw_3sensor(APPDISP_VIEW_DRAW *pDraw) //PIP = Picture In Picture
{
IRECT dst_region;
#if (DUALCAM_PIP_BEHIND_FLIP)
IPOINT dstLocation = {0, 0};
#endif
if (1){//pDraw->viewcnt == 3){
if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BOTH){
if(pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
}
// img1
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[0] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = pDraw->p_dst_img->dim.w / 2;
dst_region.y = 0;
if(pDraw->p_src_img[1] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
#else
// flip rear image to destination buffer
IRECT dstRegion;
// scale rear image to top-right corner of destination buffer (size 1/4)
dstRegion.x = 0;//pDraw->p_dst_img->dim.w / 2;
dstRegion.y = 0;
dstRegion.w = ALIGN_CEIL_4(pDraw->p_dst_img->dim.w / 2);
dstRegion.h = ALIGN_CEIL_4(pDraw->p_dst_img->dim.h / 2);
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dstRegion);
// flip and paste scaled image from top-right to top-left of destination buffer
dstLocation.x = pDraw->p_dst_img->dim.w / 2;//0;
dstLocation.y = 0;
PipView_RotateData(pDraw->p_dst_img, &dstRegion, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
// paste top-right of front image to destination buffer
if (pDraw->p_src_img[0]) {
PipView_ScaleData(pDraw->p_src_img[0], &dstRegion, pDraw->p_dst_img, &dstRegion);
}
#endif
}
// img3
dst_region.x = 0;
dst_region.y = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[2] && pDraw->p_dst_img->dim.w && pDraw->p_dst_img->dim.h){
#if (DUALCAM_PIP_BEHIND_FLIP == DISABLE)
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
#else
IRECT dstRegion;
// scale rear image to top-right corner of destination buffer (size 1/4)
dstRegion.x = pDraw->p_dst_img->dim.w / 2;
dstRegion.y = dst_region.y;
dstRegion.w = ALIGN_CEIL_4(pDraw->p_dst_img->dim.w / 2);
dstRegion.h = ALIGN_CEIL_4(pDraw->p_dst_img->dim.h / 2);
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dstRegion);
// flip and paste scaled image from top-right to top-left of destination buffer
dstLocation.x = 0;
dstLocation.y = dst_region.y;
PipView_RotateData(pDraw->p_dst_img, &dstRegion, pDraw->p_dst_img, &dstLocation, HD_VIDEO_DIR_MIRRORX);
// paste top-right of front image to destination buffer
//if (pDraw->p_src_img[0]) {
// PipView_ScaleData(pDraw->p_src_img[0], &dstRegion, pDraw->p_dst_img, &dstRegion);
//}
PipView_FillDataBlack(pDraw->p_dst_img, &dstRegion) ;
#endif
}
}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_FRONT){//Tx1
if(pDraw->p_src_img[1] && pDraw->p_dst_img != pDraw->p_src_img[1]){
PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
}
// img1
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w;
dst_region.h = pDraw->p_dst_img->dim.h;
if(pDraw->p_src_img[1] && pDraw->p_dst_img != pDraw->p_src_img[1]){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BEHIND){//Tx2
if(pDraw->p_src_img[2] && pDraw->p_dst_img != pDraw->p_src_img[2]){
PipView_FillDataBlack(pDraw->p_dst_img, NULL) ;
}
// img2
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w;
dst_region.h = pDraw->p_dst_img->dim.h;
if(pDraw->p_src_img[2] && pDraw->p_dst_img != pDraw->p_src_img[2]){
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_BOTH2){//Rx Sensor
//if(pDraw->p_src_img[0] && pDraw->p_dst_img != pDraw->p_src_img[0])
// PipView_FillDataBlack(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
// img0
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w;
dst_region.h = pDraw->p_dst_img->dim.h;
if(pDraw->p_src_img[0] && pDraw->p_dst_img != pDraw->p_src_img[0]){
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}
#if 0//_TODO
else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_CUSTOM_1){ //Tx1, Tx2
//if(pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
// GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
//}
//DBG_DUMP("src[1] w=%d, %d, src[2] w=%d, %d, dst_img=%d, %d\r\n",pDraw->p_src_img[1]->Width,pDraw->p_src_img[1]->Height,pDraw->p_src_img[2]->Width,pDraw->p_src_img[2]->Height,pDraw->p_dst_img->Width,pDraw->p_dst_img->Height);
// img1
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->Width / 2;
dst_region.h = pDraw->p_dst_img->Height;
if(pDraw->p_src_img[1] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = pDraw->p_dst_img->Width / 2;
dst_region.y = 0;
if(pDraw->p_src_img[2] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_CUSTOM_2){ //Tx1, Rx, Tx2, 1:2:1
//if(pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
// GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
//}
//DBG_DUMP("src[0] w=%d, %d, src[1] w=%d, %d, src[2] w=%d, %d, dst_img=%d, %d\r\n",pDraw->p_src_img[0]->Width,pDraw->p_src_img[0]->Height,pDraw->p_src_img[1]->Width,pDraw->p_src_img[1]->Height,pDraw->p_src_img[2]->Width,pDraw->p_src_img[2]->Height,pDraw->p_dst_img->Width,pDraw->p_dst_img->Height);
// img1
UINT32 WidthUnit=ALIGN_CEIL_4(pDraw->p_dst_img->Width / 4);
dst_region.x = WidthUnit;
dst_region.y = 0;
dst_region.w = 2*WidthUnit;
dst_region.h = pDraw->p_dst_img->Height;
if(pDraw->p_src_img[0] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = WidthUnit;
if(pDraw->p_src_img[1] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img3
dst_region.x = 3*WidthUnit;
dst_region.y = 0;
dst_region.w = WidthUnit;
if(pDraw->p_src_img[2] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}else if(UI_GetData(FL_DUAL_CAM) == DUALCAM_CUSTOM_3){ //Tx1, Rx, Tx2, 1:1:1
if(pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
}
//DBG_DUMP("src[0] w=%d, %d, src[1] w=%d, %d, src[2] w=%d, %d, dst_img=%d, %d\r\n",pDraw->p_src_img[0]->Width,pDraw->p_src_img[0]->Height,pDraw->p_src_img[1]->Width,pDraw->p_src_img[1]->Height,pDraw->p_src_img[2]->Width,pDraw->p_src_img[2]->Height,pDraw->p_dst_img->Width,pDraw->p_dst_img->Height);
// img1
UINT32 WidthUnit=ALIGN_CEIL_4(pDraw->p_dst_img->Width / 3);
dst_region.x = WidthUnit;
dst_region.y = 0;
dst_region.w = WidthUnit;
dst_region.h = pDraw->p_dst_img->Height;
if(pDraw->p_src_img[0] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = WidthUnit;
if(pDraw->p_src_img[1] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img3
dst_region.x = 2*WidthUnit;
dst_region.y = 0;
dst_region.w = WidthUnit;
if(pDraw->p_src_img[2] && pDraw->p_dst_img->Width && pDraw->p_dst_img->Height){
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
}
#endif
}
return E_OK;
}
INT32 PipView_OnDraw_4sensor_2view(APPDISP_VIEW_DRAW *pDraw) //PIP = Picture In Picture
{
IRECT dst_region;
// img2
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[1]){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
return E_OK;
}
INT32 PipView_OnDraw_4sensor(APPDISP_VIEW_DRAW *pDraw) //PIP = Picture In Picture
{
IRECT dst_region;
//GxImg_FillData(pDraw->p_dst_img, NULL, COLOR_YUV_BLACK) ;
// img1
dst_region.x = 0;
dst_region.y = 0;
dst_region.w = pDraw->p_dst_img->dim.w / 2;
dst_region.h = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[0]){
PipView_ScaleData(pDraw->p_src_img[0], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img2
dst_region.x = pDraw->p_dst_img->dim.w / 2;
dst_region.y = 0;
if(pDraw->p_src_img[1]){
PipView_ScaleData(pDraw->p_src_img[1], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img3
dst_region.x = 0;
dst_region.y = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[2]){
PipView_ScaleData(pDraw->p_src_img[2], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
// img4
dst_region.x = pDraw->p_dst_img->dim.w / 2;
dst_region.y = pDraw->p_dst_img->dim.h / 2;
if(pDraw->p_src_img[3]){
PipView_ScaleData(pDraw->p_src_img[3], REGION_MATCH_IMG, pDraw->p_dst_img, &dst_region);
}
return E_OK;
}
#endif
#if 1
INT32 PipView_OnDraw(APPDISP_VIEW_DRAW *pDraw)
{
if (System_GetState(SYS_STATE_CURRMODE) == PRIMARY_MODE_MOVIE || System_GetState(SYS_STATE_NEXTMODE) == PRIMARY_MODE_MOVIE) {
#if (SENSOR_CAPS_COUNT == 4)
if (pDraw->viewcnt == 2){
PipView_OnDraw_4sensor_2view(pDraw);
} else{
PipView_OnDraw_4sensor(pDraw);
}
#elif (((SENSOR_CAPS_COUNT& SENSOR_ON_MASK) + ETH_REARCAM_CAPS_COUNT) ==3)
PipView_OnDraw_3sensor(pDraw);
#elif (((SENSOR_CAPS_COUNT& SENSOR_ON_MASK) + ETH_REARCAM_CAPS_COUNT) ==2)
PipView_OnDraw_2sensor(pDraw);
#else
DBG_ERR("Not Support %d sensor\r\n",SENSOR_CAPS_COUNT);
#endif
}else{
#if (SENSOR_CAPS_COUNT == 4)
if (pDraw->viewcnt == 2){
PipView_OnDraw_4sensor_2view(pDraw);
} else{
PipView_OnDraw_4sensor(pDraw);
}
#elif (SENSOR_CAPS_COUNT == 3)
PipView_OnDraw_3sensor(pDraw);
#elif (SENSOR_CAPS_COUNT == 2)
PipView_OnDraw_2sensor(pDraw);
#else
DBG_ERR("Not Support %d sensor\r\n",SENSOR_CAPS_COUNT);
#endif
}
return E_OK;
}
#else
INT32 PipView_OnDraw(APPDISP_VIEW_DRAW *pDraw)
{
//if (System_GetState(SYS_STATE_CURRMODE) == PRIMARY_MODE_MOVIE || System_GetState(SYS_STATE_NEXTMODE) == PRIMARY_MODE_MOVIE) {
PipView_OnDraw_2sensor(pDraw);
//}
return E_OK;
}
#endif