www.pudn.com > bu1566.rar > W_Interface.c
#define _W_INTERFACE_C_
#include "BUxx_aDSC.h"
#include "BUxx_Sample.h"
#include "W_Interface.h"
#ifdef _BU1563API_INTERFACE_
void fObjectInit(void)
{
UINT16 i;
gv_SetMaxNum = sizeof(cBase) / sizeof(cBase[0]);
for (i = 0; i < gv_SetMaxNum; i++)
{
cBase[i]->fInit(cBase[i]);
}
gv_VideoData.p_u16JpgCode = gl_pJpegMem_Buf;
}
void fPreSizeInit(c_SetBase * p_cBaseSet)
{
UINT16 i;
c_PreSizeSet *p_cPreSizeSet = (c_PreSizeSet *) p_cBaseSet;
p_cPreSizeSet->v_Set.u16MaxNum = sizeof(cPreSizeItem) / sizeof(cPreSizeItem[0]);
for(i=0;iv_Set.u16MaxNum;i++)
{
cPreSizeItem[i].m_pcamera->mst_x = cPreSizeItem[i].m_pwindow->st_x;
cPreSizeItem[i].m_pcamera->mst_y = cPreSizeItem[i].m_pwindow->st_y;
cPreSizeItem[i].m_pcamera->cst_x =
(cPreSizeItem[i].m_pcamera->srkx - cPreSizeItem[i].m_pcamera->xsize) / 2;
cPreSizeItem[i].m_pcamera->cst_y =
(cPreSizeItem[i].m_pcamera->srky - cPreSizeItem[i].m_pcamera->ysize) / 2;
if (cPreSizeItem[i].m_pcamera->rot_h_vflip & sROT_ON)
{
if (cPreSizeItem[i].m_pcamera->cst_y % 2)
cPreSizeItem[i].m_pcamera->cst_y++;
}
else
{
if (cPreSizeItem[i].m_pcamera->cst_x % 2)
cPreSizeItem[i].m_pcamera->cst_x++;
}
}
}
void fFilterInit(c_SetBase * p_cBaseSet)
{
c_FilterSet *p_cFilterSet = (c_FilterSet *) p_cBaseSet;
p_cFilterSet->v_Set.u16MaxNum = sizeof(cFilterItem) / sizeof(cFilterItem[0]);
}
void fOvlInit(c_SetBase * p_cBaseSet)
{
c_OvlSet *p_cOvlSet = (c_OvlSet *) p_cBaseSet;
p_cOvlSet->v_Set.u16MaxNum = sizeof(cOvlItem) / sizeof(cOvlItem[0]);
}
void fJpgQualityInit(c_SetBase * p_cBaseSet)
{
c_JpgQualitySet *p_cJpgQualitySet = (c_JpgQualitySet *) p_cBaseSet;
p_cJpgQualitySet->v_Set.u16MaxNum = sizeof(cJpgQualityItem) / sizeof(cJpgQualityItem[0]);
}
void fJpgFuncInit(c_SetBase * p_cBaseSet)
{
c_JpgFuncSet *p_cJpgFuncSet = (c_JpgFuncSet *) p_cBaseSet;
p_cJpgFuncSet->v_Set.u16MaxNum = sizeof(cJpgFuncItem) / sizeof(cJpgFuncItem[0]);
}
void fJpgEncSizeInit(c_SetBase * p_cBaseSet)
{
c_JpgEncSizeSet *p_cJpgEncSizeSet = (c_JpgEncSizeSet *) p_cBaseSet;
p_cJpgEncSizeSet->v_Set.u16MaxNum = sizeof(cJpgEncSizeItem) / sizeof(cJpgEncSizeItem[0]);
}
void fJpgDecSizeInit(c_SetBase * p_cBaseSet)
{
c_JpgDecSizeSet *p_cJpgDecSizeSet = (c_JpgDecSizeSet *) p_cBaseSet;
p_cJpgDecSizeSet->v_Set.u16MaxNum = sizeof(cJpgDecSizeItem) / sizeof(cJpgDecSizeItem[0]);
}
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
void fPreSizeSet(c_SetBase * p_cBaseSet)
{
c_PreSizeSet *p_PreSizeSet = (c_PreSizeSet *) p_cBaseSet;
c_PreSizeItem *p_PreSizeItem =
(c_PreSizeItem *) (p_PreSizeSet->p_PreSize + p_PreSizeSet->v_Set.u16CurIndex);
gv_VideoData.p_Window = p_PreSizeItem->m_pwindow;
gv_VideoData.p_Camera = p_PreSizeItem->m_pcamera;
gv_VideoData.p_Item = &p_PreSizeItem->v_Item;
}
void fFilterSet(c_SetBase * p_cBaseSet)
{
c_FilterSet *p_FilterSet = (c_FilterSet *) p_cBaseSet;
c_FilterItem *p_FilterItem =
(c_FilterItem*)(p_FilterSet->p_Filter + p_FilterSet->v_Set.u16CurIndex);
gv_VideoData.u16Filter=p_FilterItem->u16Filter;
gv_VideoData.p_Item=&p_FilterItem->v_Item;
}
void fOvlSet(c_SetBase * p_cBaseSet)
{
c_OvlSet *p_OvlSet = (c_OvlSet *) p_cBaseSet;
c_OvlItem *p_OvlItem =
(c_OvlItem *) (p_OvlSet->p_Overlay + p_OvlSet->v_Set.u16CurIndex);
gv_VideoData.p_Overlay = p_OvlItem->p_Overlay;
gv_VideoData.p_Item = &p_OvlItem->v_Item;
}
void fJpgQualitySet(c_SetBase * p_cBaseSet)
{
c_JpgQualitySet *p_JpgQualitySet = (c_JpgQualitySet *) p_cBaseSet;
c_JpgQualityItem *p_JpgQualityItem =
(c_JpgQualityItem *) (p_JpgQualitySet->p_Quality + p_JpgQualitySet->v_Set.u16CurIndex);
gv_VideoData.u16JpgQuality = p_JpgQualityItem->u16JpgQuality;
gv_VideoData.p_Item = &p_JpgQualityItem->v_Item;
}
void fJpgFuncSet(c_SetBase * p_cBaseSet)
{
c_JpgFuncSet *p_JpgFuncSet = (c_JpgFuncSet *) p_cBaseSet;
c_JpgFuncItem *p_JpgFuncItem =
(c_JpgFuncItem *) (p_JpgFuncSet->p_Func + p_JpgFuncSet->v_Set.u16CurIndex);
gv_VideoData.u16JpgFunc = p_JpgFuncItem->u16JpgFunc;
gv_VideoData.p_Item = &p_JpgFuncItem->v_Item;
}
void fJpgEncSizeSet(c_SetBase * p_cBaseSet)
{
c_JpgEncSizeSet *p_JpgEncSizeSet = (c_JpgEncSizeSet *) p_cBaseSet;
c_JpgEncSizeItem *p_JpgEncSizeItem =
(c_JpgEncSizeItem *) (p_JpgEncSizeSet->p_EncSize + p_JpgEncSizeSet->v_Set.u16CurIndex);
gv_VideoData.p_EncSize = p_JpgEncSizeItem->p_EncSize;
gv_VideoData.p_Item = &p_JpgEncSizeItem->v_Item;
}
void fJpgDecSizeSet(c_SetBase * p_cBaseSet)
{
c_JpgDecSizeSet *p_JpgDecSizeSet = (c_JpgDecSizeSet *) p_cBaseSet;
c_JpgDecSizeItem *p_JpgDecSizeItem =
(c_JpgDecSizeItem *) (p_JpgDecSizeSet->p_DecSize + p_JpgDecSizeSet->v_Set.u16CurIndex);
gv_VideoData.p_DecSize = p_JpgDecSizeItem->p_DecSize;
gv_VideoData.p_Item = &p_JpgDecSizeItem->v_Item;
}
void fPreview(void)
{
aDSC_fmemory_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0x0000);
aDSC_overlayframe_off();
if (gv_VideoData.p_Overlay->u16OvlOpen)
{
aDSC_fmemory_write_rgb565(gv_VideoData.p_Overlay->u16OvlData,
gv_VideoData.p_Overlay->st_x, gv_VideoData.p_Overlay->st_y);
// aDSC_maskmemory_write(gv_VideoData.p_Overlay->xsize, gv_VideoData.p_Overlay->ysize);
aDSC_overlayframe_on();
}
fFillExOvlMirror(gv_VideoData.p_Item);
aDSC_data_trans_st(0, 0, M_LCD_WSIZE, M_LCD_HSIZE);
sFilterSet(gv_VideoData.u16Filter);
aDSC_Start_Preview(gv_VideoData.p_Window->st_x,
gv_VideoData.p_Window->st_y,
gv_VideoData.p_Window->xsize,
gv_VideoData.p_Window->ysize, gv_VideoData.p_Camera);
}
void fJpegEnc(void)
{
aDSC_fmemory_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0x0000);
aDSC_data_trans_st(0, 0, M_LCD_WSIZE, M_LCD_HSIZE);
wait(500);
switch (gv_VideoData.u16JpgFunc)
{
case SIGLESHOT:
{
gv_VideoData.u32JpgSize = JPEG_BUFFER;
bit_write(OVL_CNT, 3, LOW); //switch off OSD
aDSC_CameraEncode(gv_VideoData.p_u16JpgCode, &gv_VideoData.u32JpgSize,
gv_VideoData.p_EncSize, gv_VideoData.u16JpgQuality,
sROT_OFF | sHFLIP_OFF | sVFLIP_OFF);
fFillExOvlMirror(gv_VideoData.p_Item);
}
break;
case MULTISHOT:
{
UINT32 u32FrameByteSize = JPEG_BUFFER;
gv_VideoData.u32JpgSize = 0;
aDSC_overlayframe_off();
do
{
//u32FrameByteSize = JPEG_BUFFER;
aDSC_Start_Preview(gv_VideoData.p_Window->st_x,
gv_VideoData.p_Window->st_y,
gv_VideoData.p_Window->xsize,
gv_VideoData.p_Window->ysize, gv_VideoData.p_Camera);
aDSC_CameraEncode(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2+2,
&u32FrameByteSize,
gv_VideoData.p_EncSize, gv_VideoData.u16JpgQuality,
sROT_OFF | sHFLIP_OFF | sVFLIP_OFF);
fFillExOvlMirror(gv_VideoData.p_Item);
*(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2) =
(UINT16) ((u32FrameByteSize | 0xffff0000) >> 16);
*(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2 + 1) =
(UINT16) (u32FrameByteSize | 0x0000ffff);
gv_VideoData.u32JpgSize += u32FrameByteSize + 4;
u32FrameByteSize = JPEG_BUFFER-gv_VideoData.u32JpgSize;
//wait(10); // >1400ms@1280x960; >ms@640x480
}while (gv_VideoData.u32JpgSize < MJPEG_BUFFER);
}
break;
case MOTIONJPEG:
{
UINT32 u32FrameByteSize = 0;
aDSC_overlayframe_off();
gv_VideoData.u32JpgSize = 0;
do
{
u32FrameByteSize = 144 * 176;
aDSC_Start_Preview(tWindow80x80.st_x,
tWindow80x80.st_y,
tWindow80x80.xsize,
tWindow80x80.ysize, &tCamera80x80);
aDSC_FrameEncode(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2 +
2, &u32FrameByteSize, tWindow80x80.st_x,
tWindow80x80.st_y,
tWindow80x80.xsize,
tWindow80x80.ysize,
gv_VideoData.u16JpgQuality);
fFillExOvlMirror(gv_VideoData.p_Item);
*(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2) =
(UINT16) ((u32FrameByteSize | 0xffff0000) >> 16);
*(gv_VideoData.p_u16JpgCode + gv_VideoData.u32JpgSize / 2 + 1) =
(UINT16) (u32FrameByteSize | 0x0000ffff);
gv_VideoData.u32JpgSize += u32FrameByteSize + 4;
}while (gv_VideoData.u32JpgSize < MJPEG_BUFFER - u32FrameByteSize * 2 - 1000);
}
break;
default:
break;
}
}
void fJpegDec(void)
{
if (gv_VideoData.u32JpgSize == 0)
return;
aDRT_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0x0000ff);
wait(500);
aDSC_fmemory_clear(0, 0, M_LCD_WSIZE, M_LCD_HSIZE, 0x0000);
bit_write(OVL_CNT, 3, LOW); //switch off OSD
switch (gv_VideoData.u16JpgFunc)
{
case SIGLESHOT:
{
aDSC_Decode(gv_VideoData.p_u16JpgCode, &gv_VideoData.u32JpgSize,
gv_VideoData.p_DecSize);
aDSC_data_trans_st(gv_VideoData.p_DecSize->mst_x,
gv_VideoData.p_DecSize->mst_y,
gv_VideoData.p_DecSize->xsize, gv_VideoData.p_DecSize->ysize);
}
break;
case MULTISHOT:
{
UINT32 u32DecodeByteSize = 0, u32FrameSize = 0;
do
{
u32FrameSize = 0;
u32FrameSize = *(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2);
u32FrameSize <<= 16;
u32FrameSize |= *(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2 + 1);
aDSC_Decode(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2 + 2,
&u32FrameSize, &tCamDec128x96);
u32DecodeByteSize += u32FrameSize + 4;
aDSC_data_trans_st(tCamDec128x96.mst_x,
tCamDec128x96.mst_y,
tCamDec128x96.xsize,
tCamDec128x96.ysize);
wait(500);
}
while (gv_VideoData.u32JpgSize > u32DecodeByteSize);
}
break;
case MOTIONJPEG:
{
UINT32 u32DecodeByteSize = 0, u32FrameSize = 0;
do
{
u32FrameSize = 0;
u32FrameSize = *(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2);
u32FrameSize <<= 16;
u32FrameSize |= *(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2 + 1);
aDSC_Decode(gv_VideoData.p_u16JpgCode + u32DecodeByteSize / 2 + 2,
&u32FrameSize, &tCamDec80x80);
u32DecodeByteSize += u32FrameSize + 4;
aDSC_data_trans_st(tCamDec80x80.mst_x,
tCamDec80x80.mst_y,
tCamDec80x80.xsize,
tCamDec80x80.ysize);
wait(100);
}
while (gv_VideoData.u32JpgSize > u32DecodeByteSize);
}
break;
default:
break;
}
}
void fZoom(INT16 u8Zoom)
{
CAMSET cam;
/* MT9M111_SENSOR
static UINT16 sHoriZoom=M_LCD_WSIZE;
static UINT16 sVertZoom=M_LCD_WSIZE* 4 / 3;
INT16 u16HoriZoomStep=3*u8Zoom;
INT16 u16VertZoomStep=4*u8Zoom;
UINT16 u16CamWidth=CAM_VSIZE;
UINT16 u16CamHight=CAM_HSIZE;
cam.rot_h_vflip = sROT_ON | sHFLIP_OFF | sVFLIP_ON;
*/
static UINT16 sHoriZoom = M_LCD_HSIZE * 4 / 3;
static UINT16 sVertZoom = M_LCD_HSIZE;
INT16 u16HoriZoomStep = 4 * u8Zoom;
INT16 u16VertZoomStep = 3 * u8Zoom;
UINT16 u16CamWidth = CAM_HSIZE;
UINT16 u16CamHight = CAM_VSIZE;
cam.rot_h_vflip = sROT_OFF | sHFLIP_OFF | sVFLIP_ON;
aDSC_overlayframe_off();
cam.xsize = M_LCD_WSIZE;
cam.ysize = M_LCD_HSIZE;
if ((((sHoriZoom + u16HoriZoomStep) <= u16CamWidth)
&& ((sHoriZoom + u16HoriZoomStep) >= cam.xsize))
&& (((sVertZoom + u16VertZoomStep) <= u16CamHight)
&& ((sVertZoom + u16VertZoomStep) >= cam.ysize)))
{
sHoriZoom += u16HoriZoomStep;
sVertZoom += u16VertZoomStep;
}
cam.srkx = sHoriZoom;
cam.srky = sVertZoom;
if (cam.rot_h_vflip & sROT_ON)
{
cam.cst_x = (cam.srkx - cam.xsize) / 2;
cam.cst_y = (cam.srky - cam.ysize) / 2 + 1;
if (cam.cst_y % 2)
cam.cst_y--;
}
else
{
cam.cst_x = (cam.srkx - cam.xsize) / 2 + 1;
cam.cst_y = (cam.srky - cam.ysize) / 2;
if (cam.cst_x % 2)
cam.cst_x--;
}
cam.mst_x = 0;
cam.mst_y = 0;
cam_capture_set(&cam);
wait(50); // wait 50ms
}
static void fFillExOvlMirror(c_ItemBase * p_Item)
{
UINT8 font_cnt;
const UINT16 *font_data;
char *string;
*gl_pExOvlMem_Buf = p_Item->p_ExOverlay1->u16FmXsize;
*(gl_pExOvlMem_Buf + 1) = p_Item->p_ExOverlay1->u16FmYsize + p_Item->p_ExOverlay2->u16FmYsize;
memset((UINT8 *) gl_pExOvlMem_Buf + 4, 0x00, EXOVLMEM_BUF_SIZE - 4);
bit_write(OVL_CNT, 3, LOW); //switch off OSD
if (p_Item->p_ExOverlay1->u16OvlOpen) //set ex-overlay1 string
{
bit_write(OVL_CNT, 1 << 1, HIGH);
string = p_Item->szOvl1Str;
for (font_cnt = 0; (font_cnt < 10) || (*string != '\0'); font_cnt++)
{
if (*string != '\0')
{
font_data = fonttable[*string];
fFillStrExOvlMirror(font_data, p_Item->p_ExOverlay1, font_cnt);
string++;
}
}
}
if (p_Item->p_ExOverlay2->u16OvlOpen) //set ex-overlay2 string
{
bit_write(OVL_CNT, 1 << 0, HIGH);
string = p_Item->szOvl2Str;
for (font_cnt = 0; (font_cnt < 10) || (*string != '\0'); font_cnt++)
{
if (*string != '\0')
{
font_data = fonttable[*string];
fFillStrExOvlMirror(font_data, p_Item->p_ExOverlay2, font_cnt);
string++;
}
}
}
fExOvlParamSet(p_Item->p_ExOverlay1, p_Item->p_ExOverlay2);
aDSC_ExOvlMemory_write_rgb565(gl_pExOvlMem_Buf);
}
static void fFillStrExOvlMirror(const UINT16 * rgb_data, EXOVLSET * p_ExOverlay,
const UINT8 font_cnt)
{
UINT16 xsize, ysize;
int width, height;
UINT32 u32HeightOffset = 0;
UINT32 u32WidthOffset = 0;
UINT16 st_x, st_y;
UINT8 space = 2;
st_x = p_ExOverlay->u16ExmSt_x + (space + 4) * font_cnt;
st_y = p_ExOverlay->u16ExmSt_y;
xsize = *rgb_data;
rgb_data++;
ysize = *rgb_data;
rgb_data++;
for (height = 0; height < ysize; height++)
{
u32HeightOffset = p_ExOverlay->u16OvlIndex * p_ExOverlay->u16FmYsize + st_y + height;
u32HeightOffset *= p_ExOverlay->u16FmXsize;
for (width = 0; width < xsize; width++)
{
u32WidthOffset = st_x + width;
u32WidthOffset += u32HeightOffset;
if (*rgb_data != p_ExOverlay->u16TransColor)
{
*(gl_pExOvlMem_Buf + 2 + u32WidthOffset) = *rgb_data;
}
else
{
*(gl_pExOvlMem_Buf + 2 + u32WidthOffset) = *rgb_data+1;
}
rgb_data++;
}
}
}
static void fExOvlParamSet(EXOVLSET * p_ExOverlay1, EXOVLSET * p_ExOverlay2)
{
UINT16 u16Ovl_H, u16Ovl_V;
u16Ovl_H = p_ExOverlay1->u16FmXsize;
u16Ovl_V = p_ExOverlay1->u16FmYsize + p_ExOverlay2->u16FmYsize;
if (p_ExOverlay1->u16TransEnable)
bit_write(OVL_CNT, 1 << 4, HIGH); //transparent color enable
else
bit_write(OVL_CNT, 1 << 4, LOW);
data_write(OVL_TRANS, p_ExOverlay1->u16TransColor);
data_write(OVL_TRMSK, p_ExOverlay1->u16MaskColor);
data_write(OVLSIZE, (u16Ovl_H << 8) | u16Ovl_V);
data_write(OVL_ST1, 0x0000);
data_write(OVL_ED1, ((u16Ovl_H - 1) << 8) | (u16Ovl_V / 2 - 1));
data_write(OVL_FRMST1, (p_ExOverlay1->u16FmSt_x << 8) | p_ExOverlay1->u16FmSt_y);
data_write(OVL_ST2, u16Ovl_V / 2);
data_write(OVL_ED2, ((u16Ovl_H - 1) << 8) | (u16Ovl_V - 1));
data_write(OVL_FRMST2, (p_ExOverlay2->u16FmSt_x << 8) | p_ExOverlay2->u16FmSt_y);
}
#endif //_BU1563API_INTERFACE_
#undef _W_INTERFACE_C_