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协议原文(需加速器访问)

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

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

相关文章

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

【kubernets】kubelet证书单独更新

前言说明 接上一篇文章https://blog.csdn.net/margu_168/article/details/132584109关于kubernets中的证书管理。本篇文章将单独说明一下kubelet的证书更新。在1.19.16版本中&#xff0c;默认情况下使用 kubeadm alpha certs renew all 不能更新kubelet的证书&#xff0c;其他…

对数似然函数:为什么在统计学和机器学习中它如此重要?

在统计学和机器学习领域&#xff0c;对数似然函数常常扮演着关键的角色。本文将深入探讨对数似然函数的优势&#xff0c;为什么在实际问题中更经常使用对数似然函数而非原始似然函数。 1. 什么是对数似然函数&#xff1f; 似然函数是一个在统计学中描述参数的函数&#xff0c;…

pcl+vtk(十四)vtkCamera相机简单介绍

一、vtkCamera相机 人眼相当于三维场景下的相机&#xff0c; VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕、图像等。 相机位置&#xff1a;即相机所在的位置&#xff0c;用方法vtkCamera::SetPosition()设置。 相…

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09; 水仙花数是指一个 3 位数&a…

x-cmd pkg | sqlite3 - 轻量级的嵌入式关系型数据库

目录 简介首次用户 技术特点竞品和相关产品sqlite 与 x-cmd进一步阅读 简介 sqlite3 是一个轻量级的文件数据库&#xff0c;体积非常小&#xff0c;提供简单优雅而功能强大的 sql 化的数据查询。 通常情况下&#xff0c;sqlite 指的是 SQLite 2.x 版本&#xff0c;而 sqlite3 …

【K8S 云原生】K8S的安全机制

目录 一、K8S安全机制概述 1、概念 2、请求apiserver资源的三个步骤&#xff1a; 一、认证&#xff1a;Anthentcation 1、认证的方式&#xff1a; 1、HTTP TOKEN&#xff1a; 2、http base&#xff1a; 3、http证书&#xff1a; 2、认证的访问类型&#xff1a; 3、签发…

网络安全B模块(笔记详解)- Linux操作系统渗透提权

1. 使用渗透机对服务器信息收集,并将服务器中SSH服务端口号作为flag提交; 2. 使用渗透机对服务器信息收集,并将服务器中主机名称作为flag提交; 3. 使用渗透机对服务器信息收集,并将服务器中系统内核版本作为flag提交; 4. 使用渗透机对服务器管理员提权,并将服务器中r…

C# 使用AutoMapper实现类映射

写在前面 AutoMapper是一个用于.NET中简化类之间的映射的扩展库&#xff1b;可以在执行对象映射的过程&#xff0c;省去的繁琐转换代码&#xff0c;实现了对DTO的快速装配&#xff0c;有效的减少了代码量。 通过NuGet安装&#xff0c;AutoMapper&#xff0c; 由于本例用到了D…

pyspark.sql.types 中的类型有哪些

对 pyspark.sql.types 中的类型做个记录 1、首先正常使用的时候&#xff0c;我们需要引用他们&#xff1a; from pyspark.sql.types import MapType,StringType # 或者 from pyspark.sql.types import *PySpark SQL TYPES是PySpark模型中的一个类&#xff0c;用于定义PySpark数…

小学信息科技Python课程第3课:变量与颜色

一、变量 变量是计算机内存中的一块区域&#xff0c;存储规定范围内的值&#xff0c;值可以改变&#xff0c;通俗的说变量就是给数据起个名字。 1️⃣变量命名规则 变量名由字母、数字、下划线组成 数字不能开头 不可以使用关键字 简短且具有描述性 2️⃣变量的赋值 每个变量在…

【WPF.NET开发】WPF中的双向功能

本文内容 FlowDirectionFlowDocumentSpan 元素非文本元素的 FlowDirection数字替换 与其他任何开发平台不同&#xff0c;WPF 具有许多支持双向内容快速开发的功能&#xff0c;例如&#xff0c;同一文档中混合了从左到右和从右到左的数据。 同时&#xff0c;WPF 也为需要双向功…

【知识---NVIDIA这是一个什么公司】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言图形处理单元&#xff08;GPU&#xff09;&#xff1a;人工智能&#xff08;AI&#xff09;和深度学习&#xff1a;自动驾驶技术&#xff1a;游戏&#xff1a;数…

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备2

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;4&#xff09;—— virtio所创建的设备1 在上一篇文章中&#xff0c;对于面试所提出的问题“virtio会创建哪些设备&#xff1f;”&#xff0c;有了初步答案&#xff0c;即…

单调性的应用

1单调性 应用场景&#xff1a;常应用于双指针的进一步优化问题中含义&#xff1a;针对指针 i 1 > i i1>i i1>i一定有 j 1 > j j1>j j1>j或者 j 1 < j j1<j j1<j这样我们就可以利用该性质对算法进行进一步优化&#xff0c;避免一些不必要的遍历…

微软人工智能办公AI工具 Copilot Pro 11项 Copilot 功能

Copilot&#xff08;曾用名 Bing Chat 和 Bing Chat Enterprise&#xff09;在此期间成为了许多用户的日常AI伴侣&#xff0c;并在正式发布后将继续为用户提供AI驱动的网络聊天体验。 微软Copilot官方网址链接&#xff1a;Microsoft Copilot: 你的日常 AI 助手 Copilot详情&am…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

Rollup:打包 TypeScript - React 组件库

调用浏览器摄像头拍照组件 1、前提1、安装依赖2、添加 rollup.config.js 配置3、修改 package.json3.1 添加打包命令3.2 添加组件入口3.3 添加组件声明入口3.4 浏览器支持 1、前提 1.1 通过 create-react-app take-photo --template 创建前端应用 1.2 添加组件 TakePhoto (拍照…

3 - 主从复制结构|持久化|数据类型

主从复制结构&#xff5c;持久化&#xff5c;数据类型 主从复制 没有高可用功能命令行配置修改配置文件&#xff08;永久有效&#xff0c;重启了redis服务依然有效&#xff09; 配置带验证的主从复制主从从配置哨兵服务&#xff08;可实现高可用&#xff09;持久化RDB文件的使用…