在AAC编码器内部,使用huffman coding用于进一步减少scalefactor和量化频谱系数的冗余。

从individual_channel_stream层提取码流进行huffman解码,码流信息包括解码量化频谱数据部分(global_gain,section_data(),section_scalefactor(),spectra_data())和解码脉冲数据部分(pulse_data_present, pulse_data())。

global_gain编码成一个8位的无符号整数,第一个scalefactor与global_gain进行差分编码后再使用scalfactor codebook进行huffman编码。后续的各scalefactor都与前一个scalfactor进行差分编码。

量化频谱系数来自码流中spectral_data()。AAC的huffman编码算法对量化频谱系数有两步分组处理.如上所述,第一步分组是分出scalefactor band中的量化频谱系数个数是4的倍数.目的是进行4个量化频谱系数一起编码.第二步分割是标准中把1个或几个scalefactor band合并成一个section.同一个section内的所有scalefactor band的谱线使用同一个huffman码表.所以,如果要进行huffman解码,section的宽度信息和码本号作为side information附加在section data中传输.解码端要先解出这些信息才能进行huffman解码.而section的长度小于scalefactor band的个数而大于scalefactor windows band的个数. 为了最大限度的匹配量化谱线的统计特性,Huffman为了使量化频谱系数的统计特性最大化的匹配huffman码本,section的数量允许和scalefactor band的数量一样大. Section个数的最大值是max_sfb.但注意section的边界要与scalefactor band的边界重合. 用huffman编码的4个一组的量化频谱系数和2个一组量化频谱系数的传送顺序是从低频系数到高频系数. 对于每个frame有多个windows的情况,要注意有分组和交织情况,系数的集合需要解交织,

量化频谱系数存储在数组x_quant[g][win][sfb][bin]。

对于4个一组的量化频谱系数(w,x,y,z):

x_quant[g][win][sfb][bin]=w;

x_quant[g][win][sfb][bin + 1]=x;

x_quant[g][win][sfb][bin + 2]=y

x_quant[g][win][sfb][bin + 3]=z;

AAC的huffman解码一共有15个码本(codebook),除了一个码本专用于scalefactor解码.11个码本用于量化频谱系数的解码.1个码本表示传输的系数全位零,是0码本,不需解码.2个码本是intensity码本,也是0码本.在为量化频谱系数解码的11个码本中,每个码本有自己可以编码的最大量化量化频谱系数的绝对值,用LAV表示. 用于量化频谱系数的解码的11个码本中最后一个码本可以解码出谱线系数的最大值是16.但当解码出谱线系数的值大于0小于16的时候.解码出的值就是实际的量化频谱系数的绝对值,当解码锄地谱线系数是16时,表示退出huffman解码,使用其他方式解码.所以在该码本中解码出的值16被定义成ESC_FLAG.unsigned_cb[i]标志位表示该码本是有符号码本还是无符号码本,unsigned_cb[i]=0时表示该码本是有符号码本, unsigned_cb[i]=1时表示该码本是无符号码本.解码有符号数时,先按照无符号解码再从输入的解码比特流中提取符号位,若解码出的量化频谱系数非零,则其符号位紧跟在被该量化频谱系数的码字(codeword)的后面。

Codebook Number,i:码本的索引,即码流中sect_cb值。

unsigned_cb[i]:表示码本i是有符号码本还是无符号码本。

Dimension of Codebook:即4个一组量化频谱系数还是2个一组。

Table A.1~12为huffman codebook,下面只给出TableA.2示例:(length为codeword的bit数)

Huffman解码就是从spectral_data中读出huffman codeword,然后在对应的huffman codebook中查找出codeword所对应的index,根据index计算出4/2个量化频谱系数。每个量化频谱系数对应一个频率,最后通过量化频谱数据查找出对应的频率,最终乘以scalefactor得到真正的频率数据。

index到4个量化频谱系数的计算方法如下:

如果huffman codebook是unsigned的,那么需要huffman解码完成index到量化频谱系数的映射后,根据spectral_data()查找到codeword的紧接着的0~2个bit,来加上符号。

