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

2023-11-06

帧内预测过程会以相邻块的像素值做参考,来预测当前块的像素值。以Intra_4x4为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值?
在这里插入图片描述
本文要主要说明如何获取帧内预测所用到的相邻像素。对应参考文档6.4.5-6.4.9小节内容。

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

  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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 时间戳问题汇总

    大家好 我刚接触流媒体不久 现在遇到一个非常奇怪的问题 向各位大侠请假 请你们指点 问题是这样的 用一个 VLC 流媒体客户端 去请求流媒体服务器上的数据 但是获得的数据播放速度明显快于1倍速 大概是 timestamp 不对 不知道是服务
  • h.264 视频无法在 iOS 上播放

    我有一个用 h 264 编码的视频文件无法在 iOS 上播放 我想知道原因 这是 HTML
  • 从 AVAssetWriter 读取实时 H.264 输出时数据损坏

    我正在使用一些技巧来尝试在将 AVAssetWriter 写入磁盘时读取其原始输出 当我通过连接各个文件来重新组装它们时 生成的文件与 AVAssetWriter 的输出文件的字节数完全相同 但是 重新组装的文件将无法在 QuickTime
  • MFT 编码器 (h264) CPU 利用率高

    我能够使用 Media Foundation Transform MFT 成功地通过 H264 对数据进行编码 但不幸的是我的 CPU 非常高 当我在程序中评论该函数的调用时 我的 CPU 很低 只需执行几个步骤即可获得编码 所以我无能为力
  • 通过 ICodecAPI 为 H.264 IMFSinkWriter 编码器设置属性

    我试图通过检索 ICodecAPI 接口来调整通过 ActivateObject 创建的 H 264 编码器的属性 虽然我没有收到错误 但我的设置没有被考虑在内 代码在 Windows 10 下运行 我复制用于创建 IMFSinkWrite
  • 如何设置 VTCompressionSession 的 MaxH264SliceBytes 属性

    iOS VTCompressionSession有一个属性是kVTCompressionPropertyKey MaxH264SliceBytes 但是 我无法设置kVTCompressionPropertyKey MaxH264Slice
  • 通过 MP4 进行直播

    我正在从事在线电视服务工作 目标之一是无需任何额外的浏览器插件 Flash 除外 即可播放视频 我决定使用 MP4 因为大多数 HTML5 浏览器和 Flash 作为后备 都支持它 这些视频由 FFMpeg 从服务器上的 ASF 进行转码
  • 将 FFMPEG 编码为 MPEG-DASH – 或使用关键帧簇的 WebM – 用于 MediaSource API

    我目前正在将视频流发送到 Chrome 以通过 MediaSource API 进行播放 据我了解 MediaSource 仅支持使用 MPEG DASH 编码的 MP4 文件 或具有以关键帧开头的簇的 WebM 文件 否则会引发错误 媒体
  • H264 中的 Elementary Stream 是什么意思

    我读了 Elementary Stream 的内容维基百科 http en wikipedia org wiki Elementary stream 我正在使用的工具 Live555 需要 H 264 视频基本流文件 因此 当从视频应用程序
  • ffmpeg 复制以保留时间戳

    我正在尝试修改 HLS 段传输流 并使用 ffmpeg 保留其开始时间 但是 即使提到了 copyts 输出也不会保留输入文件的 start time 值 这是我的命令行 ffmpeg i fileSequence1 ts i x png
  • 如何在没有 MediaExtractor 的情况下使用 MediaCodec 进行 H264

    我需要在没有 MediaExtractor 的情况下使用 MediaCodec 并且我正在使用 FileInputStream 读取文件 目前它不起作用 它在屏幕上显示绿色的乱码图像 这是整个源代码 FileInputStream in n
  • 解析 mdat MP4 中的 H264

    我有一个仅包含 MP4 容器中的 mdat 原子的文件 mdat中的数据包含AVC数据 我知道数据的编码参数 该格式似乎不是附件 B 字节流格式 我想知道我将如何解析这个 我尝试过搜索切片标题 但运气不佳 是否可以在没有 NAL 的情况下解
  • Gstreamer - Android 上的硬件加速视频解码

    我在 Android 手机上通过 RTP UDP 接收视频 但我发现 CPU 使用率非常高 几乎 100 的一个核心都用于解码视频 在高端设备上 视频播放几乎流畅 但在中低端设备上 我几乎每秒无法获得 1 帧 这是一个 H 264 视频流
  • 实现 HTML5 视频的最佳方式

    我知道 HTML5 视频比其支持者希望我们相信的要复杂得多 Safari 使用专有的 H 264 编解码器 而 Firefox Chrome 和 Opera 都支持开源 Theora Internet Explorer 两者都不支持 因此需
  • 我的视频没有关键帧,怎么可能?

    当我在视频上运行以下行时 它仅输出 P 帧和 B 帧 没有 I 帧 ffprobe select streams v show frames show entries frame pict type of csv 00000 MTS 视频怎
  • 使用 VLC imem 从内存播放 h264 视频文件但收到错误“主流错误:无法预填充缓冲区”

    我有一个加载到内存中的 h264 视频文件 我尝试使用参数 imem cat 4 使用 imem 播放它 以便 vlc 将使用访问模块来解复用视频 并且 vlc 启动并接收我的 imem参数成功 0x7f38a0000e28 access
  • 使用 libavcodec 的 mpegts 容器中的原始 H264 帧

    我非常感谢对以下问题的帮助 我有一个带摄像头的小工具 可以生成 H264 压缩视频帧 这些帧将发送到我的应用程序 这些帧不在容器中 只是原始数据 我想用ffmpeg和libav函数创建一个视频文件 方便以后使用 如果我解码帧 然后对其进行编
  • 有没有简单的方法来提取附件 b 格式的 h264 原始流?

    当我使用命令行使用 ffmpeg 提取视频流时 ffmpeg i 一些文件 vcodec copy an f rawvideo h264 什么 out h264 对于 Adob e Media Encoder 生成的某些媒体文件 只有 m4
  • 如何减少 MediaCodec 视频/avc 解码中的延迟

    我执行了一些简单的计时电影播放器 java https github com google grafika blob master src com android grafika MoviePlayer java in the Grafik
  • 如何减少 MediaCodec H264 编码器延迟

    我正在尝试使用 Android6 0 的 MediaCodec 将 h264 实时低延迟编码为流 编码器大约有 6 帧延迟 我想知道如何减少 代码来自屏幕记录 cpp https android googlesource com platf

