设为首页 加入收藏

TOP

S3C6410 裸机硬件JPEG解码(五)
2014-11-24 07:40:31 来源: 作者: 【 】 浏览:6
Tags:S3C6410 裸机 硬件 JPEG 解码
rsingHeader
*************************************************************************************************************************/
static void JPEG_DecodeBody(u32 ImageAddr)
{
JPEG->ImageAddr0 = ImageAddr;
JPEG->ImageAddr1 = ImageAddr; //解码数据缓冲器地址
JPEG->Cntl = 0; //解码JPEG头部
JPEG->Misc = 0;
JPEG->ReStart = 1; //开始主解码处理
}



/*************************************************************************************************************************
*函数 : JPEG_ERROR JPEG_DecodeOneFrame(u32 JpgAddr, u32 ImageAddr, u32 jpegSize, JPEG_INFO *JpegInfo)
*功能 : 开始解码一帧JPEG
*参数 : JpegAddr: jpeg图像地址
* ImageAddr: 解码后图像地址
* jpegSize: 图片数据大小
* JpegInfo: 图像信息结构指针
*返回 : JPEG_ERROR
*依赖 : JPEG_StartParsingHeader;JPEG_StartDecodingBody
*作者 : cp1300@139.com
*时间 : 20120920
*最后修改时间 : 2010113
*说明 : 软件控制解码模式
* 修改源图像地址128位对齐bug
* 20120113:增加尺寸非8或16倍数的jpeg图片解码功能,需要传递一个参数,即图片大小,通过FileSize传递
* 非对齐的jpeg解码效率将低于对齐的图片,由于解码前需要先改写数据。
*************************************************************************************************************************/
JPEG_ERROR JPEG_DecodeOneFrame(u32 JpgAddr, u32 ImageAddr, u32 jpegSize, JPEG_INFO *JpegInfo)
{
JPEG_ERROR status;
u16 width,height;
bool headerFixed = FALSE;
#if JPEG_DBUG
const char *JpegType[6] = {"JPEG 4:4:4","JPEG 4:2:2","JPEG 4:2:0","JPEG 4:0:0","JPEG 4:1:1","JPEG UNKNOWN"};
#endif

if(JpgAddr % 16) //源地址一定要是16字节(128位)对齐的,否则会出现各种意想不到的问题,这个问题困扰了我5个多月。
{
jpeg_debug("jpeg addr error\r\n");
return JPEG_OTHER_ERROR;
}

JpegInfo->FileSize = jpegSize; //存储图片大小
jpeg_debug("\r\n");
jpeg_debug("start jpeg decoding...\r\n");
JPEG_Reset();
JPEG_DecodeHeader(JpgAddr); //分析JPEG文信息
status = JPEG_WaitForIRQ(); //等待完成
if(status != JPEG_HEADER_OK) //图像分析错误
{
return status;
}

JpegInfo->Type = JPEG_GetJpegType(); //获取图片类型
jpeg_debug("Jpeg Mod:%s\r\n",JpegType[JpegInfo->Type]);
if(JpegInfo->Type == TYPE_JPEG_UNKNOWN) //未定义类型
{
return JPEG_TYPE_ERROR;
}

JPEG_GetWidthHeight(&(JpegInfo->Width),&(JpegInfo->Height)); //获取图片分辨率

width = JpegInfo->Width;
height = JpegInfo->Height;
if(!JPEG_CorrectHeader(JpegInfo->Type, &(JpegInfo->Width), &(JpegInfo->Height)))
{
JPEG_WriteHeader(JpgAddr,jpegSize,JpegInfo->Width, JpegInfo->Height);
headerFixed = TRUE;
}

jpeg_debug("jpeg image size %d*%d\r\n",JpegInfo->Width,JpegInfo->Height);


if(JpegInfo->Width <= 0 || JpegInfo->Width > MAX_JPG_WIDTH || JpegInfo->Height <= 0 || JpegInfo->Height > MAX_JPG_HEIGHT)
{
return JPEG_SIZE_ERROR;
}

if(headerFixed == TRUE)
{
JPEG_Reset();
JPEG_DecodeHeader(JpgAddr); //分析JPEG文信息
status = JPEG_WaitForIRQ(); //等待完成
if(status != JPEG_HEADER_OK) //图像分析错误
{
return status;
}

JPEG_DecodeBody(ImageAddr); //解码JPEG
status = JPEG_WaitForIRQ(); //等待完成
if(status == JPEG_OK)
{
jpeg_debug("Jpeg decode OK(%d)\r\n",status);
//JPEG_GetStreamLen(&(JpegInfo->DataSize)); //获取解码后图像大小
}
else
{
jpeg_debug("Jpeg decode error(%d)\r\n",status);
return status;
}

// for post processor, discard pixel
if(width % 4 != 0)
width = (width/4)*4;

if(height % 2 != 0)
height = (height/2)*2;

JPEG_WriteYUV(ImageAddr,JpegInfo->Width,width,JpegInfo->Height,height);

JpegInfo->Width = width;
JpegInfo->Height = height;
}
else
{

首页 上一页 2 3 4 5 6 7 下一页 尾页 5/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OK6410汇编程序练习 下一篇S3C6410 硬件JPEG解码无关代码影..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)