CN1839550A - 解码可变长度前缀码的方法 - Google Patents

解码可变长度前缀码的方法 Download PDF

Info

Publication number
CN1839550A
CN1839550A CNA03826790XA CN03826790A CN1839550A CN 1839550 A CN1839550 A CN 1839550A CN A03826790X A CNA03826790X A CN A03826790XA CN 03826790 A CN03826790 A CN 03826790A CN 1839550 A CN1839550 A CN 1839550A
Authority
CN
China
Prior art keywords
vlc
length
prefix
variable
decoding
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CNA03826790XA
Other languages
English (en)
Other versions
CN1839550B (zh
Inventor
瑟盖·尼古拉维奇·泽尔托夫
斯坦尼斯拉夫·维克多洛维奇·布拉塔诺夫
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Intel Corp
Original Assignee
Intel Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Intel Corp filed Critical Intel Corp
Publication of CN1839550A publication Critical patent/CN1839550A/zh
Application granted granted Critical
Publication of CN1839550B publication Critical patent/CN1839550B/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/40Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code
    • H03M7/42Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code using table look-up for the coding or decoding process, e.g. using read-only memory

Abstract

公开的方法可以与任何面向前缀的解码方法一起被用来当可以确定具有相对短前缀的最常使用码的子集时,实现对可变长度码的更快解码。本发明的实施方案从位流中读出不少于码的最大可能长度的多个位。然后,选出预定数量的位并用作一个数据结构的索引,该数据结构包含至少解码值和有效性指示符,还有其他预解码数据,即:前缀类型和长度、一组码的最大码长、实际码长、将返回给位流的位数等。有效性指示符用来确定是继续解码操作,还是从所述数据结构中获得有效解码值并将多余的位返回给码流。如果解码值被指示为无效的,则解码操作将继续,并且一种估计码前缀的长度以及对应于所估计长度的有效位数的解码方法被应用于一开始从位流中读出的位。

Description

解码可变长度前缀码的方法
本专利文件的一部分公开内容包含受版权保护的材料。当本专利文件或专利公开出现在美国专利商标局的文件或记录中时,版权所有者不反对任何人复印这些文件,否则将无条件地保留所有版权。
背景
1.领域
本发明总地涉及可变长度前缀码例如霍夫曼码的解码,更具体地说,涉及一种查找表解码和面向前缀解码的组合解码方案。
2.描述
熵编码(entropy coding)是一种广泛使用的数据压缩技术,很多视频和音频编码标准都基于这种技术。熵编码的理论基础是:当与代表较少出现的数据的位的数目相比,用更少数量的位来编码最常使用的数据时,可以达到压缩效果。这种方法导致由码组成的编码数据流具有不同的长度。
有多种方法形成这样的可变长度码(VLC)。一种常见的方法使用前缀编码,其中码由前缀和几个有效位组成,前缀允许解码系统辨别不同的码,有效位代表一个具体值(例如,霍夫曼编码)。
虽然大多数编码标准在它们的编码方案中采用霍夫曼码,其前缀由一串“1”或“0”位组成,但是有一些标准(例如ISO/IEC 14496-2,运动图像专家组(MPEG)-4编码标准,Visual)允许不同的编码方案,这些方案用一串更长的位样式来加前缀。
作为一般规则,构成可变长度码的位的数目取决于构成码的前缀的位的数目。同时,通过实验定义的一个子集的最常出现码可具有相对短的前缀(包括零前缀),因而可以作为单个码以查找方式来解码,对于特定的系统而言这可能是一种更快的解码方式。
因此,需要一种根据实际频率到码长的分布,为用常规位组合添加前缀的可变长度码提供高速解码的能力。
附图说明
从以下对本发明的详细描述中将会清楚本发明的特征和优点,其中:
图1图示了示例性的可变长度编码;
图2图示了一开始从位流中读取的位、选出位以及包含解码值、有效性指示符和辅助信息在内的表之间的关系;以及
图3是图示了根据本发明实施方案的可变长度解码过程的流程图。
具体实施方式
本发明的实施方案是一种为具有由常规位样式组成的前缀的可变长度码实现解码器的方法。为了将所公开的方法应用于具体的编码方案,这种方案应当包括一个具有较短前缀(包括零前缀)的最常使用码的子集,使得前缀扫描操作变得没有效率。根据所公开的方法,从位流中读取一定数量的位,其数量不少于VLC的最大可能长度。然后,选择预定数量的位,并将它们用作一个数据结构的索引,该数据结构包含至少一个解码值和有效性指示符,以及其他预解码的数据,包括但不限于:前缀类型和长度、一组码的最大码长、实际码长以及将返回给码流的位数。有效性指示符用来确定是继续解码操作,还是从数据结构中获得有效解码值并将多余的位返回给码流。如果解码值被指示为无效的,则解码操作将继续,并且一种估计码前缀的长度以及对应于所估计长度的有效位数的解码方法被应用于一开始从位流中读出的位。所公开的方法比直接查找解码法需要更少的存储器,并且该方法的性能与使用多个查找表的现有技术方法相比,表现出更少的存储器存取开销。此外,与其他面向前缀的方法相比,这种方法对于“短前缀”码的解码似乎更有效率,这是因为它排除了最常使用码的前缀类型和长度确定的操作。
在说明书中提及本发明的“一个实施方案”或“实施方案”是指关于该实施方案所描述的具体特征、结构或特性被包括在本发明的至少一个实施方案中。因此,短语“在一个实施方案中”在整个说明书中不同地方的出现不一定是指同一个实施方案。
图1图示了示例性的可变长度编码。如图1所示,每个可变长度码都具有一组被用作前缀10的位以及一组有效位12。前缀可以由(在通常情况下)被复制并相互级联的一组位(位样式)组成。跟在码前缀后的位可以被称作有效位。
可变长度码(VLC)可以具有相同的前缀。在这种情况下,这些码构成了一个前缀码组,但与此同时,跟在前缀后面的有效位的数量可以不同。在这样一个组中,码可能具有的有效位的最大数量可以被称为最大位数。对于每个VLC而言,跟在前缀后面的位的数量可以被称为实际位数。
图2根据本发明的实施方案图示了一开始从位流中读取的位、选出位以及包含解码值、有效性指示符和辅助信息在内的表之间的关系。如图2的实施例所示,可从位流中读出的位20的数量不少于任何可能的VLC长度,即,位数足以包含在具体编码方案中最长的VLC。可以从读出的位中选出任意数量的前导位22。提供一种数据结构24,以至少包含针对可由选出位形成的每种位组合的解码数据和有效性指示符。数据结构24还可以包含与前缀类型、码长、以及返回位流的位数有关的辅助信息,以协助以后的解码。
图3是图示了根据本发明实施方案的可变长度解码过程的流程图。在框100,从位流中读出不少于任何可能的可变长度码的位数。读出的位数应当足够包含最长的可变长度码,但是不受限制,当它可以协助解码过程时存储额外的位(例如,读出的位适合机器字大小)。接着,在框102,可以从先前读出的位中选出预定数量的位。所选择的位数取决于所使用的具体编码方案,因此,是出外部装置来确定的。完成这一确定过程的方式应当是允许选出位覆盖最常使用的(最可能的)VLC,同时使码查找表的大小最小化。在框104,利用由选出位形成的值来索引码查找表,并且获得至少解码值和有效性指示符、以及辅助信息。在一个实施方案中,获得辅助信息可以是可选的。然后在框106处检查有效性指示符,如果被指示为有效的,则在框104处获得的解码值在框108处作为解码过程的结果被返回。如果需要的话,可以检查实际码长或者实际长度和选出位数之间的差值(在框104处作为辅助信息而被取出),以在解码后调整位流。
如果解码数据被指示为无效的,则在框1 10处向一开始从位流中读出的位应用面向前缀的解码方法(即,估计码前缀的长度和对应于所估计长度的有效位数的方法)。在框104处获得的辅助信息可描述码前缀的类型和长度,因而提高将进一步应用的方法的性能。
参考附录A,以一个用C和汇编程序设计语言实现的本发明的实施方案为例。这个实施例不是限制性的,本领域的技术人员可以用其他程序设计语言来实现本发明,而不会偏离所要求保护的发明的范围。
这里所描述的技术不限于任何具体的硬件或软件配置;它们可以应用于计算或处理环境中。这些技术可以用包含在硬件、软件或固件组件,或它们的组合中的逻辑来实现。这些技术可以用在可编程机器上执行的程序来实现,所述可编程机器例如是移动计算机或静止计算机、个人数字助理、机顶盒、蜂窝电话和寻呼机、以及其他电子设备,其中每个设备都包括处理器、该处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及一个或多个输出设备。程序代码被施加于使用输入设备而输入的数据上,以完成所描述的功能,并且生成输出信息。输出信息可以施加于一个或多个输出设备。本领域的普通技术人员可以理解,可以利用多种计算机系统配置来实现本发明,包括微处理器系统、小型计算机、大型计算机等等。本发明也可以实现在分布式计算环境中,由通过通信网络链接的远程处理设备来执行任务。
每个程序都可以用高级过程性或面向对象的程序设计语言来实现,以与处理系统通信。然而,如果需要的话,也可以用汇编语言或机器语言来实现程序。无论怎样,语言都可以被编译或解释。
程序指令可被用来致使以该指令编程的通用或专用处理系统执行这里所描述的操作。可替换地,可以由包含用于执行所述操作的硬连线逻辑的特定硬件组件、或者由已编程的计算机组件和定制硬件组件的组合来执行操作。这里所描述的方法可以作为计算机程序产品而被提供,该产品可以包括其上存储有指令的机器可读介质,所述指令可被用于编程一个处理系统或其他电子设备来实现所述方法。这里所使用的术语“机器可读介质”应当包括能够存储或编码供机器执行的指令序列,并致使所述机器实现这里所描述的任何一种方法的任何介质。因此,术语“机器可读介质”应当包括但不限于固态存储器、光盘和磁盘、以及编码数据信号的载波。此外,在本领域中以采取动作或引发结果的一种形式或另一种形式(例如,程序、过程、处理、应用、模块、逻辑等等)提及软件是常见的。这样的表达仅仅是表述处理系统对软件的执行致使处理器完成动作或产生结果的简便方式。
虽然参考示意性的实施方案描述了本发明,但是本说明书并不想被解释为限制性的。本发明所属领域的技术人员所清楚的对示意性实施方案的各种修改、以及本发明的其他实施方案都被视为落入本发明的精神和范围内。
附录A
2002英特尔公司
GetVLC函数(汇编程序)
InitTable函数(“C”)
输入表(“C”)和初始霍夫曼表(文本)
位流结构  (“C”)
-------------------------------------------
Initial Huffman code table初始霍夫曼表
-------------------------------------------
/*
Codes码            Vector differences向量差
1                  0
010                1
011                -1
0010               2
0011               -2
00010              3
00011              -3
0000110            4
0000111            -4
00001010           5
00001011           -5
00001000           6
00001001           -6
00000110           7
00000111           -7
0000010110         8
0000010111         -8
0000010100         9
0000010101         -9
0000010010         10
0000010011         -10
00000100010        11
00000100011        -1
00000100000        12
00000100001        -12
00000011110        13
00000011111        -13
00000011100        14
00000011101        -14
00000011010        15
00000011011        -15
00000011000        16
00000011001        -16
00000010110        17
00000010111        -17
00000010100        18
00000010101        -18
00000010010        19
00000010011        -19
00000010000        20
00000010001        -20
*/
-----------------------------------------
Packed code/value table containing
information on prefix length and
significant bit number包含有关前缀长度和有效位数的信息的压缩码/值表
-----------------------------------------
///the table elements should be sorted by prefix length表元素应当按前缀长度排序
static const long exTable_Mixed[]=
{
 13,/*max bits|bit-size flag*/最大位|位大小标志
 7,/*number of prefix groups*/前缀组的数量
 5,/*lookup table length(in bits)*/查找表长度(以位为单位)
 1,/*code length*/码长
 1,/*size of group*/组的大小
 0,/*bit index*/位索引
 0,/*get bits*/获取位
 0,/*unget bits*/不获取位
0x00010000,
 3,/*3-bit codes*/3位码
 2,
 1,
 1,
 0,
0x00020001,0x0003ffff,
 4,/*4-bit codes*/4位码
 2,
 2,
 1,
 0,
0x00020002,0x0003fffe,
 5,/*5-bit codes*/5位码
 2,
 3,
 1,
 0,
0x00020003,0x0003fffd,
 8,/*8-bit codes*/8位码
 4,
 4,
 3,
 0,
0x00080006,0x0009fffa,0x000a0005,0x000bfffb,
 7,/*7-bit codes*/7位码
 2,
 4,
 3,
 1,
0x00060004,0x0007fffc,
 11,/*11-bit codes*/11位码
 4,
 5,
 5,
 0,
0x0020000c,0x0021fff4,0x0022000b,0x0023fff5,
 10,/*10-bit codes*/10位码
 6,
 5,
 5,
 1,
0x0012000a,0x0013fff6,0x00140009,0x0015fff7,0x00160008,0x0017fff8,
 8,/*8-bit codes*/ 8位码
 2,
 5,
 5,
 3,
0x00060007,0x0007fff9,
 11,/*11-bit codes*/11位码
 16,
 6,
 4,
 0,
0x00100014,0x0011ffec,0x00120013,0x0013ffed,0x00140012,0x0015ffee,
0x00160011,0x0017ffef,0x00180010,0x0019fff0,0x001a000f,0x001bfff1,
0x001c000e,0x001dfff2,0x001e000d,0x001ffff3,
-1/*end of table*/ 表结束
};
------------------------------
Bit Stream structures 位流结构
------------------------------
typedef struct_MplDataBuf
{
    unsigned char*data;
    long           data_len;
    long           data_offset;
}MplDataBuf;
typedef struct_MplBitStream
{
    long           bit_ptr;      //缓冲区位指针(31-0)
    MplDataBuf      *data_buf;     //指向数据的指针及其大小
    unsigned long*start_data;   //内部位流指针
    unsigned long*end_data;
    unsigned long*current_data;
    FILE            *fd;            //输入或输出文件
    jmp_buf        exit_point;   //处理错误vlc码的退出点
}MplBitStream;
#define DATA_BUFFER SIZE              1*1024*1024
unsigned long bit_mask[33]=
{
    0x00000000,
    0x00000001,0x00000003,0x00000007,0x0000000f,
    0x0000001f,0x0000003f,0x0000007f,0x000000ff,
    0x000001ff,0x000003ff,0x000007ff,0x00000fff,
    0x00001fff,0x00003fff,0x00007fff,0x0000ffff,
    0x0001ffff,0x0003ffff,0x0007ffff,0x000fffff,
    0x001fffff,0x003fffff,0x007fffff,0x00ffffff,
    0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,
    0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff
};
-----------------------------------------------
Function to form internal VLC table形成内部VLC表的函数
-----------------------------------------------
    typedef unsigned long VLCDecodeTable;

    static VLCDecodeTable*CreateVLCDecodeTable_Mixed(const long*src_table,VLCDecodeTable*table,long

    *table_size,long cyr_size)

  {

      int vm4_vlc_code_mask,vm4_vlc_data_mask,vm4_vlc_shift;

      int offset;

      int i,j;

      int code_length;

      int group_size;

      int bit_index;

      int get_bits;

      int unget_bits;

      int group_count;

      int outidx;

      int group_offset;

      int lookup_length;

      int prefix_offset;

      switch(*src_table++&VM4_VLC_LEN_FLAG)

      {

      case VM4_VLC_20:

           vm4_vlc_code_mask=0xfffff000;

           vm4_vlc_data_mask=0x00000fff;

           vm4_vlc_shift    =12;

           break;

      case VM4_VLC_24:

           vm4_vlc_code-mask=0xffffff00;

           vm4_vlc_data_mask=0x000000ff;

           vm4_vlc_shift    =8;

           break;

      default:

           vm4_vlc_code_mask=0xffff0000;

           vm4_vlc_data_mask=0x0000ffff;

           vm4_vlc_shift    =16;

           break;

      }

      offset       =*src_table++*2;

      lookup_length=*src_table++;

      prefix_offset=(1<<lookup_length)*2+2;
				
				<dp n="d8"/>
  offset      +=prefix_offset;

  memset(table,0,offset*sizeof(VLCDecodeTable));

  ///memset(table,-1,prefix_offset*sizeof(VLCDecodeTable));

  table[0]=32-lookup_length;    ///the bit count to shift right右移位计数

  table[1]=prefix_offset;

  while(*src_table!=-1)

  {

      code_length=*src_table++;

      group_size =*src_table++;

      bit_index  =*src_table++*2+prefix_offset;

      get_bits   =*src_table++;

      unget_bits =*src_table++;

      if(!table[bit_index])

      {

            table[bit_index]   =get_bits;

            table[bit_index+1]=group_offset=offset;

      }

      for(i=0,group_count=0;i<group_size;i++)

      {

           if(code_length<lookup_length)

           {

                for=(j=0;j<(1<<(lookup_length-code_length));j++)

                {

                   outidx=((((((unsigned long int)(*src_table &amp; vm4_vlc_code_mask))

                               >>vm4_vlc_shift)&amp; bit_mask[code_length])

                               <<(lookup_length-code_length))+j)*2;

                   table[outidx+2]   =/*lookup_length-*/code_length;

                   table[outidx+2+1]=((*src_table &amp; vm4_vlc_data_mask)<<(32-

                                            vm4_vlc_shift))>>(32-vm4_vlc_shift);

                }

           }

           else if(code_length==lookup_ength)

           {

                 outidx=((((unsigned long int)(*src_table &amp; vm4_vlc_code_mask))

                            >>vm4_vlc_shift)&amp; bit_mask[code_length])*2;

                 table[outidx+2]   =code_length;///0;

                 table[outidx+2+1]=((*src_table &amp; vm4_vlc_data_mask)<<(32-

                                          vm4_vlc_shift))>>(32-vm4_vlc_shift);

           }

           if(!unget_bits)

           {

                 outidx=((((unsigned long int)(*src_table &amp; vm4_vlc_code_mask))

                            >>vm4_vlc_shift)&amp; bit_mask[get_bits])*2;

                 table[group_offset+outidx]   =((*src_table &amp; vm4_vlc_data_mask)<<

                                                      (32-vm4_vlc_shift))>>(32-

                                                      vm4_vlc_shft);

                 table[group_offset+outidx+1]=0;

                 group_count++;

                 src_table++;

           }

           else

           {
				
				<dp n="d9"/>
                  for(j=0;j<(1<<unget_bits);j++)

                  {

                       outidx=((((((unsigned long int)(*src_able &amp; vm4_vlc_code_mask))

                                   >>vm4_vlc_shift) &amp; bit_mask[get_bits-unget_bits])

                                   <<unget_bits)+j)*2;

                       table[group_offset+outidx]   =((*src_table &amp; vm4_vlc_data_mask)

                                                            <<(32-vm4_vlc_shift))>>(32-

                                                            vm4_vlc_shift);

                       table[group_offset+outidx+1]=unget_bits;

                       group_count++;

                  }

                  src_table++;

              }

          }

          offset+=group_count*2;

      }

      *table_size=offset;
      return(VLCDecodeTable*)table;

  }
---------------------------------------------
Function to decode VLC(Assembler)解码VLC的函数(汇编语言)
----------------------------------------------
.686
.xmm
xmmword textequ<qword>
mmword textequ<qword>
.model FLAT
MplDataBuf   struc 4t
data     dd  ?
data_len dd  ?
data_offset  dd  ?
MplDataBuf   ends
MplBitStream struc 4t
bit_ptr      dd    ?    ;;;Buffer bit pointer(31-0)缓冲区位指针
data_buf   dd  ?   ;;;Pointer to data and its size指向数据的指针及其大小
start_data dd  ?   ;;;Internal bitsream pointers内部位流指针
end_data   dd  ?
current_data   dd  ?
fd        dd   ?   ;;;Input or output file输入或输出文件
exit_pointdd   ?   ;;;Exit point to handle incorrect vlc codes处理错误vlc码的退出点
MplBitStream   ends
_TEXT    segment
    extrn_longjmp:near
;;;unsigned long asmbsGetVLC_LookupBitSearch
;;;                                    (MplBitStream*bsm,const VLCDecodeTable*vlcTable)
_asmbsGetVLC_LookupBitSearch proc near
sizeof_locals  equ  14h
ws   equ  esp+04h
bsm equ dword ptr[eax+04h]
table equ dword ptr[eax+08h]
    mov eax,esp
    sub esp,sizeof_locals
    and esp,0fffffff0h
    push eax
    mov[ws],esi
    mov[ws+04h],edi
    mov[ws+08h],ecx
    mov[ws+0ch],ebx
    mov[ws+10h],ebp
    mov esi,bsm
    mov edi,table
    mov ecx,lfh
    sub ecx,MplBitStream.bit_ptr[esi]
    mov ebx,MplBitStream.current_data[esi]
    mov eax,[ebx]
    mov edx,[ebx+4]
    shld eax,edx,cl   ;;;eax=data
    test eax,eax
    jz   error_code        ;;;this branch is supposed not to be taken假定不采用该分支
    ;;;look up several bits first
    mov ecx,[edi]          ;;;ecx==32-lookup_bits
    mov edx,eax
    shr edx,cl
    mov ebp,[edi+edx*8+8]       ;;;ebp==(un)get bits
    or  ebp,ebp
    jz  scan           ;;;not taken不采用
    mov eax,[edi+edx*8+0ch];;;eax==decoded data
    mov ebx,MplBitStream.bit_ptr[esi]
    sub ebx,ebp
    js  negative_ptr            ;;;not taken不采用
    ;;;exit
    mov MplBitStream.bit_ptr[esi],ebx
    mov esi,[ws]
    mov edi,[ws+04h]
    mov ecx,[ws+08h]
    mov ebx,[ws+0ch]
    mov ebp,[ws+10h]
    mov esp,[esp]
    ret
scan:
    bsr ecx,eax        ;;;ecx=index
    mov ebx,[edi+4]    ;;;ebx==prefix_offset
    add ebx,62
    mov ebp,31
    sub ebx,ecx
    sub ebx,ecx         ;;;ebx=offset(of bit index group位索引组的偏移)
    sub ebp,ecx         ;;;ebp=(31-index)
    mov edx,[edi+ebx*4] ;;;edx=get_bits
    mov ebx,[edi+ebx*4+4];;;ebx=offset(of code value and unget bits码值和未获取位的偏移)
    sub ecx,edx
    shr eax,cl
    and eax,bit_mask[edx*4] ;;;eax=data
    lea ebx,[ebx*4]
    lea ebx,[ebx+eax*8]
    mov ecx,[edi+ebx+4]  ;;;ecx=unget_bits
    mov eax,[edi+ebx];;;eax=data
    mov ebx,MplBitStream.bit_ptr[esi]
    lea edx,[edx+ebp+1]
    add ebx,ecx
    sub ebx,edx
    js negative_ptr       ;;;not taken不采用
almost exit:
    mov MplBitStream.bit_ptr[esi],ebx
exit:
    mov esi,[ws]
    mov edi,[ws+04h]
    mov ecx,[ws+08h]
    mov ebx,[ws+0ch]
    mov ebp,[ws+10h]
    mov esp,[esp]
    ret
negative_ptr:
    add ebx,20h
    add MplBitStream.current_data[esi],04h
    jmp almost_exit        ;;;taken被采用
error_code:
    push-1
    lea edx,MplBitStream.exit_point[esi]
    push edx
    call _longjmp
    ;;; no return here
    int   00h
_asmbsGetVLC_LookupBitSearch endp
_TEXT ends
_DATA segment
bit_mask dd 00000000h
         dd 00000001h,00000003h,00000007h,0000000fh
         dd 0000001fh,0000003fh,0000007fh,000000ffh
         dd 000001ffh,000003ffh,000007ffh,00000fffh
         dd 00001fffh,00003fffh,00007fffh,0000ffffh
         dd 0001ffffh,0003ffffh,0007ffffh,000fffffh
         dd 001fffffh,003fffffh,007fffffh,00ffffffh
         dd 01ffffffh,03ffffffh,07ffffffh,0fffffffh
      dd  1fffffffh,3fffffffh,7fffffff,0fffffffh
_DATA ends
   end

Claims (24)

1.在用于解码位流中的可变长度前缀码的系统中,一种方法包括:
从所述位流中读出足以存储所述系统的最长可变长度码的多个位;
从读出的位中选出预定数量的位;以及
根据所选出的位的实际值,从一个数据结构中至少获得与可变长度码相关联的解码值和有效性指示符。
2.如权利要求1所述的方法,还包括当解码值被指示为无效时,向一开始从所述位流中读出的位应用面向前缀的解码方法。
3.如权利要求1所述的方法,其中读出所述多个位的操作包括使指定数量的位可被访问用于以后的操作。
4.如权利要求1所述的方法,其中选出所述数量的位的操作包括使指定数量的位比读出相同数量的位更快地可被访问用于以后的操作。
5.如权利要求1所述的方法,其中所述预定数量的位包括被用作所述数据结构的索引的最大数量的位。
6.如权利要求1所述的方法,其中所述有效性指示符指示所述解码值是否有效。
7.如权利要求1所述的方法,其中用于至少获得与可变长度码相关联的解码值和有效性指示符的数据结构包括一个存储器区域,对于可由所述预定数量的位形成的每种位组合,所述存储器区域至少包含该位组合的解码值和有效性指示符。
8.如权利要求2所述的方法,其中面向前缀的解码方法还包括一种在解码期间采用可变长度码前缀属性的可变长度解码的方法。
9.一种制品,包括:具有多条机器可读指令的机器可访问介质,其中当所述指令由处理器执行时,所述指令通过以下步骤完成对位流中的可变长度前缀码的解码:
从所述位流中读出足以存储所述系统的最长可变长度码的多个位;
从读出的位中选出预定数量的位;以及
根据所选出的位的实际值,从一个数据结构中至少获得与可变长度码相关联的解码值和有效性指示符。
10.如权利要求9所述的制品,还包括当解码值被指示为无效时,用于向一开始从所述位流中读出的位应用面向前缀的解码方法的指令。
11.如权利要求9所述的制品,其中用于读出多个位的指令包括用于使指定数量的位可被访问用于以后操作的指令。
12.如权利要求9所述的制品,其中用于选出所述数量的位的指令包括用于使指定数量的位比读出相同数量的位更快地可被访问用于以后操作的指令。
13.如权利要求9所述的制品,其中所述预定数量的位包括被用作所述数据结构的索引的最大数量的位。
14.如权利要求9所述的制品,其中所述有效性指示符指示所述解码值是否有效。
15.如权利要求9所述的制品,其中用于至少获得与可变长度码相关联的解码值和有效性指示符的数据结构包括一个存储器区域,对于可由所述预定数量的位形成的每种位组合,所述存储器区域至少包含该位组合的解码值和有效性指示符。
16.如权利要求10所述的制品,其中面向前缀的解码方法还包括一种在解码期间采用可变长度码前缀属性的可变长度解码的方法。
17.一种用于解码位流中的可变长度前缀码的系统,所述系统包括:
从所述位流中读出足以存储所述系统的最长可变长度码的多个位的逻辑;
从读出的位中选出预定数量的位的逻辑;以及
根据所选出的位的实际值,从一个数据结构中至少获得与可变长度码相关联的解码值和有效性指示符的逻辑。
18.如权利要求17所述的系统,还包括当解码值被指示为无效时,向一开始从所述位流中读出的位应用面向前缀的解码方法的逻辑。
19.如权利要求17所述的系统,其中读出多个位的逻辑包括使指定数量的位可被访问用于以后操作的逻辑。
20.如权利要求17所述的系统,其中选出所述数量的位的逻辑包括使指定数量的位比读出相同数量的位的逻辑更快地可被访问用于以后操作的逻辑。
21.如权利要求17所述的系统,其中所述预定数量的位包括被用作所述数据结构的索引的最大数量的位。
22.如权利要求17所述的系统,其中所述有效性指示符指示所述解码值是否有效。
23.如权利要求17所述的系统,其中用于至少获得与可变长度码相关联的解码值和有效性指示符的数据结构包括一个存储器区域,对于可由所述预定数量的位形成的每种位组合,所述存储器区域至少包含该位组合的解码值和有效性指示符。
24.如权利要求18所述的系统,其中面向前缀的解码方法还包括一种在解码期间采用可变长度码前缀属性的可变长度解码的方法。
CN03826790XA 2003-07-15 2003-07-15 解码可变长度前缀码的方法和系统 Expired - Fee Related CN1839550B (zh)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/RU2003/000307 WO2005006562A1 (en) 2003-07-15 2003-07-15 A method of decoding variable length prefix codes

Publications (2)

Publication Number Publication Date
CN1839550A true CN1839550A (zh) 2006-09-27
CN1839550B CN1839550B (zh) 2011-09-14

Family

ID=34057071

Family Applications (1)

Application Number Title Priority Date Filing Date
CN03826790XA Expired - Fee Related CN1839550B (zh) 2003-07-15 2003-07-15 解码可变长度前缀码的方法和系统

Country Status (4)

Country Link
US (1) US7205915B2 (zh)
CN (1) CN1839550B (zh)
AU (1) AU2003298974A1 (zh)
WO (1) WO2005006562A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101547353B (zh) * 2008-03-28 2011-09-07 富士通株式会社 可变长码解码加速装置

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE10339832A1 (de) * 2003-08-29 2005-03-17 Philips Intellectual Property & Standards Gmbh Verfahren zum verbesserten Erkennen der Gültigkeit von IEEE 802.11a Signalen sowie Schaltungsanordnung zur Durchführung des Verfahrens
TWI330473B (en) * 2006-11-24 2010-09-11 Primax Electronics Ltd Huffman decoding method
US8358227B2 (en) * 2007-11-06 2013-01-22 GM Global Technology Operations LLC Multi-cell voltage secure data encoding in hybrid vehicles
KR20090101037A (ko) * 2008-03-21 2009-09-24 한국전자통신연구원 가변 구조 코드의 생성 방법
US7642935B2 (en) * 2008-04-07 2010-01-05 Mediatek Inc. Huffman decoding method and apparatus
US8508390B2 (en) * 2008-08-18 2013-08-13 Dayin Gou Combining transform coefficient decoding with variable length decoding
US20130044819A1 (en) * 2011-08-16 2013-02-21 Phani Kumar Uppalapati Decoding a variable length code
US10171104B1 (en) 2017-11-08 2019-01-01 International Business Machines Corporation Encoding variable length integers for graph compression
US10651871B1 (en) * 2019-07-10 2020-05-12 Citrix Systems, Inc. Real-time history-based byte stream compression

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4475174A (en) 1981-09-08 1984-10-02 Nippon Telegraph & Telephone Public Corporation Decoding apparatus for codes represented by code tree
US4899149A (en) * 1986-02-28 1990-02-06 Gary Kahan Method of and apparatus for decoding Huffman or variable-length coees
WO1993013603A1 (en) 1991-12-23 1993-07-08 Intel Corporation Circuitry for decoding huffman codes
JPH07235878A (ja) * 1993-12-28 1995-09-05 Matsushita Electric Ind Co Ltd 可変長復号化器
KR0124191B1 (ko) * 1994-01-18 1998-10-01 배순훈 가변길이 코드 디코딩장치
US5589829A (en) * 1994-10-26 1996-12-31 Intel Corporation Decoding variable-length encoded signals
US6008745A (en) * 1998-02-17 1999-12-28 Sun Microsystems, Inc. Variable length decoding using lookup tables
US6219457B1 (en) 1998-05-26 2001-04-17 Silicon Graphics, Inc. Method and system for decoding data encoded in a variable length code word
US6147629A (en) * 1998-10-15 2000-11-14 Intel Corporation Method and apparatus for variable length decoding
US6587057B2 (en) * 2001-07-25 2003-07-01 Quicksilver Technology, Inc. High performance memory efficient variable-length coding decoder
US6891976B2 (en) * 2002-03-12 2005-05-10 Intel Corporation Method to decode variable length codes with regular bit pattern prefixes

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101547353B (zh) * 2008-03-28 2011-09-07 富士通株式会社 可变长码解码加速装置

Also Published As

Publication number Publication date
US20060187096A1 (en) 2006-08-24
AU2003298974A1 (en) 2005-01-28
CN1839550B (zh) 2011-09-14
US7205915B2 (en) 2007-04-17
WO2005006562A1 (en) 2005-01-20

Similar Documents

Publication Publication Date Title
CN1320769C (zh) 编码器、解码器以及数据传送系统
CN1186714C (zh) 高基除法器及方法
CN1147052C (zh) 插入方法与设备和去插入方法与设备
CN1268135C (zh) 编码方法、编码装置和记录媒体、以及解码方法、解码装置和记录媒体
CN1640142A (zh) 对小波变换系数进行编码的方法和设备
CN1494767A (zh) 压缩/解压缩结构化文档的方法
CN1596547A (zh) 移动图像编码设备、移动图像解码设备、移动图像编码方法、移动图像解码方法、程序和存储程序的计算机可读记录媒介
CN1613188A (zh) 霍夫曼编码
CN1272286A (zh) 数据块噪声检测装置及数据块噪声消除装置
CN1751516A (zh) 用于发送和接收映象数据的强势系统
CN1515078A (zh) 可变长度编码方法,可变长度译码方法,存储介质,可变长度编码设备,可变长度译码设备,和位流
CN101040306A (zh) 伪随机数生成装置
CN1201519C (zh) 数据一致性检测装置、数据一致性判断装置及数据挑选装置
CN1200571C (zh) 正交变换、逆正交变换方法及装置、编码、解码方法及装置
CN1839550A (zh) 解码可变长度前缀码的方法
CN1311951A (zh) 图像编码装置、图像译码装置、文字核对装置和数据存储媒体
CN1531209A (zh) 编码方法和编码装置、计算机程序以及存储介质
CN1289509A (zh) 数据处理方法、数据处理装置和程序记录媒体
CN1249983C (zh) 电子水印嵌入设备及其方法
CN1825355A (zh) 计算机图形数据编码装置、解码装置、编码和解码方法
CN101039435A (zh) 在图象编码过程中实现自适应扫描的方法
CN1882938A (zh) 确定给定变换函数的变换元素的过程和设备,数字信号变换方法和设备及计算机可读介质
CN1254110C (zh) 图像处理方法和图像处理装置
CN1205804C (zh) 摄象装置
CN1092362C (zh) 阵列错位比较装置及用来实现查询的方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20110914

Termination date: 20150715

EXPY Termination of patent right or utility model