设为首页 加入收藏

TOP

S3C6410 裸机硬件JPEG解码(一)
2014-11-24 07:40:31 来源: 作者: 【 】 浏览:0
Tags:S3C6410 裸机 硬件 JPEG 解码

2012年12月25日,晚上我找到问题所在了,JPEG解码源图像地址必须是16字节(128位)对齐的,也就是最低4位必须为0,这个害的我好久,还好终于解决了。


修复了已知的bug;



这个是我实验用的原图,用工具把他变成了数组后直接放在程序里面了.


解码后的图片



附上代码


/*************************************************************************************************************
* 文件名 : JpegCodec.c
* 功能 : S3C6410 JPEG解码底层驱动函数
* 作者 : cp1300@139.com
* 创建时间 : 2012年9月20日20:59
* 最后修改时间 : 2012年12月02日
* 详细 : JPEG硬解码
* 通过S3C6410 DATASHEETV1.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"



//调试宏开关
#define JPEG_DBUG 0
#if JPEG_DBUG
#include "system.h"
#define jpeg_debug(format,...) uart_printf(format,##__VA_ARGS__)
#else
#define jpeg_debug(format,...) /\
/
#endif //JPEG_DBUG



//jpeg编解码模式配置
#define COEF1_RGB_2_YUV 0x4d971e
#define COEF2_RGB_2_YUV 0x2c5783
#define COEF3_RGB_2_YUV 0x836e13


#define ENABLE_MOTION_ENC (0x1<<3) //使能动态编码
#define DISABLE_MOTION_ENC (0x0<<3)


#define ENABLE_HW_DEC (0x1<<2)
#define DISABLE_HW_DEC (0x0<<2)


#define ENABLE_MOTION_DEC (0x1<<0) //使能动态解码
#define DISABLE_MOTION_DEC (0x0<<0)


#define INCREMENTAL_DEC (0x1<<3) //增量解码模式
#define NORMAL_DEC (0x0<<3) //正常解码模式
#define YCBCR_MEMORY (0x1<<5)


#define ENABLE_IRQ (0xf<<3)


//等待超时定义
#define WaitTimeOut 0xffffff //等待超时计数器


//定义最大图像宽高度
#define MAX_JPG_WIDTH 4096
#define MAX_JPG_HEIGHT 4096


//JPEG寄存器结构定义
typedef struct
{
u32 Mode; //模式寄存器
u32 Status; //状态寄存器
u32 QTblNo;
u32 RSTPos;
u32 Vertical; //垂直分辨率
u32 Horizontal; //水平分辨率
u32 DataSize; //压缩数据字节数
u32 IRQ; //中断设置寄存器
u32 IRQStatus; //中断状态寄存器 0x20
u32 Reserved0[247];
u32 QTBL0[64]; //0x400
u32 QTBL1[64];
u32 QTBL2[64];
u32 QTBL3[64];
u32 HDCTBL0[16]; //0x800
u32 HDCTBLG0[12];
u32 Reserved1[4];
u32 HACTBL0[16];
u32 HACTBLG0[162]; //0x8c0
u32 Reserved2[46];
u32 HDCTBL1[16]; //0xc00
u32 HDCTBLG1[12];
u32 Reserved3[4];
u32 HACTBL1[16];
u32 HACTBLG1[162]; //0xcc0
u32 Reserved4[46];
u32 ImageAddr0; //目的图像地址1
u32 ImageAddr1; //目的图像地址2
u32 JpegAddr0; //源JPEG图像地址1
u32 JpegAddr1; //源JPEG图像地址2
u32 Start; //JPEG解码开始
u32 ReStart; //重新开始JPEG解码
u32 SofReset; //JPEG复位
u32 Cntl; //控制寄存器
u32 COEF1;
u32 COEF2;
u32 COEF3;
u32 Misc; //杂项寄存器
u32 FramIntv;
}JPEG_TypeDef;



//定义JPEG文件标记
enum
{
UNKNOWN,
BASELINE = 0xC0,
EXTENDED_SEQ = 0xC1,
PROGRESSIVE = 0xC2
}JPG_SOF_MARKER;



//S3C6410 jpeg编解码器基址
#define JPEG_BASE 0x78800000



//寄存器结构指针
#define JPEG ((JPEG_TypeDef *)JPEG_BASE)



//内部静态函数声明
static void JPEG_Reset(void); //JPEG解码器软件复位
static JPEG_TYPE JPEG_GetJpegType(void); //获取JPEG采样模式
static void JPEG_GetWidthHeight(u16* width, u16* height);//获取图像大小
static JPEG_ERROR JPEG_WaitForIRQ(void); //等待中断,并返回状态
static bool JPEG_CorrectHeader(JPEG_TYPE jpegType, u16 *width, u16 *height);
static void JPEG_WriteHeader(u32 JpgAddr, u32 fileSize, u16 width, u16 height);
static void JPEG_WriteYUV

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

评论

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

·零基础如何学爬虫技 (2025-12-25 20:49:17)
·Java 并发工具类:提 (2025-12-25 20:25:44)
·Java面试技巧:如何 (2025-12-25 20:25:41)
·Java并发编程中的线 (2025-12-25 20:25:38)
·C 语言 - cppreferen (2025-12-25 19:50:27)