算术编码的打包输出的方法和装置转让专利

申请号 : CN200810187793.7

文献号 : CN101500164B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘浩

申请人 : 深圳市同洲电子股份有限公司

摘要 :

本发明公开了一种算术编码的打包输出的方法和装置,其中该方法包括:根据待更新的概率空间的起始位置CodLow值得到高位的7位输出串和7位标志串,7位标志串标识了7位输出串中的未确定状态输出字符;根据待更新的概率空间的长度CodRange值得到有效个数,该有效个数表示了根据待更新的CodLow值得到的7位输出串中有效的输出字符的位数;从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符;根据提取的输出字符处理得到编码输出字节,输出。本发明方案简化了打包输出的实现,提高了编码速度。

权利要求 :

1.一种算术编码的打包输出方法,其特征在于,该方法包括:

根据待更新的概率空间的起始位置CodLow值得到7位标志串和高位的7位输出串,

7位标志串标识了7位输出串中的未确定状态输出字符;根据待更新的概率空间的长度CodRange值得到有效个数,该有效个数表示了根据待更新的CodLow值得到的7位输出串中有效的输出字符的位数;

从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符;

根据提取的输出字符处理得到编码输出字节,输出编码输出字节。

2.如权利要求1所述的方法,其特征在于,所述根据待更新的CodLow值得到7位标志串和高位的7位输出串之前,该方法包括:通过硬件电路的实现方式,根据待更新的CodLow值和待更新的CodRange值得到更新后的CodLow值;通过硬件电路的实现方式,根据待更新的CodRange得到更新后的CodRange值。

3.如权利要求2所述的方法,其特征在于,所述根据待更新的CodLow值和待更新的CodRange值得到更新后的CodLow值的方法包括以下步骤:从待更新的CodRange值的最高位开始,到第一个值为“1”的位为止,计算所有值为“0”的位数,并计为n;

判断待更新的CodLow值的高n位是否全部为“1”,若是,则

将待更新的CodLow值左移n位,低位补零,得到更新后的CodLow值;

若否,则将待更新的CodLow值左移n位,低位补零,且把最高位置为“0”,得到更新后的CodLow值;

所述根据待更新的CodRange得到更新后的CodRange值的方法包括以下步骤:从待更新的CodRange值的最高位开始,到第一个值为“1”的位为止,计算所有值为“0”的位数,并计为n;

待更新的CodRange值左移n位,低位补零,得到更新后的CodRange值。

4.如权利要求2所述的方法,其特征在于,所述输出字符采用2bit表示,用“00”表示输出的“0”字符,用“01”表示输出的“1”字符,用“10”表示未确定状态字符的输出。

5.一种算术编码的打包输出装置,其特征在于,该装置包括CodLow解析模块、CodRange解析模块、输出字符提取缓存模块和未确定状态识别及打包输出模块;

CodLow解析模块,用于根据待更新的CodLow值得到7位标志串和高位的7位输出串,传送给输出字符提取缓存模块,7位标志串标识出7位输出串中的未确定状态输出字符;

CodRange解析模块,用于根据待更新的CodRange得到有效个数,传送给输出字符提取缓存模块,该有效个数表示了7位输出串中的有效的输出字符的位数;

输出字符提取缓存模块,用于从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符,存储提取的输出字符;

未确定状态识别及打包输出模块,用于从输出字符提取缓存模块读取输出字符,根据输出字符处理得到编码输出字节,输出编码输出字节。

6.如权利要求5所述的装置,其特征在于,所述CodLow解析模块通过硬件电路实现,进一步用于根据待更新的CodLow值和待更新的CodRange值得到更新后的CodLow值;

所述CodRange解析模块通过硬件电路实现,进一步用于根据待更新的CodRange值得到更新后的CodRange值。

7.如权利要求6所述的装置,其特征在于,所述CodLow解析模块具体是通过将待更新的CodLow值左移n位,低位补零得到更新后的CodLow值;并且,当待更新的CodLow值的高n位不全部为“1”时,把更新后的CodLow值的最高位置为“0”;所述CodRange解析模块具体是通过将待更新的CodRange值左移n位,低位补零得到更新后的CodRange值;其中,n为从待更新的CodRange值的最高位开始,到第一个值为“1”的位为止,所有值为“0”的位数。

