void init_cache(void) { CSL_sysInit(); MDMA_PRIARB_REG = 0x00000000; CACHE_wbInvAllL2(CACHE_WAIT); #ifdef _CAMERA_PIXEL_500W_ InitEMIF_32M(); #else InitEMIF(); #endif CACHE_setL1dSize(CACHE_L1_32KCACHE); CACHE_setL1pSize(CACHE_L1_32KCACHE); CACHE_setL2Size(CACHE_32KCACHE); CACHE_wbInvAllL2(CACHE_WAIT); }
/****************************************************************************** * flushCache ******************************************************************************/ static void flushCache (void) { uint32_t key; /* Disable Interrupts */ key = _disable_interrupts(); CSL_XMC_invalidatePrefetchBuffer(); /*------------------------------------------------------------------------- * Also flushes L1P and L1D. *------------------------------------------------------------------------*/ CACHE_wbInvAllL2(CACHE_NOWAIT); _mfence(); asm(" NOP 9"); asm(" NOP 7"); /* Reenable Interrupts. */ _restore_interrupts(key); }
/***************************************************************************** * Prototype : jpeg_decode * description : JPEG Decode * Input : Uint8 *pin_buf Uint8 *pout_buf Uint32 dim * Output : None * Return Value : * Calls : * Called By : * Modification History : * 1.Date : 2013/10/17 * Author : Gzz * Modification : Created function *****************************************************************************/ void jpeg_decode(Uint8 *pin_buf, Uint8 *pout_buf, Uint32 dim ) { /* Input/Output Buffer Descriptors */ XDM1_BufDesc inputBufDesc, outputBufDesc; IIMGDEC1_Fxns *IIMGDEC1Fxns; /*record decoded last byte num*/ XDAS_UInt32 bytesConsumed = 0; FILE *fp ; fp = fopen("E:\\jpeg8.jpg", "rb"); fread(jpeg,1, 33052,fp); fclose(fp); JPEGDEC_Status status; JPEGDEC_InArgs inArgs; JPEGDEC_OutArgs outArgs; JPEGDEC_DynamicParams dynamic_params; status.imgdecStatus.size = sizeof(IJPEGDEC_Status); inArgs.imgdecInArgs.size = sizeof(IJPEGDEC_InArgs); inArgs.imgdecInArgs.numBytes = dim;//带解码的JPEG图像大小 outArgs.imgdecOutArgs.size = sizeof(IJPEGDEC_OutArgs); memcpy((void *)&dynamic_params, (void *)&decode_dynamic_default_params, sizeof(JPEGDEC_DynamicParams)); dynamic_params.imgdecDynamicParams.decodeHeader = XDM_PARSE_HEADER;//解析信息头 dynamic_params.frame_numbytes = dim; //一帧JPEG的图像大小 /* set space for buffer descriptors */ inputBufDesc.descs[0].buf = (XDAS_Int8 *)jpeg; inputBufDesc.descs[0].bufSize = (XDAS_Int32 )dim; outputBufDesc.descs[0].buf = (XDAS_Int8 *)yuv; outputBufDesc.descs[0].bufSize = (XDAS_Int32)JPEG_DECODE_INPUT_BUFFER_SIZE ; IIMGDEC1Fxns = (IIMGDEC1_Fxns *)jpeg_decode_handle->fxns; jpeg_decode_handle->fxns->algActivate(jpeg_decode_handle); /* Get Buffer information */ IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_GETBUFINFO, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//获取buffer的信息 /* Fill up the buffers as required by algorithm */ inputBufDesc.numBufs = status.imgdecStatus.bufInfo.minNumInBufs ;//算法需要的输入缓存区的最小buf个数 inputBufDesc.descs[0].bufSize = status.imgdecStatus.bufInfo.minInBufSize[0];//根据算法需求返回的buffer信息。 outputBufDesc.numBufs = status.imgdecStatus.bufInfo.minNumOutBufs ; outputBufDesc.descs[0].bufSize = status.imgdecStatus.bufInfo.minOutBufSize[0]; IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_SETPARAMS, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//设置算法所需的参数 /* Basic Algorithm process() call */ IIMGDEC1Fxns->process((IIMGDEC1_Handle)jpeg_decode_handle, (XDM1_BufDesc *)&inputBufDesc, (XDM1_BufDesc *)&outputBufDesc, (IIMGDEC1_InArgs *)&inArgs, (IIMGDEC1_OutArgs *)&outArgs);//处理头信息 CACHE_wbInvAllL1d(CACHE_WAIT); CACHE_wbInvAllL2(CACHE_WAIT); //cache back to DDR2 IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_GETSTATUS, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//获取当前状态 dynamic_params.imgdecDynamicParams.decodeHeader = XDM_DECODE_AU;//解码数据单元 IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_RESET, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//复位所有的结构体和算法buffer被flash bytesConsumed = 0; /* DeActivate the Algorithm */ // jpeg_decode_handle->fxns->algDeactivate(jpeg_decode_handle); /* Do-While Loop for Decode Call */ do { IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_GETBUFINFO, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//获取buffer的信息 /* Fill up the buffers as required by algorithm */ inputBufDesc.numBufs = status.imgdecStatus.bufInfo.minNumInBufs ;//算法需要的输入缓存区的最小buf个数 inputBufDesc.descs[0].bufSize = status.imgdecStatus.bufInfo.minInBufSize[0];//根据算法需求返回的buffer信息。 outputBufDesc.numBufs = status.imgdecStatus.bufInfo.minNumOutBufs ; outputBufDesc.descs[0].bufSize = status.imgdecStatus.bufInfo.minOutBufSize[0]; IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_SETPARAMS, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//设置算法所需的参数 IIMGDEC1Fxns->process((IIMGDEC1_Handle)jpeg_decode_handle, (XDM1_BufDesc *)&inputBufDesc, (XDM1_BufDesc *)&outputBufDesc, (IIMGDEC1_InArgs *)&inArgs, (IIMGDEC1_OutArgs *)&outArgs);//解码处理 bytesConsumed += outArgs.imgdecOutArgs.bytesConsumed;//记录一次编码完成的字节数 CACHE_wbInvAllL1d(CACHE_WAIT); CACHE_wbInvAllL2(CACHE_WAIT); //cache back to DDR2 IIMGDEC1Fxns->control((IIMGDEC1_Handle)jpeg_decode_handle, XDM_GETSTATUS, (IIMGDEC1_DynamicParams *)&dynamic_params, (IIMGDEC1_Status *)&status);//获取解码后的状态 if(status.end_of_seq) { break;//解码完成标志 } }while(1); jpeg_decode_handle->fxns->algDeactivate(jpeg_decode_handle); jpeg_decode_handle->fxns->algFree(jpeg_decode_handle, (IALG_MemRec *)dec_memTab); }
void jpeg_encode(Uint8 *pin_buf, Uint8 *pout_buf) { FILE *fp ; Uint8 file_name[256]; static Uint32 num_frame = 0; sprintf(file_name, "E://test_jpeg//jpeg%d.jpg",num_frame); num_frame++; /* Input/Output Buffer Descriptors */ XDM1_BufDesc inputBufDesc, outputBufDesc; IIMGENC1_Fxns *IIMGENC1Fxns; /*record had encoded byte num*/ XDAS_UInt32 TotalBytes = 0; IIMGENC1_Status status; IIMGENC1_InArgs inArgs; IIMGENC1_OutArgs outArgs; IIMGENC1_DynamicParams dynamic_params; status.size = sizeof(IIMGENC1_Status); status.extendedError = 0; inArgs.size = sizeof(IIMGENC1_InArgs); outArgs.size = sizeof(IIMGENC1_OutArgs); outArgs.extendedError = 0; outArgs.bytesGenerated = 0; outArgs.currentAU = 0; fp = fopen(file_name,"wb"); memcpy((void *)&dynamic_params, (void *)&encode_dynamic_default_params, sizeof(IIMGENC1_DynamicParams)); dynamic_params.generateHeader = XDM_ENCODE_AU;//直接编码AU IIMGENC1Fxns = (IIMGENC1_Fxns *)jpeg_encode_handle->fxns; /* Activate the Algorithm */ jpeg_encode_handle->fxns->algActivate(jpeg_encode_handle); IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_SETPARAMS, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//设置算法所需的参数 IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_GETBUFINFO, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//获取输入输出buffer的信息 /* DeActivate the Algorithm */ jpeg_encode_handle->fxns->algDeactivate(jpeg_encode_handle); /* set space for buffer descriptors */ inputBufDesc.numBufs = status.bufInfo.minNumInBufs ; inputBufDesc.descs[0].bufSize = status.bufInfo.minInBufSize[0] ; inputBufDesc.descs[0].buf = (XDAS_Int8 *)pin_buf; outputBufDesc.descs[0].buf = (XDAS_Int8 *)pout_buf; outputBufDesc.numBufs = status.bufInfo.minNumOutBufs ; outputBufDesc.descs[0].bufSize = status.bufInfo.minOutBufSize[0] ; /* Activate the Algorithm */ jpeg_encode_handle->fxns->algActivate(jpeg_encode_handle); IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_SETPARAMS, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//设置算法所需的参数 /* Basic Algorithm process() call */ IIMGENC1Fxns->process((IIMGENC1_Handle)jpeg_encode_handle, (XDM1_BufDesc *)&inputBufDesc, (XDM1_BufDesc *)&outputBufDesc, (IIMGENC1_InArgs *)&inArgs, (IIMGENC1_OutArgs *)&outArgs);//处理信息 CACHE_wbInvAllL1d(CACHE_WAIT); CACHE_wbInvAllL2(CACHE_WAIT); TotalBytes += outArgs.bytesGenerated; fwrite(pout_buf,1,TotalBytes,fp); DEBUG("Out JPEG bytes = %d", TotalBytes); DEBUG("compress_rate = %d%%", IMAGE_TOTAL_SIZE/TotalBytes); fclose(fp); IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_SETPARAMS, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//设置算法所需的参数 while (outArgs.currentAU < status.totalAU)//如果当前编码输出的AU比实际的要小,就继续编码 { /* Basic Algorithm process() call */ IIMGENC1Fxns->process((IIMGENC1_Handle)jpeg_encode_handle, (XDM1_BufDesc *)&inputBufDesc,(XDM1_BufDesc *)&outputBufDesc, (IIMGENC1_InArgs *)&inArgs, (IIMGENC1_OutArgs *)&outArgs);//处理信息 TotalBytes +=outArgs.bytesGenerated; CACHE_wbInvAllL1d(CACHE_WAIT); CACHE_wbInvAllL2(CACHE_WAIT); IIMGENC1Fxns->control((IIMGENC1_Handle)jpeg_encode_handle, XDM_SETPARAMS, (IIMGENC1_DynamicParams *)&dynamic_params, (IIMGENC1_Status *)&status);//设置算法所需的参数 } jpeg_encode_handle->fxns->algDeactivate(jpeg_encode_handle); jpeg_encode_handle->fxns->algFree(jpeg_encode_handle, (IALG_MemRec *)enc_memTab); }