#include <ti/sdo/dmai/ce/Idec1.h>
#include <ti/sdo/dmai/BufferGfx.h>
#include <ti/sdo/codecs/jpegdec/ijpegdec.h>
#include "errno.h"
{
Engine_Handle hEngine = NULL;
IMGDEC1_Params jpgParams = Idec1_Params_DEFAULT;
IMGDEC1_DynamicParams jpgDynParams = Idec1_DynamicParams_DEFAULT;
IJPEGDEC_DynamicParams jpgExtDynParams;// = IJPEGDEC_DYNAMICPARAMS;
Idec1_Handle hJpgDec=NULL;
Int inBufSize, outBufSize;
ColorSpace_Type colorSpace = ColorSpace_YUV420PSEMI;
BufferGfx_Attrs gfxAttrs = BufferGfx_Attrs_DEFAULT;
Buffer_Attrs bAttrs = Buffer_Attrs_DEFAULT;
Buffer_Handle hInBuf, hDisplayBuf;
Int ret,fifoRet;
FILE *fp;
Int flen;
hEngine = Engine_open(engine->engineName, NULL, NULL);
if (hEngine == NULL)
{
__ERR("Failed to open codec engine %s\n", engine->engineName);
return -1;
}
if(filename == NULL)
return -1;
if(strstr(filename,".jpg") == NULL)
{
__ERR("filename: %s is not a jpg file!\n", filename);
return -1;
}
fp = fopen(filename, "rb");
if(fp == NULL)
{
__ERR("open file: %s failed! \n", filename);
return -1;
}
fseek(fp, 0, SEEK_END);
flen = ftell(fp);
rewind(fp);
if((flen > 500*1000) || (flen <= 0))
{
__ERR("file %s length = %d is too large!\n", filename, flen);
fclose(fp);
return -1;
}
__ERR("file %s length = %d \n", filename, flen);
hInBuf = Buffer_create(flen, &bAttrs);
if(hInBuf == NULL)
{
__ERR("create inBuf failed!\n");
return -1;
}
ret = fread(Buffer_getUserPtr(hInBuf), 1, flen ,fp);
if(ret <= 0)
{
__ERR("read file %s failed, err = %s\n", filename, strerror(errno));
Buffer_delete(hInBuf);
fclose(fp);
return -1;
}
Buffer_setNumBytesUsed(hInBuf, ret);
// Set the create time base parameters
jpgParams.size = sizeof(IJPEGDEC_Params);
jpgParams.maxWidth = 720;
jpgParams.maxHeight = 576;
jpgParams.maxScans= XDM_DEFAULT;
jpgParams.dataEndianness = XDM_BYTE;
jpgParams.forceChromaFormat = XDM_YUV_420SP;
#if 0
hJpgDec = Idec1_create(hEngine, "jpegdec", &jpgParams, &jpgDynParams);
#else
memset(&jpgExtDynParams, 0, sizeof(IJPEGDEC_DynamicParams));
//jpgExtDynParams.imgdecDynamicParams = Idec1_DynamicParams_DEFAULT;
jpgExtDynParams.imgdecDynamicParams.size = sizeof(IJPEGDEC_DynamicParams);
jpgExtDynParams.imgdecDynamicParams.numAU = XDM_DEFAULT;
jpgExtDynParams.imgdecDynamicParams.decodeHeader = XDM_DECODE_AU; //DEFAULT;
jpgExtDynParams.imgdecDynamicParams.displayWidth = XDM_DEFAULT; //720;
jpgExtDynParams.disableEOI =0;
jpgExtDynParams.resizeOption =0;
jpgExtDynParams.subRegionUpLeftX=0;
jpgExtDynParams.subRegionUpLeftX=0;
jpgExtDynParams.subRegionUpLeftX=0;
jpgExtDynParams.subRegionUpLeftX=0;
jpgExtDynParams.rotation =0;
__ERR("jped decode use normal mode.\n");
//jpgExtDynParams.decodingPreset = 0; //high performance mode will cause decode fail with high quality picture
jpgExtDynParams.decodingPreset = 1; //normal mode
hJpgDec = Idec1_create(hEngine, "jpegdec", &jpgParams, (IMGDEC1_DynamicParams *)&jpgExtDynParams);
#endif
if (hJpgDec == NULL)
{
__ERR("Failed to create jpeg decoder!\n");
fclose(fp);
return -1;
}
__ERR("jpg decode create ok!\n");
inBufSize = Idec1_getInBufSize(hJpgDec);
outBufSize = Idec1_getOutBufSize(hJpgDec);
__ERR("jpg inbufSize = %d, outbufSize = %d\n", inBufSize, outBufSize);
gfxAttrs.colorSpace = colorSpace;
gfxAttrs.dim.width = 720;
gfxAttrs.dim.height = 576;
gfxAttrs.dim.lineLength = BufferGfx_calcLineLength(gfxAttrs.dim.width,
colorSpace);
hDisplayBuf = Buffer_create(outBufSize, BufferGfx_getBufferAttrs(&gfxAttrs));
if(hDisplayBuf == NULL)
{
__ERR("create hDisplayBuf failed! \n");
Idec1_delete(hJpgDec);
Buffer_delete(hInBuf);
fclose(fp);
return -1;
}
__ERR("create hDisplayBuf OK! \n");
ret = Idec1_process_ext(hJpgDec, hInBuf, hDisplayBuf, (IMGDEC1_DynamicParams *)&jpgExtDynParams);
if(ret < 0)
{
__ERR("decode jpeg file %s failed! \n", filename);
Idec1_delete(hJpgDec);
Buffer_delete(hInBuf);
Buffer_delete(hDisplayBuf);
fclose(fp);
return -1;
}
BufferGfx_Dimensions dstDim;
BufferGfx_getDimensions(hDisplayBuf, &dstDim);
__ERR("decode jpg file OK, x=%d, y=%d, w=%d, h=%d \n",
dstDim.x,
dstDim.y,
dstDim.width,
dstDim.height);
Idec1_delete(hJpgDec);
Buffer_delete(hInBuf);
Buffer_delete(hDisplayBuf);
fclose(fp);
return 0;
}