8.如权利要求5所述的装置,其特征在于,所述输出字符采用2bit表示,用“00”表示输出的“0”字符,用“01”表示输出的“1”字符,用“10”表示未确定状态字符的输出。

9.如权利要求5或6或7或8所述的装置,其特征在于,所述输出字符提取缓存模块包括第一先入先出FIFO缓存模块、输出字符串转换模块和输出字符FIFO缓存模块;

所述第一FIFO缓存模块,用于接收CodLow解析模块传送的7位输出串和7位标志串,并存储;接收CodRange解析模块传送的有效个数,并存储;

所述输出字符串转换模块,用于读取第一FIFO缓存模块中存储的有效个数和7位标志串,从第一FIFO缓存模块存储的7位输出串中提取有效个数个输出字符,并根据7位标志串在提取的输出字符中标识出未确定状态输出字符,将提取的输出字符串行输出到输出字符FIFO缓存模块;

所述输出字符FIFO缓存模块,用于存储输出字符串转换模块传送的输出字符。

10.如权利要求9所述的装置,其特征在于,所述未确定状态识别及打包输出模块包括输出字符判断模块、计数模块和输出字符缓存处理模块;

输出字符判断模块,用于从输出字符FIFO缓存模块中逐个读取输出字符,判断当前读取的输出字符是否为未确定状态输出字符,如果是,则向计数模块发送计数指令;如果不是,则判断计数模块内存储的未确定状态输出字符数是否为0,如果为0,则将当前读取的输出字符传送给输出字符缓存处理模块,如果不为0,则将当前读取的输出字符以及从计数模块获取的未确定状态输出字符数一起传送给输出字符缓存处理模块;

计数模块,用于接收计数指令,对未确定状态输出字符数进行累积计数;

输出字符缓存处理模块,用于接收输出字符判断模块传送的输出字符,将其打入当前编码输出字节中;接收输出字符判断模块传送的输出字符以及从计数模块获取的未确定状态输出字符数,先将输出字符打入当前编码输出字节中,再于当前编码输出字节中打入未确定状态输出字符数个与当前读取的输出字符相反的输出字符。

说明书 :

算术编码的打包输出的方法和装置

技术领域

[0001] 本发明涉及视频处理中的算术编码技术,尤其涉及算术编码的打包输出的方法和装置。

背景技术

