H.264 入门篇 - 07 (帧间预测 - 解码图像缓存 DPB)

2023-11-11

目录

1、DPB 的概念

2、DPB 最大深度

3、DPB 的行为

3.1、清空机制

3.2、内存分配过大

3.3、内存分配不足


前置文章:

VideoCodec 入门篇 - 00 (编解码简介)

H.264 入门篇 - 00 (简介)

H.264 入门篇 - 01 (Bitstream)

H.264 入门篇 - 02 (帧内预测相邻像素推导)

H.264 入门篇 - 03 (宏块类型)

H.264 入门篇 - 04 (B_Skip、P_Skip 、B_Direct宏块)

1、DPB 的概念

DPB 全称 decoded picture buffer,即解码图片缓存区。

在做视频解码时,需要将最近的若干幅参考帧缓存起来,这个缓冲区就叫做 DPB。解码已经完成的图像被缓存在 DPB 中,供后续帧用作参考图像,因此,解码器需要按照一定的规则对DPB中的图像进行管理。

DPB中的每一个图像必须处于三种状态中的一种

  • Unused for reference:不作为参考帧;
  • Used for short-term reference:短期参考帧;
  • Used for long-term reference:长期参考帧;

这3种状态之间的转化,是通过解码图像标记过程进行控制的:H.264/AVC 中采用了滑动窗MMCO两种方式。

滑动窗:是以 DPB 可以存放的帧数为窗口,随着当前解码的图像,以先入先出的方式,将新的解码图像移入,将超出窗口的解码图像移出。因此,DPB 中保存的是最近解码的多个图像。

MMCO:是编码器在码流中传输控制命令,通知解码器对 DPB 中的图像进行状态标记。它支持将一个“Used for reference”标记为“Unused for reference”,也可以将当前帧或者“Used for short-term referene”的帧标记为“Used for long-term reference”等。

DPB 一般以宏块数为单位,计算公式为:

DpbInMbs = ref * PicWidthInMbs * FrameHeightInMbs

  • ref(参考帧数)
  • PicWidthInMbs(水平宏块数)
  • FrameHeightInMbs(垂直宏块数)

2、DPB 最大深度

H.264协议规定,在不同的级别(Level)下,最大的解码图片缓存区宏块数(MaxDpbMbs)是不同的:

我们可根据 MaxDpbMbs约束 倒推出最大的参考帧数

max_ref = min(floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)

注1:floor(x)是向底舍入函数,返回的是小于等于x的最大整数。

注2:因参考帧数(ref)最大只能为16。

所以最大存储帧数也是最大参考帧数(ref)。

在 SPS 中,max_num_ref_frames 说明了DPB的大小。

3、DPB 的行为

3.1、清空机制

当解码器收到一个IDR帧时会立即将DPB清空,因为H.264协议规定一个IDR帧之后的任何帧都不会引用该IDR之前的任何帧,所以DPB中的数据已失效,可以清空。这也是IDR帧名称的来源,即 Instantaneous Decoding Refresh – 解码立即重置。

3.2、内存分配过大

H.264 bitstream 语法结构(SPS)中定义了一个参数用于通知解码器最大参考帧数。有些不合理的编码器会随便报告一个安全余量很大的参数,实际上可能根本用不到。比如为了图方便在结构体中报告最大参考帧数=16,但实际上最多只用到2帧,如果解码器按照16分配内存则会造成大量的浪费。

对于资源紧张的场合,解码器的设计通常会要求最大参考帧数不能超过某个值,编码器输出的码流必须满足同样的限制才能顺利解码。显然,如果这个限制定为6帧,应该可以解大多数编码器的码流。但是如果定为2帧,则遇到不兼容码流的概率就会显著增加。

3.3、内存分配不足

有些不合理的编码器可能会报告一个不恰当的 level。有网友做高清 camera 时,遇到过所有产品型号中统一报告 level=4.1。1000万像素型号也是 level=4.1,但是其实:

1) 一帧4K分辨率的图像

宏块数 = (3840/16)*(2160)/16 = 32,400

按照 level 4.1 准备 DPB 只能存一个参考帧

2) 一帧1000万像素分辨率的图像

宏块数 = (3872/16)*(2592)/16 = 39204 ,

按照 level 5.0 准备 DPB 能存2个参考帧,

按照 level 5.1 则可以存4个参考帧。

按照 level 4.1 则一帧也放不下

所以,这里 1000W 像素的时候,level 写成 4.1 就不合适了

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

H.264 入门篇 - 07 (帧间预测 - 解码图像缓存 DPB) 的相关文章

