vp9协议梳理-header头文件

vp9协议梳理-header头文件

本文是对vp9视频码流中header中包含的语法元素的一个分类整理,及其对具体的解码过程的影响的分析。

这里写目录标题

  • vp9协议梳理-header头文件
  • 1. Vp9码流中的header头文件
  • 2. profile
  • 3. show_existing_frame, frame_to_show_map_idx
  • 4. frame_type, color_config(),frame_size(),render_size(),refresh_frame_flags,frame_context_idx
  • 5 . show_frame, only_intra
  • 6. error_resilient_mode, reset_frame_context,frame_parallel_decoding_mode;
  • 7. ref_frame_idx,ref_frame_sign_bias,frame_size_with_refs(),allow_high_precision_mv,read_interpolation_filter()
  • 8. loop_filter_params( ), quantization_params( ),tile_info( ),header_size_in_bytes
  • 9. segmentation_params()
  • 10. 参考资料

1. Vp9码流中的header头文件


🐶Vp9码流中的一帧图像只有一个头文件,分为uncompressed_header(),和 compressed_header( )两种; 完整的解码函数参考协议第6章(参考资料【2】)


  • 🐭uncompressed_header()中的头文件为图像大小,渲染大小,量化参数,参考帧的更新等等信息;这些信息未进行压缩,因此解码时直接从码流中读取即可;

  • 🐹compressed_header()中的头文件主要是vp9对码流解码时需要用到的概率表(概率表的作用参考这篇文章【1】)的参数;


🐰本文主要对uncompressed_header()的信息按解码顺序进行分析;


2. profile

🐺profile_low_bit : Profile的低bit位
🐸profile_high_bit :Profile的高bit位
请添加图片描述

3. show_existing_frame, frame_to_show_map_idx

🐯show_existing_frame: 直接将之前解码存储的图像输出,输出格式和profile一致(show_existing_frame为1,则uncompressed_header在解码完frame_to_show_map_idx后,该帧图像解码结束);

🐨frame_to_show_map_idx:输出索引frame_to_show_map_idx所对应的图像

4. frame_type, color_config(),frame_size(),render_size(),refresh_frame_flags,frame_context_idx

🐻frame_type : 1表示KEY FRAME(关键帧), 0表示非关键帧;

🐷关键帧的含义:该帧独立解码🐽色彩空间(color_config())🐮帧尺寸(frame_size( ))🐗渲染尺寸(render_size( )),且该帧必为帧内编码,存放帧间编码时用到的参考帧的参考槽,都将在解码后替换为该帧图像(refresh_frame_flags = 0xFF,🐵refresh_frame_flags对为1的bit位对应的参考槽进行替换); 且vp9进行解码用到的概率表(索引为frame_context_idx,,取值范围0~3, 🐒vp9解码时,会先加载frame_context_idx对应的概率表,解码过程会更新这些表)会被初始化恢复为协议的默认值;

5 . show_frame, only_intra

🐴show_frame:该帧图像是否被显示;

  • 0: 不被显示, 需要解码only_intra;
  • 1:被显示, only_intra = 0;

🐑Only_intra : 1:只支持帧内预测;0:帧内帧间预测都支持;

6. error_resilient_mode, reset_frame_context,frame_parallel_decoding_mode;


🐘reset_frame_contex:

  • 0 , 1 表示无操作
  • 2表示 对frame_context_idx所指向的概率表进行初始化
  • 3 表示对所有概率表进行初始化

🐤error_resilient_mode:错误鲁棒模式,该flag为1时,该帧可以独立与前面的帧进行编码,具体表现为:

  • 对所有概率表进行初始化;
  • 分段参考功能(segmentation)所用到的FeatureData和 FeatureEnabled清零;
  • ref_frame_sign_bias清零(帧间预测时只能后向参考)
  • loop_filter关于参考帧的一些变量的清零

🐛总之就是该帧可以独立于前帧进行解码,相关的变量将都被清零化初始化;


🐝frame_parallel_decoding_mode :

  • frame_parallel_decoding_mode = 1表示启用并行解码模式;
  • frame_parallel_decoding_mode = 0表示禁用并行解码模式。

🐜并行解码模式意味着概率不根据观察结果进行调整频率。


请添加图片描述

🐞如图所示,一帧结束后会根据各个语法元素出现的频率来更新概率表(参考资料【2】),但error_resilient_mode 或Frame_parallel_decoding_mode为1时,将不会更新概率表;


