blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2022.07.19 技術記事

動画エフェクト負荷を大きく軽減した HEVCPlayerView 詳解

by Hironori Bono

#hevcplayerview #h265 #videotoolbox #quicktime

ソフトウェアエンジニアの坊野です。 この blog では、先日 GitHub で公開された HEVCPlayerView について説明させていただきます。

背景

Pococha は DeNA が提供しているライブコミュニケーションアプリです。 Pococha は動画配信時に様々な動画エフェクトを表示しています。 この動画エフェクトは配信画像の上にエフェクト画像を合成することによって実装されています。 Overlay Effect

しかし、この "動画エフェクトが重い" というご意見を多くのユーザからいただいたため、私たちはこの動画エフェクト表示部分の負荷について詳しく調査しました。 その結果、以下の処理の負荷が高くなっていました。

  • 動画ファイル1 のデコード
  • 動画ファイル1 の読み込み

当時 Pococha の動画エフェクトは 2 個の動画ファイル1 で構成されていました。 Pococha は動画エフェクト表示時にこれら 2 個の動画ファイル1 に対して以下の処理を行っていました。

  1. 2 個の動画ファイル1 を同時に読み込む
  2. 2 個の動画ファイル1 を同時にデコード
  3. デコードされた 2 個の画像を Metal を用いて合成
Alpha Composition

Pococha は動画エフェクト表示時に動画の配信も行っています。 つまり、Pococha は動画エフェクト表示時に 2 個の動画デコード処理と 1 個の動画エンコード処理を同時に行っていました。 Pococha はこれら複数の処理を同時に行っていたため iPhone 端末の負荷が動画エフェクト表示時 (1/30 秒に 1 回) に急上昇していました。

また iPhone 端末のストレージは暗号化されているため、動画ファイル1 読み込み時に暗号化を解除する処理が必要になります。 iPhone 端末は動画ファイル1 の読み込み (および暗号化解除処理) を自動的に実装するため Pococha はこれらの処理を制御できませんでした。 このため、動画ファイル1 の読み込み処理の有無により動画エフェクト表示時の iPhone 端末の負荷が変化することが確認されました。

これらの問題を解決するため、私たちは Pococha の動画エフェクト表示部分を再実装することにしました。 新しい動画エフェクト表示部分は上記の問題を根本的に解決する必要があるためため、私たちは Pococha の既存実装の改良ではなく新しい技術を用いて再設計することにしました。

HEVC Video with Alpha は alpha チャネルに対応した拡張 H.265 フォーマットです。 HEVC Video with Alpha を用いればエフェクト再生時に読み込む動画ファイルの個数を 2 個から 1 個に変更できます。 また、動画ファイルのデコード処理の回数も 2 回から 1 回に変更できます。

Video ToolboxiPhone 端末や Mac の動画デコーダ (ハードウェア) を直接制御する API です。 PocochaAVAssetReader クラスを用いて動画ファイルの読み込み処理およびデコード処理を行っていました。 しかし AVAssetReader クラスは URL で記述可能な動画ファイルしかデコードできません。 このため、メモリ上の動画データなど URL で記述不可能なものをデコードすることはできません。 一方 Video Toolbox を用いるとメモリ上の HEVC Video with Alpha データのデコードも可能です。 つまり、動画エフェクト表示開始前に HEVC Video with Alpha ファイルをメモリに読み込んだ後 Video Toolbox を用いて HEVC Video with Alpha データをデコードすれば動画エフェクト表示時の動画ファイル読み込み処理をなくすことができます。

しかし、これらの技術を採用するためには以下の問題を解決する必要がありました。

当時 HEVC Video with Alpha に関する資料は WWDC 2019 の発表資料 および HEVC Video with Alpha のサンプルアプリケーション しか存在しませんでした。 残念ながら、これらの資料のみを利用して Video Toolbox を用いた HEVC Video with Alpha デコーダを開発することは私たちには困難でした。 このため、私たちはサンプル HEVC Video with Alpha ファイルを解析し HEVC Video with Alpha に対する理解を深めることから始めました。

PocochaHEVC Video with Alpha を採用するためには HEVC Video with Alpha デコーダだけでなく HEVC Video with Alpha 対応エンコーダも必要でした。 この問題を解決するため、私たちは Pococha の動画ファイルを HEVC Video with Alpha に変換するアプリケーションを開発することにしました。 この変換アプリケーションは AVAssetReader クラスを用いて Pococha の動画ファイルを読み込み、合成したあと AVAssetWriter を用いて HEVC Video with Alpha ファイルを作成する MacOS アプリケーションです。 さらに FFmpeg への Commit により MacOSFFmpeg を用いた HEVC Video with Alpha ファイル作成も可能にしました。

これらの準備作業の後、私たちは Pococha の新しいエフェクト再生部分 (HEVCPlayerView) の実装を開始しました。 この新しいエフェクト再生部分は主に 3 個の処理で構成されています。

  • HEVC Video with Alpha デコード処理
  • デコード画像の表示処理
  • 再生制御 (再生・停止など) 処理

HEVC Video with Alpha デコード処理は HEVC Video with Alpha ファイルを解析し Video Toolbox を用いでデコードする処理です。 この HEVC Video with Alpha デコード処理は高速に動作する必要があります。 このため、この HEVC Video with Alpha デコード処理部分はすべて (かなり C 言語に近い) C++ 言語 4 で記述されています。 また、軽量化のため Pococha が利用する HEVC Video with Alpha ファイルの再生に必要な最低限の機能のみ実装されています。

デコード画像の表示処理は HEVC Video with Alpha デコード処理によって出力された画像を iPhone 端末の画面に描画する処理です。 Pococha はエフェクト画像の表示処理として Metal を利用していました。 MetaliPhone 端末において最も高速に画面描画可能な API の一つです。 Pococha のエフェクト再生処理を解析においてもこの部分の負荷は十分低い状態でした。 このことや後方互換制を考慮した結果、私たちは Pococha の既存のエフェクト表示処理を改良することにしました。

再生制御 (再生・停止など) 処理についても同様にPococha の既存の処理を改良することにしました。

この新しいエフェクト再生部分は Pococha に統合されてリリースされました。 リリース後の私たちの計測では Pococha のエフェクト再生時負荷が 10% 以上減少しました。 また iPhone 端末の発熱も 50% 以上軽減されました。

この新しいエフェクト再生部分は私たちの予想を超える負荷軽減を達成したため、私たちはこの新しいエフェクト再生部分を HEVCPlayerView として公開することにしました。 さらに、私たちは HEVCPlayerView 開発の際に得られた知識も本 blog で公開することにしました。

本 blog は HEVCPlayerView 開発に必要な以下の技術の概要を説明します。

HEVC Video with Alpha ファイルの構造では HEVC Video with Alpha のサンプルデータを用いてその具体的な構造を説明します。

HEVC Video with Alpha ファイルのデコードでは Video Toolbox を用いた HEVC Video with Alpha ファイルのデコード方法について HEVCPlayerView の実装5を用いて説明します。

1. 具体的には H.2642 でエンコードされた MP43 ファイルです。
2. ITU-T H.264 - Advanced video coding for generic audiovisual services
3. ISO/IEC 14496-14:2003 Information technology — Coding of audio-visual objects — Part 14: MP4 file format (いわゆる ".mp4 ファイル")
4. 一応 C++ 言語なのですが、最新の C++ 言語の機能をほとんど利用していないため、かなり C 言語に近いものになっています。 5. HEVCPlayerViewH.265 データストリームの解析も行っていますが、その部分に関する説明は省略します。

HEVC Video with Alpha ファイル

この章では HEVC Video with Alpha ファイルの概要を説明します。

HEVC Video with Alpha

HEVC Video with Alpha は画像のカラーだけでなく画素の透明度1 もエンコード可能な拡張 H.2652 フォーマットのことです。 HEVC Video with AlphaH.2652 のレイヤー拡張機能を用いて実装されています。 このレイヤー拡張機能とは H.2652 規格書の Annex F で定義されている H.2652 の拡張機能です。 このレイヤー拡張機能を用いた H.265 ストリーム2の各フレーム画像は複数の画像 (レイヤー) で構成されています。 具体的にいえば HEVC Video with Alpha ファイルの各フレーム画像は YUV カラー画像レイヤーと alpha 画像レイヤーの 2 個のレイヤーで構成されています。 Layer

レイヤー拡張機能に対応した H.2652 デコーダはこれらのレイヤー画像を合成してフレーム画像を出力します。 iOSH.265 デコーダ (ハードウェア) は iOS 13 以降 HEVC Video with Alpha に対応しています。 (また MacOSH.2652 デコーダ (ハードウェア) は MacOS 10.15 以降 HEVC Video with Alpha に対応しています。) このため、現在の iPhoneMac はハードウェアで高速に HEVC Video with Alpha ファイルの各レイヤー画像をデコードおよび合成してフレーム画像を出力することができます。 なお、このレイヤー拡張機能は H.2652 の標準機能ではないため非対応の H.2652 デコーダも多いです。 とはいえ HEVC Video with Alpha ファイルの YUV カラー画像レイヤーは通常の H.2652 ファイルのものと互換性があります。 つまり FFmpeg など HEVC Video with Alpha に対応していない H.2652 デコーダでも YUV カラー画像のみのデコードは可能です。

QuickTime

H.2652 (HEVC Video with Alpha) は動画の圧縮フォーマットです。 このため H.2652 (HEVC Video with Alpha) で圧縮された動画データをファイルとして配布する場合、通常 MP43QuickTime, WebM, Matroska などの "コンテナ" と呼ばれるフォーマットを利用します。 HEVC Video with Alpha ファイルはコンテナフォーマットとして QuickTime4 を利用しています。 簡単にいえば HEVC Video with Alpha ファイルは拡張子 .movQuickTime ファイルということです。

1. "Alpha 画素" と呼ばれます。
2. ITU-T H.265 - High efficiency video coding
3. ISO/IEC 14496-14:2003 Information technology — Coding of audio-visual objects — Part 14: MP4 file format (いわゆる ".mp4 ファイル")
4. MP42QuickTime を基にして作成されました。このため MP42QuickTime は互換性があります。

HEVC Video with Alpha サンプルデータ

以後、本 blog では以下の HEVC Video with Alpha サンプルデータ を用いて説明します。 このサンプルデータは AVAssetWriter を利用して作成された HEVC Video with Alpha ファイルの一部を抜粋したものです。

