修復了已知的bug;
這個是我實驗用的原圖,用工具把他變成了數組后直接放在程序里面了.
解碼后的圖片
附上代碼
/*************************************************************************************************************
*文件名:JpegCodec.c
*功能:S3C6410JPEG解碼底層驅動函數
*作者:cp1300@139.com
*創(chuàng)建時間:2012年9月20日20:59
*最后修改時間:2012年12月02日
*詳細:JPEG硬解碼
*通過S3C6410DATASHEETV1.2版以及官方WINCE的JPEG驅動的分析,得出結論,S3C6410的JPEG解碼模塊不支持硬件控制自動解碼
*只能使用軟件控制解碼模式
*20121202:修復連續(xù)解碼BUG,目前有少數jpeg420,jpeg444會解碼出錯,就像windows也有可能有不支持的jpeg圖片一樣,少數圖片硬解碼
*失敗可以嘗試使用軟解碼即可。
*20121225:發(fā)現JPEG必須16字節(jié)(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)//使能動態(tài)編碼
#defineDISABLE_MOTION_ENC(0x0<<3)
#defineENABLE_HW_DEC(0x1<<2)
#defineDISABLE_HW_DEC(0x0<<2)
#defineENABLE_MOTION_DEC(0x1<<0)//使能動態(tài)解碼
#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;//狀態(tài)寄存器
u32QTblNo;
u32RSTPos;
u32Vertical;//垂直分辨率
u32Horizontal;//水平分辨率
u32DataSize;//壓縮數據字節(jié)數
u32IRQ;//中斷設置寄存器
u32IRQStatus;//中斷狀態(tài)寄存器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復位