⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vjpeg.c

📁 VC0558 backend IC jpeg format program
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -