toruのブログ

月1くらいで記事書きたい。

MP4 コンテナに収納された H.264 ファイルの色情報に関する調査

1. 背景

  • Google Chrome での動画再生のカラーマネジメントに関する調査をしたい
  • 検証用のテストパターンとして「MP4 コンテナに収納した H.264 の動画」を使用する予定である
  • しかし筆者は MP4 コンテナに収納された H.264 ファイルの色情報(※1)がどこに保存されるのか理解していなかった
  • そのため動画ファイルの色情報の保存場所について調査を行うことにした

※1 本記事において色情報は以下の3つの情報を意味する。

  • Color primaries
  • Transfer characteristics
  • Matrix coefficients

2. 目的

  • MP4 コンテナに収納された H.264 ファイルの色情報がどこに保存されるか調べる

3. 結論

MP4 コンテナに収納された H.264 ファイルの色情報は以下の2箇所に保存される。

  • (a) MP4 コンテナの 'moov' コンテナの 'colr' ボックス
  • (b) H264 の NAL の SPS の VUI

色情報が2箇所に保存されることが判明したので、Google Chrome がどちらの情報を参照するのか追加調査をした。 その結果、Google Chromeカラーマネジメント用に参照するのは (b) の VUI であり (a) の値は無視されることを確認した。

4. 詳細

4.1. 3種類の色情報の簡単な説明

冒頭で述べたとおり、本記事で扱う色情報は Color primaries, Transfer characteristics, Matrix coefficients の3種類である。 これらは動画ファイルの中で 2 Byte の数値データとして扱われる。それぞれの情報の意味を簡単に説明しておく。

  • Color primaries
    • R, G, B, W の色情報を意味する
    • 具体的な設定値の例を図1に示す。この図は Report ITU-R BT.2380-2[1] の Table 2.6 の一部である

f:id:takuver4:20210101102839p:plain
図1 Color primaries の例

  • Transfer characteristics
    • 伝達特性を意味する
    • 具体的な設定値の例を図2に示す。この図は Report ITU-R BT.2380-2[1] の Table 2.7 の一部である

f:id:takuver4:20210101102901p:plain
図2 Transfer characteristics の例

  • Matrix coefficients
    • RGB to YCbCr 変換に使用した Matrix の係数の情報を意味する
    • 具体的な設定値の例を図3に示す。この図は Report ITU-R BT.2380-2[1] の Table 2.8 の一部である

f:id:takuver4:20210101102925p:plain
図3 Matrix coefficients の例

4.2. MP4 コンテナと色情報

MP4コンテナに H.264 のバイトストリームデータや各種メタデータなどを格納できる。 ここでは MP4コンテナにメタデータとして保存できる色情報の詳細について述べる。

MP4コンテナは ISO Base Media File Format を拡張して作られたものである[2]。 MP4コンテナに保存できる色情報の詳細は、拡張元の ISO Base Media File Format で定義されている[3]。

具体的には 'colr' Box に情報が保存される。MP4Box.js のサイト[4]で実際のデータを表示した様子を図4 に示す。

f:id:takuver4:20210101105815p:plain
図4 MP4コンテナの色情報の例 (MP4Box.js を利用)

4.3. H264 のバイトストリームと色情報

MP4コンテナに格納された H.264のバイトストリームにも色情報は保存されている。具体的には NAL の SPS の VUI に保存される[5]。 h264-bitstream-viewer[6] を利用して VUI の情報を表示した例を図5 に示す。

f:id:takuver4:20210101132154p:plain
図5 h264-bitstream-viewer を利用して VUI を表示した例

4.4. Google Chrome では 'colr' と VUI のどちらが参照される?

色情報が保存される場所が2箇所だったので、どちらの情報が Google Chrome で使用されるのか確認した。 以下の表に示す通り2パターンの検証用ファイルを作成して確認した。

検証パターン1 検証パターン2
'colr' の情報 BT.709 (SDR) BT.2020 (HDR)
VUI の情報 BT.2020 (HDR) BT.709 (SDR)
Chrome で参照された情報 BT.2020 (HDR) BT.709 (SDR)

上記の結果より、VUI の情報が参照されることが確認できた。

検証に使用した動画データは以下の通り。

drive.google.com

5. 【参考】FFmpeg で MP4 コンテナに色情報を埋め込む方法

FFmpegエンコードする場合 -movflags write_colr を設定する必要がある[要出典]。このオプションが無い場合は VUI にしか情報が埋め込まれないので注意。 今回の検証では以下のようにエンコードを行った。

ffmpeg -color_primaries bt709 -color_trc bt709 -colorspace bt709 -r 24 -i input_png_seq_%4d.png -c:v libx264 -movflags write_colr -pix_fmt yuv444p -qp 0 -color_primaries bt709 -color_trc bt709 -colorspace bt709 output.mp4 -y

6. 感想

  • 2~3日で調査が終わるかと思ってたのだが、予想以上に時間がかかってしまった。
  • H264のパーサーを作っている人は凄いと思った。自分には無理ゲーだったので公開されているのを使わせて頂いた

7. 参考資料

[1] Report ITU-R BT.2380-2, "Television colorimetry elements", https://www.itu.int/dms_pub/itu-r/opb/rep/R-REP-BT.2380-2-2018-PDF-E.pdf

[2] Wikipedia(English), "MPEG-4 Part 14", https://en.wikipedia.org/wiki/MPEG-4_Part_14

[3] ISO/IEC 14496‐12:2015, "Information technology — Coding of audio-visual objects — Part 12: ISO base media file format", https://standards.iso.org/ittf/PubliclyAvailableStandards/

[4] MP4Box.js, "ISOBMFF Box Structure Viewer", https://gpac.github.io/mp4box.js/test/filereader.html

[5] Recommendation ITU-T H.264, "Advanced video coding for generic audiovisual services", https://www.itu.int/rec/T-REC-H.264

[6] h264-bitstream-viewer, https://mradionov.github.io/h264-bitstream-viewer/