动画解码器(MDEC)

动画解码器(MDEC)是一个特殊的控制芯片,把类似于JPEG的压缩图像解压到24位位图给GPU显示。MDEC一次只能解压16×16象素的24位图像,叫做“巨块”。这些巨块使用YUV(YCbCr)颜色表和离散余弦变换和行程压缩来编码。MDEC也为GPU执行24位到16位的颜色转换,由于解压速度非常高,解压后的RGB位图可以联合成一个大图片,如果显示是按顺序的,就可以产生动画。最大速度大概是每秒9000个巨块,这就可以以每秒30帧的速度播放320×240的动画。DMEC数据可以通过第0和第1个DMA通道来发送接收,DMA通道0是输入已解压的数据,通道1接收已解压的巨块。MDEC通过MDEC控制寄存器0x1F80_1820来控制,也可以用MDEC状态寄存器0x1F80_1824来检查状态。
0x1F80_1820(mdec0)      写
31   28 27 26 25 24   0
u RGB24 u STP u

注:一个str文件中每个数据段的第一个字都是控制字,用来写入到这个寄存器。
u 未知
RGB24 0 24位色
1 16位色
STP 切换是否设置解压数据的第15位(半透明)

 
0x1F80_1824(mdec1)     读
31   30 29 28   27 26 25 24 23 22    0
FIFO InSync DREQ u RGB24 OutSync STP u
u 未知
FIFO 先入先出缓存状态
InSync MDEC忙于解压数据
OutSync MDEC忙于传送数据到主存
DREQ 数据请求
RGB24 0 24位颜色
1 16位颜色
STP 切换是否设置解压数据的第15位(半透明)

 
0x1F80_1824(mdec1)     写
31 30    0
reset u
u 未知
reset 复位MDEC

 

MDEC数据格式

MDEC使用一种类似于JPEG的“有损”图片格式。一个典型的图片,用DMA放到MDEC前,是如下格式
头部
巨块
...
巨块
尾部

头部是32位字长
31   16 15    0
0x3800 size
0x3800 数据ID
size 头部后的数据大小

巨块可以分解为
Cb块
Cr块
Y0块
Y1块
Y2块
Y3块
Cb,Cr 颜色差块
Y0,Y1,Y2,Y3 发光块

在每个块中储存了DCT信息和RLE压缩
15    0
DCT
RLE
...
RLE
EOD
DCT  DCT数据,包含了量化因子和直流(DC)参考
15                    10 9                       0
Q-量化因子(6位无符号) DC-直流参考(10位带符号)
RLE  行程压缩数据
15                                  10 9                     0
LENGTH-长度数据之间的0数目(6位无符号) DATA-数据(10位带符号)
EOD   数据结束
15           0
0xFE00-使MDEC知道一个块已经结束