目录

  1. 编码流程和数据格式回顾

  2. 4 × 4亮度块的9中预测模式

  3. 16 × 16亮度块的4种预测模式

  4. 8 × 8 色度块的4种预测模式

  5. JM代码

一、编码流程和数据格式回顾

我们先看下下图来回顾下编码流程

一个编码图像通常划分一个或多个片,每个片又可以划分成若干宏块组成,一个宏块由一个 16×16 亮度像素、一个 8×8 Cb以及一个 8×8 Cr 彩色像素块组成,即常见的420采样格式,如下图: 

我们通过H264visa码流分析工具看下H264数据的第一帧数据,可以看到它是I帧,由一个个宏块组成,在帧内采用帧内预测的方式进行编码。

私信我,领取2022最新最全学习提升资料,内容包括(C/C++LinuxFFmpeg webRTC rtmp hls rtsp ffplay srs

 

 

 

也看到上面宏块的type有16x16也有4x4,这是什么意思?
再通过Elecard StreamEye 来查看发现更多信息。包括pmode、ipred Intra_4x4、 ipred chroma 都代表什么意思以及里面的值有什么什么意思呐?

在帧内预测模式中,预测块 P 是基于已编码重建块和当前块形成的。对亮度像素而言,P 块用于 4×4 子块或者 16×16 宏块的相关操作。
4×4 亮度子块有 9 种可选预测模式,独立预测每一个 4×4亮度子块,适用于带有大量细节的图像编码;
16×16 亮度块有 4 种预测模式,预测整个 16×16 亮度块,适用于平坦区域图像编码;
色度块也有 4 种预测模式,类似于 16×16 亮度块预测模式。编码器
通常选择使 P 块和编码块之间差异最小的预测模式。 

 

下面我们来看下其预测模式

二、4 × 4亮度块的9种预测模式

4x4预测块的像素使用小写字母a-p标示,预测块左侧和上方的参考像素使用大写字母A-M标示:

4x4亮度块有9种预测模式,分别如下

其中预测模式2 的所有样本预测值都等于A-D以及I-L的平均值。
其他8种模式的8个方向的预测示意图如下所示:

9种预测模式说明如下:
模式 说明
Mode0 (Vertical): 由上方的A、B、C、D进行垂直推算

Mode1 (Horizontal) : 由左侧的I、J、K、L进行水平推算

Mode2 (DC) : P中的所有样本预测值都等于AD及IL的平均值

Mode3 (Diagonal Down-Left): 由45度角方向的左下和右上的样本内插得出

Mode4 (Diagonal Down-Right): 以45度角往右下的方向进行推算

Mode5 (Vertical-Right) : 以垂直向下方向右偏大约26.6度角(即width/height = 1/2)的方向推行推算。

Mode6 (Horizontal-Down): 以水平向右方向下偏大约26.6度角的方向进行推算。

Mode7 (Vertical-Left): 以垂直向下方向左偏大约26.6度角的方向推行推算。

Mode8 (Horizontal-Up): 以水平向右方向上偏大约26.6度角的方向进行推算。

需要注意的是:

Mode 2的规则可以根据A-M中样本的可用情况进行修改,因为它求的是根据参考样本求的平均值,其他的模式可能在所有需求的参考样本都可用的时候才能采用。然后需要注意的是如果样本E、F、G和H是不可用的,样本D的值可以拷贝到这些位置从而标记这些样本为可用的。
对于Mode 3-8,预测样本的值是参考样本A-M的加权平均。假设选择了Mode 4,d的预测值 = round(B/4 + C/2 + D/4)。
引用自:https://www.jianshu.com/p/4d8692d53d8c?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends

 

三、16 × 16亮度块的4种预测模式

模式 说明
Mode0 (vertical): 由上方的样本(H)垂直推算
Mode1 (horizontal) 由左侧的样本(V)水平推算
Mode2 (DC): 上方的样本(H)和左侧的样本(V)的平均值
Mode3 (Plane): 根据上方的样本(H)和左边的样本(V)通过一个plane函数得出,在亮度平滑变化的区域工作得很好。

四、8 × 8 色度块的4种预测模式

色度的Cr和Cb分量的预测模式选择是一样的。
色度预测模式与16x16亮度预测模式的描述类似,除了模式的编号不一样。
DC (mode 0), horizontal (mode 1), vertical (mode 2), plane (mode 3).

看到这里我想对于文章开头我们通过码流分析工具H264visa以及Elecard StreamEye 查看宏块的一些问题应该有自己的答案了。

五、JM代码

这一小节我们结合JM源码来简单分析下帧内预测的实现
JM包括JM encoder和JM decoder, JM encoder是H.264标准的一个具体实现, JM decoder是对应的解码器.
JM encoder和 x264一样,都是H.264标准的实现, 但它严格按照H264的协议来进行实现,而x264 简化了JM的代价计算方法,去掉了一些代码,进行了估算等优化,编码速度上JM会很慢,不适用于生产环境,
查看其源码对于了解H264协议时很有帮助。
JM的源码下载地址:http://iphome.hhi.de/suehring/tml/download/old_jm/,可以选择一个版本进行下载查看

这个源码还没真正的看,先做个记录吧,根据需要进行学习。
具体可以参考雷神的文章 : 雷神-H.264官方软件JM源代码简单分析-编码器lencod

收获

通过本篇的学习实践

  1. 了解了帧内编码的方式以及在整个编码过程中起的作用

  2. 了解4x4亮度块的9种预测模式、16x16亮度块以及8x8色度块的预测方式

  3. 通过码流分析工具查看宏块信息,加深理解。