分析奇特的avcC原子结构

问题描述

我需要一些帮助来理解我试图分析的特定 mp4 样本的 avcC 原子结构。

十六进制转储:

00 00 00 38 61 76 63 43 01 64 00 1F FF E1 00 1C 67 64 00 1F AC D9 80 50 05 BB 01 6A 02 02 02 80 00 00 03 00 80 00 00 1E 07 8C 18 CD 01 00 05 68 E9 7B 2C 8B FD F8 F8 00 00 00 00 13 63 6F 6C 72

以上是我的理解:

00 00 00 38 avcC 原子的大小

61 76 63 43 avcC 签名

01 配置版本

64 AVCProfileIndication

00 profile_compatibility

1F AVCLevelIndication

FF 111111b + lengthSizeMinusOne

E1 111b + numOfSequenceParameterSets(在本例中为 1 SPS)

00 1C SPS 长度(在本例中为 28 字节)

67 64 00 1F AC D9 80 50 05 BB 01 6A 02 02 02 80 00 00 03 00 80 00 00 1E 07 8C 18 CD SPS 数据(如上所述 28 字节)

01 numOfPictureParameterSets(在本例中为 1 PPS)

00 05 PPS 长度

这就是问题开始的地方。根据前面字节给出的 PPS 长度,接下来的 5 个字节应该是 PPS 数据:68 E9 7B 2C 8B

但是根据avcC头,atom的总长度是56字节(0x38),也就是说应该包括以下4个字节:FD F8 F8 00

但问题是 PPS 长度为 5 个字节 (0x05)。那么这最后的 4 个字节到底是什么?

然后是 colr 原子的头部:

00 00 00 13 颜色原子的大小

63 6F 6C 72 颜色签名

我已经检查过,长度确实是 19 个字节 (0x13)。

问题出在 avcC atom 和我正在分析的那个特定的 mp4 样本上(我也检查了其他样本,但它们没有这种特性)。

您可以找到示例 here

编辑

Bento4 套件中的

mp4info 工具将以下内容报告为 avcC 原子的大小:8+48

还有 mp4dump 报告:

AVC SPS: [6764001facd9805005bb016a02020280000003008000001e078c18cd]

AVC PPS: [68e97b2c8b]

因此它根据在 avcC 标头中找到的内容正确报告原子的总大小为 56 字节 (0x38),但 SPS/PPS 数据的分析方式与上述相同。我仍然不明白最后 4 个字节是什么或者它们属于哪里。

解决方法

我没有得到任何答案,但幸运的是对 ISO 14496-15 的仔细阅读解决了这个问题:

if( profile_idc == 100 || profile_idc == 110 ||
    profile_idc == 122 || profile_idc == 144 )
{
   bit(6) reserved = ‘111111’b;
   unsigned int(2) chroma_format;
   bit(5) reserved = ‘11111’b;
   unsigned int(3) bit_depth_luma_minus8;
   bit(5) reserved = ‘11111’b;
   unsigned int(3) bit_depth_chroma_minus8;
   unsigned int(8) numOfSequenceParameterSetExt;
   for (i=0; i< numOfSequenceParameterSetExt; i++) {
      unsigned int(16) sequenceParameterSetExtLength;
      bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
   }
}

显然,根据所使用的配置文件,在 avcC 原子的末尾可能存在 4 个以上的字节序列。在我上面的示例中,配置文件是 100 (0x64),因此它符合条件。所以最后4个字节是:

FD = 位 111111 保留,剩余 01 表示色度子采样 4:2:0

F8 = bits 11111 保留,剩余 000 表示亮度位深度为 8

F8 = 位 11111 保留,剩余 000 表示色度位深度为 8

00 = 零 SPS 扩展