00000000: 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00  ....ftypqt  ....
00000010: 71 74 20 20 00 00 00 08 77 69 64 65 00 0B 72 69  qt  ....wide..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A  mdat....&....4+*
00000030: AA 89 A6 9A 70 55 F0 AD 8F EF 51 5E 4B DD 88 EA  ....pU....Q^K...
00000040: 8A 08 24 33 D6 C8 FD E0 9A 00 00 7A 80 01 1B 64  ..$3.......z...d
00000050: 22 4C 12 30 00 AA 80 A3 15 3F 16 4D 00 00 3D 40  "L.0.....?.M..=@
00000060: 00 71 80 05 D8 00 08 48 2D 5E A8 28 0F 68 93 00  .q.....H-^.(.h..
                               (中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02  .....> .q.......
000B7280: A6 03 CA 05 C4 00 00 0A 0D 6D 6F 6F 76 00 00 00  .........moov...
000B7290: 6C 6D 76 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5  lmvhd.....d...d.
000B72A0: D8 00 00 02 58 00 00 09 60 00 01 00 00 01 00 00  ....X...`.......
000B72B0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00  ................
000B72C0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00  ................
000B72D0: 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00  .........@......
000B72E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B72F0: 00 00 00 00 00 00 00 00 02 00 00 09 99 74 72 61  .............tra
000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5  k...\tkhd.....d.
000B7310: B3 DC 64 B5 D8 00 00 00 01 00 00 00 00 00 00 09  ..d.............
000B7320: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  `...............
000B7330: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7340: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00 00 00 00  .@....h.........
000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00  Dtapt....clef...
000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F  ..h..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00  f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00  .enof.....h.....
000B73A0: 00 00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73  ....$edts....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00  t...........`...
000B73C0: 00 00 01 00 00 00 00 08 CD 6D 64 69 61 00 00 00  .........mdia...
000B73D0: 20 6D 64 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5   mdhd.....d...d.
000B73E0: D8 00 00 02 58 00 00 09 60 55 C4 00 00 00 00 00  ....X...`U......
000B73F0: 31 68 64 6C 72 00 00 00 00 6D 68 6C 72 76 69 64  1hdlr....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F  eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F 00 00  re Media Video..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00  .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64  ...@.........8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70  lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20  pl.........Core 
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C  Media Data Handl
000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72  er...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al
000B7490: 69 73 00 00 00 01 00 00 07 FC 73 74 62 6C 00 00  is........stbl..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00  .0stsd..........
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00  . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68  ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01  ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00  .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00  ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00  ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60  .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF  ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00  ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03  ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33  ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01  .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02  `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD  ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05  2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00  2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 00 00  .N..............
000B75D0: 00 18 73 74 74 73 00 00 00 00 00 00 00 01 00 00  ..stts..........
000B75E0: 00 78 00 00 00 14 00 00 03 B8 63 74 74 73 00 00  .x........ctts..
000B75F0: 00 00 00 00 00 75 00 00 00 01 00 00 00 00 00 00  .....u..........
000B7600: 00 01 00 00 00 3C 00 00 00 01 00 00 00 00 00 00  .....<..........
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00  ................
                               (中略)
000B7980: 00 01 00 00 00 00 00 00 00 01 FF FF FF D8 00 00  ................
000B7990: 00 01 FF FF FF EC 00 00 00 01 00 00 00 00 00 00  ................
000B79A0: 00 20 63 73 6C 67 00 00 00 00 00 00 00 28 FF FF  . cslg.......(..
000B79B0: FF D8 00 00 00 3C 00 00 00 00 00 00 09 60 00 00  .....<.......`..
000B79C0: 00 20 73 74 73 73 00 00 00 00 00 00 00 04 00 00  . stss..........
000B79D0: 00 01 00 00 00 1F 00 00 00 3D 00 00 00 5B 00 00  .........=...[..
000B79E0: 00 84 73 64 74 70 00 00 00 00 20 10 10 18 18 10  ..sdtp.... .....
000B79F0: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A00: 10 18 18 10 10 18 18 18 20 10 10 18 18 10 10 18  ........ .......
000B7A10: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A20: 18 10 10 18 18 18 20 10 10 18 18 10 10 18 18 10  ...... .........
000B7A30: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A40: 10 18 18 18 20 10 10 18 18 10 10 18 18 10 10 18  .... ...........
000B7A50: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A60: 18 18 00 00 00 1C 73 74 73 63 00 00 00 00 00 00  ......stsc......
000B7A70: 00 01 00 00 00 01 00 00 00 1E 00 00 00 01 00 00  ................
000B7A80: 01 F4 73 74 73 7A 00 00 00 00 00 00 00 00 00 00  ..stsz..........
000B7A90: 00 78 00 00 01 7C 00 00 23 D3 00 00 0E 2F 00 00  .x...|..#..../..
                               (中略)
000B7C60: 00 5A 00 00 00 56 00 00 00 55 00 00 00 55 00 00  .Z...V...U...U..
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00  .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この HEVC Video with Alpha サンプルデータQuickTime Atoms の階層的な構造になっています。

これらの QuickTime AtomsHEVC Video with Alpha サンプルデータ 上に合成表示すると以下のようになります。

QuickTime Atoms

QuickTime の整数

QuickTime は整数を 1, 2, 4, 8 バイトのデータで記述します。 また、データの順序は最大バイト先頭順 (Most Significant Byte First Order)1 です。 たとえば 32 ビット整数 データ 01 02 03 04 は 0x01020304 = 16909060 を意味します。

1. いわゆる "ビッグエンディアン" のことです。

QuickTime の FourCC

QuickTimeQuickTime Atoms の識別子などに 4 個の ASCII アルファベットコードで構成された 32 ビット整数 を用います。 一般にこれらの 32 ビット整数FourCC (Four Character Code) と呼ばれます。 FourCC32 ビット整数 ですが、可読性を考慮して文字列表記が通常用いられます。 たとえば FourCC データ 61 62 63 64 は 0x61626364 = 1633837924 ではなく "abcd" と表記されます。 本 blog も FourCC に対しては文字列表記を用います。

QuickTime の言語コード

QuickTime は言語コードを ISO 639-2 の言語コードから変換された 16 ビット整数 で記述します。 この ISO 639-2 の言語コードから QuickTime の言語コードへの変換方法を C 言語で記述すると以下のようになります。 (詳しい説明は QuickTime File Format Specification - Language Code Values を参照してください。)

void QuickTimeToISO639(uint32_t quicktime_language_code,
                       char* iso639_language_code) {
  iso639_language_code[0] = 0x60 + ((quicktime_language_code >> 10) & 0x1f);
  iso639_language_code[1] = 0x60 + ((quicktime_language_code >> 5) & 0x1f);
  iso639_language_code[2] = 0x60 + (quicktime_language_code & 0x1f);
}

void ISO639ToQuickTime(const char* iso636_language_code, uint32_t* quicktime_language_code) { *quicktime_language_code = ((iso639_language_code[0] & 0x7f) « 10) | ((iso639_language_code[1] & 0x7f) « 5) | (iso639_language_code[2] & 0x7f); }

ISO 639-2 の言語コードと QuickTime 言語コードの変換表は以下のようになります。

言語 ISO 639-2 言語コード QuickTime 言語コード
アラビア語"ara"0x0641 (1601)
英語"eng"0x15c7 (5575)
日本語"jpn"0x2a0e (10766)
ヘブライ語"heb"0x20a2 (8354)
ヒンディー語"hin"0x212e (8494)
韓国語"kor"0x2df2 (11762)
ロシア語"rus"0x4ab3 (19123)
中国語"zho"0x690f (26895)
未定義"und"0x55c4 (21956)

本 blog は QuickTime 言語コードISO 639-2 言語コード に変換して表記します。

QuickTime の時間

動画では 1/30 = 0.033… 秒や 1/24 = 0.04166… 秒などの循環小数を頻繁に利用します。 これらの時間を誤差なく記述するため QuickTime では時間を 2 個の 32 ビット整数 タイムスケール (time_scale) とタイムカウント (time_count) を用いた有理数 time_count/time_scale で記述します。 HEVC Video with Alpha サンプルデータ では time_scale の値として 600 を用いています。 この場合における時間と time_count の値を表にすると以下のようになります。

time_scaletime_count時間
600 50 1/12 (0.083…) 秒
25 1/24 (0.0416…) 秒
20 1/30 (0.03…) 秒
12 1/50 (0.02) 秒
10 1/60 (0.016…) 秒
5 1/120 (0.0083…) 秒

本 blog は QuickTime 時間 を秒に変換して表記します。

QuickTime の固定小数点

QuickTime では 3 種類の固定小数点表記を用いています。

  • 16 ビット固定小数点
    整数部 8 ビット、少数部 8 ビットの固定小数点
  • 32 ビット固定小数点
    整数部 16 ビット、少数部 16 ビットの固定小数点
  • 32 ビット固定小数点 (2,30)
    整数部 2 ビット、少数部 30 ビットの固定小数点
たとえば 1.0 は 16 ビット固定小数点では 01 00, 32 ビット固定小数点では 00 01 00 00, 2 ビット固定小数点 (2,30) では 40 00 00 00 になります。 32 ビット固定小数点 (2,30) の場合、フィールドの整数値を 230 で除算することで出力値が得られます。 同様に、32 ビット固定小数点 (16 ビット固定小数点) の場合はそれぞれ 216 (28) で除算することで出力値が得られます。

QuickTime の日時

QuickTime では日時表記として 1904 年 1 月 1 日 00:00:00 UTC からの経過時間 (秒) を 32 ビット整数 で記述します。 (詳しい説明は QuickTime File Format Specification - Calendar Date and Time Values を参照してください。) たとえば、QuickTime DataTime データ FF FF FF FF2040-02-06T06:28:15Z (2040 年 2 月 6 日 15:28:15 JST) になります。 本 blog では QuickTime DateTime 値を ISO 8601 表記および日本時間 (JST)1 に変換して表記します。

2. うるう秒の補正を行っていないため厳密には日本標準時 (JST) ではなく UTC+09:00 です。

QuickTime の文字列

QuickTime では文字列表記として Pascal string を用いています。 Pascal string は以下の 2 個のフィールドで構成されています。

フィールド 説明
0 length 8 ビット整数 文字列の長さ
1 characters[] UTF-8 文字列データ
length+1

たとえば "abc" は 03 61 62 63 になります。 また、"日本語" は 09 E6 97 A5 E6 9C AC E8 AA 9E です。

1. Niklaus Wirth によって設計されたプログラム言語です。
2. C 言語のように文字列の最後に '\0' (NUL 文字) を付加しません。

QuickTime のフレーム変換行列

QuickTime のフレーム変換行列 は 9 個の 固定小数点 値で構成されています。 (詳しい説明は QuickTime File Format Specification - Matrices を参照してください。)

フィールド 説明
0 a 32 ビット固定小数点
1
2
3
4 b 32 ビット固定小数点
5
6
7
8 u 32 ビット固定小数点 (2,30)
9
10
11
12 c 32 ビット固定小数点
13
14
15
16 d 32 ビット固定小数点
17
18
19
20 v 32 ビット固定小数点 (2,30)
21
22
23
24 tx 32 ビット固定小数点
25
26
27
28 ty 32 ビット固定小数点
29
30
31
32 w 32 ビット固定小数点 (2,30)
33
34
35

この QuickTime のフレーム変換行列 は以下の 3×3 行列 (2 次元アフィン変換行列) を表しています。

a c tx
b d ty
u v w

QuickTime はフレーム画像出力時、各ピクセル (x, y) に対して QuickTime のフレーム変換行列 をを適用し、そのピクセルの出力位置 (x', y') を変更します。

x' a c tx x
y' = b d ty · y
1 u v w 1

HEVC Video with Alpha サンプルデータQuickTime のフレーム変換行列 はすべて単位行列です。

1 0 0
0 1 0
0 0 1

QuickTime の描画モード

QuickTime の描画モード は画像描画時の動作を指定した 16 ビット整数 です。 現在 QuickTime の描画モード として定義されている値は以下の通りです。

描画モード
0x0000 Copy
0x0020 Blend
0x0024 Transparent
0x0040 Dither Copy
0x0100 Straight Alpha
0x0101 Premultiplied White Alpha
0x0102 Premultiplied Black Alpha
0x0103 Composition (Dither Copy)
0x0104 Straight Alpha Blend

HEVC Video with Alpha サンプルデータ の描画モードはすべて "Dither Copy" (標準値) です。 このため、本 blog では QuickTime の描画モード の詳しい説明を省略します。 (詳しい説明は QuickTime File Format Specification - Graphics Modes を参照してください。)

QuickTime のカラー

QuickTime のカラー は 3 個のフィールドで構成されています。

フィールド 説明
0 red 16 ビット整数 赤色成分
1
2 green 16 ビット整数 緑色成分
3
4 blue 16 ビット整数 青色成分
5

HEVC Video with Alpha サンプルデータ の合成色は常に (32768, 32768, 32768) (標準値) です。 このため、本 blog では QuickTime のカラー の詳しい説明を省略します。 (詳しい説明は QuickTime File Format Specification - RGB Colors を参照してください。)

QuickTime サンプル

QuickTime サンプル とは圧縮された画像データのことです。 H.265 の場合 1 個の QuickTime サンプル は 1 個の H.265 圧縮画像データ1 (YUV) で構成されています。 また HEVC Video with Alpha の場合 1 個の QuickTime サンプル は 2 個の H.265 圧縮画像データ1 (YUV, alpha) で構成されています。 Composition Offset Atom で説明しますが QuickTime サンプル はデコード時間順に整列されています。 つまり QuickTime サンプル は表示時間順に整列されていない場合があります。

1. 厳密には H.265 NAL パケットです。

QuickTime Atom

QuickTime Atom は以下のように 3 個のフィールドで構成されています。 (詳しい説明は QuickTime File Format Specification - QuickTime Atom にあります。)

フィールド 説明
0 size 32 ビット整数 Atom のサイズ
1
2
3
4 type FourCC Atom の種類
5
6
7
8 data Atom 固有データ
size-1

HEVC Video with Alpha サンプルデータ は 4 個の最上位 QuickTime Atoms で構成されています。 これら最上位 QuickTime Atoms を別の色で表示すると以下のようになります。

00000000: 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00  ....ftypqt  ....
00000010: 71 74 20 20 00 00 00 08 77 69 64 65 00 0B 72 69  qt  ....wide..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A  mdat....&....4+*
  (中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02  .....> .q.......
000B7280: A6 03 CA 05 C4 00 00 0A 0D 6D 6F 6F 76 00 00 00  .........moov...
  (中略)
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

また、これら最上位 QuickTime Atoms の各フィールドの値は以下のようになります。

データ フィールド
0 00 00 00 14 size 20 バイト
1
2
3
4 66 74 79 70 type "ftyp" (File Type Compatibility Atom)
5
6
7
8 data File Type Compatibility Atom 固有データ
19
20 00 00 00 08 size 8 バイト
21
22
23
24 77 69 64 65 type "wide" (Wide Atom)
25
26
27
28 00 0B 72 69 size 750185 バイト
29
30
31
32 6d 64 61 74 type "mdat" (Media Data Atom)
33
34
35
36 data Media Data Atom 固有データ
750212
750213 00 00 0A 0D size 2573 バイト
750214
750215
750216
750217 6D 6F 6F 76 type "moov" (Movie Atom)
750218
750219
750220
750221 data Movie Atom 固有データ
752785

QuickTime Atomsize フィールドは QuickTime Atom ヘッダのサイズ (8 バイト) を含むサイズです。 つまり、この size フィールドの値は通常 8 未満にはなりません。 この size フィールドの値が 8 未満になることは以下の 2 つの場合のみです。

  • 00 00 00 00
    ファイルの終わりまで続く QuickTime Atom を意味しています。 つまり、この QuickTime Atom のサイズは (ファイルの大きさ) - (この QuickTime Atom の位置) で計算されます。
  • 00 00 00 01
    QuickTime Atom が以下のように extended_size フィールドを持つ場合に用いられます。 この QuickTime Atom のサイズは extended_size フィールドに記述されています。
フィールド 説明
0 size 32 ビット整数 00 00 00 01
(Extended Size で指定)
1
2
3
4 type FourCC Atom の種類
5
6
7
8 extended_size 64 ビット整数 Atom のサイズ
9
10
11
12
13
14
15
16 data Atom 固有データ
extended_size-1

HEVC Video with Alpha サンプルデータFile Type Compatibility Atom を考えます。 この File Type Compatibility Atom は以下の 20 バイトのデータです。

00000000: 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00 ....ftypqt  ....
00000010: 71 74 20 20                                     qt  

この File Type Compatibility Atomextended_size フィールドを用いて記述すると以下のような 28 バイトのデータになります。

00000000: 00 00 00 01 66 74 79 70 00 00 00 00 00 00 00 1C ....ftyp....... 
00000010: 71 74 20 20 00 00 00 00 71 74 20 20             qt  ....qt  
extended_size フィールドは通常 QuickTime Atoms の大きさが 232 = 4 GB を超える場合に用いられます。 とはいえ、この例のようにサイズが 4 GB 未満の QuickTime Atoms に対しても extended_size フィールドを用いることは可能です。 (実際、常に extended_size フィールドを用いて Media Data Atom のサイズを指定する MP4 エンコーダが存在します。)

File Type Compatibility Atom

File Type Compatibility Atom はファイルの互換性情報を記述した QuickTime Atom です。 File Type Compatibility Atom は常に QuickTime ファイルの先頭に配置されています。 QuickTimeMP4 と互換性があります。 また MP4 には Microsoft MPEG-4 など複数の派生フォーマットがあります。 File Type Compatibility Atom はこれらの派生フォーマットのうち互換性があるものを列挙しています。

File Type Compatibility Atom は以下の図のように 5 個のフィールドで構成されています。 (詳しい内容は QuickTime File Format Specification - File Type Compatibility Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 File Type Compatibility Atom のサイズ
1
2
3
4 type FourCC "ftyp" (File Type Compatibility Atom)
5
6
7
8 major_brand FourCC ブランド名
9
10
11
12 minor_version 32 ビット整数 バージョン番号1
13
14
15
16 compatible_brands[1] FourCC 互換ブランド名1
17
18
19
size-4 compatible_brands[k] FourCC 互換ブランド名k
size-3
size-2
size-1

1. このバージョン番号は QuickTime Revision のリリース日を Binary-Coded Decimal (BCD) で表現したものです。たとえば "2007 年 9 月 14 日" (QuickTime File Format Specification のリリース日) は 20 07 09 00 になります。

compatible_brands[] の要素数は size (または extended_size) フィールド値から File Type Compatibility Atom のサイズを引くことで計算できます。 つまり、extended_size フィールドが存在しない場合 compatible_brands[] の要素数は (size - 16) / 4 です。 また extended_size フィールドが存在する場合 compatible_brands[] の要素数は (extended_size - 24) / 4 です。

具体例を用いて File Type Compatibility Atom について説明します。 たとえば、以下の File Type Compatibility Atom について考えます。

00000000: 00 00 00 1C 66 74 79 70 71 74 20 20 20 20 06 00 ....ftypqt    ..
00000010: 71 74 20 20 69 73 6F 6D 6D 70 34 32             qt  isommp42

この File Type Compatibility Atom の個々のフィールドの値は以下の図のようになります。

データ フィールド
0 00 00 00 1C size 28 バイト
1
2
3
4 66 74 79 70 type "ftyp" (File Type Compatibility Atom)
5
6
7
8 71 74 20 20 major_brand "qt " (QuickTime)
9
10
11
12 20 20 06 00 minor_version 2020 年 6 月
13
14
15
16 71 74 20 20 compatible_brands[1] "qt " (QuickTime)
17
18
19
20 69 73 6F 6D compatible_brands[2] "isom" (ISO MPEG-4)
21
22
23
24 6D 70 34 32 compatible_brands[3] "mp42" (Microsoft MPEG-4 v2)
25
26
27

この File Type Compatibility Atom の `major_brand"qt " (QuickTime) です。 また compatible_brands[]"isom" (ISO MPEG-4) および "mp42" (Microsoft MPEG-4 v2) を含んでいます。 つまり、この File Type Compatibility Atom は ISO MPEG-4 や Microsoft MPEG-4 v2 とも互換性がある QuickTime ファイルという意味になります。

HEVC Video with Alpha サンプルデータ の場合 File Type Compatibility Atom はアドレス 0x00000000 から始まる 20 バイトのデータです。

00000000: 00 00 00 14 66 74 79 70 71 74 20 20 00 00 00 00 ....ftypqt  ....
00000010: 71 74 20 20                                     qt  

この File Type Compatibility Atom の個々のフィールドの値は以下の図のようになります。

データ フィールド
0 00 00 00 1C size 28 バイト
1
2
3
4 66 74 79 70 type "ftyp" (File Type Compatibility Atom)
5
6
7
8 71 74 20 20 major_brand "qt " (QuickTime)
9
10
11
12 00 00 00 00 minor_version 0000 年 0 月
13
14
15
16 71 74 20 20 compatible_brands[1] "qt " (QuickTime)
17
18
19

この File Type Compatibility Atom の `major_brand"qt " (QuickTime) です。 しかし、compatible_brands[]"qt " (QuickTime) 以外のフォーマットを含んでいません。 ですから、この HEVC Video with Alpha サンプルデータQuickTime 以外の MP4 派生フォーマットとの互換性を持たない QuickTime ファイルという意味になります。

Wide Atom

Wide Atom は将来他の QuickTime Atom が利用するスペースを保持するための QuickTime Atom です。 つまり Wide Atom は "機能のない" QuickTime Atom です。 Wide Atom は以下のように size および type フィールドのみで構成されています。 (詳しい情報は QuickTime File Format Specification - Basic Atom Types を参照してください。)

フィールド 説明
0 size 32 ビット整数 Wide Atom のサイズ
(通常 8 バイト)
1
2
3
4 type FourCC "wide" (Wide Atom)
5
6
7

Wide Atom は通常 Media Data Atom の前に配置され、Media Data Atomextended_size フィールドのためのスペースを保持するために利用されます。 たとえば、以下のようなサイズ 232-1 バイトの Media Data Atom にメディアデータを追加する場合について考えます。

データ フィールド
0 FF FF FF FF size 232-1 バイト
1
2
3
4 6D 64 61 74 type "mdat" (Media Data Atom)
5
6
7
8 data メディアデータ
4294967294

上記の Media Data Atom にデータを追加すると data フィールドの大きさが 4 GB を超えてしまうため extended_size フィールドを追加する必要があります。

データ フィールド
0 00 00 00 01 size Extended Size で指定
1
2
3
4 6D 64 61 74 type "mdat" (Media Data Atom)
5
6
7
8 data メディアデータ
4294967294

しかし extended_size フィールドを追加するためには data フィールドのメディアデータを移動する必要があります。 このメディアデータは非常に巨大 (232-1 バイト) です。 このため、移動は非常に負荷のかかる処理になります。

この問題を回避するために Wide Atom を利用します。 以下のように Wide Atom をあらかじめ Media Data Atom の前に配置します。

データ フィールド
0 00 00 00 08 size 8 バイト
1
2
3
4 77 69 64 65 type "wide" (Wide Atom)
5
6
7
8 FF FF FF FF size 232-1 バイト
9
10
11
12 6D 64 61 74 type "mdat" (Media Data Atom)
13
14
15
16 data メディアデータ
4294967294

この Media Data Atomextended_size フィールドを追加する場合 Wide Atom を削除してその部分に Media Data Atom を移動します。

データ フィールド
8 00 00 00 01 size Extended Size で指定
9
10
11
12 6D 64 61 74 type "mdat" (Media Data Atom)
13
14
15
16 data メディアデータ
4294967294

このように Wide Atom を利用することによって Media Data Atomdata フィールドの移動なしで extended_size フィールドを追加できます。

HEVC Video with Alpha サンプルデータ の場合 Wide Atom はアドレス 0x00000014 から始まる 8 バイトのデータです。

00000010:             00 00 00 08 77 69 64 65                 ....wide

この Wide Atom の個々のフィールドの値は以下の図のようになります。

データ フィールド
0 00 00 00 08 size 8 バイト
1
2
3
4 77 69 64 65 type "wide" (Wide Atom)
5
6
7

この HEVC Video with Alpha サンプルデータMedia Data Atom のサイズが 232 = 4 GB 未満です。 このため、この HEVC Video with Alpha サンプルデータWide Atom は削除されずに存在します。

Media Data Atom

Media Data Atom はメディア (サウンドやビデオ) データを埋め込むための QuickTime Atom です。 (詳しい内容は QuickTime File Format Specification - Media Data Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Media Data Atom のサイズ
1
2
3
4 type FourCC "mdat" (Media Data Atom)
5
6
7
8 data メディアデータ
size-1

HEVC Video with Alpha サンプルデータ の場合 Media Data Atom はアドレス 0x0000001C から始まる 750185 バイトのデータです。

00000010:                                     00 0B 72 69              ..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A  mdat....&....4+*
00000030: AA 89 A6 9A 70 55 F0 AD 8F EF 51 5E 4B DD 88 EA  ....pU....Q^K...
00000040: 8A 08 24 33 D6 C8 FD E0 9A 00 00 7A 80 01 1B 64  ..$3.......z...d
00000050: 22 4C 12 30 00 AA 80 A3 15 3F 16 4D 00 00 3D 40  "L.0.....?.M..=@
00000060: 00 71 80 05 D8 00 08 48 2D 5E A8 28 0F 68 93 00  .q.....H-^.(.h..
                               (中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02  .....> .q.......
000B7280: A6 03 CA 05 C4                                   .....

一般に k 個の QuickTime サンプル で構成された H.265 ファイルの場合、その Media Data Atomdata フィールドは以下のような H.265 NAL パケット の k 個の配列です。

フィールド 説明
0 size 32 ビット整数 Media Data Atom のサイズ
1
2
3
4 type FourCC "mdat" (Media Data Atom)
5
6
7
nal_packets[1] サンプル1
nal_packets[k] サンプルk

同様に k 個の QuickTime サンプル で構成された HEVC Video with Alpha ファイルの場合、その Media Data Atomdata フィールドは以下のような H.265 NAL パケット の k * 2 個の配列です。

フィールド 説明
0 size 32 ビット整数 Media Data Atom のサイズ
1
2
3
4 type FourCC "mdat" (Media Data Atom)
5
6
7
nal_packets[1][0] サンプル1, レイヤー0 (YUV)
nal_packets[1][1] サンプル1, レイヤー1 (alpha)
nal_packets[k][0] サンプルk, レイヤー0 (YUV)
nal_packets[k][1] サンプルk, レイヤー1 (alpha)

Movie Atom

Movie AtomQuickTime ムービーの情報を記述した container atom です。 Movie Atom は以下の QuickTime Atoms で構成されています。 (詳しい情報は QuickTime File Format Specification - Movie Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Movie Atom のサイズ
1
2
3
4 type FourCC "moov" (Movie Atom)
5
6
7
data Movie Profile Atom
Movie Header Atom (必須)
Clipping Atom
Track Atoms
User Data Atom
Color Table Atom
Compressed Movie Atom
Reference movie atom

HEVC Video with Alpha サンプルデータ の場合 Movie Atom はアドレス 0x000B7285 から始まる 2573 バイトのデータです。 (FFmpeg などの QuickTime (MP4) エンコーダは Movie Atom をファイルの最後に配置します。)

000B7280:                00 00 0A 0D 6D 6F 6F 76 00 00 00       ....moov...
000B7290: 6C 6D 76 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5  lmvhd.....d...d.
                               (中略)
000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5  k...\tkhd.....d.
                               (中略)
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Movie Atom は以下の 2 個の QuickTime Atoms で構成されています。 (巨大なので data フィールドの内容は省略します。)

データ フィールド
0 00 00 0A 0D size 2573 バイト
1
2
3
4 6D 6F 6F 76 type "moov" (Movie Atom)
5
6
7
8 data Movie Header Atom
115
116 Track Atom
2572

Movie Profile Atom

Track Profile Atom は 2022 年 4 月現在 QuickTime ファイルでは利用されていません。 HEVCPlayerView も利用していないため説明は省略します。 (詳しい情報は QuickTime File Format Specification - Movie Profile Atom を参照してください。)

Movie Header Atom

Movie Header AtomQuickTime ファイル全体の情報 (メタデータ) を提供する QuickTime Atom です。 Movie Header Atom は 19 個のフィールドで構成されています。 (詳しい方法は QuickTime File Format Specification - Movie Header Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Movie Header Atom のサイズ
1
2
3
4 type FourCC "mvhd" (Movie Header Atom)
5
6
7
8 version バージョン番号
9 flags
10
11
12 creation_time DateTime 作成日時
13
14
15
16 modification_time DateTime 更新日時
17
18
19
20 time_scale タイムスケール 基準時間1
21
22
23
24 duration タイムカウント 再生時間
25
26
27
28 preferred_rate 32 ビット固定小数点 再生速度
29
30
31
32 preferred_volume 16 ビット固定小数点 再生音量
33
34 reserved 未使用
43
44 matrix_structure フレーム変換行列 フレーム変換行列2
79
80 preview_time タイムカウント プレビュー開始時間
81
82
83
84 preview_duration タイムカウント プレビュー時間
85
86
87
88 poster_duration タイムカウント ポスター表示時間3
89
90
91
92 selection_time タイムカウント ムービー選択開始時間3
93
94
95
96 selection_duration タイムカウント ムービー選択時間
97
98
99
100 current_time タイムカウント 現在の再生時間3
101
102
103
104 next_track_id 32 ビット整数 次のトラック番号4
105
106
107

1. この time_scale の値は Track Header AtomEdit List Atom も利用します。
2. このフレーム変換行列は動画の回転表示 (縦画面 ⇔ 横画面) のために用いられることが多いです。
3. QuickTime File Format Specification - Movie Header Atom には明記されていませんが poster_duration, selection_time, selection_duration の型はタイムカウントと思われます。
4. 通常 next_track_id の値は QuickTime ファイルに含まれる全 Track Header Atoms の最大トラック ID + 1 です。 このため、この値は QuickTime ファイルのトラック数を推測するために用いられることがあります。

HEVC Video with Alpha サンプルデータ の場合 Movie Header Atom はアドレス 0x000B728D から始まる 108 バイトのデータです。

000B7280:                                        00 00 00               ...
000B7290: 6C 6D 76 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5  lmvhd.....d...d.
000B72A0: D8 00 00 02 58 00 00 09 60 00 01 00 00 01 00 00  ....X...`.......
000B72B0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00  ................
000B72C0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00  ................
000B72D0: 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00  .........@......
000B72E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B72F0: 00 00 00 00 00 00 00 00 02                       .........

この Movie Header Atom の各フィールドの値は以下のようになります。

データ フィールド
0 00 00 00 6C size 108 バイト
1
2
3
4 6D 76 68 64 type "mvhd" (Movie Header Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 DC 64 B5 B3 creation_time 2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16 DC 64 B5 D8 modification_time 2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
20 00 00 02 58 time_scale 1/0x00000258 = 1/600 秒 (約 1.6 ms)
21
22
23
24 00 00 09 60 duration 0x00000960/600 = 4.0 秒
25
26
27
28 00 01 00 00 preferred_rate 0x00010000/216 = 1.0
29
30
31
32 01 00 preferred_volume 0x0100/28 = 1.0
33
34 reserved
43
44 00 01 00 00 matrix_structure a 0x00010000/216 = 1.0
00 00 00 00 b 0x00000000/216 = 0.0
00 00 00 00 u 0x00000000/230 = 0.0
00 00 00 00 c 0x00000000/216 = 0.0
00 01 00 00 d 0x00010000/216 = 1.0
00 00 00 00 v 0x00000000/230 = 0.0
00 00 00 00 tx 0x00000000/216 = 0.0
00 00 00 00 ty 0x00000000/216 = 0.0
79 40 00 00 00 w 0x40000000/230 = 1.0
80 00 00 00 00 preview_time 0x00000000/600 = 0.0 秒
81
82
83
84 00 00 00 00 preview_duration 0x00000000/600 = 0.0 秒
85
86
87
88 00 00 00 00 poster_duration 0x00000000/600 = 0.0 秒
89
90
91
92 00 00 00 00 selection_time 0x00000000/600 = 0.0 秒
93
94
95
96 00 00 00 00 selection_duration 0x00000000/600 = 0.0 秒
97
98
99
100 00 00 00 00 current_time 0x00000000/0.0 秒
101
102
103
104 00 00 00 02 next_track_id 2
105
106
107

この Movie Header Atompreview_time, preview_duration, poster_duration, selection_time, selection_duration, current_time はすべて 0 になっています。 このことは "この HEVC Video with Alpha サンプルデータ のプレビュー範囲、ポスター時間、選択範囲、現在の表示時間は未設定" ということを意味します。
また、matrix_structure は単位行列です。 このことは、この HEVC Video with Alpha サンプルデータ はフレーム変換なしで表示可能です。
next_track_id の値が 2 なので Track Header Atoms の最大トラック ID (トラック数) は 1 と推測されます。 (実際この HEVC Video with Alpha サンプルデータ の最大トラック ID (トラック数) は 1 です。)

Track Atom

Track Atom は動画や音声など個々のトラック情報 (メタデータ) を記述した QuickTime Atom です。 Track Atom は以下の子 QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Track Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Atom のサイズ
1
2
3
4 type FourCC "trak" (Track Atom)
5
6
7
data Track Profile Atom
Track Header Atom (必須)
Track Aperture Mode Dimension Atom
Clipping Atom
Track Matte Atom
Edit Atom
Track Reference Atom
Track Exclude from Autoselection Atom
Track Load Settings Atom
Track Input Map Atom
Media Atom (必須)
User Data Atom

HEVC Video with Alpha サンプルデータ の場合 Track Atom はアドレス 0x000B72F9 から始まる 2457 バイトのデータです。 (この HEVC Video with Alpha サンプルデータ には Track Atom が 1 個しか存在しません。 しかし、多くの HEVC Video with Alpha ファイルには Track Atoms が複数個存在します。)

000B72F0:                            00 00 09 99 74 72 61           ....tra
000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5  k...\tkhd.....d.
000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00 00 00 00  .@....h.........
000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00  Dtapt....clef...
000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F  ..h..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00  f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00  .enof.....h.....
000B73A0: 00 00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73  ....$edts....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00  t...........`...
000B73C0: 00 00 01 00 00 00 00 08 CD 6D 64 69 61 00 00 00  .........mdia...
                               (中略)
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Track Atom は 4 個の QuickTime Atoms で構成されています。

データ フィールド
0 00 00 09 99 size 2457 バイト
1
2
3
4 74 72 61 68 type "trak" (Track Atom)
5
6
7
8 data Track Header Atom
99
100 Track Aperture Mode Dimension Atom
167
168 Edit Atom
203
204 Media Atom
2456

Track Profile Atom

Track Profile Atom は 2022 年 4 月現在 QuickTime ファイルでは利用されていません。 HEVCPlayerView も利用していないため説明は省略します。 (詳しい情報は QuickTime File Format Specification - Track Profile Atom を参照してください。)

Track Header Atom

Track Header Atom は各トラックの情報 (メタデータ) を提供する QuickTime Atom です。 Track Header Atom は 17 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Header Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Header Atom のサイズ
1
2
3
4 type FourCC "tkhd" (Track Header Atom)
5
6
7
8 version バージョン番号
9 flags ビットマスク トラック利用情報
(1: enabled, 2: movie, 4: preview, 8: poster)
10
11
12 creation_time DateTime 作成日時
13
14
15
16 modification_time DateTime 更新日時
17
18
19
20 track_id 32 ビット整数 トラック ID
21
22
23
24 reserved 未使用
25
26
27
28 duration タイムカウント 再生時間1
29
30
31
32 reserved 未使用
39
40 layer 16 ビット整数
41
42 alternate_group 16 ビット整数
43
44 volume 16 ビット固定小数点 再生音量
45
46 reserved 未使用
47
48 matrix_structure フレーム変換行列 フレーム変換行列
83
84 track_width 32 ビット固定小数点 フレーム画像の幅
85
86
87
88 track_height 32 ビット固定小数点 フレーム画像の高さ
89
90
91

1. この duration フィールド値の単位は Movie Header Atomtime_scale 値です。

HEVC Video with Alpha サンプルデータ の場合 Track Header Atom はアドレス 0x000B7301 から始まる 92 バイトのデータです。

000B7300:    00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5  k...\tkhd.....d.
000B7310: B3 DC 64 B5 D8 00 00 00 01 00 00 00 00 00 00 09  ..d.............
000B7320: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  `...............
000B7330: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7340: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00           .@....h......

この Track Header Atom の各フィールドの値は以下のようになります。 (time_scale の値として 600 を利用しています。)

データ フィールド
0 00 00 00 5C size 92 バイト
1
2
3
4 74 6B 68 64 type "tkhd" (Track Header Atom)
5
6
7
8 00 version 0
9 00 00 0F flags enabled, movie, preview, poster
10
11
12 DC 64 B5 B3 creation_time 2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16 DC 64 B5 D8 modification_time 2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
20 00 00 00 01 track_id 1
21
22
23
24 reserved
25
26
27
28 00 00 09 60 duration 0x00000960/600 = 4.0 秒1
29
30
31
32 reserved
39
40 00 00 layer 0
41
42 00 00 alternate_group 0
43
44 00 00 volume 0x0000/28 = 0.0
45
46 reserved
47
48 00 01 00 00 matrix_structure a 0x00010000/216 = 1.0
00 00 00 00 b 0x00000000/216 = 0.0
00 00 00 00 u 0x00000000/230 = 0.0
00 00 00 00 c 0x00000000/216 = 0.0
00 01 00 00 d 0x00010000/216 = 1.0
00 00 00 00 v 0x00000000/230 = 0.0
00 00 00 00 tx 0x00000000/216 = 0.0
00 00 00 00 ty 0x00000000/216 = 0.0
83 40 00 00 00 w 0x40000000/230 = 1.0
84 01 68 00 00 track_width 0x01680000/216 = 360
85
86
87
88 02 80 00 00 track_height 0x02800000/216 = 640
89
90
91

1. Movie Header Atomtime_scale の値を利用しています。

Track Aperture Mode Dimension Atom

Track Aperture Mode Dimension Atom はこのトラックの画面表示部分の大きさやピクセル比を記述した QuickTime Atom です。 Track Aperture Mode Dimension Atom は以下の 3 種類の表示方法について記述可能です。

  • Clean Mode
  • Production Mode
  • Encoded Pixels
Track Aperture Mode Dimension Atom は 3 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Track Aperture Mode Dimension Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Aperture Mode Dimension Atom のサイズ
1
2
3
4 type FourCC "tapt" (Track Aperture Mode Dimension Atom)
5
6
7
data Track Clean Aperture Dimensions Atom
Track Production Aperture Dimensions Atom
Track Encoded Pixels Dimensions Atom

Pococha が利用する HEVC Video with Alpha ファイルはこれらの表示サイズを設定していません。 つまり Track Aperture Mode Dimension Atom のすべての表示サイズは Track Header Atom のピクセルサイズと同一になっています。 このため HEVCPlayerViewTrack Aperture Mode Dimension Atom の情報を利用していません。

HEVC Video with Alpha サンプルデータ の場合 Track Aperture Mode Dimension Atom はアドレス 0x000B735D から始まる 68 バイトのデータです。

000B7350:                                        00 00 00               ...
000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00  Dtapt....clef...
000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F  ..h..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00  f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00  .enof.....h.....
000B73A0: 00                                               .

この Track Aperture Mode Dimension Atom は以下の 3 個の QuickTime Atoms で構成されています。

データ フィールド
0 00 00 00 44 size 68 バイト
1
2
3
4 74 61 70 74 type "tapt" (Track Aperture Mode Dimension Atom)
5
6
7
8 data Track Clean Aperture Dimensions Atom
27
28 Track Production Aperture Dimensions Atom
47
48 Track Encoded Pixels Dimensions Atom
67

Track Clean Aperture Dimensions Atom

Track Clean Aperture Dimensions Atom は Clean Mode における表示サイズを記述した QuickTime Atom です。 Track Clean Aperture Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Clean Aperture Dimensions Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Clean Aperture Dimensions Atom のサイズ
1
2
3
4 type FourCC "clef" (Track Clean Aperture Dimensions Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 track_width 32 ビット固定小数点 フレーム画像の幅
13
14
15
16 track_height 32 ビット固定小数点 フレーム画像の高さ
17
18
19

HEVC Video with Alpha サンプルデータ の場合 Track Clean Aperture Dimensions Atom はアドレス 0x000B7365 から始まる 20 バイトのデータです。

000B7360:                00 00 00 14 63 6C 65 66 00 00 00       ....clef...
000B7370: 00 01 68 00 00 02 80 00 00                       ..h......

この Track Clean Aperture Dimensions Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 14 size 20 バイト
1
2
3
4 63 6C 65 66 type "clef" (Track Clean Aperture Dimensions Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 01 68 00 00 track_width 0x01680000/216 = 360
13
14
15
16 02 80 00 00 track_height 0x02800000/216 = 640
17
18
19

この HEVC Video with Alpha サンプルデータ は Clean Mode の表示サイズを設定していません。 このため、この Track Clean Aperture Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。

Track Production Aperture Dimensions Atom

Track Production Aperture Dimensions Atom は Production Mode における表示サイズを記述した QuickTime Atom です。 Track Production Aperture Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Production Aperture Dimensions Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Production Aperture Dimensions Atom のサイズ
1
2
3
4 type FourCC "prof" (Track Production Aperture Dimensions Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 track_width 32 ビット固定小数点 フレーム画像の幅
13
14
15
16 track_height 32 ビット固定小数点 フレーム画像の高さ
17
18
19

HEVC Video with Alpha サンプルデータ の場合 Track Production Aperture Dimensions Atom はアドレス 0x000B7379 から始まる 20 バイトのデータです。

000B7370:                            00 00 00 14 70 72 6F           ....pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00           f.....h......

この Track Production Aperture Dimensions Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 14 size 20 バイト
1
2
3
4 70 72 6F 66 type "prof" (Track Production Aperture Dimensions Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 01 68 00 00 track_width 0x01680000/216 = 360
13
14
15
16 02 80 00 00 track_height 0x02800000/216 = 640
17
18
19

この HEVC Video with Alpha サンプルデータ は Production Mode の表示サイズを設定していません。 このため、この Track Production Aperture Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。

Track Encoded Pixels Dimensions Atom

Track Encoded Pixels Dimensions Atom は Encoded Pixels における表示サイズを記述した QuickTime Atom です。 Track Encoded Pixels Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Encoded Pixels Dimensions Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Track Encoded Pixels Dimensions Atom のサイズ
1
2
3
4 type FourCC "enof" (Track Encoded Pixels Dimensions Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 track_width 32 ビット固定小数点 フレーム画像の幅
13
14
15
16 track_height 32 ビット固定小数点 フレーム画像の高さ
17
18
19

HEVC Video with Alpha サンプルデータ の場合 Track Encoded Pixels Dimensions Atom はアドレス 0x000B738D から始まる 20 バイトのデータです。

000B7380:                                        00 00 00               ...
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00  .enof.....h.....
000B73A0: 00                                               .

この Track Encoded Pixels Dimensions Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 14 size 20 バイト
1
2
3
4 65 6E 6F 66 type "enof" (Track Encoded Pixels Dimensions Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 01 68 00 00 track_width 0x01680000/216 = 360
13
14
15
16 02 80 00 00 track_height 0x02800000/216 = 640
17
18
19

この HEVC Video with Alpha サンプルデータ は Encoded Pixels の表示サイズを設定していません。 このため、この Track Encoded Pixels Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。

Clipping Atom

Clipping Atom はトラックのクリップ情報を記述した QuickTime Atom です。 Clipping Atom は QuickDraw Region (Apple の非公開情報) を利用しているため Clipping Atom に関する情報は QuickTime File Format Specification - Clipping Atom を参照してください。 HEVCPlayerViewClipping Atom を利用していません。

Track Matte Atom

Track Matte Atom は透かし画像 (ウォーターマーク) などこのトラックの画像と合成したい画像を提供する QuickTime Atom です。 (詳しい情報は QuickTime File Format Specification - Track Matte Atom を参照してください。) HEVCPlayerViewTrack Matte Atom を利用していません。

Edit Atom

Edit Atom はトラックの編集情報を記述した QuickTime Atom です。 つまり Edit Atom はトラックの一部を (再エンコードなしで) 切り出すために用いる QuickTime Atom です。 Edit Atom は 1 個の Edit List Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Edit Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Edit Atom のサイズ
1
2
3
4 type FourCC "edts" (Edit Atom)
5
6
7
data Edit List Atom (必須)

Pococha が利用する HEVC Video with Alpha ファイルはトラックの編集情報を設定していません。 (常にトラック全体を再生します。) このため HEVCPlayerViewEdit Atom を利用していません。

HEVC Video with Alpha サンプルデータ の場合 Edit Atom はアドレス 0x000B73A1 から始まる 36 バイトのデータです。

000B73A0:    00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73   ...$edts....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00  t...........`...
000B73C0: 00 00 01 00 00                                   .....

この Edit Atom は 1 個の Edit List Atom で構成されています。

データ フィールド
0 00 00 00 24 size 36 バイト
1
2
3
4 65 64 74 73 type "edts" (Edit Atom)
5
6
7
8 data Edit List Atom
35

Edit List Atom

Edit List AtomEdit Atom のトラックの編集情報を記述した QuickTime Atom です。 Edit List Atom はトラックの編集情報を Edit List Entry の配列として記述しています。 (つまり、Edit List Atom は "0 秒から 1 秒まで" および "2 秒から 3 秒まで" のような複数の連続しない時間領域を記述可能ということです。) Edit List Atom は (edit_list_entries[] を 1 個として考えると) 6 個のフィールドでで構成されています。 (詳しい情報は QuickTime File Format Specification - Edit Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Edit List Atom のサイズ
1
2
3
4 type FourCC "elst" (Edit List Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 edit_list_entries[] の要素数 (k)
13
14
15
edit_list_entries[1] Edit List Entry 編集情報1
edit_list_entries[k] Edit List Entry 編集情報k

Edit-List EntryEdit List Atom の個々のトラック編集情報を記述した構造体です。 Edit-List Entry は 3 個のフィールドで構成されています。

フィールド 説明
0 track_duration タイムカウント 再生時間1
1
2
3
4 media_time タイムカウント 再生開始時間1
5
6
7
8 media_rate 32 ビット固定小数点 再生速度
9
10
11

1. この track_duration, media_time フィールド値の単位は Movie Header Atomtime_scale 値です。

HEVC Video with Alpha サンプルデータ の場合 Edit List Atom はアドレス 0x000B73A9 から始まる 28 バイトのデータです。

000B73A0:                            00 00 00 1C 65 6C 73           ....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00  t...........`...
000B73C0: 00 00 01 00 00                                   .....

この Edit List Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 1C size 28 バイト
1
2
3
4 65 6C 73 74 type "elst" (Edit List Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 01 number_of_entries 1 個
13
14
15
16 00 00 09 60 edit_list_entries[1] track_duration 0x00000960/600 = 4.0 秒2
17
18
19
20 00 00 00 00 media_time 0x00000000/600 = 0.0 秒2
21
22
23
24 00 01 00 00 media_rate 0x00010000/216 = 1.0
25
26
27

この Edit List Atom の再生範囲は Track Header Atom の情報と同一です。 また、この Edit List Atom の再生速度も 1.0 です。 これらのことから、この HEVC Video with Alpha サンプルデータ は無編集ということを表しています。

2. Movie Header Atomtime_scale の値を利用しています。

Track Reference Atom

Track Reference Atom はトラック間の関係を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルのトラック数は常に 1 個です。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Track Reference Atom を利用していません。 このため、本 blog では Track Reference Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Track Reference Atom を参照してください。)

Track Exclude from Autoselection Atom

Track Exclude from Autoselection Atom はこのトラックの自動選択 (再生) を制御する QuickTime Atom です。 Track Exclude from Autoselection Atom は通常動画において(副音声やコメンタリーなど) ビデオとの関係性が低い音声トラックの自動再生を防止するために用いられます。 Pococha が利用する HEVC Video with Alpha ファイルのトラック数は常に 1 個です。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Track Exclude from Autoselection Atom を利用していません。 このため、本 blog では Track Exclude from Autoselection Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Track Exclude from Autoselection Atom を参照してください。)

Track Load Settings Atom

Track Load Settings Atom はトラックの読み込み設定を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルは十分小さいです。 このため HEVCPlayerView は常に HEVC Video with Alpha ファイル全体を先読みします。 つまり HEVCPlayerViewTrack Load Settings Atom を利用していません。 このため、本 blog では Track Load Settings Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Track Load Settings Atom を参照してください。)

Track Input Map Atom

Track Input Map Atom は副トラックの情報の主トラックへの送信方法を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルのトラック数は常に 1 個 (主トラックのみ) です。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Track Input Map Atom を利用していません。 このため、本 blog では Track Input Map Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Track Input Map Atom を参照してください。)

Media Atom

Media Atom はトラックのメディア情報およびサンプル情報を記述した QuickTime Atom です。 Media Atom は 5 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Media Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Media Atom のサイズ
1
2
3
4 type FourCC "mdia" (Media Atom)
5
6
7
data Media Header Atom (必須)
Extended Language Tag Atom
Handler Reference Atom
Media Information Atom
User Data Atom

HEVC Video with Alpha サンプルデータ の場合 Media Atom はアドレス 0x000B73C5 から始まる 2253 バイトのデータです。

000B73C0:                00 00 08 CD 6D 64 69 61 00 00 00       ....mdia...
000B73D0: 20 6D 64 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5   mdhd.....d...d.
000B73E0: D8 00 00 02 58 00 00 09 60 55 C4 00 00 00 00 00  ....X...`U......
000B73F0: 31 68 64 6C 72 00 00 00 00 6D 68 6C 72 76 69 64  1hdlr....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F  eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F 00 00  re Media Video..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00  .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64  ...@.........8hd
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00  ................
                               (中略)
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00  .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Media Atom は 3 個の QuickTime Atoms で構成されています。

データ フィールド
0 00 00 08 CD size 2253 バイト
1
2
3
4 6D 64 69 61 type "mdia" (Media Atom)
5
6
7
8 data Media Header Atom
39
40 Handler Reference Atom
88
89 Media Information Atom
2252

Media Header Atom

Media Header Atom は (メディアの種類に依存しない) メディア情報を記述した QuickTime Atom です。 Media Header Atom は 10 個のフィールドでで構成されています。 (詳しい情報は QuickTime File Format Specification - Media Header Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Media Header Atom のサイズ
1
2
3
4 type FourCC "mdhd" (Media Header Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 creation_time DateTime 作成日時
13
14
15
16 modification_time DateTime 更新日時
17
18
19
20 time_scale タイムスケール 基準時間1
21
22
23
24 duration タイムカウント 再生時間
25
26
27
28 language 言語コード 言語
29
30 quality 16 ビット整数 再生品質
31

1. この time_scale の値は Time-to-Sample Atom, Composition Offset Atom, Composition Shift Least Greatest Atom で利用されます。

HEVC Video with Alpha サンプルデータ の場合 Media Header Atom はアドレス 0x000B73CD から始まる 32 バイトのデータです。


000B73C0:                                        00 00 00               ...
000B73D0: 20 6D 64 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5   mdhd.....d...d.
000B73E0: D8 00 00 02 58 00 00 09 60 55 C4 00 00           ....X...`U...

この Media Header Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 20 size 32 バイト
1
2
3
4 6D 64 68 64 type "mdhd" (Media Header Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 DC 64 B5 B3 creation_time 2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16 DC 64 B5 D8 modification_time 2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
20 00 00 02 58 time_scale 1/0x00000258 = 1/600 秒 (約 1.6 ms)
21
22
23
24 00 00 09 60 duration 0x00000960/600 = 4.0 秒
25
26
27
28 55 C4 language "und" (未定義)
29
30 00 00 quality 0
31

Extended Language Tag Atom

Extended Language Tag Atom はメディアの言語情報を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルは言語情報を常に含みません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Extended Language Tag Atom を利用していません。 このため、本 blog では Extended Language Tag Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Extended Language Tag Atom を参照してください。)

Media Information Atom

Media Information Atom は動画情報や音声情報など (メディアの種類に依存した) メディア情報を記述した QuickTime Atom です。 (詳しい情報は QuickTime File Format Specification - Media Information Atom を参照してください。)

動画メディアの場合 Media Information Atom は 4 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Video Media Information Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Media Information Atom のサイズ
1
2
3
4 type FourCC "minf" (Media Information Atom)
5
6
7
data Video Media Information Header Atom (必須)
Handler Reference Atom (必須)
Data Information Atom
Sample Table Atom

音声メディアの場合 Media Information Atom は 4 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Sound Media Information Atoms を参照してください。)

フィールド 説明
0 size 32 ビット整数 Media Information Atom のサイズ
1
2
3
4 type FourCC "minf" (Media Information Atom)
5
6
7
data Sound Media Information Header Atoms (必須)
Handler Reference Atom (必須)
Data Information Atom
Sample Table Atom

HEVC Video with Alpha サンプルデータ の場合 Media Information Atom はアドレス 0x000B741E から始まる 2164 バイトのデータです。

000B7410:                                           00 00                ..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00  .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64  ...@.........8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70  lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20  pl.........Core 
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C  Media Data Handl
000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72  er...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al
000B7490: 69 73 00 00 00 01 00 00 07 FC 73 74 62 6C 00 00  is........stbl..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00  .0stsd..........
                               (中略)
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00  .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Media Information Atom は 4 個の QuickTime Atoms で構成されています。

データ フィールド
0 00 00 08 74 size 2164 バイト
1
2
3
4 6D 69 6E 66 type "minf" (Media Information Atom)
5
6
7
8 data Video Media Information Header Atom
27
28 Handler Reference Atom
83
84 Data Information Atom
119
120 Sample Table Atom
2163

Video Media Information Header Atom を含んでいるので、この Media Information Atom は動画メディアの情報を表しています。

Video Media Information Header Atom

Video Media Information Header Atom は動画の描画情報を記述した QuickTime Atom です。 Video Media Information Header Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Video Media Information Header Atoms を参照してください。)

フィールド 説明
0 size 32 ビット整数 Video Media Information Header Atom のサイズ
1
2
3
4 type FourCC "vmhd" (Video Media Information Header Atom)
5
6
7
8 version バージョン番号
9 flags ビデオメディア情報
10
11
12 graphics_mode Graphics Mode 描画モード
13
14 opcolor Color 合成色
(描画モードが blend の時に利用)
15
16
17
18
19

HEVC Video with Alpha サンプルデータ の場合 Video Media Information Header Atom はアドレス 0x000B7426 から始まる 20 バイトのデータです。

000B7420:                   00 00 00 14 76 6D 68 64 00 00        ....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00                    ...@......

この Video Media Information Header Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 14 size 20 バイト
1
2
3
4 76 6D 68 64 type "vmhd" (Video Media Information Header Atom)
5
6
7
8 00 version 0
9 00 00 01 flags 1 (no lean ahead)
10
11
12 00 40 graphics_mode dither copy
13
14 80 00 opcolor red 32768
15
16 80 00 green 32768
17
18 80 00 blue 32768
19

Sound Media Information Header Atoms

Sound Media Information Header Atoms はサウンドの再生情報を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルはサウンドを常に含みません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Sound Media Information Header Atoms を利用していません。 このため、本 blog では Sound Media Information Header Atoms の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Sound Media Information Header Atom を参照してください。)

Handler Reference Atom

Handler Reference Atom はメディア (およびメディアデータ) の製作者などの情報を記述した QuickTime Atom です。 Handler Reference Atom は 10 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Handler Reference Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Handler Reference Atom のサイズ
1
2
3
4 type FourCC "hdlr" (Handler Reference Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 component type FourCC コンポーネントのタイプ (主)
("mhlr" media handler または "dhlr" data handler)
13
14
15
16 component subtype FourCC コンポーネントのタイプ (副)
17
18
19
20 component manufacturer FourCC コンポーネント製作者
21
22
23
24 component flags 未使用
25
26
27
28 component flags mask 未使用
29
30
31
32 component name 文字列 コンポーネント名
size-1

HEVC Video with Alpha サンプルデータ は 2 個の Handler Reference Atoms を含んでいます。

最初の Handler Reference Atom はアドレス 0x000B73ED から始まる 49 バイトのデータです。

000B73E0:                                        00 00 00               ...
000B73F0: 31 68 64 6C 72 00 00 00 00 6D 68 6C 72 76 69 64  1hdlr....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F  eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F        re Media Video

この Handler Reference Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 31 size 49 バイト
1
2
3
4 68 64 6C 72 type "hdlr" (Handler Reference Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 6D 68 6C 72 component type "mhlr" (Media Handler)
13
14
15
16 76 69 64 65 component subtype "vide" (Video Data)
17
18
19
20 61 70 70 6C component manufacturer "appl" (Apple)
21
22
23
24 00 00 00 00 component flags
25
26
27
28 00 00 00 00 component flags mask
29
30
31
32 component name "Core Media Video"
48

この Handler Reference Atom は "この HEVC Video with Alpha サンプルデータ が Apple の Code Media Video を利用してエンコードされた" ことを表しています。 (実際、この HEVC Video with Alpha サンプルデータAVAssetWriter を利用して作成されています。)

2 個目の Handler Reference Atom はアドレス 0x000B743A から始まる 56 バイトのデータです。

000B7430:                               00 00 00 38 68 64            ...8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70  lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20  pl.........Core 
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C  Media Data Handl
000B7470: 65 72                                            er

この Handler Reference Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 38 size 56 バイト
1
2
3
4 68 64 6C 72 type "hdlr" (Handler Reference Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 64 68 6C 72 component type "dhlr" (Data Handler)
13
14
15
16 61 6C 69 73 component subtype "alis" (File Alias)
17
18
19
20 61 70 70 6C component manufacturer "appl" (Apple)
21
22
23
24 00 00 00 00 component flags
25
26
27
28 00 00 00 00 component flags mask
29
30
31
32 component name "Core Media Data Handler"
55

この Handler Reference Atom は "この HEVC Video with Alpha サンプルデータ の元データが Apple の Core Media を利用して読み込まれたファイル" ということを表しています。 (実際、この HEVC Video with Alpha サンプルデータ の元データは AVAssetReader を利用して読み込まれています。)

Data Information Atom

Data Information Atom はメディアデータの情報を記述した QuickTime Atom です。 Data Information Atom は 1 個の Data Reference Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Data Information Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Data Information Atom のサイズ
1
2
3
4 type FourCC "dinf" (Data Information Atom)
5
6
7
data Data Reference Atom (必須)

HEVC Video with Alpha サンプルデータ の場合 Data Information Atom はアドレス 0x000B7472 から始まる 36 バイトのデータです。

000B7470:       00 00 00 24 64 69 6E 66 00 00 00 1C 64 72    ...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al
000B7490: 69 73 00 00 00 01                                is....

この Data Information Atom は 1 個の Data Reference Atom で構成されています。

データ フィールド 説明
0 00 00 00 24 size 36 バイト
1
2
3
4 64 69 6E 66 type "dinf" (Data Information Atom)
5
6
7
8 data Data Reference Atom
35

Data Reference Atom

Data Reference Atom はメディアデータの情報 (Data Reference) を列挙した QuickTime Atom です。 Data Reference Atom は (data_references[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Data Information Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Data Reference Atom のサイズ
1
2
3
4 type FourCC "dref" (Data Reference Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 data_reference[] の要素数 (k)
13
14
15
data_references[1] Data Reference 参照情報1
data_references[k] Data Reference 参照情報k

Data Reference は以下の図のように 5 個のフィールドで構成されています。

フィールド 説明
0 size 32 ビット整数 Data Reference のサイズ
1
2
3
4 type FourCC Data Reference の種類
("alis" (ファイル) または "url " (URL))
5
6
7
8 version バージョン番号
9 flags 参照情報
(1 自己参照1)
10
11
12 data Data Reference 固有データ
size-1

1. "外部のファイルを参照していない" という意味です。 (ローカルファイルを AVAssetReader を利用して読み込むと自己参照になります。)

HEVC Video with Alpha サンプルデータ の場合 Data Reference Atom はアドレス 0x000B747A から始まる 28 バイトのデータです。

000B7470:                               00 00 00 1C 64 72            ....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al
000B7490: 69 73 00 00 00 01                                is....

この Data Reference Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 1C size 28 バイト
1
2
3
4 64 72 65 66 type "dref" (Data Reference Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 01 number_of_entries 1 個
13
14
15
16 00 00 00 0C data_references[1] size 12 バイト
17
18
19
20 61 6C 69 73 type "alis" (ファイル)
21
22
23
24 00 version 0
25 00 00 01 flag 1 (自己参照)
26
27

この HEVC Video with Alpha サンプルデータ はファイルを AVAssetReader を利用して読み込んだものです。 このため data_references[0]type"alis", flag1 になっています。

Sample Table Atom

Sample Table Atom はトラックの (サンプルの位置や表示時間など) サンプル情報を記述した QuickTime Atom です。 Sample Table Atom は 13 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Sample Table Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample Table Atom のサイズ
1
2
3
4 type FourCC "stbl" (Sample Table Atom)
5
6
7
data Sample Description Atom
Time-to-Sample Atom
Composition Offset Atom
Composition Shift Least Greatest Atom
Sync Sample Atom
Partial Sync Sample Atom
Sample-to-Chunk Atom
Sample Size Atom
Chunk Offset Atom
Shadow Sync Atom
Sample Group Description Atom
Sample-to-Group Atom
Sample Dependency Flags Atom

HEVC Video with Alpha サンプルデータ の場合 Sample Table Atom はアドレス 0x000B7496 から始まる 2044 バイトのデータです。

000B7490:                   00 00 07 FC 73 74 62 6C 00 00        ....stbl..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00  .0stsd..........
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00  . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68  ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01  ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00  .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00  ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00  ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60  .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF  ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00  ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03  ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33  ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01  .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02  `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD  ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05  2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00  2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 00 00  .N..............
000B75D0: 00 18 73 74 74 73 00 00 00 00 00 00 00 01 00 00  ..stts..........
000B75E0: 00 78 00 00 00 14 00 00 03 B8 63 74 74 73 00 00  .x........ctts..
000B75F0: 00 00 00 00 00 75 00 00 00 01 00 00 00 00 00 00  .....u..........
000B7600: 00 01 00 00 00 3C 00 00 00 01 00 00 00 00 00 00  .....<..........
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00  ................
                               (中略)
000B7980: 00 01 00 00 00 00 00 00 00 01 FF FF FF D8 00 00  ................
000B7990: 00 01 FF FF FF EC 00 00 00 01 00 00 00 00 00 00  ................
000B79A0: 00 20 63 73 6C 67 00 00 00 00 00 00 00 28 FF FF  . cslg.......(..
000B79B0: FF D8 00 00 00 3C 00 00 00 00 00 00 09 60 00 00  .....<.......`..
000B79C0: 00 20 73 74 73 73 00 00 00 00 00 00 00 04 00 00  . stss..........
000B79D0: 00 01 00 00 00 1F 00 00 00 3D 00 00 00 5B 00 00  .........=...[..
000B79E0: 00 84 73 64 74 70 00 00 00 00 20 10 10 18 18 10  ..sdtp.... .....
000B79F0: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A00: 10 18 18 10 10 18 18 18 20 10 10 18 18 10 10 18  ........ .......
000B7A10: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A20: 18 10 10 18 18 18 20 10 10 18 18 10 10 18 18 10  ...... .........
000B7A30: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A40: 10 18 18 18 20 10 10 18 18 10 10 18 18 10 10 18  .... ...........
000B7A50: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A60: 18 18 00 00 00 1C 73 74 73 63 00 00 00 00 00 00  ......stsc......
000B7A70: 00 01 00 00 00 01 00 00 00 1E 00 00 00 01 00 00  ................
000B7A80: 01 F4 73 74 73 7A 00 00 00 00 00 00 00 00 00 00  ..stsz..........
000B7A90: 00 78 00 00 01 7C 00 00 23 D3 00 00 0E 2F 00 00  .x...|..#..../..
                               (中略)
000B7C60: 00 5A 00 00 00 56 00 00 00 55 00 00 00 55 00 00  .Z...V...U...U..
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00  .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Sample Table Atom は以下の 9 個の QuickTime Atoms で構成されています。

データ フィールド
0 00 00 07 FC size 2044 バイト
1
2
3
4 73 74 62 6C type "stbl" (Sample Table Atom)
5
6
7
8 data Sample Description Atom
311
312 Time-to-Sample Atom
335
336 Composition Offset Atom
1287
1288 Composition Shift Least Greatest Atom
1319
1320 Sync Sample Atom
1351
1352 Sample Dependency Flags Atom
1483
1484 Sample-to-Chunk Atom
1511
1512 Sample Size Atom
2011
2012 Chunk Offset Atom
2043

Sample Description Atom

Sample Description Atom はサンプルの複数のメディア依存情報 (Sample Description) を列挙した QuickTime Atom です。 Sample Description Atom は (sample_descriptions[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Sample Description Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample Description Atom のサイズ
1
2
3
4 type FourCC "stsd" (Sample Description Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 sample_descriptions[] の要素数 (k)
13
14
15
sample_descriptions[1] Sample Description サンプル情報1
sample_descriptions[k] Sample Description サンプル情報k

HEVC Video with Alpha サンプルデータ の場合 Sample Description Atom はアドレス 0x000B749E から始まる 304 バイトのデータです。

000B7490:                                           00 00                ..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00  .0stsd..........
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00  . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68  ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01  ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00  .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00  ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00  ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60  .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF  ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00  ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03  ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33  ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01  .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02  `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD  ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05  2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00  2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00        .N............

この Sample Description Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 01 30 size 304 バイト
1
2
3
4 73 74 73 64 type "stsd" (Sample Description Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 01 number_of_entries 1 個
13
14
15
16 sample_descriptions[1] Video Sample Description
(H.265 non-elementary stream)
303

Sample Description

Sample Description はデコード情報などメディア依存のサンプル情報を記述した QuickTime Atoms です。 Sample Descriptions は 4 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Media Data Atom Types を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample Description のサイズ
1
2
3
4 type FourCC フォーマット名1
5
6
7
8 reserved 未使用
13
14 data_reference_index 参照番号1
15
16 data メディア依存データ
size-1

Sample Description には Video Sample DescriptionSound Sample Description などの派生オブジェクトが存在し data の内容は派生オブジェクトによって異なります。 type の値が "avc1" (H.264), "hev1" (H.265 elementary stream), "hvc1" (H.265 non-elementary stream) などの場合、この Sample DescriptionVideo Sample Description を表しています。 またtype の値が "mp4a" (MPEG-4 Advanced Audio Coding (AAC)) などの場合、この Sample DescriptionSound Sample Description を表しています。

1. "avc1" (H.264), "hev1" (H.265 elementary stream), "hvc1" (H.265 non-elementary stream), "mp4a" (MPEG-4 Advanced Audio Coding (AAC)) などが利用されます。
2. Data Reference Atomdata_references[] の index

Video Sample Description

Video Sample Description は動画フォーマット名、フレーム画像の大きさ、デコード情報など動画メディアのサンプル情報を記述した QuickTime Atoms です。 Video Sample DescriptionSample Description から派生しています。 Video Sample Descriptions は (video_sample_extensions[] を 1 個として考えると) 18 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Video Media を参照してください。)

フィールド 説明
0 size 32 ビット整数 Video Sample Description のサイズ
1
2
3
4 type FourCC 動画フォーマット名
("avc1", "hev1", "hvc1" など)
5
6
7
8 reserved 未使用
13
14 data_reference_index 16 ビット整数 参照番号
(Data Reference Atomdata_references[] の index)
15
16 version 16 ビット整数 バージョン番号1
17
18 revision_level 16 ビット整数 レビジョン番号2
19
20 vendor FourCC ベンダー名
21
22
23
24 temporal_quality 32 ビット整数 (時間) 圧縮品質
25
26
27
28 spatial_quality 32 ビット整数 (空間) 圧縮品質
29
30
31
32 width 16 ビット整数 フレーム画像の幅
33
34 height 16 ビット整数 フレーム画像の高さ
35
36 horizontal resolution 32 ビット固定小数点 水平方向の解像度 (ピクセル/インチ)
37
38
39
40 vertical resolution 32 ビット固定小数点 垂直方向の解像度 (ピクセル/インチ)
41
42
43
44 data_size 32 ビット整数 データサイズ
45
46
47
48 frame_count 16 ビット整数 フレーム数/サンプル
49
50 compressor_name 文字列 エンコーダ名
81
82 depth 16 ビット整数 画素ビット数
83
84 color_table_id 16 ビット整数 カラーテーブル ID
85
video_sample_extensions[1] Video Sample Extension サンプル拡張情報1
video_sample_extensions[k] Video Sample Extension サンプル拡張情報k

1. version の値は通常 0 です。
2. revision の値は常に 0 です。
3. temporaral_quality, spatial_quality の値は 0 以上 1024 以下です。
3. data_size の値は常に 0 です。
4. frame_count の値は通常 1 (1 frame/sample) です。
5. color_table_iddepth が 8 以下の場合のみ有効です。

Video Sample Extension はサンプルの復号に必要な情報を包含した QuickTime Atoms です。 Video Sample Extension には以下のものがあります。

  • gamaGamma Level
    サンプルのガンマ情報を記述した QuickTime Atom です。
  • fielField Handling
    デコードされたデータ処理方法を記述した QuickTime Atom です。
  • mjqtMotion-JPEG Quantification Table
    Motion JPEG の量子化テーブルを記述した QuickTime Atom です。
  • mjhtMotion-JPEG Huffman Table
    Motion JPEG のハフマンテーブルを記述した QuickTime Atom です。
  • esdsMPEG-4 Elementary Stream Descriptor Atom
    MPEG-4 の Elementary Stream Descriptor を包含した QuickTime Atom です。
  • avcCAVC Decoder Configuration Atom
    H.264 Decoder Configuration Record を包含した QuickTime Atom です。
  • hvcCHEVC Decoder Configuration Atom
    H.265 Decoder Configuration Record を包含した QuickTime Atom です。
  • paspPixel Aspect Ratio
    サンプルのピクセル比を記述した QuickTime Atom です。
  • colrColor Parameter Atoms
    サンプルの色変換方法を記述した QuickTime Atom です。
  • clapClean Aperture
    Clean Aperture Mode で使用する情報を記述した QuickTime Atom です。
HEVC Video with Alpha ファイルを Video Toolbox を用いてデコードするために必要な QuickTime AtomHEVC Decoder Configuration Atom のみです。 このため、本 blog では HEVC Decoder Configuration Atom 以外の Video Sample Extensions の説明を省略します。

HEVC Video with Alpha サンプルデータ の場合 Video Sample Description はアドレス 0x000B74AE から始まる 288 バイトのデータです。

000B74A0:                                           00 00                ..
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00  . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68  ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01  ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00  .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00  ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00  ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60  .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF  ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00  ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03  ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33  ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01  .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02  `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD  ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05  2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00  2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00        .N............

この Video Sample Description の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 01 20 size 288 バイト
1
2
3
4 68 76 63 31 type "hvc1" (H.265 non-elementary stream)
5
6
7
8 reserved
13
14 00 01 data_reference_index 1
15
16 00 00 version 0
17
18 00 00 revision_level 0
19
20 00 00 00 00 vendor
21
22
23
24 00 00 02 00 temporal_quality 512
25
26
27
28 00 00 02 00 spatial_quality 512
29
30
31
32 01 68 width 360
33
34 02 80 height 640
35
36 00 48 00 00 horizontal resolution 0x00480000/216 = 72.0 pixels/inch
37
38
39
40 00 48 00 00 vertical resolution 0x00480000/216 = 72.0 pixels/inch
41
42
43
44 00 00 00 00 data_size 0
45
46
47
48 00 01 frame_count 1
49
50 compressor_name "HEVC"
81
82 00 18 depth 241 bits/pixel
83
84 FF FF color_table_id -1 (the default color table)
85
86 video_sample_extensions[1] HEVC Decoder Configuration Atom
287
284 00 00 00 00 video_sample_extensions[2] QuickTime Atom2
285
286
287

AVAssetWriter を用いてエンコードされた HEVC Video with Alpha ファイルは HEVC Video with Alpha Interoperability Profile (Preliminary) に準拠します。 このため type の値が "hvc1" になっています。 (実際、この HEVC Video with Alpha サンプルデータH.265 elementary stream ではないです。) Safari など type の値が "hvc1" 以外のとき期待通りに動作しないアプリケーションがあるため AVAssetWriter 以外の方法で HEVC Video with Alpha ファイルを作成する場合 type の値を "hvc1" にする必要3があります。

1. AVAssetWriter でエンコードされた HEVC Video with Alpha ファイルの depth の値はなぜか 32 ではなく 24 になります。(理由は不明です。)
2. AVAssetWriterVideo Sample Extensions 配列の終わりに空 QuickTime Atom を配置します。
3. FFmpeg の場合 -vtag hvc1 オプションで変更可能です。

Sound Sample Description

Sound Sample Description はサウンドフォーマット名、チャネル数、デコード情報などサウンドメディアのサンプル情報を記述した QuickTime Atoms です。 Pococha が利用する HEVC Video with Alpha ファイルはサウンドを常に含みません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Sound Sample Description を利用していません。 このため、本 blog では Sound Sample Description の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Sound Media を参照してください。)

HEVC Decoder Configuration Atom

HEVC Decoder Configuration AtomH.265 Decoder Configuration Record を包含した QuickTime Atoms です。 HEVC Decoder Configuration Atom は 3 個のフィールドで構成されています。 (QuickTime File Format Specification には該当するページが存在しません。)

フィールド 説明
0 size 32 ビット整数 HEVC Decoder Configuration Atom のサイズ
1
2
3
4 type FourCC "hvcC" (HEVC Decoder Configuration Atom)
5
6
7
8 data H.265 Decoder Configuration Record
size-1

Video ToolboxHEVC Decoder Configuration AtomH.265 Decoder Configuration Record を初期化時に利用します。 とはいえ H.265 Decoder Configuration Record について詳しく知らなくても HEVC Video with Alpha ファイルを Video Toolbox を用いてデコードすることは可能です。 このため、本 blog では H.265 Decoder Configuration Record の説明を省略1させていただきます。

1. HEVCPlayerViewDecoder::DecodeHEVCDecoderConfiguration()H.265 Decoder Configuration Record に関する簡単な説明があります。

HEVC Video with Alpha サンプルデータ の場合 HEVC Decoder Configuration Atom はアドレス 0x000B7505 から始まる 198 バイトのデータです。

000B7500:             00 00 00 C6 68 76 63 43 01 21 60 00      ....hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00  ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60  .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF  ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00  ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03  ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33  ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01  .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02  `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD  ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05  2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00  2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80                    .N........

この HEVC Decoder Configuration Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 C6 size 198 バイト
1
2
3
4 68 76 63 43 type "hvcC" (HEVC Decoder Configuration Atom)
5
6
7
8 data H.265 Decoder Configuration Record
197

Time-to-Sample Atom

Time-to-Sample Atom は各サンプルの表示期間 (Time-to-Sample Entry) を列挙した QuickTime Atoms です。 また、各サンプルのデコード時間 (デコード順序) も Time-to-Sample Atom を用いて計算可能1です。 (Composition Offset Atom で説明しますが、このデコード時間と表示時間は Composition Offset Atom が存在しない時のみ一致します。) Time-to-Sample Atom は (time_to_samples[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Time-to-Sample Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Time-to-Sample Atom のサイズ
1
2
3
4 type FourCC "stts" (Time-to-Sample Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 time_to_samples[] の要素数 (k)
13
14
15
time_to_samples[1] Time-to-Sample Entry サンプル表示期間1
time_to_samples[k] Time-to-Sample Entry サンプル表示期間k

Time-to-Sample Entry は以下の図のように 2 個のフィールドで構成されています。

フィールド 説明
0 sample_count 32 ビット整数 サンプル数
1
2
3
4 sample_duration タイムカウント 再生期間2
5
6
7

1. サンプル番号を i のとき、サンプル時間は time_to_samples[1] から time_to_samples[i] までの合計値です。
2. この sample_duration フィールド値の単位は Media Header Atomtime_scale 値です。

HEVC Video with Alpha サンプルデータ の場合 Time-to-Sample Atom はアドレス 0x000B75CE から始まる 24 バイトのデータです。

000B75C0:                                           00 00                ..
000B75D0: 00 18 73 74 74 73 00 00 00 00 00 00 00 01 00 00  ..stts..........
000B75E0: 00 78 00 00 00 14                                .x....

この Time-to-Sample Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 18 size 24 バイト
1
2
3
4 73 74 74 73 type "stts" (Time-to-Sample Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 01 number_of_entries 1 個
13
14
15
16 00 00 00 78 time_to_samples[1] sample_count 120 サンプル
17
18
19
20 00 00 00 78 sample_duration 0x00000014/600 = 0.033… 秒1
21
22
23

1. Media Header Atomtime_scale の値を利用しています。

この Time-to-Sample Atom のサンプルの表示期間は全て 1/30 = 0.033… 秒です。 このことから、この HEVC Video with Alpha サンプルデータ の各サンプルのデコード時間は以下のようになります。

サンプル sample_duration デコード時間
1 1/30 0.0 秒
2 1/30 0.033… 秒
3 1/30 0.066… 秒
4 1/30 0.1 秒
5 1/30 0.133… 秒
120 1/30 3.966… 秒

Composition Offset Atom

Composition Offset Atom はファイル内のデコード時間と表示時間が同一でない1場合に Time-to-Sample Atom から計算されるデコード時間と表示時間との差分を列挙した QuickTime Atoms です。 (実際の表示計算方法は例を用いて説明します。) 逆に Composition Offset Atom が存在しない場合、ファイル内のデコード時間と表示時間が同一である2ことを表しています。 Composition Offset Atom は (composition_offsets[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Composition Offset Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Composition Offset Atom のサイズ
1
2
3
4 type FourCC "ctts" (Composition Offset Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 entry_count 32 ビット整数 composition_offsets[] の要素数 (k)
13
14
15
composition_offsets[1] Composition Offset サンプル再生位置1
composition_offsets[k] Composition Offset サンプル再生位置k

1. "Out-of-order" といいます。
2. "in-order" といいます。

Composition Offset は以下の図のように 2 個のフィールドで構成されています。

フィールド 説明
0 sample_count 32 ビット整数 サンプル数
1
2
3
4 composition_offset タイムカウント 再生位置1
5
6
7

1. この composition_offset フィールド値の単位は Movie Header Atomtime_scale 値です。

HEVC Video with Alpha サンプルデータ の場合 Composition Offset Atom はアドレス 0x000B75E6 から始まる 952 バイトのデータです。

000B75E0:                   00 00 03 B8 63 74 74 73 00 00        ....ctts..
000B75F0: 00 00 00 00 00 75 00 00 00 01 00 00 00 00 00 00  .....u..........
000B7600: 00 01 00 00 00 3C 00 00 00 01 00 00 00 00 00 00  .....<..........
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00  ................
                               (中略)
000B7980: 00 01 00 00 00 00 00 00 00 01 FF FF FF D8 00 00  ................
000B7990: 00 01 FF FF FF EC 00 00 00 01 00 00 00 00        ..............

この Composition Offset Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 03 B8 size 952 バイト
1
2
3
4 63 74 74 73 type "ctts" (Composition Offset Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 75 number_of_entries 117 個
13
14
15
16 00 00 00 01 composition_offsets[1] sample_count 1 サンプル
17
18
19
20 00 00 00 00 composition_offset 0x00000000/600 = 0.0 秒1
21
22
23
24 00 00 00 01 composition_offsets[2] sample_count 1 サンプル
25
26
27
28 00 00 00 3C composition_offset 0x0000003C/600 = 0.1 秒1
29
30
31
32 00 00 00 01 composition_offsets[3] sample_count 1 サンプル
33
34
35
36 00 00 00 00 composition_offset 0x00000000/600 = 0.0 秒1
37
38
39
40 00 00 00 01 composition_offsets[4] sample_count 1 サンプル
41
42
43
44 FF FF FF D8 composition_offset 0xFFFFFFD8/600 = -0.066… 秒1
45
46
47
48 00 00 00 01 composition_offsets[5] sample_count 1 サンプル
49
50
51
52 FF FF FF EC composition_offset 0xFFFFFFEC/600 = -0.033… 秒1
53
54
55
944 00 00 00 01 composition_offsets[117] sample_count 1 サンプル
945
946
947
948 00 00 00 00 composition_offset 0x00000000/600 = 0.0 秒1
949
950
951

1. Media Header Atomtime_scale の値を利用しています。

Composition Offset Atom が存在する場合 QuickTime ファイルの各サンプルの表示時間は Time-to-Sample Atom のデコード時間に Composition Offset Atomcomposition_offset の値を加算することによって計算できます。 また、表示順序はサンプルを表示時間の昇順でソートすることによって計算できます。 たとえば HEVC Video with Alpha サンプルデータ の各サンプルの表示時間および表示順序は以下のようになります。

サンプル デコード時間 composition_offset 表示時間 表示順序
1 0.o 秒 0.0 秒 0.0 秒 1
2 0.033… 秒 0.1 秒 0.133… 秒 5
3 0.066… 秒 0.0 秒 0.066… 秒 3
4 0.1 秒 -0.066… 秒 0.033… 秒 2
5 0.133… 秒 -0.033… 秒 0.1 秒 4
120 3.966… 秒 0.0 秒 3.966… 秒 120

この HEVC Video with Alpha サンプルデータ の表示順序 2 のサンプルはサンプル 4 です。 つまり、この HEVC Video with Alpha サンプルデータ の 1 番目のフレーム画像を表示したあと 2 番目ののフレーム画像を表示するためには 3 個の QuickTime サンプル (サンプル 2, サンプル 3, サンプル 4) をデコードする必要があります。 つまり、フレーム画像 2 を表示する時の待ち時間はフレーム画像 1 の時の待ち時間の単純計算で 3 倍になります。 このように H.264H.265 フォーマットの動画のサンプルを表示時にデコードすると待ち時間のばらつきが発生します。 この問題は表示前に一定数のサンプルをあらかじめデコードしておくことによって回避できます。

1. "バッファリング" といいます。

Composition Shift Least Greatest Atom

Composition Shift Least Greatest AtomComposition Offset Atom の最大値や最小値を記述した QuickTime Atoms です。 Composition Shift Least Greatest Atom は 9 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Composition Shift Least Greatest Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Composition Shift Least Greatest Atom のサイズ
1
2
3
4 type FourCC "cslg" (Composition Shift Least Greatest Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 composition_offset_to_display_offset_shift タイムカウント 表示時間差分1
13
14
15
16 least_display_offset タイムカウント 最小表示時間差分1
17
18
19
20 greatest_display_offset タイムカウント 最大表示時間差分1
21
22
23
24 display_start_time タイムカウント 表示開始時間1
25
26
27
28 display_end_time タイムカウント 表示終了時間1
29
30
31

1. この composition_offset フィールド値の単位は Movie Header Atomtime_scale 値です。

HEVC Video with Alpha サンプルデータ の場合 Composition Shift Least Greatest Atom はアドレス 0x000B799E から始まる 32 バイトのデータです。

000B7990:                                           00 00                ..
000B79A0: 00 20 63 73 6C 67 00 00 00 00 00 00 00 28 FF FF  . cslg.......(..
000B79B0: FF D8 00 00 00 3C 00 00 00 00 00 00 09 60        .....<.......`

この Composition Shift Least Greatest Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 20 size 32 バイト
1
2
3
4 63 73 6C 67 type "cslg" (Composition Shift Least Greatest Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 28 composition_offset_to_display_offset_shift 0x00000028/600 = 0.066… 秒1
13
14
15
16 FF FF FF D8 least_display_offset 0xFFFFFFD8/600 = -0.066… 秒1
17
18
19
21 00 00 00 3C greatest_display_offset 0x0000003C/600 = 0.1 秒1
22
23
24
25 00 00 00 00 display_start_time 0x00000000/600 = 0.0 秒1
26
27
28
29 00 00 09 60 display_end_time 0x00000960/600 = 4.0 秒1
30
31
32

1. Media Header Atomtime_scale の値を利用しています。

Composition Shift Least Greatest Atom はバッファリングのフレーム画像数の計算に利用可能です。 たとえば、この Composition Shift Least Greatest Atomgreatest_display_offset の値は 0.1 秒です。 このことは、この HEVC Video with Alpha サンプルデータ のデコードする時には "最大 0.1/(1/30) = 3 フレーム分先のフレーム画像を保持する必要がある" ことを意味します。 つまり、バッファリングに必要なフレーム画像の最大数は 3 ということです。

Sync Sample Atom

Sync Sample Atom はキーフレーム1のサンプル番号を列挙した QuickTime Atoms です。 Sync Sample Atom はシーク処理2 を高速化するために用いることができます。 Sync Sample Atom は (sync_samples[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Sync Sample Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sync Sample Atom のサイズ
1
2
3
4 type FourCC "stss" (Sync Sample Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 sync_samples[] の要素数 (k)
13
14
15
16 sync_samples[1] 32 ビット整数 サンプル番号1
17
18
19
size-4 sync_samples[k] 32 ビット整数 サンプル番号k
size-3
size-2
size-1

1. 他の QuickTime サンプル への依存がない QuickTime サンプル のことです。
2. 再生位置を移動する処理のことです。

HEVC Video with Alpha サンプルデータ の場合 Sync Sample Atom はアドレス 0x000B79BE から始まる 32 バイトのデータです。

000B79B0:                                           00 00                ..
000B79C0: 00 20 73 74 73 73 00 00 00 00 00 00 00 04 00 00  . stss..........
000B79D0: 00 01 00 00 00 1F 00 00 00 3D 00 00 00 5B        .........=...[

この Sync Sample Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 20 size 32 バイト
1
2
3
4 63 73 6C 67 type "stss" (Sync Sample Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 04 number_of_entries 4 個
13
14
15
16 00 00 00 01 sync_samples[1] 1
17
18
19
20 00 00 00 1F sync_samples[2] 31
21
22
23
24 00 00 00 3D sync_samples[3] 61
25
26
27
28 00 00 00 5B sync_samples[4] 91
29
30
31

この HEVC Video with Alpha サンプルデータ は 1, 31, 61, 91 の 4 個のキーフレームが存在します。 つまり、この HEVC Video with Alpha サンプルデータ は 0.0 秒、1.0 秒、2.0 秒、3.0 秒の位置ならば遅延なく再生位置を移動可能ということです。

Partial Sync Sample Atom

Pococha が利用する HEVC Video with Alpha ファイルは常に最初から再生されます。 Pococha が利用する HEVC Video with Alpha ファイルは Partial Sync Sample Atom を利用する必要がありません。 このため、本 blog では Partial Sync Sample Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Partial Sync Sample Atom を参照してください。)

Sample Dependency Flags Atom

Sample Dependency Flags AtomQuickTime サンプル 間の依存情報を列挙した QuickTime Atoms です。 Sample Dependency Flags Atom は再生時にデコードをスキップ可能なフレームを列挙するために用いることができます。 Sample Dependency Flags Atom は (sample_dependency_flags[] を 1 個として考えると) 5 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Sample Dependency Flags Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample Dependency Flags Atom のサイズ
1
2
3
4 type FourCC "sdtp" (Sample Dependency Flags Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 sample_dependency_flags[1] Sample Dependency Flag サンプル依存情報1
size-1 sample_dependency_flags[k] Sample Dependency Flag サンプル依存情報k

sample_dependency_flagss[] の要素数は size (または extended_size) フィールド値から Sample Dependency Flags Atom のサイズを引くことで計算できます。 つまり、extended_size フィールドが存在しない場合 sample_dependency_flags[] の要素数は size - 12 です。 また extended_size フィールドが存在する場合 sample_dependency_flags[] の要素数は extended_size - 20 です。

Sample Dependency Flag は以下の値で構成されるビットマスクです。

フィールド 説明
kQTSampleDependency_EarlierDisplayTimesAllowed 0x40
kQTSampleDependency_SampleDoesNotDependOnOthers 0x20 他のサンプルへの依存がない (キーフレーム)
kQTSampleDependency_SampleDependsOnOthers 0x10 他のサンプルへの依存がある (キーフレーム以外)
kQTSampleDependency_NoOtherSampleDependsOnThisSample 0x08 他のサンプルからの依存がない (スキップ可)
kQTSampleDependency_OtherSamplesDependOnThisSample 0x04 他のサンプルからの依存がある (スキップ不可)
kQTSampleDependency_ThereIsNoRedundantCodingInThisSample 0x02 冗長な (エラー修正) データがない
kQTSampleDependency_ThereIsRedundantCodingInThisSample 0x01 冗長な (エラー修正) データがある

HEVC Video with Alpha サンプルデータ の場合 Sample Dependency Flags Atom はアドレス 0x000B79DE から始まる 132 バイトのデータです。

000B79D0:                                           00 00                ..
000B79E0: 00 84 73 64 74 70 00 00 00 00 20 10 10 18 18 10  ..sdtp.... .....
000B79F0: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A00: 10 18 18 10 10 18 18 18 20 10 10 18 18 10 10 18  ........ .......
000B7A10: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A20: 18 10 10 18 18 18 20 10 10 18 18 10 10 18 18 10  ...... .........
000B7A30: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10  ................
000B7A40: 10 18 18 18 20 10 10 18 18 10 10 18 18 10 10 18  .... ...........
000B7A50: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18  ................
000B7A60: 18 18                                            ..

この Sample Dependency Flags Atom の各フィールドの値は以下のとおりです。 (要素数が多いので省略しています。)

データ フィールド
0 00 00 00 84 size 132 バイト
1
2
3
4 84 73 64 74 type "sdtp" (Sample Dependency Flags Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 20 sample_dependency_flags[1] キーフレーム
13 10 sample_dependency_flags[2] キーフレーム以外
14 10 sample_dependency_flags[3] キーフレーム以外
15 18 sample_dependency_flags[4] キーフレーム以外、スキップ可
131 18 sample_dependency_flags[120] キーフレーム以外、スキップ可

この Sample Dependency Flags Atom の内容から HEVC Video with Alpha サンプルデータ のデコードをスキップ可能な QuickTime サンプル は "サンプル 4, サンプル 5, サンプル 8, サンプル 9, ... , サンプル 120" となります。

Sample-to-Chunk Atom

Sample-to-Chunk Atom はチャンク (chunk) の中に含まれる QuickTime サンプル 数を列挙した QuickTime Atoms です。 QuickTime はメディアのサンプルをチャンク (chunk) と呼ばれるグループを用いて管理しています。 Sample-to-Chunk Atom は各チャンクが何個の QuickTime サンプル で構成されているのかを記述しています。 Sample-to-Chunk Atom は (sync_samples[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Sample-to-Chunk Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample-to-Chunk Atom のサイズ
1
2
3
4 type FourCC "stsc" (Sample-to-Chunk Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 sample_to_chunks[] の要素数 (k)
13
14
15
sample_to_chunks[1] Sample-to-Chunk チャンク情報1
sample_to_chunks[k] Sample-to-Chunk チャンク情報k

Sample-to-Chunk は以下の図のように 3 個のフィールドで構成されています。

フィールド 説明
0 first_chunk 32 ビット整数 最初のサンプル番号
1
2
3
4 samples_per_chunk 32 ビット整数 サンプル数
5
6
7
8 samples_description_id 32 ビット整数 サンプル情報番号
9
10
11

HEVC Video with Alpha サンプルデータ の場合 Sample-to-Chunk Atom はアドレス 0x000B7A62 から始まる 28 バイトのデータです。

000B7A60:       00 00 00 1C 73 74 73 63 00 00 00 00 00 00    ....stsc......
000B7A70: 00 01 00 00 00 01 00 00 00 1E 00 00 00 01        ..............

この Sample-to-Chunk Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 00 1C size 28 バイト
1
2
3
4 63 74 74 73 type "stsc" (Sample-to-Chunk Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 01 number_of_entries 1 個
13
14
15
16 00 00 00 01 sample_to_chunks[1] first_chunk 1
17
18
19
20 00 00 00 1E samples_per_chunk 30
21
22
23
24 00 00 00 01 sample_description_id 1
25
26
27

この Sample-to-Chunk Atom は "各チャンクは 30 個の QuickTime サンプル1で構成される" ことを表しています。 一方、この HEVC Video with Alpha サンプルデータ は 120 個の QuickTime サンプル で構成されています。 (Sample Size Atom を参照してください。) このことから、この HEVC Video with Alpha サンプルデータ は 4 個のチャンク (チャンク 1、チャンク 2、チャンク 3、チャンク 4) で構成され、それぞれのチャンクは 30 個の QuickTime サンプル で構成されています。

チャンク サンプル
HEVC Video with Alpha
サンプルデータ
チャンク 1 サンプル 1
サンプル 30
チャンク 2 サンプル 31
サンプル 60
チャンク 3 サンプル 61
サンプル 90
チャンク 4 サンプル 91
サンプル 120

1. 通常 AVAssetWriter の 1c チャンクは 1 秒分の QuickTime サンプル で構成されるようです。

Sample Size Atom

Sample Size AtomQuickTime サンプル のサイズを列挙した QuickTime Atoms です。 Sample Size Atom は (sample_sizes[] を 1 個として考えると) 7 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Sample Size Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Sample Size Atom のサイズ
1
2
3
4 type FourCC "stsz" (Sample Size Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 sample_size 32 ビット整数 共通サンプルサイズ1
13
14
15
16 number_of_entries 32 ビット整数 samples_sizes[] の要素数 (k)
17
18
19
20 sample_sizes[1] 32 ビット整数 サンプルサイズ1
21
22
23
size-4 sample_sizes[k] 32 ビット整数 サンプルサイズk
size-3
size-2
size-1

1. 固定ビットレート (全サンプルのサイズが同一) の場合にのみ利用します。可変ビットレートの場合は 0 です。

HEVC Video with Alpha サンプルデータ の場合 Sample Size Atom はアドレス 0x000B7A7E から始まる 500 バイトのデータです。


000B7A70:                                           00 00                ..
000B7A80: 01 F4 73 74 73 7A 00 00 00 00 00 00 00 00 00 00  ..stsz..........
000B7A90: 00 78 00 00 01 7C 00 00 23 D3 00 00 0E 2F 00 00  .x...|..#..../..
                               (中略)
000B7C60: 00 5A 00 00 00 56 00 00 00 55 00 00 00 55 00 00  .Z...V...U...U..
000B7C70: 00 57                                            .W

この Sample Size Atom の各フィールドの値は以下のとおりです。1

データ フィールド
0 00 00 01 F4 size 500 バイト
1
2
3
4 73 74 73 7A type "stsz" (Sample Size Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 00 sample_size 0 (可変ビットレート)
13
14
15
16 00 00 00 78 number_of_entries 120 個
17
18
19
20 00 00 01 7C sample_sizes[1] 380 バイト
21
22
23
24 00 00 23 D3 sample_sizes[2] 9171 バイト
25
26
27
28 00 00 0E 2F sample_sizes[3] 3631 バイト
29
30
31
492 00 00 00 55 sample_sizes[119] 85 バイト
493
494
495
496 00 00 00 57 sample_sizes[120] 87 バイト
497
498
499

QuickTime ファイルでは各チャンクに含まれる QuickTime サンプル は連続して配置されます。 このことから Sample Size Atomsample_sizes[]Chunk Offset Atomchunk_offsets[] を組み合わせると個々の QuickTime サンプル のファイル内位置を計算することができます。

サンプル開始位置i = チャンク開始位置 チャンクの最初のサンプル
サンプル開始位置i-1 + サンプルサイズi-1 それ以外のサンプル

HEVC Video with Alpha サンプルデータ の各 QuickTime サンプル のファイル内位置を計算すると以下の表1になります。

サンプル チャンク開始位置 サンプルサイズ サンプル開始位置
1 36 380 36
2 9171 416 = 36 + 380
3 9587 = 416 + 9171
31 418848 25121 418848
32 14458 443969 = 418848 + 25121
33 458427 = 443969 + 14458
61 706249 13882 706249
62 4315 820131 = 706249 + 13882
63 824446 = 820131 + 4315
91 747474 274 747474
92 88 747748 = 747474 + 274
93 747836 = 747748 + 88

1. 全サンプルを列挙すると巨大になるため省略しています。

Chunk Offset Atom

Chunk Offset AtomQuickTime ファイルに含まれるチャンクの個数および各チャンクのファイル内位置を記述した QuickTime Atoms です。 Chunk Offset Atom は (chunk_offsets[] を 1 個として考えると) 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Chunk Offset Atom を参照してください。)

フィールド 説明
0 size 32 ビット整数 Chunk Offset Atom のサイズ
1
2
3
4 type FourCC "stco" (Chunk Offset Atom)
5
6
7
8 version バージョン番号
9 flags 未使用
10
11
12 number_of_entries 32 ビット整数 chunk_offsets[] の要素数 (k)
13
14
15
16 chunk_offsets[1] 32 ビット整数 チャンク 1 の開始位置
17
18
19
size-4 chunk_offsets[k] 32 ビット整数 チャンク k の開始位置
size-3
size-2
size-1

HEVC Video with Alpha サンプルデータ の場合 Chunk Offset Atom はアドレス 0x000B7C72 から始まる 32 バイトのデータです。


000B7C70:       00 00 00 20 73 74 63 6F 00 00 00 00 00 00    ... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......
000B7C90: 67 D2                                            g.

この Chunk Offset Atom の各フィールドの値は以下のとおりです。

データ フィールド
0 00 00 01 F4 size 32 バイト
1
2
3
4 73 74 63 6F type "stco" (Chunk Offset Atom)
5
6
7
8 00 version 0
9 00 00 00 flags
10
11
12 00 00 00 04 number_of_entries 4 個
13
14
15
16 00 00 00 24 chunk_offsets[1] 36
17
18
19
20 00 06 64 20 chunk_offsets[2] 418848
21
22
23
24 00 0A C6 C9 chunk_offsets[3] 706249
25
26
27
28 00 0B 67 D2 chunk_offsets[4] 747474
29
30
31

この HEVC Video with Alpha サンプルデータ には 4 個のチャンクがあり、各チャンクのファイル内開始位置は 36, 418848, 706249, 747474 です。 (詳しい利用方法は Sample Size Atom を参照してください。)

User Data Atom

User Data Atom はアプリケーション独自の情報を記述した QuickTime Atoms です。 とはいえ、Pococha が利用する HEVC Video with Alpha ファイルではアプリケーション独自の情報を記述する必要はありません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルでは User Data Atom を利用しません。 このため、本 blog では User Data Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - User Data Atom を参照してください。)

Color Table Atom

Color Table Atom はサンプルのカラーテーブルを記述した QuickTime Atoms です。 とはいえ、そもそも HEVC Video with Alpha ファイルにはカラーテーブルは不要です。 つまり HEVC Video with Alpha ファイルでは Color Table Atom は不要ということです。 このため、本 blog では Color Table Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Color Table Atom を参照してください。)

Compressed Movie Atom

Compressed Movie Atom は圧縮された動画情報を記述した QuickTime Atoms です。 とはいえ、Pococha は動画情報を利用しません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルでは Compressed Movie Atom を利用しません。 このため、本 blog では Compressed Movie Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Compressed Movie Atom を参照してください。)

Reference Movie Atom

Reference Movie Atom は動画の参照情報を記述した QuickTime Atoms です。 とはいえ、Pococha がは動画情報を利用しません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルでは Reference Movie Atom を利用しません。 このため、本 blog では Reference Movie Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Reference Movie Atom を参照してください。)

HEVCPlayerView の実装

HEVCPlayerViewHEVC Video with Alpha ファイルを Video Toolbox を用いてデコードするために以下の処理を行います。

  1. HEVC Video with Alpha ファイルの解析
    1. QuickTime Atoms の列挙
    2. H.265 Decoder Configuration Record の取得
    3. QuickTime サンプル の列挙
    4. QuickTime サンプル の表示時間 (表示順序) の計算
  2. QuickTime サンプル のデコードおよび並び替え

QuickTime Atoms の列挙

HEVCPlayerView は以下の QuickTime Atoms の位置およびサイズを取得します。

HEVCPlayerViewQuickTime Atoms を列挙するため QuickTime Atoms の深さ優先探索を行っています。

HEVC Video with Alpha サンプルデータ の場合、HEVCPlayerViewQuickTime Atoms を以下の順序で探索し、最初に発見した QuickTime Atoms1 を出力します。 (詳しい実装に関しては mov::AtomCollection::EnumerateChildAtoms() を参照してください。)

探索順序 QuickTime Atom 開始位置 出力
1 File Type Compatibility Atom 0x00000000
2 Wide Atom 0x00000014
3 Media Data Atom 0x0000001C
4 Movie Atom 0x000B7285
5 Movie Header Atom 0x000B728D
6 Track Atom 0x000B72F9
7 Track Header Atom 0x000B7301
8 Track Aperture Mode Dimension Atom 0x000B735D
9 Track Clean Aperture Dimensions Atom 0x000B7365
10 Track Production Aperture Dimensions Atom 0x000B7379
11 Track Encoded Pixels Dimensions Atom 0x000B738D
12 Edit Atom 0x000B73A1
13 Media Atom 0x000B73C5
14 Media Header Atom 0x000B73CD
15 Handler Reference Atom 0x000B73ED
16 Media Information Atom 0x000B741E
17 Video Media Information Header Atom 0x000B7426
18 Handler Reference Atom 0x000B743A
19 Data Information Atom 0x000B7472
20 Sample Table Atom 0x000B7496
21 Sample Description Atom 0x000B749E
22 Time-to-Sample Atom 0x000B75CE
23 Composition Offset Atom 0x000B75E6
24 Composition Shift Least Greatest Atom 0x000B799E
25 Sync Sample Atom 0x000B79BE
26 Sample Dependency Flags Atom 0x000B79DE
27 Sample-to-Chunk Atom 0x000B7A62
28 Sample Size Atom 0x000B7A7E
29 Chunk Offset Atom 0x000B7C72

1. この実装のため HEVCPlayerView はデコードに必要な QuickTime AtomsHEVC Video with Alpha ファイルの 2 番目以降の Track Atom 内に存在する場合エラーが発生します。

H.265 Decoder Configuration Record の取得

HEVCPlayerViewSample Description Atom を解析して H.265 Decoder Configuration Record を取得します。

たとえば HEVC Video with Alpha サンプルデータ の場合 HEVCPlayerView は以下のような処理を行います。

  1. Sample Description Atomsample_descriptions[0] (Video Sample Description) を取得
  2. Video Sample Descriptionvideo_sample_extensions[0] (HEVC Decoder Configuration Atom) を取得
  3. HEVC Decoder Configuration Atomdata (H.265 Decoder Configuration Record) を取得
取得された H.265 Decoder Configuration Record は Video Toolbox の初期化関数 (VTDecompressionSessionCreate()) で利用します。

QuickTime サンプルの列挙

HEVCPlayerViewSample-to-Chunk Atom, Sample Size Atom, Chunk Offset Atom を用いて各 QuickTime サンプル の開始位置を計算します。

たとえば HEVC Video with Alpha サンプルデータ の場合 HEVCPlayerView は以下のような処理1 を行います。 (詳しい実装に関しては hevc::Decoder::InitializeSamples() を参照してください。)

  1. Sample-to-Chunk Atom を用いて表を作成します。
    チャンク サンプル
    番号 開始位置 番号 サイズ 開始位置
    0 0
    1
    2
    1 30
    31
    32
    2 60
    61
    62
    3 90
    91
    92
  2. Chunk Offset Atom のチャンク開始位置と Sample Size Atom のサンプルサイズを書き込みます。
    チャンク サンプル
    番号 開始位置 番号 サイズ 開始位置
    0 36 0 380
    1 9171
    2
    1 418848 30 25121
    31 14458
    32
    2 706249 60 13882
    61 4315
    62
    3 747474 90 274
    91 88
    92
  3. チャンク開始位置とサンプルサイズを用いてサンプル開始位置を計算します。
    チャンク サンプル
    番号 開始位置 番号 サイズ 開始位置
    0 36 0 380 36
    1 9171 416 = 36 + 380
    2 9587 = 416 + 9171
    1 418848 30 25121 418848
    31 14458 443969 = 418848 + 25121
    32 458427 = 443969 + 14458
    2 706249 60 13882 706249
    61 4315 820131 = 706249 + 13882
    62 824446 = 820131 + 4315
    3 747474 90 274 747474
    91 88 747748 = 747474 + 274
    92 747836 = 747748 + 88

1. メモリ使用量削減のため厳密な処理方法は異なります。

QuickTime サンプルの表示時間 (表示順序) の計算

Composition Offset Atom で説明したとおり Time-to-Sample AtomComposition Offset Atom を用いると QuickTime サンプル の表示時間 (表示順序) を計算できます。 しかし、この方法だとサンプル数が増えると表示順序の計算 (並び替え) に時間がかかる可能性があります。1 このため HEVCPlayerViewH.265picture_order_count パラメータ 2 の値を取得して表示順序を計算しています。

1. HEVC Video with Alpha サンプルデータ のように Sync Sample Atom が存在する場合は全サンプルを並び替える必要はありません。
2. フレーム画像の表示順序を記述する H.265 のパラメータです。

QuickTime サンプルのデコードおよび並び替え

HEVCPlayerView は列挙された QuickTime サンプルVTDecompressionSessionDecodeFrameWithOutputHandler() 関数を用いてデコードします。 また HEVCPlayerView はデコードされたフレーム画像は QuickTime サンプル の表示順序 (picture_order_count) の値を用いて並び替え (分布数え上げソート) ます。 HEVCPlayerView は負荷分散のためデコード処理を画像表示時ではなく画像表示処理の間の空き時間で行います。

さいごに

最後になりましたが、 HEVCPlayerView の開発およびオープンソース化に協力していただいたすべての方々、特に Pococha チームの方々に感謝させていただきます。 本 blog や HEVCPlayerView が皆さんが HEVC Video with Alpha を利用する際の 助けになれば幸いです。

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。