例如,hcod[7][y][z]表示第7个codebook的频谱系数(y,z)对应的codeword

紧接着的为0~2bits为pair_sign_bits,

那完成index到(y,z)的映射后,做如下处理:

huffman 解码流程图如下:

参考:

http://www.cnblogs.com/gaozehua/archive/2012/05/15/2500864.html

;

AAC huffman decoding的更多相关文章

  1. AAC Joint coding

    1. M/S stereo M/S stereo 作用于channel pair. channel pair对于listener来说通常具有对称性,即第一个channel和第二个channel相似性较 ...

  2. FFmpeg 2.1 发布

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它包括了目前领先的音/视频编码库 libavcodec. FFmpeg是在Linux下开发出来的,但它可以在包括W ...

  3. FFmpeg 2.1 试用(新版支持HEVC,VP9)

    前两天帮一位老师转码图像的时候,无意间发现新版FFmpeg竟然支持了下一代编码标准HEVC,以及Google提出的下一代编码标准VP9.真心没想到FFmpeg对下一代的编码标准支持的是如此之快.我还以 ...

  4. CUDA JPEG编码

    基于英伟达的jpegNPP工程,分离实现独立的JPEG压缩. 由于原工程是直接把解码时的jpeg图片的信息直接作为编码时的信息,所以在做独立的JPEG编码时,需要自己来填充各种信息. 1.JPEG编码 ...

  5. 手把手实现andriod应用增量升级

    近期研究了android应用增量升级的应用.当中用到了android NDK编程,先说下为什么要使用增量升级.当我们的应用达到一定大小的时候,比方眼下有30M.假设新版本号35M仅仅是添加了几个功能, ...

  6. NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库

    NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...

  7. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...

  8. (转) 解密H264、AAC硬件解码的关键扩展数据处理

    出自:http://blog.itpub.net/30168498/viewspace-1576794/       通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...

  9. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

随机推荐

  1. MySQL之分库分表

    MySQL之分库分表(MyCAT实现)   分库分表介绍 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用.每个应用都有独立的数据库. 数据的切分分为两种: ...

  2. BZOJ1040: [ZJOI2008]骑士 树套环DP

    题意:一个图n个点n条边保证点能互相到达,ab有边意味着ab互相厌恶,求一个集合,使得集合里元素最多而且没有人互相厌恶 删去环上一条边树形dp,比如删掉的边连着a,b,那么先dp出不选a的最大值,再d ...

  3. Spring Batch 批处理原则与建议

    Spring Batch 批处理原则与建议 当我们构建一个批处理的过程时,必须注意以下原则: 通常情况下,批处理的过程对系统和架构的设计要够要求比较高,因此尽可能的使用通用架构来处理批量数据处理,降低 ...

  4. python3包、模块、类、方法的认识

    包>>模块>>类>> 函数 包:就是一个目录,import time from+import导入包中的部分模块 直接到类 from budaoguan.common ...

  5. 1级搭建类111-Oracle 19c SI FS(Windows Server 2019)公开

    Oracle 19c 单实例文件系统在Windows Server 2019上的安装 在线查看

  6. Oracle 12c 如何在 PDB 中添加 SCOTT 模式(手工方式)

    Oracle 12c 建库后,没有 scott 模式,本篇使用手工脚本方式,在12c版本中创建 scott 模式及相关表. 目录 1. PDB中创建用户 2. PDB中用户授权 3. PDB中创建表空 ...

  7. jQuery---scrollTop和scrollLeft的方法

    scrollTop和scrollLeft的方法 <script src="jquery-1.12.4.js"></script> <script> ...

  8. MySql快速入门(四)

    在之前我们对MySql已经有了基本的了解,接下来我们就来接触MySql的分库分表,请往下阅读: 分库分表之MyCat实现 分库分表介绍: 随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为 ...

  9. mybatis - 基于拦截器修改执行语句中的ResultMap映射关系

    拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...

  10. 已经安装了 AccessDatabaseEngine.exe,还是报错

    标题: SQL Server 导入和导出向导 ------------------------------ 操作无法完成. ------------------------------ 其他信息: 未 ...