Vp9解码方式概述 -- Parsing Process

2024-01-26 05:04

本文主要是介绍Vp9解码方式概述 -- Parsing Process,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Vp9解码方式概述 – Parsing Process

本文是对vp9协议第9章,解析字符串函数的一个梳理,主要对几种解析类型(Type)的流程进行梳理

目录

  • Vp9解码方式概述 -- Parsing Process
  • 1. 如何解码视频?
  • 2. f(n)
  • 3. 布尔解码器Boolean decoder (read_bool( p ))
  • 4. 布尔解码函数read_bool( p )
  • 5. B( p )
  • 6. L( n )
  • 7. T
  • 8. 参考资料

1. 如何解码视频?

请添加图片描述

🍟编码后的视频信息是一长串二进制的字符串,解码时将按照协议第6章的函数进行,黑体加粗(图中红圈所示)表示此时从字符串中读取数据进行解析,解析的值,赋值给该黑体加粗表示的语法元素(padding_bit);而从字符串中读取多少位信息,以及如何对获取的二进制字符串解析,则用不同的Type(图中绿圈所示)来表示。

2. f(n)

🍗f(n)表示直接从字符串中获取n bit,例如f(3),就表示从字符串中直接获取3bit,若获取的是010,那该语法元素解码值就是2;

3. 布尔解码器Boolean decoder (read_bool( p ))

🍖Vp9在解码一个tile前,都会初始化布尔解码器(init_bool(tile_size),tile_size表示解码该tile需要获取的字符串的长度),解码完一个tile后会关闭布尔解码器(exit_bool); Type中的B(n), L(n), T都代表用布尔解码器对视频字符串(码流)进行解码操作;

4. 布尔解码函数read_bool( p )

🍝布尔解码器的核心是read_bool( p )函数。B(n), L(n), T这三种类型的解码,都要调用该函数;其中在init_bool(sz)中会赋给BoolRange(255)和BoolMaxBits (8 * sz – 8), BoolValue(f(8),从码流中读取8bit,赋给BoolValue)的初始值,read_bool( p )函数如下所示:

read_bool(p){split = 1 + (((BoolRange - 1) * p) >> 8)if(BoolValue < split){BoolRange = split;bool = 0;}else{BoolRange -= split;BoolValue -= split;bool = 1;}if(BoolRange < 128){if(BoolMaxBits > 0){newBit = f(1);//从码流中获取1bit;BoolMaxBits -= 1;}else{NewBit = 0;}BoolRange =  BoolRange *2;BoolValue = (BoolValue << 1) + newBit;}return bool;
}

5. B( p )

🍛用于一些1bit语法元素的解码:B(p) = read_bool( p )

6. L( n )

🍤用于一些已知位宽(nbit)语法元素的解码

L(n){x = 0;for(i = 0; i < n; i++){x = 2 * x + read_bool(128);}return x;
}

7. T

🍱T解码是一种依靠各种概率表和树状图的,用于一些不定长度的语法元素的解析。T表示调用多次read_bool§进行解码; 调用多少次,取决于树状表,而每次调用的参数p的值,取决与概率表;


🍣以mv_joint语法元素的解析为例:

  • 🍥首先我们要看懂mv_joint对应的树状图(见协议9.3.1 Tree selection process): 前面带-符号的,表示叶子节点,其余为子节点
mv_joint_tree[ 6 ] = {
-MV_JOINT_ZERO, 2,
-MV_JOINT_HNZVZ, 4,
-MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
}
  • 🍙转换后,树状图为
    请添加图片描述

  • 🍘第一次调用read_bool( p ), 解码为0,解码结束,mv_joint = MV_JOINT_ZERO;
    解码为1,则 node_tmp = 2(该变量是下一次调用read_bool§时,计算p用的,后面会写),继续解码;

  • 🍚第二次调用read_bool( p ), 解码为0,解码结束,mv_joint = MV_JOINT_HNZVZ;
    解码为1,则 node_tmp = 4, 继续解码;

  • 🍜第三次调用read_bool( p ), 解码为0,mv_joint = MV_JOINT_HZVNZ;
    解码为1,则 mv_joint =MV_JOINT_HNZVNZ , 解码结束;

🍲每次调用read_bool( p )中的参数p的大小都是变化的,p的大小由概率表mv_joint_probs[node] 决定,其中node在一个语法元素的第一次调用时,初始值为0, 之后node = node_tmp/2;

default_mv_joint_probs[ 3 ] = {
32, 64, 96
}
  • 🥚第一次调用用的p值为32 (node_tmp = 0, node=0),
  • 🍞若继续解码,p = 64(node_tmp = 2, node=1);
  • 🍩若继续第三次解码,p=96(node_tmp = 4, node=2);

🍡各个语法元素的概率表在协议第10节(10.5 Default probability tables等) ;

🍢需要注意的是,协议里的概率表是一个初始值,在解码过程中,是会有更新的;参考文章【1】,对vp9的解码过程的框架进行过一次梳理;

8. 参考资料

【1】vp9协议笔记-CSDN博客

【2】vp9协议原文(需加速器访问)

这篇关于Vp9解码方式概述 -- Parsing Process的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/645709

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日