7. ref_frame_idx,ref_frame_sign_bias,frame_size_with_refs(),allow_high_precision_mv,read_interpolation_filter()


🐌这些是帧间预测会用到的一些配置变量, 帧间编码一般用到4个可选的参考帧,存放参考帧的参考槽往往有更多个;

🐙4个ref_frame_idx,指定帧间使用哪些参考帧。对应的ref_frame_sign_bias指定每个参考帧的运动矢量在时间上的预期方向。符号偏差等于0表示参考系是向后参考系;符号偏差等于1表示参考帧是向前参考。


🐟allow_high_precision_mv:

  • allow_high_precision_mv = 0指定运动矢量为1/4精度;
  • allow_high_precision_mv = 1指定运动矢量为1/8精度。

🐠比如像素点值为0, 相邻像素点1 , 按1/4像素移动, 就得到0.25这个值;


🐳read_interpolation_filter帧间预测用到的过滤器的配置;


🐋frame_size_with_refs:判断图像的frame_size直接选用参考帧的frame size,还是单独解码frame_size作为图像的尺寸信息


8. loop_filter_params( ), quantization_params( ),tile_info( ),header_size_in_bytes

🐬loop_filter_params( ),:环路滤波器的一些工作模式的配置
🐏quantization_params( ):反量化需要用的qp相关的参数
🐀tile_info( ):tile的划分大小
🐉header_size_in_bytes:uncompressed_header()在码流中所占的字符串长度;

9. segmentation_params()

🐐 vp9解码过程中采用了一种分段工作;将多组信息存储在数组FeatureData 中,数组FeatureEnabled表示FeatureData 中的信息是否有效;

🐓MAX_SEGMENTS默认为8,表示FeatureData多少组信息;
🐕segment_id表示该帧获取segment_id对应的FeatureData的信息;

🐖FeatureData 中包含的信息:

  • SEG_LVL_ALT_Q : Index for quantizer segment feature
  • SEG_LVL_ALT_L : Index for loop filter segment feature
  • SEG_LVL_REF_FRAME : Index for reference frame segment feature
  • SEG_LVL_SKIP: Index for skip segment feature
  • SEG_LVL_MAX: Number of segment features

🐊我们可以简单理解为,QP,环路滤波器(lpf),skp,和帧间编码的一些信息,这些信息在解码帧头文件的过程中存储了8组(MAX_SEGMENTS);编码时若该帧采用的这些对应配置信息和某组数据一样,则直接编码输出segment_id,解码端解码时只需要解码出segment_id就可以得到这些数据了,从而达到节省码流的目的;

10. 参考资料

【1】Vp9解码方式概述 – Parsing Process-CSDN博客
【2】VP9_Bitstream_Specification_v0.7_ORIGINAL.docx
【3】vp9协议笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

What is Rust? Why Rust?

why Rust? 目前,Rust 变得越来越流行。然而,仍然有很多人(和公司!)误解了 Rust 的主张价值是什么,甚至误解了它是什么。在本文中,我们将讨论 Rust 是什么以及为什么它是一种可以增强…

vivado 配置内存IP

配置内存IP UltraScale体系结构内存IP支持DDR3和DDR4 SDRAM的配置,QDRIIPLUS SRAM和RLDRAM3型接口。截至2015.3,内存IP已被拆分基于内存接口标准和工具流,将其划分为不同的IP。“自定义IP”对话框框包含基本和高级配置选项,其中包…

【C/C++ 05】快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序算法,其基本思想是:任取待排序序列中的某元素作为基准值,按照该基准值将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于…

数据在网络传输中为什么要加密?

在信息化浪潮席卷全球的今天,数据如同流淌在信息高速公路的生命血液,其安全传输的重要性不言而喻。随着网络空间中各种威胁与挑战日益凸显,加密技术已成为保护数据安全、维护用户隐私、确保业务连续性的关键手段。它就如同一道无形的防护盾&a…

Nestjs 全局拦截器

