VP9 probe 的概念

vp9 prob 实际是vp9 probability的缩写,指的是各个编码参数出现在码流的概率。为什么需要在码流里面传递这样的参数。这个是为了节省熵编码的比特数。

例子:算术编码 编码帧间预测的模式

vp9的帧间预测模式有4种NEW, NEAREST, NEAR, ZERO 。 如果说这4种模式出现的概率相等,那么编码的时候就可以每个模式都分配同样的两个比特。

如果说ZERO 出现的概率是50%, NEAREST 是 25%, NEAR/NEW 12.5% 。那么最佳的码流比特分配方式如下,也就是给高概率少的比特,给低概率高的比特。使得最后的编出来的码流最小。

如果说估计到的语法元素出现概率跟实际上语法元素出现的概率很接近,那么就可以达到编码比特的最小。

vp9 加prob语法的目的 就是为了在码流种传递不同语法元素在码流中的概率。

编码端有两种方式来告诉解码端不同语法元素出现的概率。

1、直接在码流的头里面传递 概率, 这样会增加比特输出,但是很精确。

2、在解码的时候追踪不同语法元素被解码的次数 然后在帧结束的时候计算概率。 这个概率就用在下一帧的算术解码里面。这个是基于前后两帧出现的语法元素相近的概率很高。这种方法就不用增加比特的输出

vp9 prob用的是这两种方法的结合。

libvpx的实现

在解码前首先申请4个frame_contexts, 然后每个frame_contexts都初始化为相同的prob,这些prob 包括mode预测模式,coef残差系数,mv相关的prob。然后解析码流的frame_context_idx语法元素。frame_context_idx指定了用4个buffer里面哪个frame_contexts来进行probe 的更新。

继续会从码流中读取出来要更新的prob,frame_context_idx指定的prob和码流读进来的probe一起组成最后解码使用的probe。如果说refresh_frame_context语法为0,表明 这一帧的读出来使用的prob 是不用更新到frame_contexts,直接就丢弃了。

如果说refresh_frame_context语法为1,表明 这一帧的读出来使用的prob 是需要更新到frame_contexts,更新的位置还是当前帧frame_context_idx指定的位置。 后面帧如果说用到这个frame_contexts 那么要用的是更新之后的frame_contexts。

此外 frame_contexts 重置为默认值的情况

1、当前是I帧或者error_resilient_mode 或者reset_frame_context为3 的时候,所有4个frame_contexts都要重置为默认的prob(这个prob是写死在代码里面的)

2、reset_frame_context为2的时候 需要将帧头里解析的frame_context_idx 指定的frame_contexts 重置为默认。

vp9 prob 详细分析相关推荐

  1. Yolov1目标检测算法详细分析

    Yolov1目标检测算法详细分析 Yolov1介绍 这是继RCNN,fast-RCNN 和 faster-RCNN之后,rbg(Ross Girshick)大神挂名的又一大作,起了一个很娱乐化的名字: ...

  2. 详细分析本机号码一键登录原理

    详细分析本机号码一键登录原理! 很多 APP 的目前都支持「本机号码一键登录」功能.本机号码一键登录是基于运营商独有网关认证能力推出的账号认证产品.用户只需一键授权,即可实现以本机号码注册/登录,相比 ...

  3. linux shell数据重定向(输入重定向与输出重定向)详细分析

    转载自: linux shell数据重定向(输入重定向与输出重定向)详细分析 - 程默 - 博客园 http://www.cnblogs.com/chengmo/archive/2010/10/20/ ...

  4. Blueprint代码详细分析-Android10.0编译系统(七)

    摘要:Blueprint解析Android.bp到ninja的代码流程时如何走的? 阅读本文大约需要花费18分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Andro ...

  5. android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...

    01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...

  6. C语言中的static 详细分析

    google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...

  7. 【数字信号处理】序列傅里叶变换 ( 序列傅里叶变换定义详细分析 | 证明单位复指数序列正交完备性 | 序列存在傅里叶变换的性质 | 序列绝对可和 → 序列傅里叶变换一定存在 )

    文章目录 一.序列傅里叶变换定义详细分析 二.证明单位复指数序列正交完备性 三.序列存在傅里叶变换的性质 一.序列傅里叶变换定义详细分析 序列傅里叶变换 SFT , 英文全称 " Seque ...

  8. 新手向:从不同的角度来详细分析Redis

    最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...

  9. C语言中static详细分析

    google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...

  10. 集合框架源码分析四(Collections类详细分析)

    我认为Collections类主要是完成了两个主要功能  1.提供了若干简单而又有用的算法,比如排序,二分查找,求最大最小值等等.  2.提供对集合进行包装的静态方法.比如把指定的集合包装成线程安全的 ...

最新文章

  1. ThinkPHP5有关模型hasOne、hasMany、belongsTo详解
  2. oracle网卡,Oracle_bond网卡配置
  3. 用 PHPRPC 实现 Ajax 安全登录
  4. python基础——lambda函数
  5. mysql5.5 5.7区别_mysql 5.5 和5.7 安装的区别
  6. 【目标检测】目标检测中的多尺度检测(Multi-Scale),FPN,RPN
  7. NIVC-gt;IPR[IPADDR]
  8. 中国蟹养殖和捕捞现状分析,淡水养殖产量占比最高「图」
  9. 带时间轴的文章归档的html页面,Css打造伸缩时间轴样式的WordPress归档页面archive.php...
  10. qlv转MP4(笨方法,大用途)
  11. NR 5G 入网流程
  12. linux redis自启动
  13. 关于ATSHA204a的使用流程
  14. 来自一个老码农的技术理想
  15. HDU - 1869 六度分离 (Floyd算法)
  16. 网络挖掘技术——微博文本特征提取
  17. 那些年淘汰的控件留下的坑!CrossWalk
  18. LabVIEW 设定NI-DAQmx通道的共享变量的轮询速率
  19. 十个酷炫的人工智能开源项目
  20. 西门子S7-200编程软件,触摸屏,电气原理图。 污水处理系统

热门文章

  1. smartprinter注册版_SmartPrinter下载 4.2 共享版
  2. 【转】将安全证书导入到java的cacerts证书库
  3. MessageQueue nativePollOnce 一个不一样的 ANR
  4. 东芝移动硬盘无法弹出密保,无法执行该软件,因为未启动需要的服务程序
  5. debian10编译安装mysql
  6. 语法分析——自下而上
  7. java软件工程师工作业绩_java软件工程师的工作描述怎么写
  8. android版wifi管家下载安装,腾讯WiFi管家最新版下载安装
  9. java 代码练习题_99个java练习题及答案
  10. 磁盘精灵linux,磁盘空间-逻辑卷