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

相关文章

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

IDEA与MyEclipse代码量统计方式

《IDEA与MyEclipse代码量统计方式》文章介绍在项目中不安装第三方工具统计代码行数的方法,分别说明MyEclipse通过正则搜索(排除空行和注释)及IDEA使用Statistic插件或调整搜索... 目录项目场景MyEclipse代码量统计IDEA代码量统计总结项目场景在项目中,有时候我们需要统计

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释: