📄 jpegdec.c
字号:
break;
case TE3320_WRJPG: //write the jpeg data to TE3320RPE
{
JPEGDATA_info *pJpegdata = (JPEGDATA_info*)arg;
writeJPEGdata(pJpegdata->pdatabuf,pJpegdata->len);
}
break;
default:
break;
}
return EDC_SUCCESS;
}
/*
* ======== TE3320_open ========
*/
static EDC_Handle TE3320_open(String devName, Arg optArg)
{
Int devId;
/* Check if the addresse is correct */
if(devName[0] != '/') {
devId = -1;
} else if(devName[1] == '0') {
devId = 0;
} else if(devName[1] == '1'){
devId = 1;
} else {
devId = -1;
}
return (EDC_Handle)devId;
}
///////////////////////external interface//////////////////////////////
int JPGdecInit()
{
return Set32bitLE();
}
int GetDecSts()
{
Uint16 ifact;
ifact = (Uint16)(RD_IDR(IREG_IFACT)&0x0080);
return ifact;
}
FVID_Handle JPGdecOpen(int resolution, int * pStatus)
{
int status;
FVID_Handle capChan;
switch(resolution)
{
case RESOLUTION_CIF:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 352-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 288;
}
break;
case RESOLUTION_VGA:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 640-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 480;
}
break;
case RESOLUTION_NTSC:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 720-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 480;
}
break;
case RESOLUTION_PAL:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 720-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 576;
}
break;
case RESOLUTION_SVGA:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 800-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 600;
}
break;
case RESOLUTION_XGA:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 1024-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 768;
}
break;
case RESOLUTION_SXGA:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 1280-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 1024;
}
break;
case RESOLUTION_UXGA:
{
JPEGDEC_vCapParamsChan.fldXStop1 = 1600-1;
JPEGDEC_vCapParamsChan.fldYStop1 = 1200;
}
break;
default:
{
*pStatus = ER_RESULOTION;
return INV;
}
}
JPEGDEC_vCapParamsChan.segId = EXTERNALHEAP;
//initialize the varibles
pJpgbuf = NULL;
len4Jpgdw = 0;
hSem4Sendjpg = SEM_create(0, NULL);
if(hSem4Sendjpg == NULL)
{
*pStatus = ER_CREATESEM;
return INV;
}
//config the te3320
if(configTE3320(&JPEGDEC_vCapParamsTE3320)<0)
{
// debug_decode("Failed to initialize TE3320!!!\n");
*pStatus = ER_CONFIGDEC;
SEM_delete(hSem4Sendjpg);
return INV;
}
/******************************************************/
/* initialization of capture driver */
/******************************************************/
capChan = FVID_create("/VP0JPGDEC/A/0",
IOM_INPUT, &status, (Ptr)&JPEGDEC_vCapParamsChan, NULL);
/******************************************************/
/* start capture operation */
/******************************************************/
FVID_control(capChan, VPORT_CMD_START, NULL);
//set the TE3320
startTE3320(0x0001);
return capChan;
}
int JPGdecImg(Uint8 *pIn, int jpeglen, Uint8 *pOut, int *YUVlen, int *type)
{
/*
Uint16 goorder = 0;
Uint32 gostatus = 0;
// Int32 lenOnetime =0;
int i;
int curTxlen = 0;
// Uint32 gostatus;
Uint32 *pInbuf = (Uint32 *)pIn;
int jpgdwlen = jpeglen>>2;
gostatus = GOSTATUS();
if(gostatus&0x00030000)
return ER_DECBUSY;
//make ready for the pointer returned
// pYbuf = pOut;
// pCbbuf = pOut+(numLinesCap*numPixels);
// pCrbuf = pCbbuf+((numLinesCap*numPixels)>>1);
// Light_LED(1);
//set the GO register
goorder = 0x0002;
startTE3320(goorder);
//download the data
while(1)
{
while((gostatus = GOSTATUS())&JFIFO_WRENABLE)
{
curTxlen = (gostatus&0x1FFF)>>2; //32bits
if(curTxlen<1000)
break;
for(i=0;i<curTxlen;i++)
{
JEPGDEC_DR(DR_iJDATA) = *pInbuf;
pInbuf++;
jpgdwlen--;
if(jpgdwlen == 0)
{//one frame over
if(SEM_pend(SEM_vp2tx,500))
{//capture success
*YUVlen = (numLinesCap*numPixels)<<1;
*type = 4;
// DeLight_LED(1);
return DECSUCCESS;
}
else
{//capture failed
return DECFAILED;
}
}
}
// TSK_sleep(1);
}
}
*/
return 1;
}
/*
int SendJpegData(Uint8 *pIn, int jpeglen)
{
Uint32 gostatus = 0;
int i;
int curTxlen = 0;
Uint32 *pInbuf = (Uint32 *)pIn;
int jpgdwlen = jpeglen>>2;
gostatus = GOSTATUS();
if(!(gostatus&JFIFO_WRENABLE))
return ER_DECBUSY;
// Light_LED(1);
while(1)
{
while((gostatus = GOSTATUS())&JFIFO_WRENABLE)
{
curTxlen = (gostatus&0x1FFF)>>2; //32bits
if(curTxlen<1000)
break;
for(i=0;i<curTxlen;i++)
{
JEPGDEC_DR(DR_iJDATA) = *pInbuf;
pInbuf++;
jpgdwlen--;
if(jpgdwlen == 0)
{//one frame over
// DeLight_LED(1);
//clear the ifact flag for bit 7 and bit 3
WR_IDR(IREG_IFACT, (IFACT_JEND|IFACT_DECEND));
return DECSUCCESS;
}
}
// TSK_sleep(2);
}
}
}
*/
int SendJpegData(Uint8 *pIn, int jpeglen)
{
Uint32 gostatus = 0;
int i;
int curTxlen = 0;
gostatus = GOSTATUS();
if(!(gostatus&JFIFO_WRENABLE))
return ER_DECBUSY;
//don't need protect them
pJpgbuf = (Uint32 *)pIn;
len4Jpgdw = jpeglen>>2;
curTxlen = (gostatus&0x1FFF)>>2; //32bits
// Light_LED(1);
while(1)
{
while((gostatus = GOSTATUS())&JFIFO_WRENABLE)
{
curTxlen = (gostatus&0x1FFF)>>2; //32bits
if(curTxlen<1000)
break;
for(i=0;i<curTxlen;i++)
{
JEPGDEC_DR(DR_iJDATA) = *pInbuf;
pInbuf++;
jpgdwlen--;
if(jpgdwlen == 0)
{//one frame over
// DeLight_LED(1);
//clear the ifact flag for bit 7 and bit 3
WR_IDR(IREG_IFACT, (IFACT_JEND|IFACT_DECEND));
return DECSUCCESS;
}
}
// TSK_sleep(2);
}
}
}
void JPGdecClose(FVID_Handle capChan)
{
if(hSem4Sendjpg != NULL)
{
SEM_delete(hSem4Sendjpg);
}
if(capChan)
{
// FVID_delete(capChan);
capChan = INV;
}
}
/**************************************************************************/
/* End of file */
/**************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -