📄 vjpeg.c
字号:
#include "v558api.h"
#include "v558def.h"
#include "vjpeg.h"
#include "vregdef.h"
#include "string.h"
#include "yuv2bmp.h"
V558_JPEG_CONTEXT gJpegContext;
extern UINT8 g_fbdiv,g_plldiv;
extern UINT8 g_halffbdiv,g_halfplldiv;
void V558_Set_PLL(UINT8 fbdiv, UINT8 plldiv)
{
UINT8 fbtmp, plltmp;
V558_GetReg(V558_REG_HCTRL_CLKCTRL2,&fbtmp);
V558_GetReg(V558_REG_HCTRL_CLKCTRL3,&plltmp);
if((fbdiv==fbtmp)&&(plldiv==plltmp))
return;
if((fbdiv==0)&&(plldiv==0))
return;
V558_CtrlSetChipClkOff();
V558_CtrlSetChipClkPlldiv(fbdiv, plldiv>>4, plldiv&0x0f);
V558_CtrlChipClkPlldivEnable();
V558_CtrlSetChipClkOn();
}
void DecreaseClk(void)
{
UINT16 temp;
if(gJpegContext.clkflag == 0)
{
gJpegContext.wcy = V558_GetPanelWcy();
temp = ((((gJpegContext.wcy&0x7c00)+0x400) >> 1) & 0x7c00) |
((((gJpegContext.wcy & 0x3e0)+0x20) >> 1) & 0x3e0) |
((((gJpegContext.wcy&0x1f)+1) >> 1) & 0x1f);
V558_SetPanelWcy(temp);
V558_Set_PLL(g_halffbdiv,g_halfplldiv);
gJpegContext.clkflag = 1;
temp = 0xff;
while(temp--);
}
}
void ResumeClk(void)
{
UINT8 temp = 0xff;
if(gJpegContext.clkflag == 1)
{
V558_SetPanelWcy(gJpegContext.wcy);
V558_Set_PLL(g_fbdiv,g_plldiv);
gJpegContext.clkflag = 0;
while(temp--);
}
}
static UINT32 GetYuvLbufSize(UINT16 *line)
{
UINT32 len = 0;
switch(gJpegContext.mode)
{
case V558_DECODE_ONLY:
*line = 8;
switch(gJpegContext.header.YUVType)
{
case V558_YUV_422:
len = gJpegContext.header.JpgSize.cx;
len <<= 4;
break;
case V558_YUV_420:
len = gJpegContext.header.JpgSize.cx;
len *= 3;
len <<= 3;
*line = 16;
break;
case V558_YUV_411:
len = gJpegContext.header.JpgSize.cx;
len *= 3;
len <<= 2;
break;
case V558_YUV_400:
len = gJpegContext.header.JpgSize.cx;
len <<= 3;
break;
default:
break;
}
break;
case V558_DECODE_IPP:
case V558_DECODE_LCDIF:
*line = V558_LbufGetStatus();
len = gJpegContext.decodewidth << 1;
*line &= 0x3c;
*line >>= 2;
len *= *line;
break;
default:
break;
}
return len;
}
static void GetYuv422Data(UINT8 *pdat) //used in mode0
{
UINT16 i, j;
UINT32 adr;
UINT8 *ptr = pdat;
UINT8 temp0,temp1,temp2,temp3;
for(j=0; j<8;j++)
{
adr = LBUF0BASEADR + j*LBUF_UNITSIZE;
V558_ReadSram(adr, ptr, gJpegContext.header.JpgSize.cx << 1);
for(i=0 ; i< (gJpegContext.header.JpgSize.cx >> 1) ; i++)
{
adr = (i<<2);
switch(gJpegContext.decdatatype)
{
case V558_PYUV_422_YYUV:
temp0 = *(ptr+adr);
temp1 = *(ptr+adr+1);
temp2 = *(ptr+adr+2);
temp3 = *(ptr+adr+3);
*(ptr+adr) = temp1;
*(ptr+adr+1) = temp3;
*(ptr+adr+2) = temp0;
*(ptr+adr+3) = temp2;
break;
case V558_PYUV_422_YUYV:
temp0 = *(ptr+adr);
*(ptr+adr) = *(ptr+adr+1);
*(ptr+adr+1) = temp0;
temp0 = *(ptr+adr+2);
*(ptr+adr+2) = *(ptr+adr+3);
*(ptr+adr+3) = temp0;
break;
default: break;
}
}
ptr += (gJpegContext.header.JpgSize.cx << 1);
}
}
static void GetYuv420Data(UINT8 *pdat)
{
UINT16 i, j;
UINT32 adr;
UINT8 *ptr = pdat;
UINT8 temp0,temp1,temp2,temp3;
for(j=0; j<8;j++)
{
adr = LBUF0BASEADR + j*LBUF_UNITSIZE*2;
V558_ReadSram(adr, ptr, gJpegContext.header.JpgSize.cx << 1);
for(i=0 ; i< (gJpegContext.header.JpgSize.cx >> 1) ; i++)
{
adr = (i<<2);
switch(gJpegContext.decdatatype)
{
case V558_PYUV_422_YYUV:
temp0 = *(ptr+adr);
temp1 = *(ptr+adr+1);
temp2 = *(ptr+adr+2);
temp3 = *(ptr+adr+3);
*(ptr+adr) = temp1;
*(ptr+adr+1) = temp3;
*(ptr+adr+2) = temp0;
*(ptr+adr+3) = temp2;
break;
case V558_PYUV_422_YUYV:
temp0 = *(ptr+adr);
*(ptr+adr) = *(ptr+adr+1);
*(ptr+adr+1) = temp0;
temp0 = *(ptr+adr+2);
*(ptr+adr+2) = *(ptr+adr+3);
*(ptr+adr+3) = temp0;
break;
default: //uyvy
break;
}
}
ptr += (gJpegContext.header.JpgSize.cx << 1);
adr = LBUF0BASEADR + j*LBUF_UNITSIZE*2 + LBUF_UNITSIZE;
V558_ReadSram(adr,ptr, gJpegContext.header.JpgSize.cx << 1);
for(i=0 ; i< (gJpegContext.header.JpgSize.cx>>1) ; i++)
{
adr = (i<<2);
switch(gJpegContext.decdatatype)
{
case V558_PYUV_422_YYUV:
*(ptr + adr) = *(ptr+adr+1);
*(ptr + adr+1) = *(ptr+adr+3);
*(ptr+adr+2)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr+2) ;
*(ptr+adr+3)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr+3) ;
break;
case V558_PYUV_422_YUYV:
*(ptr + adr) = *(ptr+adr+1);
*(ptr + adr+2) = *(ptr+adr+3);
*(ptr+adr+1)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr+1) ;
*(ptr+adr+3)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr+3) ;
break;
default:
*(ptr+adr)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr) ;
*(ptr+adr+2)=*(ptr-(gJpegContext.header.JpgSize.cx>>1)+adr+2) ;
break;
}
}
ptr += (gJpegContext.header.JpgSize.cx << 1);
}
}
static void GetYuv411Data(UINT8 *pdat) //used in mode0
{
UINT16 i, j;
UINT32 adr;
UINT8 *ptr = pdat;
UINT8 temp0,temp1,temp2,temp3,temp5,temp7;
for(j=0; j<8;j++)
{
adr = LBUF0BASEADR + j*LBUF_UNITSIZE;
V558_ReadSram(adr, ptr, (gJpegContext.header.JpgSize.cx << 1));
for(i=0; i<(UINT16)(gJpegContext.header.JpgSize.cx >>2) ;i++)
{
adr = (i<<3);
temp0 = *(ptr + adr );
temp1 = *(ptr + adr +1 );
temp2 = *(ptr + adr +2 );
temp3 = *(ptr + adr +3 );
temp5 = *(ptr + adr +5 );
temp7 = *(ptr + adr +7 );
adr = (i<<1) + (i<<2);
*(ptr + adr ) = temp1;
*(ptr + adr +1) = temp3;
*(ptr + adr +2) = temp5;
*(ptr + adr +3) = temp7;
*(ptr + adr +4) = temp0;
*(ptr + adr +5) = temp2;
}
ptr += gJpegContext.header.JpgSize.cx + (gJpegContext.header.JpgSize.cx>>1);
}
}
static void GetYuv400Data(UINT8 *pdat) //used in mode0 1x1
{
UINT16 i, j;
UINT32 adr;
UINT8 *ptr = pdat;
for(j=0; j<8;j++)
{
adr = LBUF0BASEADR + j*LBUF_UNITSIZE;
V558_ReadSram(adr, ptr, (gJpegContext.header.JpgSize.cx << 1));
for(i=0; i<gJpegContext.header.JpgSize.cx ;i++)
{
*(ptr + i ) = *(ptr + (i<<1)+1);
}
ptr += gJpegContext.header.JpgSize.cx;
}
}
UINT8 V558_YUV422PointToBlock(PV558_JPEGBUF psrc, PV558_JPEGBUF pdst,PV558_SIZE psize,PV558_SIZE pnewsize,UINT8 encdatatype)
{
UINT16 i,j,k;
UINT32 h;
UINT32 srcadr,desadr;
V558_SIZE OldSize,NewSize;
V558_JPEGBUF src,dst;
src = *psrc;
dst = *pdst;
OldSize.cx = psize->cx;
OldSize.cy = psize->cy;
NewSize.cx = (((OldSize.cx+15)>>4)<<4);
NewSize.cy = (((OldSize.cy+7)>>3)<<3);
if( dst.Len < ((OldSize.cx * OldSize.cy)<<1))
return 0;
if((OldSize.cx != NewSize.cx) || (OldSize.cy != NewSize.cy) )
{
for( h=0 ; h < ((NewSize.cx * NewSize.cy)<<1) ; h++)
*(dst.pData+h) = 0;
}
for( k=0 ; k< OldSize.cy ; k++)
{
for( i=0 ; i<(OldSize.cx<<1) ; i += (16<<1))
{
srcadr = i+ ((k*OldSize.cx)<<1);
desadr = (((((k >>3)*NewSize.cx)<<1) + k%8) +i)<<3;
for( j = 0 ; j<4 ; j++)
{
if((i + (j<<2)+1)>= (OldSize.cx<<1))
break;
switch(encdatatype)
{
case V558_PYUV_422_YYUV:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) );
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+1);
break;
case V558_PYUV_422_YUYV:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) );
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+2);
break;
case V558_PYUV_422_UYVY:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) +1);
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+3);
break;
default:break;
}
}
}
for( i=0 ; i<(OldSize.cx<<1) ; i += (16<<1))
{
srcadr = i+ 16+((k*OldSize.cx)<<1);
desadr = (((((k>>3)*NewSize.cx)<<1) + k%8) +i)<<3;
desadr += 64;
for( j = 0 ; j<4 ; j++)
{
if((i + 16 + (j<<2)+1)>= (OldSize.cx<<1))
break;
switch(encdatatype)
{
case V558_PYUV_422_YYUV:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) );
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+1);
break;
case V558_PYUV_422_YUYV:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) );
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+2);
break;
case V558_PYUV_422_UYVY:
*(dst.pData +desadr+(j<<1)) = *(src.pData+srcadr + (j <<2) +1);
*(dst.pData +desadr+(j<<1)+1) = *(src.pData+srcadr + (j <<2)+3);
break;
default:break;
}
}
}
for( i=0 ; i<(OldSize.cx<<1) ; i += (16<<1))
{
srcadr = i+ ((k*OldSize.cx)<<1);
desadr = (((((k>>3)*NewSize.cx)<<1) + k%8) +i)<<3;
desadr += 128;
for( j = 0 ; j<8 ; j++)
{
if((i + (j<<2)+2)>= (OldSize.cx<<1))
break;
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+1 );
switch(encdatatype)
{
case V558_PYUV_422_YYUV:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+2 ); break;
case V558_PYUV_422_YUYV:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+1 ); break;
case V558_PYUV_422_UYVY:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+0 ); break;
default:break;
}
}
}
for( i=0 ; i<(OldSize.cx<<1) ; i += (16<<1))
{
srcadr = i+ ((k*OldSize.cx)<<1);
desadr = (((((k>>3)*NewSize.cx)<<1) + k%8) +i)<<3;
desadr += 192;
for( j = 0 ; j<8 ; j++)
{
if((i + (j<<2)+3)>= (OldSize.cx<<1))
break;
switch(encdatatype)
{
case V558_PYUV_422_YYUV:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+3 ); break;
case V558_PYUV_422_YUYV:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+3 ); break;
case V558_PYUV_422_UYVY:
*(dst.pData +desadr+j) = *(src.pData+srcadr + (j <<2)+2 ); break;
default:break;
}
}
}
}
pdst->ActLen = ((NewSize.cx * NewSize.cy) <<1);
pnewsize->cx = NewSize.cx;
pnewsize->cy = NewSize.cy;
return 1;
}
UINT8 V558_YUV420PointToBlock(PV558_JPEGBUF psrc, PV558_JPEGBUF pdst,PV558_SIZE psize,PV558_SIZE pnewsize)
{
UINT16 i, j, k;
UINT32 srcadr,dstadr,h;
V558_JPEGBUF src,dst;
V558_SIZE OldSize,NewSize;
OldSize = *psize;
src = *psrc;
dst = *pdst;
NewSize.cx = (((OldSize.cx+15)>>4)<<4);
NewSize.cy = (((OldSize.cy+15)>>4)<<4);
if( dst.Len < (((OldSize.cx * OldSize.cy)*3)>>1))
return 0;
if((OldSize.cx != NewSize.cx) || (OldSize.cy != NewSize.cy) )
{
for( h=0 ; h < (((NewSize.cx * NewSize.cy)*3)>>1) ; h++)
*(dst.pData+h) = 0;
}
for( k=0 ; k< OldSize.cy ; k = k+2)
{
for( i=0 ; i<(OldSize.cx<<1) ; i += 32) //first line 'y0'
{
srcadr = i+ ((k*OldSize.cx*3)>>1);
dstadr = (((((k >>4)*NewSize.cx)*3)<<3) + ((k%8)<<3)+ (i*12));
if((k%16)>=8)
dstadr += 128;
for( j = 0 ; j<4 ; j++)
{
//if((i + (j<<2)+1)>= (OldSize.cx<<1))
//break;
*(pdst->pData +dstadr+(j<<1)) = *(psrc->pData+srcadr + (j<<2));
*(pdst->pData +dstadr+(j<<1)+1) = *(psrc->pData+srcadr + (j<<2)+1);
}
}
for( i=0 ; i<(OldSize.cx<<1) ; i += 32) //first line'y1'
{
srcadr = i+ 16+((k*OldSize.cx*3)>>1);
dstadr = (((((k >>4)*NewSize.cx)*3)<<3) + ((k%8)<<3)+ (i*12));
if((k%16)>=8)
dstadr += 128;
dstadr += 64;
for( j = 0 ; j<4 ; j++)
{
*(pdst->pData +dstadr+(j<<1)) = *(psrc->pData+srcadr + (j<<2));
*(pdst->pData +dstadr+(j<<1)+1) = *(psrc->pData+srcadr + (j<<2)+1);
}
}
for( i=0 ; i<(OldSize.cx) ; i += 16) //next line 'y0'
{
srcadr = (i+ ((k*OldSize.cx*3)>>1));
srcadr += (OldSize.cx<<1);
dstadr = (((((k >>4)*NewSize.cx)*3)<<3) + (((k+1)%8)<<3)+ (i*24));
if((k%16)>=8)
dstadr += 128;
for( j = 0 ; j<8 ; j++)
{
//if((i + (j<<2)+2)>= (OldSize.cx<<1))
//break;
*(pdst->pData +dstadr+j) = *(psrc->pData+srcadr + j);
}
}
for( i=0 ; i<(OldSize.cx) ; i += 16) //next line 'y1'
{
srcadr = (i+ 8 + ((k*OldSize.cx*3)>>1));
srcadr += (OldSize.cx<<1);
dstadr = (((((k >>4)*NewSize.cx)*3)<<3) + (((k+1)%8)<<3)+ (i*24));
if((k%16)>=8)
dstadr += 128;
dstadr += 64;
for( j = 0 ; j<8 ; j++)
{
//if((i + (j<<2)+2)>= (OldSize.cx<<1))
//break;
*(pdst->pData +dstadr+j) = *(psrc->pData+srcadr + j);
}
}
for( i=0 ; i<(OldSize.cx<<1) ; i += 32) //first line 'u'
{
srcadr = (i+ ((k*OldSize.cx*3)>>1));
dstadr = (((((k >>4)*NewSize.cx)*3)<<3) + ((k%16)<<2)+ (i*12));
dstadr += 256;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -