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

相关文章

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys