vp9协议笔记

news2024/11/16 11:45:49

vp9协议笔记📒

本文主要是对vp9协议的梳理,协议的细节参考官方文档:VP9协议链接(需要加速器)

vp9协议笔记

  • vp9协议笔记📒
  • 1. 视频编码概述
  • 2. 超级帧superframe(sz):
  • 2. frame(sz)
  • 3. vp9中的一些索引解释:
  • 4. decode-tiles()
  • 5. decode_partition
  • 6. Residual()
  • 7. 参考文献

1. 视频编码概述

🐶视频编码的流程大概是预测 + 残差 + loop filter(LPF)的模式;

🐭编码端 : 编码端首先对图像进行合理的划分,之后对划分的块(CU)采用帧内预测或帧间预测的方式,对图像进行预测,筛选出误差最小的预测模式,但这样预测出来的图像和原图像会有很大误差,这个误差被称为残差(residual, TU);

🐹编码端可能会对残差进行进一步的split划分(因此TU的大小是小于CU的, H265有对TU进一步的划分, 而vp9中没有),之后再对划分后的块进行DCT变换和量化,以减小残差所占的字节大小(这一步一般图像会有少许的损失);

🐰为了弥补变换量化产生的损失,编码端会编码一种选择一种合适的loop_filter(lpf)过滤器的模式,对图像进行补偿;


请添加图片描述

🐺如图所示, 解码端拿到预测模式,根据预测模式对图像进行预测;同时对拿到的残差进行解量化和反变换; 将预测图像和接量化,反变换后的残差相加,再根据lpf的模式进行滤波,就可以完成图像的解码了。

2. 超级帧superframe(sz):

superframe( sz ) {
	for( i = 0; i < NumFrames; i++ )
		frame( frame_sizes[ i ] )
	superframe_index( )
}
  • 🐸各个帧的解析函数frame(frame_ize)需要用的fram_size在superframe_index()里,为什么super_frame_index在后面才解码?
    • Q1 : 该解析函数顺序并不是真实解码顺序,只是码流的排列顺序。解析超级帧时,整个超级帧的大小sz是已知的,直接先读取大小为sz的字符串的最后1个字节(superframe_header),解析后就知道frame的数量和frame_size的大小;解析完superframe-index然后才开始从头开始解析各个frame;
    • Q2. 由于我们编码完所有的帧信息才能知道各个帧的大小,所以superframe index放在超级帧的后面;而解析的时候是先解析superframe index,再从头解析各个frame
  • 🐯为什么superframe header要解析两遍
    • Q : 因为vp9支持superframe,也支持不用superframe的结构,解析两遍(对比一下是否存在这个信息)和superframe-mark标志的,一起判断该段是否为超级帧;

2. frame(sz)

frame( sz ) {
	startBitPos = get_position( )
	uncompressed_header( )
	trailing_bits( )
	if ( header_size_in_bytes == 0 ) {
		while ( get_position( ) < startBitPos + 8 * sz)
			padding_bit
		return
	}
	load_probs( frame_context_idx )
	load_probs2( frame_context_idx )
	clear_counts( )
	init_bool( header_size_in_bytes )
	compressed_header( )
	exit_bool( )
	endBitPos = get_position( )
	headerBytes = (endBitPos - startBitPos) / 8
	decode_tiles( sz - headerBytes )
	refresh_probs( )
}
  • 🐻uncompress-header()为一些图像基本信息,bit位宽,YUV格式,色彩空间,帧间预测所需要用到的参考帧的更新等等;
  • 🐷header_size_in_byte为0时表示该帧直接copy其他帧信息,不需要进一步解码了,这个变量的解析在ubcompress-header中;
  • 🐽vp9采用的基于概率的压缩,具体可以参考协议第9节,很多压缩的语法元素有一张概率表,解码过程是会用到这张概率表的,而这张概率表也是会在运算过程中更新的。load-probs(idx)是加载frame_context_idx表示的这张概率表,frame_context_idx的值在uncompress-header中解析;
  • 🐮编解码过程中会将很多语法元素编码的次数记录下来,以便后面在refresh_probs()中更新概率模型;因此开始解析压缩后的信息前,clear_count()清空计数器;
  • 🐵Compress_header()里解析的是概率表,因为vp9并不是完全按上面load-probs加载的概率表来计算的,部分位置需要更新后再使用,哪些概率信息需要更新,更新值是多少,就在compress-header里解析;概率表用于从二进制码流里解析各个语法元素(详见协议第9节)
  • 🐒decode-tiles()开始正式解析还原这个图像;

