S3C6410 裸机硬件JPEG解码
扫描二维码
随时随地手机看文章
修复了已知的bug;
这个是我实验用的原图,用工具把他变成了数组后直接放在程序里面了.
解码后的图片
附上代码
/*************************************************************************************************************
*文件名:JpegCodec.c
*功能:S3C6410JPEG解码底层驱动函数
*作者:cp1300@139.com
*创建时间:2012年9月20日20:59
*最后修改时间:2012年12月02日
*详细:JPEG硬解码
*通过S3C6410DATASHEETV1.2版以及官方WINCE的JPEG驱动的分析,得出结论,S3C6410的JPEG解码模块不支持硬件控制自动解码
*只能使用软件控制解码模式
*20121202:修复连续解码BUG,目前有少数jpeg420,jpeg444会解码出错,就像windows也有可能有不支持的jpeg图片一样,少数图片硬解码
*失败可以尝试使用软解码即可。
*20121225:发现JPEG必须16字节(128位)地址对齐,否则可能会出现解码失败问题。
*20130113:增加尺寸非8或16倍数的jpeg图片解码功能
*20130113:将程序外部依赖降低,目前只依赖外部的数据类型定义(高类聚,低耦合),打印调试也依赖外部,不用可以修改宏,JPEG_DBUG=0来取消,方便移植。
*************************************************************************************************************/
#include"JpegCodec.h"
#include"jpeg_tables.h"
//调试宏开关
#defineJPEG_DBUG0
#ifJPEG_DBUG
#include"system.h"
#definejpeg_debug(format,...)uart_printf(format,##__VA_ARGS__)
#else
#definejpeg_debug(format,...)/
/
#endif//JPEG_DBUG
//jpeg编解码模式配置
#defineCOEF1_RGB_2_YUV0x4d971e
#defineCOEF2_RGB_2_YUV0x2c5783
#defineCOEF3_RGB_2_YUV0x836e13
#defineENABLE_MOTION_ENC(0x1<<3)//使能动态编码
#defineDISABLE_MOTION_ENC(0x0<<3)
#defineENABLE_HW_DEC(0x1<<2)
#defineDISABLE_HW_DEC(0x0<<2)
#defineENABLE_MOTION_DEC(0x1<<0)//使能动态解码
#defineDISABLE_MOTION_DEC(0x0<<0)
#defineINCREMENTAL_DEC(0x1<<3)//增量解码模式
#defineNORMAL_DEC(0x0<<3)//正常解码模式
#defineYCBCR_MEMORY(0x1<<5)
#defineENABLE_IRQ(0xf<<3)
//等待超时定义
#defineWaitTimeOut0xffffff//等待超时计数器
//定义最大图像宽高度
#defineMAX_JPG_WIDTH4096
#defineMAX_JPG_HEIGHT4096
//JPEG寄存器结构定义
typedefstruct
{
u32Mode;//模式寄存器
u32Status;//状态寄存器
u32QTblNo;
u32RSTPos;
u32Vertical;//垂直分辨率
u32Horizontal;//水平分辨率
u32DataSize;//压缩数据字节数
u32IRQ;//中断设置寄存器
u32IRQStatus;//中断状态寄存器0x20
u32Reserved0[247];
u32QTBL0[64];//0x400
u32QTBL1[64];
u32QTBL2[64];
u32QTBL3[64];
u32HDCTBL0[16];//0x800
u32HDCTBLG0[12];
u32Reserved1[4];
u32HACTBL0[16];
u32HACTBLG0[162];//0x8c0
u32Reserved2[46];
u32HDCTBL1[16];//0xc00
u32HDCTBLG1[12];
u32Reserved3[4];
u32HACTBL1[16];
u32HACTBLG1[162];//0xcc0
u32Reserved4[46];
u32ImageAddr0;//目的图像地址1
u32ImageAddr1;//目的图像地址2
u32JpegAddr0;//源JPEG图像地址1
u32JpegAddr1;//源JPEG图像地址2
u32Start;//JPEG解码开始
u32ReStart;//重新开始JPEG解码
u32 SofReset; //JPEG复位