JSVM9_19中class AccessUnit解释说明(待续)
来源:互联网 发布:画线工具源码 编辑:程序博客网 时间:2024/06/02 02:35
首先关于SVC中的AccessUnit概念定义可以参考SVC标准以及在paper “System and Transport Interface of SVC”中有详细的描述。
class AccessUnit 是JSVM9_19代码中数据结构。类图如下:
其中一个重载的构造函数是我为了调试测试方便所写的一个拷贝构造函数。
基本处理过程:从SVC编码文件的byte stream中读取属于同一个AccessUnit的NALU,将这些NALU存放在一个list里面,然后再循环处理每一个NALU,处理完后,系统再处理下一个AceessUnit。
m_bEndOfStream:表明整个byte stream码流是否结束。当处理完了字节流中最后一个AccessUnit所包含的最后一个NALU后,会将m_bEndOfStream设置为true,其他为false。
m_bComplete:解码是按照AccessUnit为单位进行的,该变量表示一个AccessUnit是否处理完成。一种情况当m_bEndOfStream=true的时候,此时由于没有数据要处理,m_bComplete也设置为true。另一种情况是当获取了一个AccessUnit中的所有NALU后,m_bComplete设置为true,然后开始处理里面的每一个NALU,全面处理完后,再将m_bComplete设置为false,开始处理下一个AccessUnit。
m_cNalUnitList:该list保存属于同一个AccessUnit的所有NALU。处理流程是,获取一个AccessUnit的所有NALU到该list,然后从list的0到size-1处理每个NALU,处理的方法是把该NALU数据从list的队首中remove出来,单独保存后再处理,list内容减少一个。直到全部remove并处理完。对于该成员变量需要注意两点:
(1) 对于Prefix NALU,由于其特殊性,也做了特殊处理,将其与其对应的AVC NALU合并到了一个数据结构中,在其AVC NALU的数据结构中可以通过一个指针变量访问到其Prefix NALU中的码流数据。所以在list中,处理的时候,遇到Prefix NALU后先临时的放到list中,如果下一个获取的是AVC NALU(不考虑丢包的情况下总是这样),就认为前面获取的就是其Prefix,然后合并到AVC NALU的数据结构中。
(2) 在remove处理完m_cNalUnitList中所有的NALU后,该list并不空(除非处理的是最后一个AccessUnit),会保存下一个AccessUnit结构中的第一个NALU数据。
m_cStartOfNewAccessUnit:该list保存下一个AccessUnit中的起始NALU,开始为null,当当前AccessUnit获取所有NALU完成后,该成员变量就已经保存了下个AccessUnit的所有起始NALU。当当前AccessUnit处理完后,该list又重新为null。
为什么使用一个list,而不是一个单独的NALU结构呢?猜测应该是因为一些NonVCL Unit的存在,该list的目的应该是保存下一个AccessUnit中起始NALU,包括各种NonVCl Unit,直到第一个Slice Unit(包含VCL数据的NALU)。
m_pcLastVCLNALUnit:开始为空,当当前AccessUnit获取所有NALU完成后,该变量内容是本AccessUnit中最后一个VCLNALU。,当当前AccessUnit处理完后,该变量又为空。
m_pcLastPrefixHeader:AccessUnit在获取其所包含的NALU的时候,包括获取下一个AccessUnit的起始NALU,如果获取的NALU单元为Prefix类型,此时会将该Prefix类型的NALU临时存放到m_cNalUnitList中,同时将该单元的头数据赋值给该成员变量。若AccessUnit读取的下一个NALU为AVC NALU,则把存放在m_cNalUnitList的Prefix NALU数据合并到该AVC NALU,同时从list中去除Prefix NALU,也同时将该变量m_pcLastPrefixHeader赋值为空。
m_pcLastSliceHeader:AccessUnit对应的下一个AccessUnit中的第一个片头数据。当当前AccessUnit获取需要的NALU(自己所包含的和下一个AU开始的)完成后,生成该数据,当前AU的所有NALU处理完后,该数据不变,直到被一个AU的该数据所覆盖。
(待续)
- JSVM9_19中class AccessUnit解释说明(待续)
- jsvm9_19中BufferParameters参数解释
- uboot中.balig解释说明
- c++ 中extern的基本解释说明(VC代码)
- c++ 中extern的基本解释说明(VC代码)
- liunx常用的命令详细解释 (未完待续)
- androidstudio中各种gradle配置解释说明
- Android中手机开发者选项解释说明
- metasploit中msfvenom命令解释说明
- androidstudio中各种gradle配置解释说明
- Cocos2d游戏中Class类说明
- Cocos2d-x中Class的说明
- java中static修饰class说明
- mui-class说明(持续更新中~~)
- Java中abstract class 和 interface 的解释和他们的异同点(转)
- Java中abstract class 和 interface 的解释和他们的异同点(转)
- Java中abstract class 和 interface 的解释和他们的异同点(转)
- Java中abstract class 和 interface 的解释和他们的异同点(转)
- 新手
- 解决SP2010的CQWP匿名访问时SetDocumentIconUrlAndOnClickString方法错误
- 《C#编程之道》 之 如何将前台线程改为后台线程
- PL/SQL 11g R2 —— 异常处理
- ha!!!
- JSVM9_19中class AccessUnit解释说明(待续)
- Xshell 使用技巧
- ubuntu桌面创建网页的快捷方式
- 生活在继续....工作刚开始....
- JavaScript对象模型-执行模型
- 枚举enum学习小记
- 系统排错
- 查看数据库中的错误
- Java从入门到精通 - IO输入输出