3. vp9中的一些索引解释:

  • 🐴segment id : sement id对应的位置存储了之前解码过的图像的skip,QP,参考帧等信息,根据一些segment的相关标志位决定这些参数是直接采用segment id位置 所对应这些信息,还是单独解码这些信息;
  • 🐎 frame_to_show_map_idx : 表示该帧直接显示frame_to_show_map_idx所对应的图像(之前解码存储的图像),该帧解码结束;
  • 🐫frame_context_idx : vp9的字符串解析过程中会用到很多概率表(第9节),load_probs( frame_context_idx )表示加载frame_context_idx所对应的概率表;

4. decode-tiles()

  • 🐑tileCols,这一帧图像有多少列tile
  • 🐘tileRows,这一帧图像有多少行tile
  • 🐼tileROw:当前tile位于该帧的第几行tile
  • 🐍tileCOl: 当前tile位于该帧的第几行tile
  • 🐦MiROWs:这一帧图像有多少行8*8块
  • 🐤MiCols:这一帧图像有多少行8*8块
  • 🐥MiROWSTART : 该tile的起始行的位置(8*8为单位,比如若为20,表示该tile位于一帧图像的y坐标的160像素点);
  • 🐣简单来说,一个Mi的为8*8个r像素点;

5. decode_partition

  • 🐔bsize是根据partition划分后的大小,也就是说,如果对88进行划分,之后一定进decode-block()。 如果bsize是88,partition 若为 NONE则一定进入decode_ block;其他partition对应的bsize为44,84,48,也是直接进decode block(一个88,无论怎么划分,都只解码一次decode_block);需要注意的是,decode_block函数里虽然Misze是44,84或48,但实际上都是在处理一个88的块;
  • 🐧如果不需要编解码残差(skip),那还需要编码tx size吗?需要,intra mode预测要用到tx_size;

6. Residual()


Token : extra_bits[ 11 ][ 3 ] = {
{ 0, 0, 0},
{ 0, 0, 1},
{ 0, 0, 2},
{ 0, 0, 3},
{ 0, 0, 4},
{ 1, 1, 5},
{ 2, 2, 7},
{ 3, 3, 11},
{ 4, 4, 19},
{ 5, 5, 35},
{ 6, 14, 67}
}

  • 【0】 位置是概率解码时要用到的;
  • 【1】 表示offset的位宽
  • 【2】 表示base

残差的绝对值 = base + offset;

例如:

  • 🐟若token为 0(ZERO_TOKEN),则base为0,offset位宽为0,则残差的绝对值为0;
  • 🐳若token为7(DCT_VAL_CAT3)则base = 7, offset位宽为2bit([0 , 3]),因此残差绝对值的取值范围为[7 , 10];
  • 🐋若token为8(DCT_VAL_CAT4)则base = 11, offset位宽为3bit[0 , 7],因此表示残差绝对值的取值范围为[11 , 18];

7. 参考文献

【1】VP9协议链接(需要加速器)

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

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

相关文章

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

springboot家乡特色推荐系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括家乡特色推荐的网络应用&#xff0c;在外国家乡特色推荐系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。家乡特色推荐系统采用java技术&#xff0…

橘子学Mybatis08之Mybatis关于一级缓存的使用和适配器设计模式

前面我们说了mybatis的缓存设计体系&#xff0c;这里我们来正式看一下这玩意到底是咋个用法。 首先我们是知道的&#xff0c;Mybatis中存在两级缓存。分别是一级缓存(会话级)&#xff0c;和二级缓存(全局级)。 下面我们就来看看这两级缓存。 一、准备工作 1、准备数据库 在此之…

HCIP:不同VLAN下实现网络互相通信

配置pc1 配置pc2 配置pc3 将sw1划分到vlan3 将sw3划分到vlan3 在sw1上进行缺省 将sw1上&#xff08;g0/0/1&#xff09;的untagged改成 1 3 则在pc1上ping pc2可通 在sw1上进行缺省 在sw3上&#xff08;e0/0/1&#xff09;打标记 则在pc1上ping pc3可通&#xff08;实现互通&am…

阿里云Serverless 容器使用,以及常见问题处理

阿里云Serverless Kubernetes容器服务&#xff08;ASK&#xff09;是基于Kubernetes的Serverless容器产品&#xff0c;能够自动完成资源管理、弹性伸缩和按需计费。以下是一些基本使用步骤以及常见问题处理&#xff1a; 阿里云Serverless Kubernetes&#xff08;ASK&#xff0…

17.鸿蒙HarmonyOS App(JAVA)滑动选择器

每天进步一点点,成功在久不在速 滑动选择器 //设置文本样式 picker.setNormalTextFont(Font.DEFAULT_BOLD); picker.setNormalTextSize(40); picker.setNormalTextColor(new Color(Color.getIntColor("#FFA500"))); picker.setSelectedTextFont(Font.DEFAULT_BOLD)…

