具体实施方式
本方法的主要指导思想是利用数据的连续性,尽量连续取数,不重复取数,而且要避免判断宏块类型(mb_type)。由于数据是否连续的标志就是其地址是否连续,所以,采用“合并地址”的方法来实现上述目标,即:将一个宏块划分为多个最小分块单元,取得每个最小分块单元的地址,先对地址进行从小到大的排序,然后将排序后的连续的地址合并起来;由于数据相同时,其地址也相同,所以不会重复取数;由于数据连续时,其地址也连续,所以可以连续取数。地址合并后,得到首地址和连续取数的长度,将其作为“指令”发送,对读取回的数据按最小分块单元的对应顺序排列后送入内插模块中。
如图3所示,本发明的硬件解码器中参考帧数据的读取方法主要分为两个阶段,一是发送指令阶段,将参考帧数据在存储器中的首地址和存储范围一起发送至存储器,图中的实线箭头所示;另一个是取回数据阶段,将参考帧数据取回,并排列成内插需要的格式,图中的虚线箭头所示。
本发明的硬件解码器中参考帧数据的读取方法分为四个步骤:
(1)计算一个宏块的各个最小分块单元的特征参数,包括起始逻辑地址、长度、宽度、及x轴方向的偏移;
(2)将各个最小分块单元的逻辑地址串按所述的起始逻辑地址进行从小到大的排序,得到最小分块单元的逻辑地址串列;
(3)将所述的逻辑地址串列进行合并,然后发送访存指令;
(4)从存储器中读取参考帧数据列,并选出各个最小分块单元对应的参考帧数据,依序写入到内插模块中。
如图4所示是本发明的硬件解码器中参考帧数据的读取装置的系统结构图,包括:输入参数模块、发送指令模块、存储器模块、取回数据模块及内插模块。其中发送指令模块又包括:依次连接的计算逻辑地址模块、比较器模块、并联的地址移位寄存器模块和参数移位寄存器模块、合并地址模块、产生指令模块、和指令FIFO模块;以及计算起始序号和结束序号模块,其输入端连接所述并联的地址移位寄存器模块和参数移位寄存器模块的输出端。发送指令模块用于实现图3中实线箭头所示的发送指令阶段的功能。另外取回数据模块又包括:依次连接的:位选择模块、RAM模块、输出FIFO模块,用于实现图3中虚线所示的取回数据阶段的功能。由于参数移位寄存器模块和计算每个块的起始序号和结束序号模块所得到的值在取回数据阶段也有用到,所以,要另外寄存这些参数,需将RAM模块的输入端分别连接计算起始序号和结束序号模块、参数移位寄存器模块。
本发明的硬件解码器中参考帧数据的读取方法中,步骤(1)主要由计算逻辑地址模块所完成。
以H.264标准中亮度数据为例,首先将一个宏块切分成16个4x4亮度最小分块单元,计算各个最小分块单元的特征参数,包括起始逻辑地址、长度及宽度等。且前向参考帧和后向参考帧是分开计算的。
一个亮度最小分块单元最多需要9x9的参考帧数据块,一个宏块最多需要多少个逻辑地址,取决于存储器中数据的排列形式。逻辑地址、块的长度、块的宽度、及x方向的偏移,可以唯一的表示一个块。逻辑地址由参考帧号、x坐标、y坐标三部分组成,大小为25位。块的长度是指参考阵列的长度(4行还是9行),块的宽度是指参考阵列的宽度(4列还是9列),x方向的偏移指的是起始的x方向的坐标。
块的宽度、x方向的偏移可以重新组织成一个新的参数,即偏移参数,该参数用于指明:哪些数据才是真正有用的。该参数用5位来表示,其中,前两位是标识位,后三位是x方向的偏移。
块号(4位)、偏移参数(用于标识哪些数据真正有用,5位)和块的长度(1位)均为最小分块单元一级的参数。
本发明的硬件解码器中参考帧数据的读取方法中,步骤(2)主要是由比较器模块、地址移位寄存器模块、和参数移位寄存器模块完成的。
将地址进行排序包括两个过程:比较和移位;比较器是比较逻辑地址(当前的地址和已存储的地址)的大小,是为地址排序作准备。从整个排序过程上看,先判断当前的地址和已存储的地址谁更大,如果已存储的大,则前移一位,如果当前的大,保持不动。每个周期只输入一个新地址,需要与已存储的所有的数据比较,为了减少面积,可以复用一个比较器。每进行一次排序,需要5次比较和1次移位,在H.264中,需要192个周期。
地址移位寄存器的作用是实现地址排序的过程,是由多个25位的寄存器串成链路实现的。比较器已经判断出当前的地址和已存储的地址谁更大,如果已存储的大,则前移一位,如果当前的大,保持不动。
地址排序后,逻辑地址的排列顺序发生了更改,参数移位寄存器是为了使参数保持与逻辑地址的排列同步变化。可以认为,地址和参数是一同进行排序的。参数移位寄存器的控制和地址移位寄存器的控制是完全一样的,参数移位寄存器是由多个10位的寄存器串成链路实现的。
本发明的硬件解码器中参考帧数据的读取方法中,步骤(3)主要是由合并地址模块、计算起始序号和结束序号模块、产生指令模块、及指令FIFO模块完成的。具体又分为4个过程:
a、计算各个参考帧数据块的起始序号和结束序号。
从外部存储器中回来的数据是按照地址排序后的顺序来的,而不是按照块号的顺序,而且,由于地址合并,一个数据可能被多个块利用。每个块的起始序号和结束序号用于标识从外部存储器中回来的数据属于哪个块,在合并发生的同时,就要计算出各个块的起始序号和结束序号。每个块的起始序号和结束序号需要另存,因为这些参数会在第二阶段用到。
设第一个地址对应的起始序号为零,如果发生合并,起始序号为当前地址减去前一个地址,如果不发生合并,当前的起始序号则为前一个结束序号加一。结束序号是起始序号加上块的长度。
b、若所述逻辑地址串列中的各个逻辑地址串之间有交叠,则将有交叠的逻辑地址串进行合并,得到多个无重复的连续逻辑地址串,形成连续逻辑地址串列,计算所述的各个连续逻辑地址串的起始地址和串长度。
合并地址的直接目的是减少指令的数目。经过地址排序之后,可以方便的进行地址合并,合并后,形成多个无重复的连续逻辑地址串,可以用一个地址表示一个连续逻辑地址串;该地址由两部分组成,一个是基址,表示连续逻辑地址串的起始地址,另一个是偏移,表示串的长度。
合并时,按照排序后的顺序,从小到大,依次进行,只有当基址加上偏移大于等于当前已存储的地址(地址移位寄存器中)时,才可以合并;合并后,基址不变,偏移等于当前已存储的地址加上块的长度减去基址;下次合并运算时,需要用新的偏移参加运算。如果合并发生,地址的数目将减少,产生的指令数目也减少。如果不发生合并,则设定当前已存储的地址为基址,设定块的长度为偏移。
c、将所述各个连续逻辑地址串的起始地址和串长度变换为访存指令,将访存指令依次存储至指令FIFO模块;
合并后把当前的基址和偏移输出到产生指令模块中,产生适应存储器格式的访存指令,并将这些访存指令依次存储在指令FIFO模块中。
d、由指令FIFO模块将所述的访存指令依次发送至存储器模块。
指令FIFO拟存储两个宏块的指令,宽度是指令的长度,FIFO需要向外部存储器发出一个可读信号,此信号表示外部存储器可以从指令FIFO中读取指令,可读信号不仅受控于FIFO内数据的深度,而且必须满足:RAM模块中的各个RAM是空的。
本发明的硬件解码器中参考帧数据的读取方法中,步骤(4)主要是由位选择器模块、RAM模块、及输出FIFO模块完成的。具体又分为3个过程:
a、存储器模块依照所述访存指令,读出参考帧数据列。
从外部存储器中读取回来的数据有一定的宽度,这些数据有些是有用的,有些是没有用的,有些对某些块有用,有些对另外一些块有用,这就需要依照参数移位寄存器中的“偏移参数”来进行位选择,选择有用的数据放入RAM模块中。
由于取回的数据每次可能小于9字节,所以,对一个块的一行而言,需要由两次读入的数据拼接而成,位数的指定均由位选择器来确定,拼接时,一边的数据是来自RAM模块(已存储),一边的数据来自外部存储器。
b、根据所述的各个最小分块单元的起始序号和结束序号,从参考帧数据列中取出各个最小分块单元对应的参考帧数据。
如图4所示,RAM模块中,包含有n个RAM子模块。以H.264标准为例,一个宏块有16个4x4亮度块,对应为16个RAM子模块,每个RAM的大小为9x9字节。由于从外部存储器读入的数据不是以块号的顺序,而输出却需要以块号为顺序,所以,需要RAM模块来存储不能立即输出的数据。9x9字节为一个4x4参考帧最小分块单元需要的最大的存储容量,其数据需要分为两批到达,前一批到达的数据是暂时存储在RAM模块中的,故前一批到达的数据无需拼接,而后一批到达的数据则需要进行拼接,且有时参考帧数据在位宽上部分有效,需通过位选择模块,选出有效的部分,并进行拼接。
依照每个块的起始序号和结束序号来标识从外部存储器中回来的数据属于哪个块,即:采用一个计数器对从外部存储器回来的数据计数,只要当前的计数值位于某个块的起始序号和结束序号的区间之内,则将数据存入该块相应的RAM子模块中。
c、将所述的各个最小分块单元对应的参考帧数据发送至输出FIFO模块,依次写入到内插模块中。
输出FIFO模块的功能就是将数据以块号的顺序进行存放,等待内插模块读取。在实际中,比较常见的情况是:块0和块2是同一批次到达的,块1和块3是同一批次到达的,假设块0和块2先到,需要等到块1到达后,块2才可以输入到FIFO。而16个RAM之间是并行的,是没有必要等到块1到达后,块2才输入到FIFO的。
将“输出FIFO”分为两个,一个用于存储奇数块的数据,一个用于存储偶数块的数据。整个系统的输出需要再增加一个二选一开关来进行选择。
在H.264标准下,采用本发明的硬件解码器中参考帧数据的读取方法,相应的系统时序示意图请参照图5所示,地址移位寄存器需要192个周期,合并地址需要32个周期,产生指令需要32个周期;读入数据需要288个周期。“第一阶段”和“第二阶段”之间是流水线的形式,处理一个宏块最多需要576个周期。图中的周期数指的是单向预测时的情况,如果是双向预测,周期数需要加倍。本方法采用HDL(硬件描述语言)实现后,综合频率可达200M,满足高清实时解码的要求。