一种解码器和解码方法

文档序号:7513730阅读:197来源:国知局

专利名称::一种解码器和解码方法
技术领域
:本发明涉及解码领域,尤其涉及一种解码器和解码方法。
背景技术
:目前比较常见的音频流压缩格式包括MP3、AAC等,其中不同压缩格式的码流的比特封装顺序可能不同,均由其相应的规范文档确定。码流通常采用的比特封装顺序是从目标字节(destination)的空闲最高数据位(MSB)开始,将码流中的语义项的各比特从高位向低位依次写入,在目标字节写满时,将所述语义项的剩余比特从下一个字节的最高数据位开始写入。如图1所示为现有技术中在ACC空码流中写入一个语义项的方法示意图,以在AAC空码流中写入4比特值"12"[bllOO]为例,其写入方法为将"1100"顺序写入O字节的空闲最高数据位(即第7~4号比特)。如图2所示为现有技术中在ACC空码流中连续写入两个语义项的方法示意图,以在AAC空码流中依次写入4比特值"12"[bll00]和7比特值"17"[b0010001]为例,具体的,按照图i所示的方法将"iioo"写入后,再将"ooiooor顺序写入o字节的剩余其他比特位(即第30号比特),在0字节写满时,从下一字节的最高位开始顺序写入剩余的比特。上述图1和图2中各字节的7号比特和0号比特分别对应字节的最高位(MSB)和最低位(LSB),"X"表示空闲比特位。码流经过特定的封装方法编码后,在需要读取时,需要对码流进行解码操作,现有技术中的解码器多对应上述编码方式,即依次从码流的低字节向高字节读取,在字节内从高位向低位读取。OggVorbis是一种日益流行的免费音频压缩流格式,其采用与常见音频流不同的比特封装顺序,具体是从目标字节(destination)的空闲最低数据位(LSB)开始,将码流中的语义项的各比特从低位向高位依次写入,目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入。如图3所示为现有技术中在OggVorbis空码流中写入一个语义项的方法示意图,以在OggVorbis空码流中写入4比特值"12"[bll00]为例,其写入方法为将"1100"顺序写入O字节的空闲最低数据位(即第03号比特)。如图4所示为现有技术中在OggVorbis空码流中连续写入两个语义项的方法示意图,以在OggVorbis空码流中依次写入4比特值"12"[bll00]和7比特值"17"为例,具体的,按照图3所示的方法将"iioo"写入后,再将"ooiooor顺序写入0字节的剩余其他比特位(即第4~7号比特),在0字节写满时,从下一字节的最j氐位开始顺序写入剩余的比特。同样的,上述图3和图4中各字节的7号比特和0号比特分别对应字节的最高位(MSB)和最低位(LSB),"X"表示空闲比特位。由于OggVorbis格式的码流的封装顺序与常用压缩格式的封装顺序不同,因此,其解码的顺序也不同,利用现有技术中的解码器无法进行正确的解码。
发明内容有鉴于此,本发明实施例的目的在于提供一种解码器和解码方法,可以快速有效的对OggVorbis封装格式的码流进行解码。为达到上述目的,本发明实施例提供一种解码器,用于从外部存储器中读取码流并进行解码,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述存储器的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储,所述解码器包括第一緩存,用于存储从所述存储器读取的码流,所述第一緩存的存储方式为将从所述存储器中读取的低地址字节码流存储在空闲最低数据位;处理模块,用于从所述第一緩存中读取指定长度个最低数据位码流并输出,并将所述第一緩存中的数据右移所述指定长度位,所述指定长度为第一长度和第二长度中较小的值,所述第一长度为当前需要解码的语义项的比特长度,所述第二长度为所述第一緩存中当前存储的数据的有效比特长度;读取模块,用于在所述第二长度为零时,从所述存储器的可用码流中读取码流并存储到所述第一緩存中;第一更新模块,用于在所述第一长度大于所述第二长度时,获取所述第一长度与所述第二长度的差作为新的第一长度,并发送给所述处理模块;第二更新模块,用于在所述第一緩存中的数据发生变化时,更新所述第二长度,并发送给所述处理模块;第二缓存,用于存储所述处理模块输出的码流,所述第二緩存的存储方式为将所述处理模块输出的码流存储在空闲最低数据位;输出模块,用于在所述第二缓存中存储的码流的长度等于所述当前需要解码的语义项的长度时,将所述第二緩存中的码流输出,并将所述第二緩存清零。所述处理模块进一步包括第一获取子模块,用于根据所述码流的编码规范,获取当前需要解码的语义项的比特长度,作为所述第一长度;第二获取子模块,用于获取所述第一緩存中当前存储的数据的有效比特长度,作为所述第二长度;比较子模块,用于比较所述第一长度和所述第二长度;读取子模块,用于将所述第一长度和所述第二长度中较小的数值作为指定长度,从所述第一緩存中读取所述指定长度个最低数据位码流并输出;第一更新子模块,用于在所述读取子模块输出码流后,将所述第一緩存中的数据右移所述指定长度位。所述第一获取子模块进一步包括第一判断单元,用于判断获取到的所述第一长度是否为零;置零单元,用于在所述第一长度为零时,控制所述第二緩存置零;第一发送单元,用于在所述第一长度不为零时,将所述第一长度发送给所述比较子模块。所述第二获取子模块进一步包括第二判断单元,用于判断获取到的所述第二长度是否为零;第一通知单元,用于在所述第二长度为零时,通知所述读取模块;第二发送单元,用于在所述第二长度不为零时,将所述第二长度发送给所述比较子模块。所述读取模块进一步包括判断子模块,用于在所述第二长度为零时,判断所述存储器的可用码流长度是否大于第一字节长度,所述第一字节长度为所述第一緩存能够存储的数据的最大长度;填充子模块,用于在所述可用码流长度大于或等于所述第一字节长度时,根据所述存储器的可用码流首地址,从所述存储器的可用码流中读取所述第一字节长度的码流并存储在所述第一緩存中,在所述可用码流长度小于所述第一字节长度时,从所述存储器中读取所述可用码流长度的码流并存储在所述第一緩存中;第二更新子才莫块,用于在所述填充子模块读取码流后,更新所述可用码流首地址和所述可用码流长度。所述码流为OggVorbis格式的码流。本发明实施例还提供一种解码方法,包括从外部存储器中读取码流并进行解码的步骤,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述存储器的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储,所述方法还包括以下步骤获取当前需要解码的语义项的比特长度,作为第一长度;获取当前緩存的数据的有效比特长度,作为第二长度;将所述第一长度和所述第二长度中的较小值作为指定长度;从缓存的数据中读取所述指定长度个最低数据位码流,并将所述码流置于返回数值的空闲最低数据位,将緩存的数据右移所述指定长度位;判断所述返回值中码流的长度是否等于所述当前需要解码的语义项的长度;在所述返回值中码流的长度等于所述当前需要解码的语义项的长度时,将所述返回值中的码流输出,并在输出后将所述返回值清零;在所述返回值中码流的长度不等于所述当前需要解码的语义项的长度时,从所述外部存储器中读取码流并进行緩存,更新所述第一长度和所述第二长度,并返回所述将所述第一长度和所述第二长度中的较小值作为指定长度的步骤。所述获取当前緩存的数据的有效比特长度,作为第二长度之前还包括判断所述第一长度是否为零,在所述第一长度为零时,直接控制所述返回值置零的步骤。所述将所述第一长度和所述第二长度中的较小值作为指定长度之前还包括判断所述第二长度是否为零,在所述第二长度为零时,从所述外部存储器中读取码流并进行缓存,更新所述第一长度和所述第二长度的步骤。所述从所述外部存储器中读取码流并进行緩存的方法具体为判断所述存储器的可用码流长度是否大于第一字节长度,所述第一字节长度为所述解码器能够緩存的数据的最大长度;在所述可用码流长度大于或等于所述第一字节长度时,根据所述存储器的可用码流首地址,从所述存储器的可用码流中读取所述第一字节长度的码流并进行緩存,在所述可用码流长度小于所述第一字节长度时,从所述存储器中读取所述可用码流长度的码流并进行緩存;更新所述可用码流首地址和所述可用码流长度。所述码流为OggVorbis格式的码流。本发明的实施例具有以下优点通过本发明实施例的解码器和解码方法,在对OggVorbis封装格式的码流进行解码时,可以4会照以下顺序读取码流字节之间的读取顺序为从J氐地址字节向高地址字节读取,字节内部读取顺序为从低比特位(LSB)向高比特位(MSB)读取,另外,在从外部存储器中读取码流时,总是以字节为单位,将存储器的低地址字节的码流读取到解码器緩存的空闲最低数据位,因此,与平台字节存放的顺序无关。图1为现有技术中在ACC空码流中写入一个语义项的方法示意图2为现有^t支术中在ACC空码流中连续写入两个语义项的方法示意图3为现有4支术中在OggVorbis空码流中写入一个语义项的方法示意图;图4为现有技术中在OggVorbis空码流中连续写入两个语义项的方法示意图5为本发明实施例的解码器结构示意图6为本发明实施例的从存储器中读取码流后,第一缓存中存储的码流与存储器中存储的码流的对应示意图7为本发明实施例的解码器方法流程示意图。具体实施例方式本发明实施例提供一种解码器和解码方法,使得在对接收到的码流进行解码时,可以按照以下顺序读取码流字节之间的读取顺序为从低地址字节向高地址字节读取,字节内部读取顺序为从低比特位(LSB)向高比特位(MSB)读取。下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。如图5所示为本发明实施例的解码器结构示意图,该解码器10,用于从外部存储器20中读取码流并进行解码,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述存储器20的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储。解码器10包括第一緩存11,用于存储从存储器20中读取的码流,第一緩存11的存储方式为将从存储器20中读取的低地址字节存储在空闲最低数据位,从存储器20中读取的字节的长度不超过第一字节长度,所述第一字节长度为所述第一緩存11所能够存储的数据的最大长度,所述第一字节长度可以为4字节、8字节或其他更大的字节长度。处理模块12,用于从第一緩存11中读取指定长度个最低数据位码流并输出,并将所述第一緩存11中的数据右移所述指定长度位,所述指定长度为第一长度和第二长度中较小的值,所述第一长度为当前需要解码的语义项的比特长度,所述第二长度为第一緩存11中当前存储的数据的有效比特长度,所述有效比特长度即为所述第一緩存11中存储的可用码流的长度。读取模块13,用于在所述第二长度为零时,从存储器20的可用码流中读取码流并存储到第一緩存11中。第一更新模块14,用于在所述第一长度大于所述第二长度时,获取所述第一长度与所述第二长度的差作为新的第一长度,并发送给处理模块12。第二更新模块15,用于在第一緩存11中的数据发生变化时,更新所述第二长度,并发送给处理模块12。所述第一緩存11中的数据发生变化即第一缓存11从存储器20读取新码流或第一緩存11中的数据进行右移位操作。第二緩存16,用于存储处理模块12输出的码流,第二緩存16的存储方式为将处理模块12输出的码流存储在空闲最低数据位。输出模块17,用于在第二緩存16中存储的码流的长度等于所述当前需要解码的语义项的长度时,将第二緩存16中的码流输出,并将第二緩存16清零。在第一緩存11中存储的数据的有效长度(第二长度)小于当前需要读取的码流的长度(第一长度)时,上述处理模块12输出的码流则不是一个完整的语义项,因此,输出模块17并不立即将第二緩存16接收到的码流输出,而是继续等待,处理模块12将下一次输出的码流存储在第二缓存16的空闲最低数据位,直至第二緩存16中存储的码流的长度等于所述当前需要解码的语义项的长度时,输出模块17才将第二緩存16中的码流输出。上述的处理模块12进一步包括第一获取子模块121,用于根据接收到的码流的编码规范,获取当前需要解码的语义项的比特长度,作为第一长度。第二获取子才莫块122,用于获取第一緩存11中当前存储数据的有效比特长度,作为第二长度。比较子模块123,用于比较第一长度和第二长度。读取子模块124,用于将第一长度和第二长度中较小的数值作为指定长度,从第一緩存11中读取所述指定长度个最低数据位码流并输出。第一更新子模块125,用于在读取子模块124输出码流后,将第一緩存ll中的数据右移所述指定长度位。当然,在第二长度小于第一长度,且读取子模块124从第一緩存11中读取所述第二长度个最低数据位后,也可以不进行第一更新子模块125的右移位操作,而是直接从存储器中读取新的码流,将第一緩存11中的数据覆盖。上述接收到的所述码流可以是OggVorbis格式的码流,当然也可以是与OggVorbis比特封装顺序相同的其他格式的码流。当所述码流是OggVorbis格式的码流时,根据OggVorbis编码规范的要求,所述码流中还可能包括O字节长度的语义项,即上述第一获取子模块121获取到的当前需要解码的语义项的长度(即第一长度)可能为零,当第一长度为零时,则无须执行上述的比较、读取、更新操作,而是由第一获取子模块121直接控制第二緩存16置零,因此,上述第一获取模块121进一步包括第一判断单元,用于判断获取到的所述第一长度是否为零。置零单元,用于在所述第一长度为零时,控制所述第二缓存16置零。第一发送单元,用于在所述第一长度不为零时,将所述第一长度发送给所述比较子模块123。当上述的第一緩存11存储的有效数据为空时,上述的第二获取子模块122获取到的第二长度为零,第二获取子模块122此时需要通知读取模块13从存储器20中读取新码流并存储到第一緩存11中,因此,所述第二获取子模块122进一步包括第二判断单元,用于判断获:f又到的所述第二长度是否为零。第一通知单元,用于在所述第二长度为零时,通知所述读取模块13。第二发送单元,用于在所述第二长度不为零时,将所述第二长度发送给所述比较子模块123。上述的读取子模块124从第一緩存11中读取所述指定长度个最低数据位的方法具体为将第一緩存11中的所述指定长度个最低数据位码流与特定数据进行与操作,所述特定数据的指定长度个最低数据位比特为1,其余比特均为O,所述与操作的结果即是需要读取的码流,当然,读取子模块124也可以采用其他方法从第一緩存11中读取码流。上述的读取模块13进一步包括判断子模块131,用于在所述第二长度为零时,判断存储器20中的可用码流长度是否大于第一字节长度,所述第一字节长度为第一緩存11可存储的数据的最大长度。所述可用码流长度即存储器20中未被读取的码流的字节长度,通常情况下,解码器10从存储器20读取码流的同时,还需要读取存储器20的可用码流首地址和可用码流长度,所述可用码流首地址为所述存储器20中未被读取的码流的首地址。填充子模块132,用于在所述可用码流长度大于或等于所述第一字节长度时,根据所述存储器20的可用码流首地址,从存储器20的可用码流中读取所述第一字节长度的码流并存储到第一緩存11中,在所述可用码流长度小于所述第一字节长度时,从存储器20中读取所述可用码流长度的码流并存储到第一緩存11中。第二更新子模块133,用于在填充子模块132读取码流后,更新所述可用码流首地址和所述可用码流长度。从存储器20中读取码流并存储到第一缓存11中的方法具体为读取存储器20中可用码流首地址的码流,并将所述码流存储到第一缓存11的空闲最低数据位,更新所述可用码流首地址,即将可用码流首地址加一,重复上述操作,直至读取完毕。上述操作中,总是将存储器20的低地址字节的码流读取到第一緩存11的空闲最低数据位,与平台字节存放的顺序无关,如图6所示为本发明实施例的从存储器中读取码流后,第一緩存中存储的码流与存储器中存储的码流的对应示意图。如图7所示为本发明实施例的解码方法流程示意图,具体包括以下步骤步骤701,根据从外部存储器读取的码流的编码规范,获取当前需要解码的语义项的比特长度,作为第一长度。所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述解码器将从所述存储器中读取的低地址字节码流存储在空闲最低数据位;所述外部存储器的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储。步骤702,获取当前緩存的数据的有效比特长度,作为第二长度。步骤703,将所述第一长度和所述第二长度中的较小值作为指定长度。步骤704,从緩存的数据中读取所述指定长度个最低数据位码流,并将所述读取的码流置于返回数值的空闲最低数据位。步骤705,将緩存的数据右移所述指定长度位。步骤706,判断所述返回值中码流的长度是否等于所述当前需要解码的语义项的长度,如果是,进入步骤709,否则进入步骤707。步骤707,从外部存储器中读取码流并进行緩存。当然,在需要从外部存储器读取码流时,也可以不4丸行上述步骤705,而是将从外部存储器中读取的码流覆盖原来缓存的数据。步骤708,更新第一长度和第二长度,返回步骤703。此时,更新后的第一长度等于原第一长度与原第二长度的差,更新后的第二长度为从外部存储器中读取的码流的长度。步骤709,将得到的返回值中的码流输出,并在输出后将返回值清零,所述返回值中存储的码流即当前需要解码的语义项。另外,上述步骤703之前还包括判断获取到的当前需要解码的语义项的比特长度(即第一长度)是否为零的步骤,当所述当前需要解码的语义项的比特长度等于零时,直接将返回值置零并输出;以及判断所述第二长度是否为零的步骤,在所述第二长度为零时,直接进入所述步骤707。上述步骤704中读取緩存的数据的方法可以为将緩存的数据的指定长度个最低数据位码流与特定数据进行与操作,所述特定数据的指定长度个最低数据位的比特为1,其他比特为0,所述与操作的结果即是需要读取的码流,所述指定长度为第一长度或第二长度。当然,也可以采用其他方法读取緩存的数据。上述步骤707的实现方法具体为判断所述存储器的可用码流长度是否大于第一字节长度,所述第一字节长度为所述解码器能够緩存的数据的最大长度;在所述可用码流长度大于或等于所述第一字节长度时,根据所述存储器的可用码流首地址,从所述存储器的可用码流中读取所述第一字节长度的码流并进行緩存,在所述可用码流长度小于所述第一字节长度时,从所述存储器中读取所述可用码流长度的码流并进行緩存;更新所述可用码流首地址和所述可用码流长度。以下以OggVorbis格式的码流为例,对本发明实施例的解码方法进行详细说明。解码器首先需要从外部存储器中读取码流,通常情况下,外部存储器是以数组的形式对码流进行存储,数组中的每一项存储一个字节的码流,其存储方式为按照码流的接收顺序,从低地址字节向高地址字节存储。解码器从存储器读取码流时,总是以字节为单位进行读取,并将存储器的低地址字节的码流存储在解码器的第一缓存的空闲最低数据位,因此,上述读取操作与平台字节存放的数据无关。另外,解码器从外部存储器读取码流的同时,还需要读取存储器的当前可用码流的首地址bufPointer以及可用码流的长度nBytes,随着码流的读取操作的进4亍,该将bufPointer不断才丸行加一的#喿作。以下为解码器从外部存储器读取码流的参考代码<formula>formulaseeoriginaldocumentpage16</formula>/*读取操作,将存储器的低地址字节的码流存储在解码器的第一緩存的空闲最低数据位*/if(nBytes>=4){bsi->iCachebsi->iCachebsi->iCachebsi->iCache(unsignedint)(*bsi->bytePtr++);=(((unsignedint)(*bsi->bytePtr++))《8)=(((unsignedint)(*bsi->bytePtr++))《16)=(((unsignedint)(*bsi->bytePtr++))《24)bsi->cachedBits=32;bsi->nBytes-=4;}else{intn=0;bsi->iCache=0;while(nBytes--){bsi->iCache|=((*bsi->bytePtr++)《(8*n》;++n;bsi->cachedBits=8*bsi->nBytes;bsi->nBytes=0;上述解码器中的第一緩存相当于一个寄存器,其可以对緩存的码流进行位操作,通常为4字节的长度,也可能为8字节的长度,或者其他字节的长度,本发明实施例中假设第一緩存为4字节的长度。OggVorbis码流中的语义项的长度通常情况下小于或等于32比特(即4字节)。本发明实施例的解码方法具体为获取当前需要解码的语义项的长度nBits(此处规定nBits小于或等于32比特);由于OggVorbis格式的编码规范中要求码流中可以包括0字节长度的语义项,因此,还需要判断nBits是否为零,当nBits等于零时,直接将返回值置零,当nBits不为零时,执行以下操作;获取第一缓存中存储的数据的有效长度cachedBits,并判断cachedBits是否为零,当cachedBits为零时,从外部存储器中读取新码流并存储到第一緩存中,当cachedBits不为零时,执行以下操作;上述从存储器中读取码流的方法具体为判断存储器的当前可用码流长度nBytes是否大于第一緩存的长度4;在nBytes大于或等于4时,根据所述存储器的可用码流首地址bufPointer,从所述存储器的可用码流中读取4字节的码流并存储到所述第一緩存中,在nBytes小于4时,从所述存储器中读取所述nBytes长度的码流并存储到所述第一緩存中;比较nBits和cachedBits的大小;在nBits小于或等于cachedBits时,利用逻辑位操作(与操作)读取第一緩存中的nBits个最低数据位,即将第一緩存中的nBits个最低数据位与特定数据MASK—TAB进行与操作,所述特定数据MASK—TAB的nBits个最低数据位的比特为1,其他比特为0,置于返回值data的nBits个最低数据位,并对第一緩存进行右移位操作,删除第一緩存中已被读取的nBits个比特位,将未被读取的低数据位,置于最低数据位,同时更新cachedBits,此时新的cachedBits等于nBits与原cachedBits的差;在nBits大于cachedBits时,即第一緩存中的可用码流的比特数不够,从第一緩存中取出所有剩余的cachedBits个可用比特,置于返回值data的cachedBits个最^f氐凄t据^f立,更新nBits为nBits2,nBits2为nBits与cachedBits的差,同时,对第一緩存进行右移位操作,将第一緩存中的所有比特删除,即cachedBits为零,则从存储器中读取新的码流,并更新cachedBits,当然,也可以不进行右移位操作,直接将读取的新的码流覆盖原数据;假设此时存储器中可用码流长度大于4字节,因此,从存储器中读取新的码流的长度为4字节(32比特);由于nBits小于或等于32,nBits2必然小于32,因此,只需利用逻辑位操作从第一緩存中读取nBits2个最低数据位即可完成语义项的读取,将读取的nBits2个码流置于返回值data的(cachedBits)~nBits-1号比特位,此时所述返回值data中存储的码流即时当前需要解码的语义项。上述过程的参考代码如下unsignedintGetBits(BitStreamInfo*bsi,intnBits)/*consttabletoextractfixedlengthbitsfromiCache*/StaticconstunsignedintMASK—TAB[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};/承retumdatainitialization*/unsignedintdata=Ojunsignedintmask=0;/*limitnBits*/nBits=MIN(nBits,32);nBits=MAX(nBits,O);mask=MASK—TAB[nBits];/*checkwhethernBitsiszero*/if(nBits==0)return0;if(bsi->cachedBits>=nBits)/*enoughreadablebitsiniCache*/"extractandupdate*/data=bsi->iCache&mask;bsi->iCache=nBits;/*unsignedtype,zero-extending*/bsi->cachedBits-=nBits;else{/*notenoughreadablebitsiniCache*//*extractallreadablebits*/intbit—num—read=bsi->cachedBits;mask=MASK—TAB[bit—num—read];data=bsi->iCache&mask;/*updatenBits*/nBits-=bit—num—read;mask=MASK—TAB[nBits];/*filliCachewithnewdata*/RefillBitstreamCache(bsi);/*appendingbits*/data=data|((bsi->iCache&mask)《bit—num_read);/*update*/bsi->iCache=nBits;bsi->cachedBits-=nBits;returndata;以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应^L为本发明的保护范围。20权利要求1.一种解码器,用于从外部存储器中读取码流并进行解码,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述存储器的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储,其特征在于,包括第一缓存,用于存储从所述存储器读取的码流,所述第一缓存的存储方式为将从所述存储器中读取的低地址字节码流存储在空闲最低数据位;处理模块,用于从所述第一缓存中读取指定长度个最低数据位码流并输出,并将所述第一缓存中的数据右移所述指定长度位,所述指定长度为第一长度和第二长度中较小的值,所述第一长度为当前需要解码的语义项的比特长度,所述第二长度为所述第一缓存中当前存储的数据的有效比特长度;读取模块,用于在所述第二长度为零时,从所述存储器的可用码流中读取码流并存储到所述第一缓存中;第一更新模块,用于在所述第一长度大于所述第二长度时,获取所述第一长度与所述第二长度的差作为新的第一长度,并发送给所述处理模块;第二更新模块,用于在所述第一缓存中的数据发生变化时,更新所述第二长度,并发送给所述处理模块;第二缓存,用于存储所述处理模块输出的码流,所述第二缓存的存储方式为将所述处理模块输出的码流存储在空闲最低数据位;输出模块,用于在所述第二缓存中存储的码流的长度等于所述当前需要解码的语义项的长度时,将所述第二缓存中的码流输出,并将所述第二缓存清零。2.根据权利要求1所述的解码器,其特征在于,所述处理模块进一步包括第一获取子模块,用于根据所述码流的编码规范,获取当前需要解码的语义项的比特长度,作为所述第一长度;第二获取子模块,用于获取所述第一緩存中当前存储的数据的有效比特长度,作为所述第二长度;比较子模块,用于比较所述第一长度和所述第二长度;读取子模块,用于将所述第一长度和所述第二长度中较小的数值作为指定长度,从所述第一緩存中读:f又所述指定长度个最低数据位码流并输出;第一更新子模块,用于在所述读取子模块输出码流后,将所述第一緩存中的数据右移所述指定长度位。3.根据权利要求2所述的解码器,其特征在于,所述第一获取子模块进一步包括第一判断单元,用于判断获取到的所述第一长度是否为零;置零单元,用于在所述第一长度为零时,控制所述第二緩存置零;第一发送单元,用于在所述第一长度不为零时,将所述第一长度发送给所述比较子模块。4.根据权利要求2所述的解码器,其特征在于,所述第二获取子模块进一步包括第二判断单元,用于判断获取到的所述第二长度是否为零;第一通知单元,用于在所述第二长度为零时,通知所述读取模块;第二发送单元,用于在所述第二长度不为零时,将所述第二长度发送给所述比较子模块。5.根据权利要求1所述的解码器,其特征在于,所述读取模块进一步包括判断子模块,用于在所述第二长度为零时,判断所述存储器的可用码流长度是否大于第一字节长度,所述第一字节长度为所述第一緩存能够存储的数据的最大长度;填充子模块,用于在所述可用码流长度大于或等于所述第一字节长度时,根据所述存储器的可用码流首地址,从所述存储器的可用码流中读取所述第一字节长度的码流并存储在所述第一緩存中,在所述可用码流长度小于所述第一字节长度时,从所述存储器中读取所述可用码流长度的码流并存储在所述第一緩存中;第二更新子模块,用于在所述填充子模块读取码流后,更新所述可用码流首地址和所述可用码流长度。6.根据权利要求1所述的解码器,其特征在于,所述码流为OggVorbis格式的码流。7.—种解码方法,包括从外部存储器中读取码流并进行解码的步骤,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入,所述存储器的存储方式为按照接收的顺序,将所述码流从低地址字节向高地址字节存储,其特征在于,包括以下步骤获取当前需要解码的语义项的比特长度,作为第一长度;获取当前緩存的数据的有效比特长度,作为第二长度;将所述第一长度和所述第二长度中的较小值作为指定长度;从緩存的数据中读取所述指定长度个最低数据位码流,并将所述码流置于返回数值的空闲最低数据位,将緩存的数据右移所述指定长度位;判断所述返回值中码流的长度是否等于所述当前需要解码的语义项的长度;在所述返回值中码流的长度等于所述当前需要解码的语义项的长度时,将所述返回值中的码流输出,并在输出后将所述返回值清零;在所述返回值中码流的长度不等于所述当前需要解码的语义项的长度时,从所述外部存储器中读取码流并进行緩存,更新所述第一长度和所述第二长度,并返回所述将所述第一长度和所述第二长度中的较小值作为指定长度的步骤。8.根据权利要求7所述的解码方法,其特征在于,所述获取当前緩存的数据的有效比特长度,作为第二长度之前还包括判断所述第一长度是否为零,在所述第一长度为零时,直接控制所述返回值置零的步骤。9.根据权利要求7所述的解码方法,其特征在于,所述将所述第一长度和所述第二长度中的较小值作为指定长度之前还包括判断所述第二长度是否为零,在所述第二长度为零时,从所述外部存储器中读取码流并进行緩存,更新所述第一长度和所述第二长度的步骤。10.根据权利要求7所述的解码方法,其特征在于,所述从所述外部存储器中读取码流并进行緩存的方法具体为判断所述存储器的可用码流长度是否大于第一字节长度,所述第一字节长度为所述解码器能够緩存的数据的最大长度;在所述可用码流长度大于或等于所述第一字节长度时,才艮据所述存储器的可用码流首地址,从所述存储器的可用码流中读取所述第一字节长度的码流并进行緩存,在所述可用码流长度小于所述第一字节长度时,从所述存储器中读取所述可用码流长度的码流并进行緩存;更新所述可用码流首地址和所述可用码流长度。11.根据权利要求7所述的解码方法,其特征在于,所述码流为OggVorbis格式的码流。全文摘要本发明提供一种解码器和解码方法,所述解码器用于从外部存储器中读取码流并进行解码,所述码流的封装格式为从目标字节的空闲最低数据位开始,将所述码流中的语义项的各比特从低位向高位依次写入,所述目标字节写满后,将所述语义项的剩余比特从下一个字节的最低数据位开始写入。本发明可快速有效的对上述格式的码流进行解码,且从存储器读取码流时,与平台字节存放的顺序无关。文档编号H03M7/30GK101340191SQ200810118000公开日2009年1月7日申请日期2008年8月19日优先权日2008年8月19日发明者王箫程,昊邓申请人:北京中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1