vp9协议梳理-header头文件

vp9协议梳理-header头文件

本文是对vp9视频码流中header中包含的语法元素的一个分类整理,及其对具体的解码过程的影响的分析。

1. Vp9码流中的header头文件


🐶Vp9码流中的一帧图像只有一个头文件,分为uncompressed_header(),和 compressed_header( )两种; 完整的解码函数参考协议第6章(参考资料【2】


  • 🐭uncompressed_header()中的头文件为图像大小,渲染大小,量化参数,参考帧的更新等等信息;这些信息未进行压缩,因此解码时直接从码流中读取即可;

  • 🐹compressed_header()中的头文件主要是vp9对码流解码时需要用到的概率表(概率表的作用参考这篇文章【1】)的参数;


🐰本文主要对uncompressed_header()的信息按解码顺序进行分析;


2. profile

🐺profile_low_bit : Profile的低bit位
🐸profile_high_bit :Profile的高bit位
请添加图片描述

3. show_existing_frame, frame_to_show_map_idx

🐯show_existing_frame: 直接将之前解码存储的图像输出,输出格式和profile一致(show_existing_frame为1,则uncompressed_header在解码完frame_to_show_map_idx后,该帧图像解码结束);

🐨frame_to_show_map_idx:输出索引frame_to_show_map_idx所对应的图像

4. frame_type, color_config(),frame_size(),render_size(),refresh_frame_flags,frame_context_idx

🐻frame_type : 1表示KEY FRAME(关键帧), 0表示非关键帧;

🐷关键帧的含义:该帧独立解码🐽色彩空间(color_config())🐮帧尺寸(frame_size( ))🐗渲染尺寸(render_size( )),且该帧必为帧内编码,存放帧间编码时用到的参考帧的参考槽,都将在解码后替换为该帧图像(refresh_frame_flags = 0xFF,🐵refresh_frame_flags对为1的bit位对应的参考槽进行替换); 且vp9进行解码用到的概率表(索引为frame_context_idx,,取值范围0~3, 🐒vp9解码时,会先加载frame_context_idx对应的概率表,解码过程会更新这些表)会被初始化恢复为协议的默认值;

5 . show_frame, only_intra

🐴show_frame:该帧图像是否被显示;

  • 0: 不被显示, 需要解码only_intra;
  • 1:被显示, only_intra = 0;

🐑Only_intra : 1:只支持帧内预测;0:帧内帧间预测都支持;

6. error_resilient_mode, reset_frame_context,frame_parallel_decoding_mode;


🐘reset_frame_contex:

  • 0 , 1 表示无操作
  • 2表示 对frame_context_idx所指向的概率表进行初始化
  • 3 表示对所有概率表进行初始化

🐤error_resilient_mode:错误鲁棒模式,该flag为1时,该帧可以独立与前面的帧进行编码,具体表现为:

  • 对所有概率表进行初始化;
  • 分段参考功能(segmentation)所用到的FeatureData和 FeatureEnabled清零;
  • ref_frame_sign_bias清零(帧间预测时只能后向参考)
  • loop_filter关于参考帧的一些变量的清零

🐛总之就是该帧可以独立于前帧进行解码,相关的变量将都被清零化初始化;


🐝frame_parallel_decoding_mode :

  • frame_parallel_decoding_mode = 1表示启用并行解码模式;
  • frame_parallel_decoding_mode = 0表示禁用并行解码模式。

🐜并行解码模式意味着概率不根据观察结果进行调整频率。


请添加图片描述

🐞如图所示,一帧结束后会根据各个语法元素出现的频率来更新概率表(参考资料【2】),但error_resilient_mode 或Frame_parallel_decoding_mode为1时,将不会更新概率表;


7. ref_frame_idx,ref_frame_sign_bias,frame_size_with_refs(),allow_high_precision_mv,read_interpolation_filter()


🐌这些是帧间预测会用到的一些配置变量, 帧间编码一般用到4个可选的参考帧,存放参考帧的参考槽往往有更多个;

🐙4个ref_frame_idx,指定帧间使用哪些参考帧。对应的ref_frame_sign_bias指定每个参考帧的运动矢量在时间上的预期方向。符号偏差等于0表示参考系是向后参考系;符号偏差等于1表示参考帧是向前参考。


🐟allow_high_precision_mv:

  • allow_high_precision_mv = 0指定运动矢量为1/4精度;
  • allow_high_precision_mv = 1指定运动矢量为1/8精度。

🐠比如像素点值为0, 相邻像素点1 , 按1/4像素移动, 就得到0.25这个值;


🐳read_interpolation_filter帧间预测用到的过滤器的配置;


🐋frame_size_with_refs:判断图像的frame_size直接选用参考帧的frame size,还是单独解码frame_size作为图像的尺寸信息


8. loop_filter_params( ), quantization_params( ),tile_info( ),header_size_in_bytes

🐬loop_filter_params( ),:环路滤波器的一些工作模式的配置
🐏quantization_params( ):反量化需要用的qp相关的参数
🐀tile_info( ):tile的划分大小
🐉header_size_in_bytes:uncompressed_header()在码流中所占的字符串长度;

9. segmentation_params()

🐐 vp9解码过程中采用了一种分段工作;将多组信息存储在数组FeatureData 中,数组FeatureEnabled表示FeatureData 中的信息是否有效;

🐓MAX_SEGMENTS默认为8,表示FeatureData多少组信息;
🐕segment_id表示该帧获取segment_id对应的FeatureData的信息;

🐖FeatureData 中包含的信息:

  • SEG_LVL_ALT_Q : Index for quantizer segment feature
  • SEG_LVL_ALT_L : Index for loop filter segment feature
  • SEG_LVL_REF_FRAME : Index for reference frame segment feature
  • SEG_LVL_SKIP: Index for skip segment feature
  • SEG_LVL_MAX: Number of segment features

🐊我们可以简单理解为,QP,环路滤波器(lpf),skp,和帧间编码的一些信息,这些信息在解码帧头文件的过程中存储了8组(MAX_SEGMENTS);编码时若该帧采用的这些对应配置信息和某组数据一样,则直接编码输出segment_id,解码端解码时只需要解码出segment_id就可以得到这些数据了,从而达到节省码流的目的;

10. 参考资料

【1】Vp9解码方式概述 – Parsing Process-CSDN博客
【2】VP9_Bitstream_Specification_v0.7_ORIGINAL.docx
【3】vp9协议笔记

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要打开mdk-arm头文件,您需要先安装MDK(Microcontroller Development Kit)软件。MDK是由Keil开发的一套用于ARM处理器的嵌入式开发工具。 安装MDK后,您可以按照以下步骤打开mdk-arm头文件: 1. 打开MDK软件,您将看到一个IDE(集成开发环境)界面。 2. 在顶部菜单栏中,找到“File”(文件)选项,点击它。 3. 在下拉菜单中,选择“Open”(打开)选项。这将弹出一个文件浏览器窗口。 4. 在文件浏览器窗口中,导航到存储mdk-arm头文件的文件夹。 5. 找到您要打开的mdk-arm头文件,并双击它。或者,选择文件后点击“打开”按钮。 6. MDK将打开您选择的mdk-arm头文件,并在IDE界面的编辑器窗口中显示其内容。 通过以上步骤,您可以打开mdk-arm头文件,并在MDK中进行编辑、查看或其他操作。请注意,mdk-arm头文件是用于ARM处理器的头文件,用于定义编程所需的常量、数据结构和函数等。因此,要正确地使用这些头文件,您需要熟悉ARM处理器的编程知识。 ### 回答2: 要打开mdk-arm头文件,首先需要在电脑上安装MDK-ARM软件。MDK-ARM是一款由ARM公司开发的嵌入式开发环境,用于编写和调试ARM处理器架构的应用程序。 安装完MDK-ARM软件后,可以在计算机上找到安装目录,一般默认是在C盘的Program Files文件夹下。在这个文件夹中,可以找到包含mdk-arm头文件的文件夹。 在这个文件夹中,你可以看到一些常用的头文件,如stdio.h、stdlib.h等。要打开mdk-arm头文件,可以选择其中的一个文件,比如stdio.h,鼠标右键单击该文件,然后选择使用文本编辑器(如Notepad++、Sublime Text等)打开。 另外,如果你想在MDK-ARM软件中直接查看mdk-arm头文件的内容,可以通过以下步骤进行操作: 1. 打开MDK-ARM软件。 2. 在软件界面中找到“Project”或“项目”选项,点击打开。 3. 在项目文件列表中找到mdk-arm头文件所在的项目文件夹,双击打开。 4. 在项目文件夹中,可以看到mdk-arm头文件的列表。 5. 双击打开任意一个mdk-arm头文件,就可以在MDK-ARM软件中查看和编辑该文件的内容了。 通过以上方法,你可以方便地打开和查看mdk-arm头文件的内容。 ### 回答3: 要打开mdk-arm头文件,首先需要安装mdk-arm开发环境。 1. 在Keil官方网站上下载mdk-arm开发环境的安装程序。 2. 运行安装程序并按照提示进行安装。安装程序会将mdk-arm的所有文件和头文件安装到指定的目录中。 3. 打开Keil软件,点击菜单栏的“File”(文件)选项,选择“Open”(打开)。 4. 在弹出的文件选择对话框中,浏览到mdk-arm环境的安装目录,并找到所需的头文件。 5. 选中要打开的头文件,点击“Open”(打开)按钮。 6. 头文件将在Keil软件的编辑器中打开,您可以在其中进行编辑和查看。 在打开mdk-arm头文件之前,建议您对mdk-arm开发环境有一定的了解,熟悉相关的编程语言和工具。这样有助于更好地理解和使用头文件中的功能和定义。您可以查阅mdk-arm的相关文档和资料,了解如何使用和配置mdk-arm开发环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值