随笔分类 -  H.264

摘要:在进行h264解码过程中,有两个最重要的结构体,分别为H264Picture、H264SliceContext。 H264Picture H264Picture用于维护一帧图像以及与该图像相关的语法元素。其中占用大片内存的结构体成员有以下几个:typedef struct H264Picture { AVFrame *f; int8_t *qscale_table; ... 阅读全文
posted @ 2019-01-24 05:24 TaigaComplex 阅读(3142) 评论(2) 推荐(0) 编辑
摘要:ffmpeg中的并行解码分为两种: Frame-level Parallelism Slice-level Parallelism Frame-level Parallelism 帧间依赖 我们之前讨论过Frame-level Parallelism。在之前的文章中,我们说过在进行帧级的并行处理时, 阅读全文
posted @ 2019-01-04 15:54 TaigaComplex 阅读(7843) 评论(1) 推荐(5) 编辑
摘要:在之前的一篇文章CABAC中我们已经对算法中的大部分细节部分做了详细分析,这里做一个总结与拾遗。 总结 CABAC的编码可以分为以下四个部分: 上下文变量的初始化 待编码语法元素二值化 上下文建模(确定上下文索引) 算术编码 本文的主要目的就是阐明CABAC是如何把这四个部分串联起来的。 在编码一个 阅读全文
posted @ 2017-06-15 15:57 TaigaComplex 阅读(6479) 评论(1) 推荐(0) 编辑
摘要:在前面讨论并行解码的章节中,我们专注于讨论解码的宏块重建部分,甚至把宏块重建描述成宏块解码,这是因为在解码工作中,宏块重建确实占了相当大的比重,不过解码还包含其它的部分,按照解码流程可粗略分为: 在以前的并行解码文章,我们主要讨论了宏块重建的并行算法,得知采用不同的算法,会产生不同的并行度。在不考虑 阅读全文
posted @ 2017-04-04 00:07 TaigaComplex 阅读(1829) 评论(1) 推荐(1) 编辑
摘要:3D-Wave算法是2D-Wave的扩展。3D-Wave相对于只在帧内并行的2D-Wave来说,多了帧间并行,不用等待前一帧完成解码后才开始下一帧的解码,而是只要宏块的帧间参考部分以及帧内依赖宏块解码完毕即可开始当前宏块的解码。由于帧间参考所用的运动向量是动态的值,因此称此算法为Dynamic 3D 阅读全文
posted @ 2016-09-30 23:19 TaigaComplex 阅读(924) 评论(0) 推荐(0) 编辑
摘要:cache-coherent shared-memory system 我们最平常使用的很多x86、arm芯片都属于多核共享内存系统,这种系统表现为多个核心能直接对同一内存进行读写访问。尽管内存的存取速度已经非常快,但是仍然不足以与CPU的处理速度相比,因此为了提高CPU的利用率,一般会在芯片的每个 阅读全文
posted @ 2016-09-18 19:37 TaigaComplex 阅读(828) 评论(0) 推荐(0) 编辑
摘要:在《Scalable Parallel Programming Applied to H.264/AVC Decoding》书中,作者基于双芯片18核的Cell BE系统实现了2D-Wave并行解码算法。 Cell BE架构 首先来了解一下Cell BE。Cell BE全称为Cell Broadba 阅读全文
posted @ 2016-08-11 01:40 TaigaComplex 阅读(1207) 评论(0) 推荐(1) 编辑
摘要:块效应及其产生原因 我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact)。 首先我们需要搞清楚块效应产生的原因。h.264在编码过程中对像素残差进行了DCT变换,变换后得到的DCT系数是与 阅读全文
posted @ 2016-05-17 00:41 TaigaComplex 阅读(11536) 评论(0) 推荐(2) 编辑
摘要:并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-level Decomposition 在h.264解码时进行功能划分,例如对于四核系统,各个核心分别执 阅读全文
posted @ 2016-04-27 19:13 TaigaComplex 阅读(4804) 评论(2) 推荐(6) 编辑
摘要:h.264标准中,CABAC的算术编码部分(9.3.4)只是一个参考,实际编码器中并不一定会按照它来实现,像JM中就有自己的算术编码实现方案。 在上篇文章CABAC中有详细的算术编码描述,在了解算术编码原理的基础上,下面分析JM18.6中的算术编码实现。 下图是JM方案编码的一个例子 结合上图的例子 阅读全文
posted @ 2016-03-25 04:21 TaigaComplex 阅读(2984) 评论(4) 推荐(0) 编辑
摘要:CABAC(Context-based Adaptive Binary Arithmetic Coding),基于上下文的自适应二进制算术编码。CABAC是H.264/AVC标准中两种熵编码中的一种,它的编码核心算法就是算术编码(Arithmetic Coding)。 算术编码 传统编码算法 算术编 阅读全文
posted @ 2016-03-22 04:13 TaigaComplex 阅读(14831) 评论(8) 推荐(4) 编辑
摘要:在H.264标准中,CAVLC(Context-based Adaptive Variable Length Coding)被用于亮度和色度残差数据编码。在标准的码流结构中,CAVLC编码方式描述为ce(v)。如果在编码时采用CAVLC,那么尽管在DCT时是以8x8块为单位进行的,在进行CAVLC时 阅读全文
posted @ 2016-03-08 17:59 TaigaComplex 阅读(5104) 评论(4) 推荐(2) 编辑
摘要:宏块在经过变换、量化后,得到大小为4x4或者8x8的矩阵,矩阵中的数据被称为transform coefficient levels。这些level在后面会被用于熵编码,因此我们需要把矩阵按照一定顺序进行扫描,得到数字序列。 扫描顺序在帧与场会有所不同 4x4块矩阵的扫描顺序如下 Zig-zag s 阅读全文
posted @ 2016-03-05 16:38 TaigaComplex 阅读(2006) 评论(0) 推荐(0) 编辑
摘要:宏块类型mb_type 宏块类型表示的是宏块不同的分割和编码方式,在h.264的语法结构中,宏块类型在宏块层(macroblock_layer)中用mb_type表示(请参考h.264语法结构分析中的macroblock_layer)。而mb_type是与当前宏块所在的slice相关的,相同数值的m 阅读全文
posted @ 2016-02-29 23:36 TaigaComplex 阅读(7584) 评论(2) 推荐(0) 编辑
摘要:NAL Unit Stream Network Abstraction Layer,简称NAL。 h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stream)。而NAL单元流,就是NAL单元组成的。 标准的Annex B规定了NAL单元组成NAL单元流 阅读全文
posted @ 2016-02-24 23:01 TaigaComplex 阅读(18201) 评论(7) 推荐(5) 编辑
摘要:在做B帧的运动预测时,有两组参考图像列表(refList0, refList1),需要进行分别前向预测、后向预测。传统的预测方式是: 对refList0进行前向预测,得到最佳前向ref与mv。 对refList1进行后向预测,得到最佳后向ref与mv。 对比三组ref与mv(前向、后向、前向+后向) 阅读全文
posted @ 2015-05-17 20:58 TaigaComplex 阅读(1390) 评论(0) 推荐(0) 编辑
摘要:Mode Decision(模式选择)决定一个宏块以何种类型进行分割。宏块的分割类型有以下几种: //P_Skip and B_Skip means that nothing need to be encoded for this macroblock , // just use the mv pr 阅读全文
posted @ 2015-04-26 19:20 TaigaComplex 阅读(2366) 评论(0) 推荐(0) 编辑
摘要:如上一篇Quantization所说,可以在编码端通过设置offset来调整量化后的值,从而趋向于期望的量化值,而且在逆量化公式可以看出offset值在逆量化的时候是不会用到的。 目前来说,确定offset的算法有三种:static offset、around offset、trellis offs 阅读全文
posted @ 2015-04-06 01:13 TaigaComplex 阅读(2030) 评论(0) 推荐(0) 编辑
摘要:H.264 Quantizer 一般的量化器,可用下面的公式来表示: $Z=\pm \left \lfloor\frac{ \left | W \right | }{\bigtriangleup }\right \rfloor$ 反量化可表示为: $W' = \bigtriangleup \cdot 阅读全文
posted @ 2015-02-02 01:59 TaigaComplex 阅读(4786) 评论(0) 推荐(0) 编辑
摘要:变换是视频、图像编码的核心部分。目前所采用的变换算法都是从傅里叶变换演变而来。单纯的变换并不会导致视频(图像)的码率变小,反而会增大。但是非常巧妙的一点是:变换把图像从空域转换成的时域,把由色块组成的图像变为由基准色调与图像细节组成;低频代表图片的基准色调,高频代表图像细节,类比电路中的基频与谐波。 阅读全文
posted @ 2015-01-13 01:29 TaigaComplex 阅读(3351) 评论(2) 推荐(2) 编辑