(H264的NaluUnit组成,图片来自Apple)
如想实现HEVC解码,首先需要拿到视频的元数据,这就需要通过解析NALU类型为32(VPS_NUT),33(SPS_NUT),34(PPS_NUT)的NaluHeader来获取 。
举个最基本的例子,如果我们希望获取视频的宽高,则需要解析SPS_NUT的NaluHeader,并取sps->pic_width_in_luma_samples的值,以此类推 。
通常媒体开发会使用一个叫做StreamAnalyzer的工具(链接:-analysis/stream-analyzer)快速解析视频NaluHeader,我们要做的事其实和这个软件做的差不多:
(StreamAnalyzer解析NaluHeader示意)
可以看到,SPS_NUT的NaluHeader解析后的数据如截图右侧区域显示,感谢Elecard开发的这款好用的工具,有了它对我们实现VPS解析有很大帮助 。
观察Chromium的代码结构发现@JefferyKardatzke大佬已经于2020年底完成Linux平台VappiHEVC的硬解加速实现,和H265NaluParse的大部分逻辑实现,由于Linux平台硬解并不需要提取VPS参数,因为大佬没有实现VPS解析,但根据AppleDeveloper的说明,若我们使用CMVideoFormatDescriptionCreateFromHEVCParameterSetsAPI创建解码session,需要提供VPS,SPS,PPS三种类型的NaluData,因此实现macOS硬解的很大一部分工作即是完成VPSNALU的Header解析:
首先,参考T-REC-H.265-202108-I,以及FFMPEG定义好的H265RawVPSStructReference,我们需要定义好要解析的VPS结构体类型:
接着,我们需要完成H265VPS的解析逻辑:
完善编写UnitTest和FuzzerTest:
由于FFMPEG已经实现了VPS的解析逻辑,因此这里大部分逻辑与FFMPEG保持一致即可,经过UnitTest测试(编译步骤:autoninja-Cout/Release64media_unittests)确认无问题,对照StreamAnalyzer同样无问题后,完成VPS解析逻辑实现 。
这里跳过SPS,PPS,SliceHeader的解析逻辑,因为代码量过大且琐碎,感兴趣可参考h265_parser.cc(+/main:media/video/h265_parser.cc)
我们知道H264/HEVC视频帧类型大体上有三种:I帧,P帧,B帧,其中I帧又称全帧压缩编码帧,为整个GOP(一个存在了I,P,B的帧组)内的第一帧,解码无需参考其他帧,P帧又称前向预测编码帧,解码需要参考前面的I,P帧解码,B帧又称双向预测内插编码帧,解码需要参考前面的I、P帧和后面的P帧 。
一共存在的这三种帧,他们在编码时不一定会按顺序写入视频流,因此在解码时为了获取不同帧的正确顺序,需要计算图片的顺序即POC 。
(StreamEye解析后的GOPPOC结果示意)
如上图StreamEye解析结果所示,POC呈现:0->4->2->1->3->8->6...规律 。
不同帧的出现顺序对于解码来说至关重要,因此我们需要在不同帧解码后对帧按POC重新排序,最终确保解码图像按照实际顺序呈现给用户:0->1->2->3->4->5->6->7->8 。
苹果的VideoToolbox并不会给我们实现这部分逻辑,因此我们需要自行计算POC顺序,并在之后重排序,代码实现如下:
POC的计算逻辑:
计算POC并解码后,为了确保视频帧按照正确的顺序展示给用户,需要对视频帧进行Reorder重排序,我们可以观察H264的最大Reorder数计算逻辑,发现很复杂:
幸运的是HEVC相比H264不需要如此繁杂的计算,HEVC在编码时已经提前将最大Reorder数算好了,我们只需按如下方式获取:
计算好Reorder数和POC后,继续复用H264的Reorder逻辑,即可正确完成排序 。
下面我们正式开始解码逻辑实现,首先,需要提取SPS/PPS/VPS,并对其解析,缓存:
根据解析后的VPS,SPS,PPS,我们可以创建解码Format:
(VideoToolbox的解码流程,图片来自Apple)
在创建解码Format后,继续创建解码Session:
创建解码Session的逻辑:
这一步开始我们就要开始正式解码了,解码前首先需要提取视频帧的SliceHeader,并从缓存中拿到到该帧引用的SPS,PPS,VPS,计算POC和最大Reorder数 。
推荐阅读
- 逆战老兵回归礼包2022三月 逆战老兵回归礼包2022
- 广州琶洲展会2022年展会时间表图片 广州琶洲展会2022年展会时间表
- 2022年无烟日宣传主题是什么 2022年无烟日宣传主题
- 2月汽车销量排行榜2022suv 2月汽车销量排行榜2022完整版
- 小升初语文必考知识点归纳2022人教版试卷 小升初语文必考知识点归纳2022人教版
- 女生体重身高标准表计算公式 女生体重身高标准表2022
- 食品安全法实施条例2022健康证 食品安全法实施条例2022全文
- 2022年5月国债发行时间公告 最新 2022年5月国债发行
- 深圳市平均工资标准2022年的三倍 深圳市平均工资标准2022年
- 杭州招聘信息最新招聘信息查询 杭州招聘信息最新招聘2022