分析奇特的avcC原子结构

Analyze peculiar avcC atom structure

我需要一些帮助来理解我正在尝试分析的特定 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 header,atom的总长度是56字节(0x38),这意味着应该包括以下4个字节:FD F8 F8 00

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

然后是colr原子的header:

00 00 00 13 颜色原子的大小

63 6F 6C 72 colr 签名

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

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

您可以找到示例 here

编辑

来自 bento4 套件的

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

mp4dump报告:

AVC SPS: [6764001facd9805005bb016a02020280000003008000001e078c18cd]

AVC PPS: [68e97b2c8b]

因此它根据在 avcC header 中找到的内容正确地将原子的总大小报告为 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 = bits 111111 保留,剩余01表示色度子采样4:2:0

F8 = bits 11111被保留,剩余的000表示luma位深为8

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

00 = 零个 SPS 扩展