[0002] H.264协议中,算术编码是视频处理过程中用于实现数据压缩的一种常用编码方法,其基本原理为:根据当前视频编码电路中的二进制数据的取值来对概率空间进行处理,得到处理后的概率空间,然后,将处理后的概率空间作为待更新的概率空间,进行重归一化处理,得到更新后的概率空间,同时根据上述待更新的概率空间生成相应的码流。生成的所述相应的码流中包括一个个编码输出字节,该编码输出字节为编码端输出的最后结果。
[0003] 上述概率空间通常表示为:概率空间的起始位置(CodLow)和概率空间的长度(CodRange)。CodLow和CodRange通常表示为二进制数。在H.264协议中,对CodRange值和CodLow值的更新如下:
[0004] CodRange值一般为九位,各位的值为“0”或“1”,最高位为第8位,次高位为第7位,依此类推,最低位为第0位。如果待更新的CodRange值中某一位的值为1,且该位之前的所有高位的值都为0,将该位记为第m位,则将第m位之前的所有高位移出,将第m位及其后续的各个位依次移至从最高位开始的位置,并将移出后空出的所有低位补零,这样得到的CodRange值便为更新后的CodRange值。例如,某CodRange值为0001×××××,进行更新时,将第8、7和6位的“0”移出,将后续的“1×××××”作为更新后CodRange值的第8-3位,对移出后空出的第2-0位填入0,这样,便得到更新后的CodRange值:1×××××000,更新后的CodRange值将用于下一次的重归一化处理。
[0005] CodLow值一般为十位,各位的值为“0”或“1”,最高位为第9位,次高位为第8位,依此类推,最低位为第0位。根据待更新的CodRange值和待更新的CodLow值进行CodLow值更新。具体地,从待更新的CodRange值的最高位开始,如果某一位的值为1,且该位之前的所有高位的值都为0,将该位之前的所有高位个数记为n;如果待更新的CodLow的高n位全部为“1”,即高n位为“1...1”,则将CodLow中的高n位移出,将移出n位后的剩余各个位依次移至从最高位开始的位置,并将移出后空出的所有低位补零;如果CodLow的高n位不全部为“1”,则将CodLow中的高n位移出,移出后把最高位置为“0”,将移出n位后的剩余各个位依次移至从次高位开始的位置,然后将移出后空出的所有低位补零,这样得到的CodLow值便为更新后的CodLow值。更新后的CodLow值将用于下一次的重归一化处理。
[0006] 对CodRange值和CodLow值进行更新的过程中,同时输出编码输出字节。当编码输出字节的8bit输出字符都填满时,将该编码输出字节输出。编码输出字节中的8bit输出字符根据得到输出字符的先后顺序从高位到低位排列。下面对得到编码输出字节的8bit输出字符需要满足的条件进行说明。
[0007] 编码输出字节根据CodRange值和CodLow值得到。输出字节包含的输出字符由CodLow值中的相邻两位确定,确定输出字符的顺序为先高位再低位。具体地,由第9位与第8位确定一个输出字符,由第8位与第7位确定一个输出字符,由第7位和第6位确定一个输出字符,由第6位和第5位确定一个输出字符,依此类推,以确定出各个输出字符。由一个待更新的CodLow值确定的有效的输出字符数为,对CodRange值进行更新时移出的高位的位数。例如,如果对CodRange值进行更新时移出的高位的位数为3,则由当前的待更新的CodLow值确定的有效的输出字符为3个,包括:由第9位与第8位确定的输出字符,由第8位与第7位确定的输出字符,由第7位和第6位确定的输出字符。
[0008] 由CodLow值中的相邻两位确定输出字符的原理包括:
[0009] 如果相邻两位为00,则相应的输出字符为0;
[0010] 如果相邻两位为01,则相应的输出字符为未确定状态输出字符;
[0011] 如果相邻两位为10,则相应的输出字符为1;
[0012] 如果相邻两位为11,则相应的输出字符为1;
[0013] 由CodLow值的相邻两位确定输出字符的过程中,如果相邻的第9位和第8位中任一位为0,则根据该相邻两位之后的各个相邻两位确定输出字符时,需要将该相邻两位之后的各个相邻两位的最高位的值设置为0;如果相邻的第9位和第8位的值为11,则根据该相邻两位之后的各个相邻两位确定输出字符时,不需要改变将该相邻两位之后的各个相邻两位的值。举例说明,如果CodLow值为1010110001,由第9位和第8位确定的输出字符为1;此时,第9位和第8位中有一位为0(即第9位为0),则由第8位和第7位(即01)确定输出字符时,将其中的第8位设置为0,而第8位原本为0,则由第8位和第7位原本的值01确定出相应的输出字符,为未确定状态输出字符;由第7位和第6位(即10)确定输出字符时,将其中的第7位设置位0,也就是由00确定出相应的输出字符,为0;由第6位和第5位(即01)确定输出字符时,将其中的第6位设置为0,而第6位原本为0,则由第6位和第5位原本的值01确定出相应的输出字符,为未确定状态输出字符;由第5位和第4位(即11)确定输出字符时,将其中的第5位设置为0,也就是由01确定出相应的输出字符,为未确定状态输出字符;依此类推,以确定出其它的各个输出字符。
[0014] 根据CodRange值和CodLow值得到输出字符后,对当前得到的输出字符进行判断,如果判断出当前得到的输出字符为未确定状态输出字符,则对未确定状态输出字符数进行累积计数,继续获取下一个输出字符;如果当前得到的输出字符不是未确定状态输出字符,则判断未确定状态输出字符数是否为0,如果未确定状态输出字符数为0,将当前得到的输出字符打入当前编码输出字节中,如果未确定状态输出字符数不为0,则先将当前得到的输出字符打入当前编码输出字节中,再于当前编码输出字节中打入未确定状态输出字符数个与当前得到的输出字符相反的输出字符。
[0015] 为了满足协议中重归一化及打包输出的条件,实现算术编码的重归一化及打包输出,现有技术中采用软件实现的串行处理方法,该方法需要进行多次循环完成一次重归一化,并在重归一化的同时生成输出字符,输出相应的码流。
[0016] 在H.264协议中,CodRange的取值范围为[2,255],CodLow的取值范围为[0,1023]。下面通过图1的流程对现有技术的重归一化及打包处理过程进行详细说明,这里,以参考概率空间为[0,1023]为例,该方法以下步骤:
[0017] 步骤101,判断CodRange是否小于256,即CodRange是否小于参考概率空间总长度的1/4,如果是,则执行步骤102,否则,结束本流程。
[0018] 判断CodRange是否小于256,对应二进制表示,也就是判断九位的CodRange的最高位是否为0。
[0019] 步骤102,判断CodLow是否小于256,即当前概率空间是否位于参考概率空间的下半部,如果是,则执行步骤104,否则,执行步骤103。
[0020] 判断CodLow是否小于256,对应二进制表示,也就是判断十位的CodLow的最高位和次高位是否都为0。
[0021] 步骤103,判断CodLow是否大于等于512,即当前概率空间是否位于参考概率空间的上半部,如果是,则执行步骤106,否则,执行步骤105。
[0022] 步骤104,产生1个0作为输出字符,并产生count个1作为输出字符,将count清零并执行步骤108。
[0023] 步骤105,将CodLow的值减去256,即将当前的概率空间在参考概率空间中的位置,向下半部移动参考概率空间总长度的1/4,并将count的取值加1,然后执行步骤108。
[0024] 步骤106~步骤107,将CodLow的值减去512,即将当前的概率空间在参考概率空间中的位置,向下半部移动参考概率空间总长度的1/2,然后产生1个1作为输出字符,并产生count个0作为输出字符,将count清零并执行步骤108。
[0025] 步骤108,分别将CodLow的值和CodRange的值乘以2,即将当前概率空间长度扩大一倍,然后返回步骤101。
[0026] 上述流程中,步骤101~步骤108的操作过程为一个循环。
[0027] 由上述流程可见,通过更新CodLow和CodRange的取值实现了对概率空间的更新,而且在重归一化处理更新概率空间的同时,还得到输出字符。但是,每个循环执行到步骤108时,概率空间的长度均扩大一倍并返回步骤101进行判断,在CodRange大于等于256时才结束当前的重归一化处理流程。如果执行步骤101时的CodRange为其最小值2,则需要
7次循环才能完成重归一化处理的全部流程,耗费了大量的单位时间。
[0028] 可见,现有的重归一化处理效率不高,从而使得概率空间的更新速度慢,进而使得算术编码的效率较低,影响了视频处理速度。且对CodLow、CodRange的更新与输出字符的生成交织在一起,难以对其改进以提高处理效率。

