余温|SEI那些事儿,FFmpeg从入门到精通——进阶篇( 二 )


H.265/HEVC中的情况《ISO/IEC23008-2:2015》是MPEG专家组为HEVC编解码器制定的标准 , H.265/HEVC中NALunit类型完整定义都在该标准的7-1表中 , 可用的NALunittype一共有40种之多 , 其中39和40都表征SEI内容 。 因为标准一共预留64种类型 , 所以在NALheader里面 , 用6bits表征NALunittype 。
如上图所示 , 在16bits的NALheader中:
1.第0位是禁止位0 , 值为1时表示语法出错
2.第1~6位是NALunittype
3.第7~12位是NUHlayerid
4.第13~15位是temporal_id
SEI类型在H.264/AVC视频编码标准中 , 并没有规定SEIpayloadtype的范围 , 所以表征payloadtype的字节数是浮动的 。
语法分析如下所示 , 当开始解析类型为SEI的NAL时 , 持续读取8bit , 直到非0xff为止 , 然后把读取的数值累加 , 累加值即为SEIpayloadtype 。
当前《ISO/IEC14496-10:2014》AnnexD.1.1提供了最大到181的payload类型处理规范 , 由于类型可以指定任意大小 , 给SEI的添加、处理创造了很大的自由空间 。
其中SEIpayload类型值为5时 , 指定的处理方法叫user_data_unregistered() , 字面含义为未注册的用户数据 , 常用于存储编码器的编码参数信息 , 是比较常见的payload类型 。
读取payloadtype为5时 , 具体的语法解析流程如下:
通过user_data_unregistered()语法解析可以看出 , 当使用SEIpayloadtype为5时 , 注意事项如下:
1.payloadsize应该大于16;
2.uuid可能出现0x000000/0x000001/0x000002 , 需要插入0x03做防竞争处理;
构成RBSP时 , 都需要做RBSP拖尾处理 。 拖尾处理对所有SODB方式都一致 。 rbsp_trailing_bits()语法逻辑如下:
NALheader
起始码(暗红底色)"0x00000001"分割出来的比特流即是NALunit , 起始码紧跟的第一个字节(墨绿底色)是NALheader 。 上图“NALheader”一共出现了四个数值:
·"0x06" , 此时NRI为"00B" , NALunittype为SEI类型 。
·“0x67” , 此时NRI为“11B” , NALunittype为SPS类型 。