随机推荐

  • C++对象调用优化

    C 对象调用优化 临时对象拷贝构造新对象 临时对象就不会产生 常见的对象调用过程 c 编译器对于对象构造的优化 用临时对象拷贝新对象的时候 临时对象就不产生了 直接构造新对象就可以了 include
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 打造智能机器人的秘诀:利用ChatGPT提示词,让机器人更聪明

    当我们与聊天机器人交互时 我们希望它们能够理解我们的意图并提供准确 有针对性和完整的答案 然而 聊天机器人并不是神 它们需要我们的帮助才能更好地服务我们 在使用ChatGPT时 提示词就像是聊天机器人的 灵魂 可以帮助ChatGPT更好地理
  • 最近都在说移民火星,这些黑科技你了解吗?

    点击查看全文 火星移民计划是由埃隆 马斯克所对媒体透露的移民火星并在火星建立社区的计划 尽管被曝出是骗局 许多人还是对这一计划抱有极大兴趣 近年来除了美国宇航局NASA 就连民间机构SpaceX 亚马逊 荷兰公司等都着手研发火星计划 预计在
  • 死循环任务的线程结束方式

    文章目录 前言 一 两种方法 1 方法一 2 方法二 二 代码实例 1 方法一 2 方法二 总结 记录于2021年11月16日 前言 以下介绍的两种方发的适用情景不同 可根据具体需求选择使用 一 两种方法 1 方法一 用定时器去结束任务 设
  • 20230907docker安装MySQL配置

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 docker 安装 启动 docker安装 docker 设置开机启动并立即运行 docker国内镜像源配置 二 docker安装mysql 1 从hub
  • 用几句话说一说CMake add_dependencies & target_link_libraries的使用区别

    简单说一说前两天学习使用CMake解决链接问题时遇到的一个问题 对于编译时遇到的依赖问题 很多时候我们只需要一句target link libraries就可以搞定 但是CMake还有另外一个command add dependencies
  • 天梯题集——愿天下有情人都是失散多年的兄妹(隐藏条件)

    愿天下有情人都是失散多年的兄妹 解题思路 利用结构体读入每个 ID 下数据 隐藏条件 标记父母的性别 卡死个人 假设判断 a b 是否可通婚 同性输出 Never Mind 不同性 bfs标记 a 的五代内的祖先 check检查 b 五代内
  • Bert base和 Bert large参数对比

    Bert base的网络结构 L 网络层数 12 H 隐藏层维度 768 A Attention 多头个数 12 Total Parameters 12 768 12 110M 使用GPU内存 7G多 Bert large的网络结构 and
  • 基础篇:ios开发概述

    1 介绍 iOS是由苹果公司开发的移动操作系统 苹果公司最早于2007年1月9日的Macworld大会上公布这个系统 最初是设计给iPhone使用的 后来陆续套用到iPod touch iPad上 iOS与苹果的macOS操作系统一样 属于
  • 图像拼接 之 特征点匹配

    图像拼接 之 特征点匹配 介绍 特征点对搜索 建立 K D 树 搜索 K D 树 特征点对的筛选 计算单应性矩阵 基于特征点对计算单应性矩阵 RANSAC 优化单应性矩阵 总结 参考资料 介绍 在人们实际生活和工作中时常需要获得宽视角 高分
  • 如果一个类实现接口,那么它要实现这个接口所有的方法吗?如果这个类继承抽象类呢?

    一个类实现接口和继承抽象类对于抽象方法的实现原则是相同的 1 如果这个类是个普通类 那么必须实现这个接口 抽象类的所有抽象方法 2 如果这个类是个抽象类 那么不必实现这个接口 抽象类的抽象方法 因为抽象类中可以定义抽象方法 接口中定义的属性
  • 推荐一个开源的区块链开发者工具网站

    开源区块链开发者工具箱 https ChainTool tech 今天可以正式上线了 ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具 关于 ChainToolDAO 大约在两个月前 ChainToolDAO 成立了
  • 立体匹配 --视差预测‘soft argmin‘

    1 立体匹配的关键任务就是预测精准的视差图 对于视差图每一个像素位置的值并不是 0 255 灰度值 而是一个视差值 2 那么这些视差值如何得到的呢 最开始是由传统方法的 argmin 得到 arg min 就是使后面这个式子达到最小值时的变
  • windows系统下帧率获取工具--fraps

    系列文章目录 文章目录 系列文章目录 前言 二 fraps使用 1 下载 2 使用 前言 我们在展示三维场景 或者是查看游戏帧率 可以使用帧率显示工具 Fraps Fraps是一款显卡辅助软件 有了它可以很轻松的了解电脑上正在运行游戏的帧数
  • 电脑桌面下方的任务栏卡死解决方案:

    重启 Windows资源管理器 方法 1 按 Ctrl Alt Del 打开 任务管理器 切换到 进程 选项卡 2 找到 Windows资源管理器 鼠标右击选中 重新启动
  • 服务器UDIMM、LRDIMM、RDIMM的区别

    随着应用程序的增加 存储器不得不承受更大的压力 现在 无论是服务器租赁还是PC领域 DDR4存储技术仍然是主流 DDR4为了保证并行数据的有效传输 必须在存储器上下功夫 在服务器领域 现在使用的存储器类型 DIMM 主要有UDIMM RDI
  • JavaScript设计模式(一)——构造器模式、原型模式、类模式

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • VScode 结合Global构建linux源代码阅读环境

    1 背景介绍 上一篇文章 VScode ssh远程登陆到服务器阅读代码 介绍了在VSCode工具中使用SSH远程登陆服务器加载Linux源代码 本文向大家介绍使用Global构建linux源代码阅读环境 对linux kernel代码进行解
  • H.264 入门篇 - 07 (帧间预测 - 解码图像缓存 DPB)

    目录 1 DPB 的概念 2 DPB 最大深度 3 DPB 的行为 3 1 清空机制 3 2 内存分配过大 3 3 内存分配不足 前置文章 VideoCodec 入门篇 00 编解码简介 H 264 入门篇 00 简介 H 264 入门篇