socket通信客户端收到16进制转换出现efbfbd乱码解决办法

socket客户端接收服务端发来的数据时&#xff0c;发现老有efbfbd乱码&#xff0c;如下图&#xff0c;服务端发送的是02040200013CF0&#xff0c;但是客户端接收到解析后却不一样 客户端接收解析并打印 在网上查原因后&#xff0c;原因是将接收的byte数组转换为String后&#…

C++:第十三讲BFS广度优先搜索

前言 今天带领大家学一下BFS。 DFS可以看——C:第十二讲DFS深搜&#xff08;二&#xff09;_c匿名函数dfs-CSDN博客 BFS简介 广度优先搜索&#xff08;breadth-first search&#xff0c;缩写为bfs&#xff09;又名宽度优先搜索&#xff0c;是最简便的图的搜索算法之一&…

Conda python运行的包和环境管理 入门

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装 Conda 是一个功能强大的命令行工具&#xff0c;用于在 Windows、macOS 和 Linux 上运行的包和环境管理。 本 conda 入门指南介绍了启动和使用 conda 创建环境和安装包的基础知识。 1. 准备…

优先级队列(堆) PriorityQueue

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.优先级队列 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的创建 2.3 堆的插入和删除 2.…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库&#xff0c;可对通信双方流通的字节序列进行加解密&#xff0c;保障通信的安全。本文以c编写的tcp server和tcp client为例子&#xff0c;openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

【软考】位示图

目录 一、基本概念二、位示图 一、基本概念 1.要将文件保存到外部存储器&#xff08;外存或辅存&#xff09;&#xff0c;首先得知道存储空间的使用情况 2.要清楚哪个物理块已经被占用&#xff0c;哪个物理块是空闲的 3.当对大容量的磁盘存储空间被多用户共享时&#xff0c;用户…

套接字通信(附带单线程TCP套接字通信代码)

套接字-Socket 1. 概念 1.1 局域网和广域网 局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09;是两种不同范围的计算机网络&#xff0c;它们用于连接多台计算机以实现数据共享和通信。 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1…

JUC-CAS

1. CAS概述 CAS(Compare ans swap/set) 比较并交换&#xff0c;实现并发的一种底层技术。它将预期的值和内存中的值比较&#xff0c;如果相同&#xff0c;就更新内存中的值。如果不匹配&#xff0c;一直重试&#xff08;自旋&#xff09;。Java.util.concurrent.atomic包下的原…

AMIS的组件学习使用

部分代码片段 {"id": "filterForm","className": " xysd-zbkb-pubquery","labelWidth": 130,"body": [{"type": "grid","className": "xysd-grid-query-input","c…

鲲鹏微认证——openEuler开源操作系统迁移实践

文章目录 为什么要系统搬迁为什么选择欧拉欧拉系统迁移概述实施路径工具实战 为什么要系统搬迁 2020年12月&#xff0c;CentOs作为由开源社区免费提供的操作系统&#xff0c;宣布将对CentO58于2021年底停止服务&#xff0c;CentO57则于2024年6月底停止服务。 这将直接导致操作…

MyBatis详解(1)-- ORM模型

MyBatis详解&#xff08;1&#xff09; JDBC的弊端&#xff1a; ORM 模型常见的ORM模型&#xff1a;mybatis和Hibernate的区别 ***优势&#xff1a;mybatis解决问题&#xff1a;优点&#xff1a; MyBatisMyBatis环境搭建项目架构mybatis生命周期 JDBC的弊端&#xff1a; 1.硬编…

dataGrip连接数据库mysql和intersystems的iris

intersystems公司的产品iris是cache的升级版本&#xff0c;目前绝大多数数据库工具都没法连接这个数据库 datagrip下载地址 https://download-cdn.jetbrains.com.cn/datagrip/datagrip-2023.3.3.exe 选择对应的数据库产品类型 新建数据库资源连接 填上对应的数据库连接和账…

12.前端--CSS-背景属性

1.背景颜色 样式名称&#xff1a; background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明&#xff1a; 元素背景颜色默认值是 transparent&#xff08;透明&#xff09;      background-color:transparent; 代码演示&#xff1a; 背景色…

将AWS iot消息数据发送Kinesis Firehose Stream存向S3

观看此文章之前&#xff0c;请先学习AWS iot的数据收集&#xff1a; 使用Linux SDK客户端向AWS Iot发送数据-CSDN博客 1、工作原理&#xff1a; 1.1 规则 规则可让您的设备与 AWS 服务进行交互。分析规则并根据物品发送的消息执行操作。您可以使用规则来支持任务&#xff0…