动画解码器(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
|
MDEC数据格式
MDEC使用一种类似于JPEG的“有损”图片格式。一个典型的图片,用DMA放到MDEC前,是如下格式
头部是32位字长
| 0x3800
| 数据ID
|
| size
| 头部后的数据大小
|
巨块可以分解为
| Cb,Cr
| 颜色差块
|
| Y0,Y1,Y2,Y3
| 发光块
|
在每个块中储存了DCT信息和RLE压缩
| 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知道一个块已经结束
|