JPEG_DecodeBody(ImageAddr); //解码JPEG
status = JPEG_WaitForIRQ(); //等待完成
if(status == JPEG_OK)
{
jpeg_debug("Jpeg decode OK(%d)\r\n",status);
}
else
{
jpeg_debug("Jpeg decode error(%d)\r\n",status);
return status;
}
}
JpegInfo->DataSize = JPEG_GetYUVSize(JpegInfo->Type,JpegInfo->Width,JpegInfo->Height);
return status; //返回错误
}
/*************************************************************************************************************************
*函数 : JPEG_ERROR JPEG_EncodeOneFrame(u32 JpgAddr, u32 ImageAddr, JPEG_INFO *JpegInfo)
*功能 : 压缩一张JPEG
*参数 : JpegAddr: jpeg图像地址
* ImageAddr: 解码后图像地址
* JpegInfo: 图像信息结构指针
*返回 : JPEG_ERROR
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20130114
*最后修改时间 : 201310114
*说明 : 只支持YCbCr4:2:2,YCbCr4:2:0的输入格式
* 只测试了编码,能成功,但是没有生成jpeg文件进行测试,如果要生成jpeg文件应该还需要添加相应的文件头和尾部。
*************************************************************************************************************************/
JPEG_ERROR JPEG_EncodeOneFrame(u32 JpgAddr, u32 ImageAddr, JPEG_QUALITY_TYPE jpegQuality, JPEG_INFO *JpegInfo)
{
JPEG_ERROR status = JPEG_OK;
u32 i;
if(JpegInfo->Width <= 0 || JpegInfo->Width > MAX_JPG_WIDTH || JpegInfo->Height <= 0 || JpegInfo->Height > MAX_JPG_HEIGHT)
{
return JPEG_SIZE_ERROR;
}
JPEG_Reset();
JPEG->Mode = (JpegInfo->Type == TYPE_JPEG_422) (0x01 << 0) : (0x02 << 0); //亚抽样模式
JPEG->RSTPos = 2; // MCU inserts RST marker
JPEG->QTblNo = (1 << 12) | (1 << 14);
JPEG->Horizontal = JpegInfo->Width;
JPEG->Vertical = JpegInfo->Height;
JPEG->ImageAddr0 = ImageAddr;
JPEG->ImageAddr1 = ImageAddr;
JPEG->JpegAddr0 = JpgAddr;
JPEG->JpegAddr1 = JpgAddr;
JPEG->COEF1 = COEF1_RGB_2_YUV; // Coefficient value 1 for RGB to YCbCr
JPEG->COEF2 = COEF2_RGB_2_YUV; // Coefficient value 2 for RGB to YCbCr
JPEG->COEF3 = COEF3_RGB_2_YUV; // Coefficient value 3 for RGB to YCbCr
JPEG->Misc = (1<<5) | (0<<2);
JPEG->Cntl = DISABLE_MOTION_ENC;
// Quantiazation and Huffman Table setting
for (i=0; i<64; i++)
JPEG->QTBL0[i] = (u32)QTBL_Luminance[jpegQuality][i];
for (i=0; i<64; i++)
JPEG->QTBL1[i] = (u32)QTBL_Chrominance[jpegQuality][i];
for (i=0; i<16; i++)
JPEG->HDCTBL0[i] = (u32)HDCTBL0[i];
for (i=0; i<12; i++)
JPEG->HDCTBLG0[i] = (u32)HDCTBLG0[i];
for (i=0; i<16; i++)
JPEG->HACTBL0[i] = (u32)HACTBL0[i];
for (i=0; i<162; i++)
JPEG->HACTBLG0[i] = (u32)HACTBLG0[i];
JPEG->Start = 0;
status = JPEG_WaitForIRQ();
if(status == JPEG_OK)
{
jpeg_debug("Jpeg encode OK!(%d)\r\n",status);
JpegInfo->FileSize = JPEG->DataSize;
}
else
{
JpegInfo->FileSize = 0;
jpeg_debug("Jpeg encode error!(%d)\r\n",status);
}
return status;
}
/*************************************************************************************************************************
*函数 : static bool JPEG_CorrectHeader(JPEG_TYPE jpegType, u16 *width, u16 *height)
*功能 : 检查图像的宽高时候满足要求
*参数 : jpegType: jpeg类型,见JPEG_TYPE
* width: 图像宽度
* height: 图像高度
*返回 : TRUE:需要重写宽度,高度
* FALSE:无需重写宽度,高度
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20130113
*最后修改时间 : 20130113
*说明 : 直接由S3C6410官方代码移植而来
* 如果不满足要求,将计算最接近的满足要求的分辨率,JPEG分辨率需要能被8或者16整除,具体可以查阅相关资料
*************************************************************************************************************************/
static bool JPEG_CorrectHeader(JPEG_TYPE jpegType, u16 *width, u16 *height)
{
bool result = FALSE;