发明内容

[0029] 本发明提供一种算术编码的打包输出方法,该方法能够简化打包输出过程,提高编码速度。
[0030] 本发明提供一种算术编码的打包输出装置,该装置能够简化打包输出过程,提高编码速度。
[0031] 一种算术编码的打包输出方法,该方法包括:
[0032] 根据待更新的概率空间的起始位置CodLow值得到高位的7位输出串和7位标志串,7位标志串标识了7位输出串中的未确定状态输出字符;根据待更新的概率空间的长度CodRange值得到有效个数,该有效个数表示了根据待更新的CodLow值得到的7位输出串中有效的输出字符的位数;
[0033] 从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符;
[0034] 根据提取的输出字符处理得到编码输出字节,输出编码输出字节。
[0035] 一种算术编码的打包输出装置,该装置包括CodLow解析模块、CodRange解析模块、输出字符提取缓存模块和未确定状态识别及打包输出模块;
[0036] CodLow解析模块,用于根据待更新的CodLow值得到高位的7位输出串和7位标志串,传送给输出字符提取缓存模块,7位标志串标识出7位输出串中的未确定状态输出字符;
[0037] CodRange解析模块,用于根据待更新的CodRange得到有效个数,传送给输出字符提取缓存模块,该有效个数表示了7位输出串中的有效的输出字符的位数;
[0038] 输出字符提取缓存模块,用于从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符,存储提取的输出字符;
[0039] 未确定状态识别及打包输出模块,用于从输出字符提取缓存模块读取输出字符,根据输出字符处理得到编码输出字节,输出编码输出字节。
[0040] 从上述方案可以看出,本发明中根据待更新的CodRange值得到有效个数,根据待更新的CodLow值得到7位输出串和7位标志串;然后根据有效个数、7位输出串和7位标志串,生成编码输出字节。本发明将编码输出字节的获取与对CodRange值和CodLow值的更新分离开来,使循环次数不固定的打包输出过程可以在一个时钟周期内完成,这样,降低了实现复杂度,提高了编码速度。

