首页 > 其他分享 >H264/AVC-帧内预测相邻像素推导过程

H264/AVC-帧内预测相邻像素推导过程

时间:2024-05-06 16:22:05浏览次数:18  
标签:H264 mbAddrD 像素 相邻 当前 宏块 像素点 AVC

帧内预测过程会以相邻块的像素值做参考,来预测当前块的像素值。以Intra_4x4为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值?

本文要主要说明如何获取帧内预测所用到的相邻像素。

获取相邻像素的流程如下:

  1. 找到当前块(可以为4x4、8x8、16x16大小)的左、上、右上、左上相邻块
  2. 找到左、上、右上、左上相邻块所在宏块
  3. 根据当前宏块以及相邻块所在宏块确定相邻像素

在此之前需要先知道宏块地址是否可用,如果宏块地址不可用,则在该宏块的相邻像素也都不可用。

1.宏块地址可用性推导

宏块不可用主要有以下三种情况:

  1. mbAddr<0,此时该宏块不存在
  2. mbAddr>CurrMbAddr,也就是在当前解码宏块之后的宏块,显然后面的宏块还为解码,不可用做预测
  3. mbAddr和CurrMbAddr属于不同slice

2.相邻宏块地址及其可用性的推导

分为两种情况:

  1. MbaffFlag=0
  2. MBaffFlag=1

2.1 非MBAFF宏块(帧宏块或场宏块)

mbAddrA:表示当前宏块左侧宏块的地址和可用性状态。
mbAddrB:表示当前宏块上侧宏块的地址和可用性状态。
mbAddrC:表示当前宏块右上侧宏块的地址和可用性状态。
mbAddrD:表示当前宏块左上侧宏块的地址和可用性状态。
下图表示当前宏块和四个相邻宏块的空间位置

 

2.2 MBAFF宏块

对于MBAFF格式,是以宏块对方式成对出现,一个宏块对包含顶宏块和底宏块。
帧宏块对和场宏块对数据存放方式也有差异。
一个宏块对亮度分量有32行数据,如果当前宏块对为帧宏块,则顶帧宏块由1-16行数据组成,底帧宏块由17-32行数据组成;
如果当前宏块对为场宏块,则顶场宏块为奇数行数据组成,底场宏块为偶数行数据组成。

mbAddrA:表示当前宏块左侧宏块对中顶宏块的地址和可用性状态。
mbAddrB:表示当前宏块上侧宏块对中顶宏块的地址和可用性状态。
mbAddrC:表示当前宏块右上侧宏块对中顶宏块的地址和可用性状态。
mbAddrD:表示当前宏块左上侧宏块对中顶宏块的地址和可用性状态。
下图表示当前宏块和四个相邻宏块的空间位置,不管当前宏块是顶宏块还是底宏块,四个相邻宏块都是相同的。

3.相邻宏块、块的推导过程

帧内预测所用的块大小有三种情况(16x16、8x8、4x4)。
以8x8块为例,如下图所示,当前宏块分为4个8x8块。

idx=0的8x8块,左相邻块为mbAddrA中idx为1的8x8块,如果mbAddrA不可用,则左相邻块也不可用,
上相邻块为mbAddrB中idx为2的8x8块,
左上相邻块为mbAddrD中idx为3的8x8块。

idx=3的8x8块,左相邻块为当前宏块中idx为2的8x8块,
上相邻块为当前宏块中idx为1的8x8块,
左上相邻块为当前宏块中idx为0的8x8块。

 


因此,相邻块的推导过程,需要先找到相邻块所在宏块,确定宏块是否可用。

4.相邻像素推导过程

本过程的输入为相对于当前宏块左上角样点位置的亮度或色度位置(xN,yN)。
本过程的输出为:
mbAddrN:等于CurrMbAddr或等于包含(xN,yN)的相邻宏块的地址,及其可用性,
( xW, yW ):表示与宏块mbAddrN左上角的相对(不是相对于当前宏块左上角)位置(xN,yN)。

比如xN=-1,yN=-1,表示获取当前宏块左上角相邻像素,显然(xN,yN)像素所在宏块为左上角宏块mbAddrD,( xW, yW )=(15, 15).

相邻像素推导根据当前宏块是否为MBAFF分为两种情况。

4.1场和非MBAFF帧中相邻像素

MbaffFlag=0时,相对简单相邻像素的推导如下表所示。

4.2 MBAFF帧中相邻像素