一、拦截器 拦截器作用: 在函数执行之前、之后绑定额外的逻辑转换函数的返回结果转换从函数抛出的异常扩展基本函数的行为根据所选条件重写函数 期望接口返回一个标准的json格式,利用拦截器对数据做全局的格式化 {code: "200",data: [],mess…

【文本到上下文 #7】探索 NLP 中的 Seq2Seq、编码器-解码器和注意力机制

一、说明 今天,我们将探讨序列到序列 (seq2seq) 模型的复杂工作原理,特别关注编码器-解码器架构和注意力机制。这些概念是各种 NLP 应用的基础,从机器翻译到问答系统。 这是可以期待的: Seq2Seq模型中的编码…

数据结构之单链表详解

前言 之前大摆了5天多,没怎么学编程,自昨日起,觉不可如此,痛定思痛,开始继续学习,昨天刷了20多道简单级别的力扣,今天想把链表好好巩固一下,于是乎,把单链表的增删查改搞…

基础算法之Huffman编码

// Type your code here, or load an example. #include<iostream> #include<string> #include<queue> #include <unordered_map> #include <vector>using namespace std;//树节点结构 struct Node {char ch;int freq;Node *left;Node *right;No…

数据结构3、基于栈的后缀算术表达式求值

1 题目描述 图1 中缀表达式转化为后缀表达式题目描述 图2 基于栈的后缀算术表达式求值题目描述 2 题目解读 借助一个运算符栈&#xff0c;可将中缀表达式转化为后缀表达式&#xff1b;借助一个运算数栈&#xff0c;可对后缀表达式求值。借助一个运算符栈和一个运算数栈&#xf…

Java基础数据结构之哈希表

概念 顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素时&#xff0c;必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) &#xff0c;平衡树中为树的高度&#xff0c;即 O( log2N ) &#xff0c;搜索的效…

防火墙用户认证、NAT、策略路由、DNS透明代理以及双机热备笔记

用户认证 防火墙管理员登录认证 --- 检验身份的合法性&#xff0c;划分身份权限 用户认证 --- 上网行为管理的一部分 用户&#xff0c;行为&#xff0c;流量 --- 上网行为管理三要素 用户认证的分类 上网用户认证 --- 三层认证 --- 所有的跨网段的通信都可以属于上网行为。…

【Web前端实操19】商城官网_分析与顶部广告

本次实操主要是借用小米之前的网站来进行参考&#xff0c;达成网站静态页面开发的目的&#xff0c;而新学者想要一次性直接开发整个网站&#xff0c;肯定会很懵圈&#xff0c;因此&#xff0c;这个商城官网我会一部分一部分地进行拆分来写&#xff0c;最后合成整个界面。 本次…

国企重组整合后,如何严把“选人用人”关?

三年国企改革之后&#xff0c;新一轮国企改革明确重组方向&#xff0c;强调将“战略性重组和专业化整合”作为深化供给侧结构性改革从而建设世界一流企业的重要抓手&#xff0c;推动了国有资源的高效运转流动。在很多企业兼并、重组后&#xff0c;成立了新的集团性公司&#xf…

Mysql查询数据

1 基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是&#xff1a; 2 单表查询 2.1 查询所有字段 SELECT * FROM 表名; 2.2 在SELECT语句中指定所有字段 SELECT f_id, s_id ,f_name, f_price FROM fruits; 2.3 查询单个字段 SELECT 列名FR…

nginx部署前端(vue)项目及配置修改

目录 一、前端应用打包 二、部署前端应用 1、上传前端文件夹 2、修改nginx配置文件 3、重启nginx 三、查看效果 nginx安装参考&#xff1a;linux安装nginx-CSDN博客 一、前端应用打包 打包命令 npm run build 打包成功如下&#xff0c;会在项目路径下生成dist文件夹 二…

Windows Server 2003 Web服务器搭建

系列文章目录 目录 系列文章目录 前言 一、Web服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 2.服务器搭建 1)控制面板中找到增加或删除程序打开 2)点击增加程序 3)安装Web服务器 4)查看安装是否成功 5)打开Internet信息服务(IIS)管理器,进行配置 6)找…

【开源之美】:cppcheck

一、项目链接 https://github.com/danmar/cppcheck/tree/main 二、效果示例

图像复原的天花板在哪里?SUPIR:开创性结合文本引导先验和模型规模扩大

SUPIR&#xff08;Scaling-UP Image Restoration&#xff09;&#xff0c;这是一种开创性的图像复原方法&#xff0c;利用生成先验和模型扩大规模的力量。通过利用多模态技术和先进的生成先验&#xff0c;SUPIR在智能和逼真的图像复原方面取得了重大进展。作为SUPIR中的关键催化…

如何配置MacLinuxWindows环境变量

这里写目录标题 什么是环境变量什么是PATH为什么要配置环境变量 如何配置环境变量环境变量有哪些环境变量加载顺序环境变量加载详解 配置参考方法一&#xff1a; export PATHLinux环境变量配置方法二&#xff1a;vim ~/.bashrcLinux环境变量配置方法三&#xff1a;vim ~/.bash_…

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…