附图说明

[0041] 图1为现有技术中算术编码的重归一化及打包输出的方法流程图;
[0042] 图2a为本发明中算术编码的打包输出装置结构示意图;
[0043] 图2b为图2a中未确定状态识别及打包输出模块的结构示意图;
[0044] 图3为本发明中算术编码的打包输出方法流程图。

具体实施方式

[0045] 为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明进一步详细说明。
[0046] 本发明采用并行处理的硬件电路实现方式,同时对CodRange值和CodLow值分别进行更新处理,得到更新后的CodRange值和CodLow值;在对CodRange值进行更新的过程中,还得到有效个数,在对CodLow值进行更新的过程中,还得到7位输出串和7位标志串,7位标志串标识出了7位输出串中的未确定状态输出字符;然后根据有效个数、7位输出串和7位标志串,生成输出字符。本发明对CodRange值和CodLow值并行进行独立的更新,且将更新处理和打包输出处理分离开来,这样,使现有技术中循环次数不固定的重归一化过程可以在一个时钟周期内完成,并且,可以在另一个时钟周期内完成基于重归一化的打包输出过程,使重归一化及其打包输出过程在两个时钟周期内完成,从而,降低了实现复杂度,提高了编码速度。
[0047] 本发明方案中,对CodRange值和CodLow值的更新除了采用并行处理的硬件电路实现方式外,也可以采用现有技术串行实现的方式,而打包输出仍然采用本发明所述根据有效个数、7位输出串和7位标志串生成输出字符的方式;此时,采用现有技术对CodRange值和CodLow值进行更新,可通过执行图1中除步骤104、105和107外的其它步骤实现。
[0048] 参见图2a,为本发明中算术编码的重归一化及打包输出的装置结构示意图,该装置包括CodRange解析模块、CodLow解析模块、输出字符提取缓存模块和未确定状态识别及打包输出模块。
[0049] CodLow解析模块,用于根据待更新的CodLow值得到高位的7位输出串和7位标志串,传送给输出字符提取缓存模块,7位标志串标识出7位输出串中的未确定状态输出字符;
[0050] CodRange解析模块,用于根据待更新的CodRange得到有效个数,传送给输出字符提取缓存模块,该有效个数表示了7位输出串中的有效的输出字符的位数;
[0051] 输出字符提取缓存模块,用于从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符,存储提取的输出字符;
[0052] 未确定状态识别及打包输出模块,用于从输出字符提取缓存模块读取输出字符,根据输出字符处理得到编码输出字节,输出编码输出字节。
[0053] 可选地,所述CodLow解析模块通过硬件电路实现,进一步用于根据待更新的CodLow值和待更新的CodRange值得到更新后的CodLow值。
[0054] CodLow值一般为十位,各位的值为“0”或“1”,最高位为第9位,次高位为第8位,依此类推,最低位为第0位。根据待更新的CodRange值和待更新的CodLow值进行CodLow值更新。具体地,从待更新的CodRange值的最高位开始,如果某一位的值为1,且该位之前的所有高位的值都为0,将该位之前的所有高位个数记为n;如果待更新的CodLow的高n位全部为“1”,即高n位为“1...1”,则将CodLow中的高n位移出,将移出n位后的剩余各个位依次移至从最高位开始的位置,并将移出后空出的所有低位补零;如果CodLow的高n位不全部为“1”,则将CodLow中的高n位移出,移出后把最高位置为“0”,将移出n位后的剩余各个位依次移至从次高位开始的位置,然后将移出后空出的所有低位补零,这样得到的CodLow值便为更新后的CodLow值。更新后的CodLow值将用于下一次的重归一化处理。
[0055] 采用硬件电路的实现方式,可以将对CodLow值更新所需要满足的各个条件同时通过硬件电路设置实现,这样,对CodLow值的更新可以在一个时钟周期内完成。
[0056] 输出字节包含的输出字符由CodLow值中的相邻两位确定,确定输出字符的顺序为先高位再低位。具体地,由第9位与第8位确定一个输出字符,由第8位与第7位确定一个输出字符,由第7位和第6位确定一个输出字符,由第6位和第5位确定一个输出字符,依此类推,以确定出各个输出字符。采用现有串行处理的软件实现方式获取输出字符,最多的时候需要7次循环完成一次重归一化,也就是,一次重归一化过程中最多能输出7个输出字符,因此本发明中,CodLow解析模块在进行CodLow值更新的同时,根据待更新的CodLow值得到高位的7位输出串,该7位输出串为由CodLow值中的相邻两位得到的高位上的7个输出字符,具体包括:由第9位与第8位确定的输出字符,由第8位与第7位确定的输出字符,由第7位和第6位确定的输出字符,由第6位和第5位确定的输出字符,由第5位和第4位确定的输出字符,由第4位和第3位确定的输出字符,由第3位和第2位确定的输出字符。
[0057] 由CodLow值中的相邻两位确定输出字符的原理包括:
[0058] 如果相邻两位为00,则相应的输出字符为0;
[0059] 如果相邻两位为01,则相应的输出字符为未确定状态输出字符;
[0060] 如果相邻两位为10,则相应的输出字符为1;
[0061] 如果相邻两位为11,则相应的输出字符为1;
[0062] 由CodLow值的相邻两位确定输出字符的过程中,如果相邻的第9位和第8位中任一位为0,则根据该相邻两位之后的各个相邻两位确定输出字符时,需要将该相邻两位之后的各个相邻两位的最高位的值设置为0;如果相邻的第9位和第8位的值为11,则根据该相邻两位之后的各个相邻两位确定输出字符时,不需要改变将该相邻两位之后的各个相邻两位的值。举例说明,如果CodLow值为1010110001,由第9位和第8位确定的输出字符为1;此时,第9位和第8位中有一位为0(即第9位为0),则由第8位和第7位(即01)确定输出字符时,将其中的第8位设置为0,而第8位原本为0,则由第8位和第7位原本的值01确定出相应的输出字符,为未确定状态输出字符;由第7位和第6位(即10)确定输出字符时,将其中的第7位设置为0,也就是由00确定出相应的输出字符,为0;由第6位和第5位(即01)确定输出字符时,将其中的第6位设置为0,而第6位原本为0,则由第6位和第5位原本的值01确定出相应的输出字符,为未确定状态输出字符;由第5位和第4位(即11)确定输出字符时,将其中的第5位设置为0,也就是由01确定出相应的输出字符,为未确定状态输出字符;依此类推,以确定出其它的各个输出字符。
[0063] CodLow解析模块在得到7位输出串的同时,还对该7位输出串中的未确定状态输出字符进行记录,该记录通过一个同样7位长度的标志串表示,将其称为7位标志串。
[0064] 可选地,所述CodRange解析模块通过硬件电路实现,进一步用于根据待更新的CodRange值得到更新后的CodRange值。
[0065] CodRange值一般为九位,各位的值为“0”或“1”,最高位为第8位,次高位为第7位,依此类推,最低位为第0位。如果待更新的CodRange中某一位的值为1,且该位之前的所有高位的值都为0,将该位记为第m位,则将第m位之前的所有高位移出,将第m位及其后续的各个位依次移至从最高位开始的位置,并将移出后空出的所有低位补零,这样得到的CodRange值便为更新后的CodRange值。例如,某CodRange值为0001×××××,进行更新时,将第8、7和6位的“0”移出,将后续的“1×××××”作为更新后CodRange值的第8-3位,对移出后空出的第2-0位填入0,这样,便得到更新后的CodRange值:1×××××000,更新后的CodRange值将用于下一次的重归一化处理。一般情况下,所述第m位之前的所有高位的数目为0、1、2、3、4、5、6或7。
[0066] 采用硬件电路的实现方式,对CodRange值的更新可以在一个时钟周期内完成。
[0067] CodRange解析模块对CodRange值进行更新的同时,还输出有效个数,该有效个数表示了根据待更新的CodLow值得到的7位输出串中的有效的输出字符的位数。由一个待更新的CodLow值确定的有效的输出字符的数目为,对CodRange值进行更新时移出的高位的位数;也就是,7位输出串中的有效的输出字符的位数为,对CodRange值进行更新时移出的高位的位数。例如,如果对CodRange值进行更新时移出的高位的位数为3,则由当前的待更新的CodLow值确定的有效的输出字符为3个,包括:由第9位与第8位确定的输出字符,由第8位与第7位确定的输出字符,由第7位和第6位确定的输出字符。
[0068] 由一个待更新的CodLow值确定的有效的输出字符的数目最多为7个,采用二进制,有效个数可用一个三位数表示0~7中的某一数。
[0069] 输出字符提取缓存模块,用于从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符,存储提取的输出字符。
[0070] 未确定状态识别及打包模块,用于从输出字符提取缓存模块读取输出字符,如果判断出当前读取的输出字符为未确定状态输出字符,则对未确定状态输出字符数进行累积计数,继续读取下一个输出字符;如果当前读取的输出字符不是未确定状态输出字符,则判断未确定状态输出字符数是否为0,如果未确定状态输出字符数为0,将当前读取的输出字符打入当前编码输出字节中,如果未确定状态输出字符数不为0,则先将当前读取的输出字符打入当前编码输出字节中,再于当前编码输出字节中打入未确定状态输出字符数个与当前读取的输出字符相反的输出字符,同时将未确定状态输出字符数清零,以进行下一次未确定状态输出字符的累积计数。
[0071] 当前编码输出字节为当前正在进行编码且即将输出的字节,当编码输出字节的8bit输出字符都填满时,将该编码输出字节输出。编码输出字节中的8bit输出字符根据得到输出字符的先后顺序从高位到低位排列。
[0072] 可选地,所述输 出字符提 取缓存 模块包 括第一 先入先出 (FIFO,First-inFirst-out)缓存模块、输出字符串转换模块和输出字符FIFO缓存模块。
[0073] 所述第一FIFO缓存模块,用于接收CodLow解析模块传送的7位输出串和7位标志串,并存储;接收CodRange解析模块传送的有效个数,并存储。
[0074] 所述输出字符串转换模块,用于读取第一FIFO缓存模块中存储的有效个数和7位标识串,从第一FIFO缓存模块存储的7位输出串中提取有效个数个输出字符,并根据7位标志串在提取的输出字符中标识出未确定状态输出字符,串行输出到输出字符FIFO缓存模块。
[0075] 输出字符串转换模块将提取的7位输出串输出到输出字符FIFO缓存模块时,输出的每个输出字符可以采用2bit表示,具体地,用“00”表示输出的“0”字符,用“01”表示输出的“1”字符,用“10”表示未确定状态字符的输出。
[0076] 所述输出字符FIFO缓存模块,用于存储输出字符串转换模块传送的输出字符。
[0077] 可选地,未确定状态识别及打包模块包括输出字符判断模块、计数模块和输出字符缓存处理模块,其结构如图2b所示。
[0078] 输出字符判断模块,用于从输出字符FIFO缓存模块中逐个读取输出字符串中的各个输出字符,判断当前读取的输出字符是否为未确定状态输出字符,如果是未确定状态字符,则向计数模块发送计数指令;如果不是未确定状态输出字符,则判断计数模块内存储的未确定状态输出字符数是否为0,如果未确定状态输出字符数为0,则将当前读取的输出字符传送给输出字符缓存处理模块,如果未确定状态输出字符数不为0,则将当前读取的输出字符以及从计数模块获取的未确定状态输出字符数一起传送给输出字符缓存处理模块,并将未确定状态输出字符数清零。
[0079] 计数模块,用于接收计数指令,对未确定状态输出字符数进行累积计数。
[0080] 输出字符缓存处理模块,用于接收输出字符判断模块传送的输出字符,将其打入当前编码输出字节的相应位置;接收输出字符判断模块传送的输出字符以及从计数模块获取的未确定状态输出字符数,先将输出字符打入当前编码输出字节的相应位置,再于当前编码输出字节的相应位置打入未确定状态输出字符数个与当前读取的输出字符相反的输出字符。
[0081] 参见图3,为本发明中算术编码的重归一化及打包输出的方法流程图,该方法包括以下步骤:
[0082] 步骤301,根据待更新的CodLow值得到高位的7位输出串和7位标志串,7位标志串标识了7位输出串中的未确定状态输出字符;根据待更新的CodRange值得到有效个数,该有效个数表示了根据待更新的CodLow值得到的7位输出串中有效的输出字符的位数。
[0083] 步骤302,从7位输出串中提取有效个数个输出字符,根据7位标志串在提取的输出字符中标识出未确定状态输出字符。
[0084] 步骤303,根据提取的输出字符处理得到编码输出字节,输出编码输出字节。
[0085] 本步骤具体包括:对提取的输出字符进行判断,如果判断出当前提取的输出字符为未确定状态输出字符,则对未确定状态输出字符数进行累积计数,继续提取下一个输出字符;如果当前提取的输出字符不是未确定状态输出字符,则判断未确定状态输出字符数是否为0,如果未确定状态输出字符数为0,将当前提取的输出字符打入当前编码输出字节中,如果未确定状态输出字符数不为0,则先将当前提取的输出字符打入当前编码输出字节中,再于当前编码输出字节中打入未确定状态输出字符数个与当前提取的输出字符相反的输出字符。当编码输出字节的8bit输出字符都填满时,将该编码输出字节输出。
[0086] 可选地,步骤301之前,该方法包括:通过硬件电路的实现方式,根据待更新的CodLow值和待更新的CodRange值得到更新后的CodLow值;通过硬件电路的实现方式,根据待更新的CodRange得到更新后的CodRange值。
[0087] 采用现有技术串行处理的软件实现方式,对CodRange值和CodLow值的更新交织在一起,CPU不能同时满足对CodRange值和CodLow值更新时的各个条件,需要多次循环实现,最多的时候需要经过7次循环。而本发明方案中,采用并行方式,获知待更新的CodRange值和待更新的CodLow值之后,对CodRange值和CodLow值的更新分别独立处理,在更新的同时得到有效个数、7位字符串和7位标志串,根据有效个数、7位字符串和7位标志串得到最终的输出字符。采用本发明方案,只需两个时钟周期便可完成重归一化及打包输出,其中,在第一个时钟周期内完成更新,并得到有效个数、7位字符串和7位标志串;在第二个时钟周期内根据有效个数、7位字符串和7位标志串得到输出字符。
[0088] 这样,本发明将重归一化处理与打包输出处理分离开来,并且将重归一化处理中对CodRange值和CodLow值的更新分离开来,使算术编码易于在硬件电路上实现,将循环次数不固定的重归一化过程,固化在在两个时钟周期内完成,简化了重归一化及打包输出过程,提高了编码速度。
[0089] 以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。