MbaffFlag=1时,要根据当前宏块帧/场属性、顶/底场属性以及相邻块帧/场属性、顶/底场属性做不同的处理,相对复杂。
以xN=-1,yN=-1为例,也就是得到左上相邻像素。
其相邻像素可以由下表获得:


currMbFrameFlag,表示当前宏块是否为帧宏块
mbIsTopMbFlag,表示当前宏块为顶宏块还是底宏块
mbAddrX,表示相邻宏块对,还不能确定最终相邻宏块是使用顶宏块还是底宏块
mbAddrXFrameFlag,表示相邻宏块是否为帧宏块
mbAddrN,表示最终的相邻宏块

相邻像素推导可分为四个步骤:

  1. 根据currMbFrameFlag和mbIsTopMbFlag确定当前宏块左上角像素在帧图像中对应的像素点;
  2. 根据当前宏块的属性来确定相邻像素点;
  3. 确定相邻像素点所属宏块对mbAddrX;
  4. 根据相邻宏块对的属性mbAddrXFrameFlag来确定相邻像素点所属宏块mbAddrN;

根据当前宏块帧、场格式以及顶、底属性分四种情况分析
1.当 currMbFrameFlag = 1,mbIsTopMbFlag = 1,也就是当前宏块为帧宏块,并且为顶宏块

  1. 确定当前宏块左上角像素在帧图像中对应的像素点:
    currMbFrameFlag = 1,mbIsTopMbFlag = 1:当前宏块为顶帧宏块,其左上角像素的对应像素点为 c
  2. 根据当前宏块的属性来确定相邻像素点:
    因为当前宏块为顶帧宏块,所以 c 的左上角相邻像素点为 a
  3. 确定相邻像素点所属宏块对:
    因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此 mbAddrX = mbAddrD
  4. 根据相邻宏块对的属性来确定相邻像素点所属宏块:
    (1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1,所以mbAddrN = mbAddrD+1
    (2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像时(即进行隔行抽取后)属于宏块mbAddrD+1
    ,因此mbAddrN = mbAddrD+1

2. 当 currMbFrameFlag = 1,mbIsTopMbFlag = 0,也就是当前宏块为帧宏块,并且为底宏块

  1. 确定当前宏块左上角像素在帧图像中对应的像素点:
    currMbFrameFlag = 1,mbIsTopMbFlag = 0:当前宏块为低帧宏块,其左上角像素的对应像素点为 f
  2. 根据当前宏块的属性来确定相邻像素点:
    因为当前宏块为底帧宏块,所以 f 的左上角相邻像素点为 e
  3. 确定相邻像素点所属宏块对:
    因为宏块对是用顶宏块的地址表示,所以像素点 e 所属宏块对为 mbAddrA,因此表 6-4 中 mbAddrX = mbAddrA
  4. 根据相邻宏块对的属性来确定相邻像素点所属宏块:
    (1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 e 属于宏块 mbAddrA,因此mbAddrN = mbAddrA
    (2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 e 在图像的偶数行,属于底场宏块 mbAddrA+1,因此mbAddrN = mbAddrA+1

3.当 currMbFrameFlag = 0,mbIsTopMbFlag = 1,当前宏块为顶场宏块

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 1:当前宏块为顶场宏块,其左上角像素的对应像素点为 c
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为顶场宏块,所以 c 的左上角相邻像素点为 b
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 b 所属宏块对为 mbAddrD,因此 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 b 属于宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 b 在场图像奇数行,属于顶场宏块 mbAddrD,因此mbAddrN = mbAddrD

4.当 currMbFrameFlag = 0,mbIsTopMbFlag = 0,当前宏块为底场宏块

1、确定当前宏块左上角像素在帧图像中对应的像素点:
currMbFrameFlag = 0,mbIsTopMbFlag = 0:当前宏块为低场宏块,其左上角像素的对应像素点为 d
2、根据当前宏块对的属性来确定相邻像素点:
因为当前宏块为低场宏块,所以 d 的左上角相邻像素点为 a
3、确定相邻像素点所属宏块对:
因为宏块对是用顶宏块的地址表示,所以像素点 a 所属宏块对为 mbAddrD,因此表 6-4 中 mbAddrX = mbAddrD
4、根据相邻宏块对的属性来确定相邻像素点所属宏块:
无论 mbAddrX 是帧宏块对还是场宏块对(即无论mbAddrXFrameFlag 值为多少),像素点 a 都属于宏块 mbAddrD+1
(1)、如果 mbAddrX 是帧宏块对(即mbAddrXFrameFlag = 1),像素点 a 属于宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1
(2)、如果 mbAddrX 是场宏块对(即mbAddrXFrameFlag = 0),像素点 a 在场图像偶数行,属于底场宏块 mbAddrD+1,因此mbAddrN = mbAddrD+1

标签:H264,mbAddrD,像素,相邻,当前,宏块,像素点,AVC
From: https://www.cnblogs.com/lanlancky/p/18175242

相关文章

  • 关于设备像素比
    因为高dpi会把原本低dpi的图片或者canvas拉伸导致模糊,所以在定义的时候我们让画布和画布的内容(因为canvas和内容是两个东西)都放大,这样保证高清,个人理解,如有更好的想法可及时更改1.画布尺寸调整:首先,我们需要根据设备的DPI或像素比调整Canvas的物理尺寸。这意味着如果设备的DPI较高......
  • H264编码分析及隐写实践
    H264编码分析及隐写实践目录1视频数据层级2H264裸流3NALU4RBSP4.1指数哥伦布熵编码5NALU种类6实践6.1修改IDR帧类型6.2修改其他帧类型6.3重新封装6.4修复7总结8参考CTF竞赛中经常出现图片隐写,视频作为更高量级的信息载体,应当有更大的隐写空间......
  • H264编码分析及隐写实践
    H264编码分析及隐写实践目录1视频数据层级2H264裸流3NALU4RBSP4.1指数哥伦布熵编码5NALU种类6实践6.1修改IDR帧类型6.2修改其他帧类型6.3重新封装6.4修复7总结8参考CTF竞赛中经常出现图片隐写,视频作为更高量级的信息载体,应当有更大的隐写空间......
  • H264编码分析及隐写实践
    H264编码分析及隐写实践目录1视频数据层级2H264裸流3NALU4RBSP4.1指数哥伦布熵编码5NALU种类6实践6.1修改IDR帧类型6.2修改其他帧类型6.3重新封装6.4修复7总结8参考CTF竞赛中经常出现图片隐写,视频作为更高量级的信息载体,应当有更大的隐写空间......
  • Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集
    一、前言用ffmpeg采集本地摄像头,如果不指定格式的话,默认小分辨率比如640x480使用rawvideo格式,大分辨率比如1280x720使用mjpeg格式,当然前提是这个摄像头设备要支持这些格式。目前市面上有一些厂家做的本地设备支持264格式,这个压缩率极高,由于采集到的就是264格式的裸流,所以不用编码......
  • 如何将图片上的像素坐标(u, v)投影到世界坐标系中
    如何将图片上的像素坐标(u,v)投影到世界坐标系中,即得到\((x_w,y_w,z_w)\).数学表达如下\[\begin{align*}s\begin{bmatrix}u\\v\\1\end{bmatrix}&=\begin{bmatrix}f_x&0&c_x&0\\0&f_y&c_y&0\\0&0&1&0\end......
  • 一个非常实用的H264视频解码器开源项目
    一个非常实用的H264视频解码器开源项目音视频开发技术 ​关注他 29人赞同了该文章一、前言:为了弄清楚H264整个解码流程,为此我专门按照H264标准文档《T-REC-H.264-201704-S!!PDF-E.pdf》,用C++实现了一个H264裸码流视频解码器,代码工程地址为:h......
  • 使用OpenCV来实现读取一个目录下的所有图像,然后将它们调整大小为1920x1080像素,并保存
    使用OpenCV来实现读取一个目录下的所有图像,然后将它们调整大小为1920x1080像素,并保存的步骤如下:安装OpenCV库:如果你还没有安装OpenCV库,可以通过pip安装:pipinstallopencv-python编写Python脚本:importosimportcv2defresize_images_in_directory(source_dir,target......
  • 像素画——色彩基础
    目录色调(Hue)饱和度(Saturation)亮度(Value)alpha通道,取值(0-255)色温色彩设计例子1,色调(Hue)是用来描述颜色本身。红,黄,蓝HSV颜色模型从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°////2.饱和度(Saturation)饱和度的取值是0%-100%,饱和度越高......
  • 像素画——绘制基础步骤
    步骤线条轮廓色彩明暗关系抗锯齿(AA)减噪成果1.线条轮廓要先画出物体的轮廓,我们再进行颜色的区分,(色块)若是想将物品画的比较的直的话。要把。斜边的的顶点部分点上。反之亦然:比如正方形,去掉最周边的顶点,会显得他比较的圆润。2.颜色选择是处于递进关系。请新手我们合理......