文档章节

H264的CAVLC探秘

ljb_iss
 ljb_iss
发布于 2013/09/24 17:34
字数 996
阅读 197
收藏 1

CAVLC的算法搜索出来的资料比较多,但是怎么理解这个CAVLC呢。

CAVLC=CA+VLC

VLC(Variable-Length Code) 变长编码

想想霍夫曼编码吧。还不明白,google下吧。

CA (Context Adaptivie) 上下文自适应

上下文-就是利用图像的空间冗余性,上边和左边的4x4块残差和当前快的是具有相关性。

那具体怎么设计这个编码算法,我们还是通过历史来学习吧。

H.261

使用的是RUN-LEVEL编码,也就是把残差数据按照0...n分段,0...代表多个0,n是1个非零的数字。

RUN是连续零的个数,LEVEL是n的数值,每个(RUN,LEVEL)作为一个符号按照哈夫曼编码来编码,来保证概率小的分段编码最小。

假设有一个4*4数据块
{
0, 3, -1, 0,
0, -1, 1, 0,
1, 0, 0, 0,
0, 0, 0, 0
}

数据重排列:0301-1-1010

那就分为(1,3)(1,1)(0,1)(0,1)(0,1)(1,1)EOB(End Of Block)这几个分段,查码表

(1,3)等于0010 0101 1

......

EOB等于01 PS:这个是最短的码字哦。


H263

采用的3D VLC 编码方式,把 (last, run, level) 作为一个符号来进行编码,

last=1表示最后非零的参数,这样就不许要EOB这个符号了。

这个也很好理解。因为EOB这个符号采用了最短的码字,但是EOB的概率并没有是最大。

看码表也可以看到同样的RUN-LEVEL下last=1的码字比last=0的长。


H264

开始采用的是UVLC, 针对之前使用H.263采用不同码表统一了码表。

但是缺点就是没有利用上下文的相关性。所以后面改成了CAVLC,在JVT-C028 会议论文中可以看到

这个提案的综述

CVLC is a method of coding transform coefficients. It replaces the UVLC coding of transform coefficients (Tcoeff) for luma as well as chroma. All other elements are identical to the description of UVLC coding.

The motivation for using CVLC can be summarized in the following way:

  • Highly context adaptive coding result in very good coding efficiency over the whole quality range of the standard.

  • Zig-zag scanning is still used. Separation of the coding of Run and Level allows for better adaptivity and thereby better coding efficiency.

  • Separation of Run and Level also result in low complexity with low demand on memory.

The following coding elements are used to replace the Tcoeff elements of the UVLC coding method:

    1. If there are non-zero coefficients, it is typically observed that there is a string of coefficients at the highest frequencies that are +-1. Hence, a common parameter Num-Trail is used that contains the number of coefficients as well as the number of "Trailing 1s" (from now referred to as T1s). For T1s only the sign has to be coded.

    2. For coefficients other than the T1s, Level information is coded. Since this is a one dimensional parameter, coding is simplified and well structured VLCs are used.

    3. Lastly, the Run information is coded. Since the number of coefficients is already known, this sets a limit to the Run, which is used for additional compression. Run is split into Total-run for all coefficients and Run before each non-zero coefficient.

Zig-zag scanning is used, but in the transmission of coefficient data, both levels and runs, the scanning is done in reverse order. Therefore, in the Level information, the signs of T1s appear first (in reverse order), then the Level information of the last coefficient where this is needed, and so on. Run information is coded similarly. First Total number of zeros in Runs is coded, followed by Run before the last nonzero coefficient, and so on.

大概意思讲的就是

CAVLC利用了上下文适配提高了编码效率,分离RUN和LEVEL的编码可以更好的适配上下文,而且可以降低计算复杂度和内存需求。

然后介绍了新引入的几个概念,Num-Trail 非零系数 ,Trailing 1s拖尾系数 ,

这样编码需要编码的元素就有,非零系数,拖尾系数,拖尾系数的符号,每个非零系数-拖尾系数的Level,Run分为总0个数和每个0的run都要编码。

到此,大体CAVLC的来历就清楚了,如果不是想改进这个编码算法,只是为了满足好奇,那到此也就够了。

如果想在这上面有创新,那就需要每一步都仔细研究和计算了。祝各位好运。


© 著作权归作者所有

ljb_iss
粉丝 10
博文 8
码字总数 8099
作品 0
武汉
技术主管
私信 提问
x264源代码简单分析:熵编码(Entropy Encoding)部分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leixiaohua1020/article/details/45944811 ===================================================== H.264源代......

雷霄骅
2015/05/24
0
0
iOS H264,H265视频编码(Video encode)

本例需求:使用H264, H265实现视频数据的编码并录制开始200帧存为文件. 原理:比如做直播功能,需要将客户端的视频数据传给服务器,如果分辨率过大如2K,4K则传输压力太大,所以需要对视频数据...

__小___东邪___
2017/11/11
0
0
H.264 Profile、Level、Encoder三张简图

H.264有四种画质级别,分别是BP、EP、MP、HP:   1、BP-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;   2、EP-Extended profile:进阶画质。支持I/P/B...

张旭0512
2014/07/02
154
0
iOS视频编码实战VideoToolbox

需求 iOS中编码视频数据,一般情况而言一个项目仅需要一个编码器,不过有时特殊需求可能需要两个编码器同时工作.本例中实现了编码器类.仅通过指定不同编码器的枚举值就可以快速生成需要的编码器...

小东邪啊
05/26
0
0
视频解码器--x264

x264是一个基于h.264/AVC的免费开源的视频解码器,该版本为win32平台下的VFW codec版。 Encoder features 8x8 and 4x4 adaptive spatial transform Adaptive B-frame placement B-frames as......

匿名
2008/11/12
12.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

会用python把linux命令写一遍的人,进大厂有多容易?

看过这篇《2000字谏言,给那些想学Python的人,建议收藏后细看!》的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令。 文章中我就提到如何提升自己的 python 能力...

上海小胖
10分钟前
1
0
HashMap的特性

一、hashmap数据结构:哈希表结构:数组+链表 hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数, int hash = hash(key.hashCode...

GGbird
10分钟前
2
0
第五章 spring-connet之Imports注解来龙去脉

前言 imports是一个在spring体系里非常重要的注解,基本每个Enable开头的注解必然有一个import注解。接下来我们深入研究下import的作用。看小节的同学建议先取看PostProcessorRegistrationDe...

鸟菜啊
14分钟前
1
0
CentOS部署Harbor镜像仓库

关于Harbor Harbor是用于存储和分发Docker镜像的镜像仓库服务,相比Docker Registry,Harbor在安全、标识、管理等方面做了增强,更适合企业使用; 官方网站:https://goharbor.io/ 官方开源:...

程序员欣宸
18分钟前
1
0
JavaScript调试必会的8个console方法

每个JavaScript开发者都用过console.log()来调试程序,但实际上Console对象还提供了很多其他方法可以提高调试效率。本文将介绍8个有趣的Console方法,即使JavaScript老手也不一定知道! 1、c...

汇智网教程
40分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部