随机推荐

  • VNC unable to connect via 127.0.0.1:1080

    VNC远程登录出现自己电脑拒绝的时候 请查看一下自己是否设了代理登录之类的操作 这里是WIN 10 登录远程一台WIN 10 服务器 跟服务器设置没有什么关系 主要由于本地配置导致的 解决方案 File里面选择属性 取消代理设置即可 折腾了
  • WebTransport 开播的应用实践之路

    动手点关注 干货不迷路 Web开播的业务挑战 无论是本地软件推流还是Web推流 都需要解决推流抖动 画面高糊 音频卡顿等问题 在现有的Web技术环境下 如何稳定地把高质量的音视频流呈现给更多用户 是我们技术团队攻克的重点 从技术角度来解读一
  • Hashtable和HashMap、ConcurrentHashMap 之间的区别

    Hashtable和HashMap的区别 HashMap和Hashtable都是哈希表数据结构 但是Hashtable是线程安全的 HashMap是线程不安全的 Hashtable实现线程安全就是简单的把关键方法都加上了synchroniz
  • 企业项目实战----CDN加速的实现

    前言 CDN加速对企业非常重要 体现在哪呢 举个例子 A企业的后端服务器在杭州 用户遍布全国 让全国的用户都去访问企业A在杭州的后端服务器你觉得可行吗 肯定不可行呀 第一 后端服务器承受不了全国这么巨大的访问量 第二 访问速度慢 要经过的陆
  • 提升职场价值,把握成长方向

    来自 IT人的职场进阶 同样的职场起点 为什么几年后大家差距很大 如果想快速升职加薪 有什么好方法吗 如何才能做到持续且快速的成长 这些疑惑都离不开一个本质问题 职场价值 因为企业用人的核心出发点是 你能否为企业创造价值 你的价值和薪酬职级
  • MSP430 EEPROM-24C512使用总结及代码说明

    MSP430 EEPROM 24C512使用总结及代码说明 https wenku baidu com view 61f407d6f705cc175527094b html
  • hooks中useMemo和useCallback详解

    要想学习useMemo必须要先知道React memo 这两者都有一定的优化作用 memo的作用 当数据变化时 代码会重新执行一遍 但是子组件数据没有变化也会执行 这个时候可以使用memo将子组件封装起来 让子组件的数据只在发生改变时才会执
  • sudo rosdep init ERROR: cannot download default sources list from:

    在sudo rosdep init时出现的错误ERROR cannot download default sources list from https raw githubusercontent com ros rosdistro mas
  • 安装一个虚拟服务器,一个云服务器可以装虚拟机么

    一个云服务器可以装虚拟机么 内容精选 换一换 虚拟IP地址用于为网卡提供第二个IP地址 同时支持与多个云服务器的网卡绑定 从而实现多个云服务器之间的高可用性 登录管理控制台 单击管理控制台左上角的 选择区域和项目 选择 计算 gt 云耀云服
  • WEB前端命名规范

    https www cnblogs com ysx215 p 7461777 html
  • 数组指针 行指针 列指针

    概念 我们把指向数组的指针叫做数组指针 后面还会学到指针数组 这两个是不一样的 根据中学语文偏正词组的知识可以知道 前者是指针 后者是数组 一般指针变量 int a 2 3 1 2 3 4 5 6 int P a 0 0 int p a 0
  • 短视频账号矩阵系统如何技术嵌入Chatgpt?

    将GPT Generative Pre trained Transformer 嵌入短视频账号矩阵系统需要以下步骤 1 获取GPT模型 可以自行训练或使用开源的预训练模型 如GPT 2 GPT 3等 2 导入GPT模型 将GPT模型导入到短
  • Metronic学习-1-替换google字体,让页面打开更流畅

    Metronic是一款强大的后台模板 包括很多组件 接触过很多后台模板 有Layui AdminLTE Inspinia hui 感觉Layui适合快速开发 Layui封闭性很强 对于前端不太熟悉的话 只能按模仿 如果需要深入学习 需要花费
  • Html-根据不同的分辨率设置不同的背景图片

    media only screen and min width 1024px 当分辨率width gt 1024px 时使用1 jpg作为背景图片 bg background url images 1 jpg no repeat media
  • Reactor模型与Proactor模型

    1 Reactor模型 1 1 什么是Reactor模式 它是基于IO多路复用与线程池 Reactor模式的核心组成部分包括Reactor和处理资源池 进程池或线程池 Reactor负责监听和分配事件 处理资源池负责处理事件 Reactor
  • 详解用 matplotlib 绘制动态条形图

    详解用 matplotlib 绘制动态条形图 端午安康 近日看到联合国网站提供的世界人口数据集 其中一个子数据集包含了各国 1950 2015年的人口数据 假日值班 有自由的时间 就基于这个数据集 用 matplotlib 实现了一个世界人
  • 无法打开文件“xxx.lib”错误的解决办法

    原因 pragma comment lib xxx lib 默认和引用的CPP文件在一个文件夹中 解决方法1 将xxx lib和调用pragma comment的源文件放在一个目录 注意是调用它的源文件 不是头文件 解决方法2 也可以在xx
  • UE4UE5 打包安卓报错总结UnrealBuildTool failed解决

    报错 Android armv7 gradle rungradle bat UnrealBuildTool failed 解决方法 1 替换gradle包 下载地址 http services gradle org distribution
  • 0.目标检测基础知识

    1 IOU交并比 1 交并比 import cv2 import numpy as np img np zeros 512 512 3 np uint8 此大小的黑色画布 img fill 255 画布填255 变成白色画布 RecA 50
  • H264/AVC-帧内预测相邻像素推导过程

    帧内预测过程会以相邻块的像素值做参考 来预测当前块的像素值 以Intra 4x4为例 如下图所示 需要用到的13个相邻像素值 那么如何获取这13个像素值 本文要主要说明如何获取帧内预测所用到的相邻像素 对应参考文档6 4 5 6 4 9小节