2022.07.19技術記事
動画エフェクト負荷を大きく軽減した HEVCPlayerView 詳解
contents
ソフトウェアエンジニアの坊野です。 この blog では、先日GitHub で公開されたHEVCPlayerView について説明させていただきます。
背景
Pococha は DeNA が提供しているライブコミュニケーションアプリです。Pococha は動画配信時に様々な動画エフェクトを表示しています。 この動画エフェクトは配信画像の上にエフェクト画像を合成することによって実装されています。
しかし、この "動画エフェクトが重い" というご意見を多くのユーザからいただいたため、私たちはこの動画エフェクト表示部分の負荷について詳しく調査しました。 その結果、以下の処理の負荷が高くなっていました。
当時Pococha の動画エフェクトは 2 個の動画ファイル1 で構成されていました。Pococha は動画エフェクト表示時にこれら 2 個の動画ファイル1 に対して以下の処理を行っていました。

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 Toolbox はiPhone 端末やMac の動画デコーダ (ハードウェア) を直接制御する API です。Pococha はAVAssetReader クラスを用いて動画ファイルの読み込み処理およびデコード処理を行っていました。 しかしAVAssetReader クラスはURL で記述可能な動画ファイルしかデコードできません。 このため、メモリ上の動画データなどURL で記述不可能なものをデコードすることはできません。 一方Video Toolbox を用いるとメモリ上のHEVC Video with Alpha データのデコードも可能です。 つまり、動画エフェクト表示開始前にHEVC Video with Alpha ファイルをメモリに読み込んだ後Video Toolbox を用いてHEVC Video with Alpha データをデコードすれば動画エフェクト表示時の動画ファイル読み込み処理をなくすことができます。
しかし、これらの技術を採用するためには以下の問題を解決する必要がありました。
- HEVC Video with Alpha に関する資料が少ない
- 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 に対する理解を深めることから始めました。
Pococha がHEVC 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 によりMacOS 版FFmpeg を用いた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 を利用していました。Metal はiPhone 端末において最も高速に画面描画可能な 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 ファイルの構造では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.HEVCPlayerView はH.265 データストリームの解析も行っていますが、その部分に関する説明は省略します。
HEVC Video with Alpha ファイル
この章ではHEVC Video with Alpha ファイルの概要を説明します。
HEVC Video with Alpha
HEVC Video with Alpha は画像のカラーだけでなく画素の透明度1 もエンコード可能な拡張H.2652 フォーマットのことです。HEVC Video with Alpha はH.2652 のレイヤー拡張機能を用いて実装されています。 このレイヤー拡張機能とはH.2652 規格書の Annex F で定義されているH.2652 の拡張機能です。 このレイヤー拡張機能を用いたH.265 ストリーム2の各フレーム画像は複数の画像 (レイヤー) で構成されています。 具体的にいえばHEVC Video with Alpha ファイルの各フレーム画像は YUV カラー画像レイヤーと alpha 画像レイヤーの 2 個のレイヤーで構成されています。
レイヤー拡張機能に対応したH.2652 デコーダはこれらのレイヤー画像を合成してフレーム画像を出力します。iOS のH.265 デコーダ (ハードウェア) はiOS 13 以降HEVC Video with Alpha に対応しています。 (またMacOS のH.2652 デコーダ (ハードウェア) はMacOS 10.15 以降HEVC Video with Alpha に対応しています。) このため、現在のiPhone やMac はハードウェアで高速に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) で圧縮された動画データをファイルとして配布する場合、通常MP43 やQuickTime,WebM,Matroska などの "コンテナ" と呼ばれるフォーマットを利用します。HEVC Video with Alpha ファイルはコンテナフォーマットとしてQuickTime4 を利用しています。 簡単にいえばHEVC Video with Alpha ファイルは拡張子.mov のQuickTime ファイルということです。
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.MP42 はQuickTime を基にして作成されました。このためMP42 とQuickTime は互換性があります。
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..ri00000020: 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...d00000050: 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 .............tra000B7300: 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..........pro000B7380: 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....els000B73B0: 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....mhlrvid000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co000B7410: 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 ...@.........8hd000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap000B7450: 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 Handl000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 er...$dinf....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al000B7490: 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 ...............h000B74D0: 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..."3000B7570: 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 の階層的な構造になっています。
- File Type Compatibility Atom
- Wide Atom
- Media Data Atom
- Movie Atom
これらのQuickTime Atoms をHEVC Video with Alpha サンプルデータ 上に合成表示すると以下のようになります。

QuickTime の整数
QuickTime は整数を 1, 2, 4, 8 バイトのデータで記述します。 また、データの順序は最大バイト先頭順 (Most Significant Byte First Order)1 です。 たとえば32 ビット整数 データ01 02 03 04 は 0x01020304 = 16909060 を意味します。
1. いわゆる "ビッグエンディアン" のことです。
QuickTime の FourCC
QuickTime はQuickTime Atoms の識別子などに 4 個の ASCII アルファベットコードで構成された32 ビット整数 を用います。 一般にこれらの32 ビット整数 はFourCC (Four Character Code) と呼ばれます。FourCC は32 ビット整数 ですが、可読性を考慮して文字列表記が通常用いられます。 たとえば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_scale | time_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 ビットの固定小数点
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 FF は2040-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 2000 00 00 08 77 69 64 6500 0B 72 69 qt ....wide..ri00000020: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 C400 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 Atom のsize フィールドは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 Atom をextended_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 ....qtextended_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 ファイルの先頭に配置されています。QuickTime はMP4 と互換性があります。 また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 Atom のextended_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 Atom にextended_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 Atom のdata フィールドの移動なしで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 ..ri00000020: 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...d00000050: 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 Atom のdata フィールドは以下のような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 Atom のdata フィールドは以下のような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 Atom はQuickTime ムービーの情報を記述した 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 Atom はQuickTime ファイル全体の情報 (メタデータ) を提供する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 Atom やEdit 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 Atom のpreview_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 を参照してください。)
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 ....tra000B7300: 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..........pro000B7380: 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....els000B73B0: 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 Atom のtime_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 Atom のtime_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
Pococha が利用するHEVC Video with Alpha ファイルはこれらの表示サイズを設定していません。 つまりTrack Aperture Mode Dimension Atom のすべての表示サイズはTrack Header Atom のピクセルサイズと同一になっています。 このためHEVCPlayerView はTrack 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..........pro000B7380: 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 ....pro000B7380: 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 を参照してください。HEVCPlayerView はClipping Atom を利用していません。
Track Matte Atom
Track Matte Atom は透かし画像 (ウォーターマーク) などこのトラックの画像と合成したい画像を提供するQuickTime Atom です。 (詳しい情報はQuickTime File Format Specification - Track Matte Atom を参照してください。)HEVCPlayerView はTrack 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 ファイルはトラックの編集情報を設定していません。 (常にトラック全体を再生します。) このためHEVCPlayerView はEdit 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....els000B73B0: 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 Atom はEdit 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 Entry はEdit 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 Atom のtime_scale 値です。
HEVC Video with Alpha サンプルデータ の場合Edit List Atom はアドレス0x000B73A9 から始まる 28 バイトのデータです。
000B73A0: 00 00 00 1C 65 6C 73 ....els000B73B0: 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 Atom のtime_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 ファイル全体を先読みします。 つまりHEVCPlayerView はTrack 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....mhlrvid000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co000B7410: 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 ...@.........8hd000B7610: 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 ...@.........8hd000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap000B7450: 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 Handl000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 er...$dinf....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al000B7490: 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....mhlrvid000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co000B7410: 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 ...8hd000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap000B7450: 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 Handl000B7470: 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....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al000B7490: 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 ....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al000B7490: 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",flag は1 になっています。
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 ...............h000B74D0: 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..."3000B7570: 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 ...............h000B74D0: 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..."3000B7570: 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 Description やSound Sample Description などの派生オブジェクトが存在しdata の内容は派生オブジェクトによって異なります。type の値が"avc1" (H.264),"hev1" (H.265 elementary stream),"hvc1" (H.265 non-elementary stream) などの場合、このSample Description はVideo Sample Description を表しています。 またtype の値が"mp4a" (MPEG-4 Advanced Audio Coding (AAC)) などの場合、このSample Description はSound 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 Atom のdata_references[] の index
Video Sample Description
Video Sample Description は動画フォーマット名、フレーム画像の大きさ、デコード情報など動画メディアのサンプル情報を記述したQuickTime Atoms です。Video Sample Description はSample 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 Atom の data_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_id はdepth が 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 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 ...............h000B74D0: 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..."3000B7570: 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.AVAssetWriter はVideo 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 Atom はH.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 Toolbox はHEVC Decoder Configuration Atom のH.265 Decoder Configuration Record を初期化時に利用します。 とはいえH.265 Decoder Configuration Record について詳しく知らなくてもHEVC Video with Alpha ファイルをVideo Toolbox を用いてデコードすることは可能です。 このため、本 blog ではH.265 Decoder Configuration Record の説明を省略1させていただきます。
1.HEVCPlayerView のDecoder::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..."3000B7570: 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 Atom のtime_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 Atom のtime_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 Atom のtime_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 Atom のtime_scale の値を利用しています。
Composition Offset Atom が存在する場合QuickTime ファイルの各サンプルの表示時間はTime-to-Sample Atom のデコード時間にComposition Offset Atom のcomposition_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.264 やH.265 フォーマットの動画のサンプルを表示時にデコードすると待ち時間のばらつきが発生します。 この問題は表示前に一定数のサンプルをあらかじめデコードしておくことによって回避できます。
1. "バッファリング" といいます。
Composition Shift Least Greatest Atom
Composition Shift Least Greatest Atom はComposition 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 Atom のtime_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 Atom のtime_scale の値を利用しています。
Composition Shift Least Greatest Atom はバッファリングのフレーム画像数の計算に利用可能です。 たとえば、このComposition Shift Least Greatest Atom のgreatest_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 Atom はQuickTime サンプル 間の依存情報を列挙した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 Atom はQuickTime サンプル のサイズを列挙した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 Atom のsample_sizes[] とChunk Offset Atom のchunk_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 Atom はQuickTime ファイルに含まれるチャンクの個数および各チャンクのファイル内位置を記述した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 の実装
HEVCPlayerView はHEVC Video with Alpha ファイルをVideo Toolbox を用いてデコードするために以下の処理を行います。
- HEVC Video with Alpha ファイルの解析
- QuickTime Atoms の列挙
- H.265 Decoder Configuration Record の取得
- QuickTime サンプル の列挙
- QuickTime サンプル の表示時間 (表示順序) の計算
- QuickTime サンプル のデコードおよび並び替え
QuickTime Atoms の列挙
HEVCPlayerView は以下のQuickTime Atoms の位置およびサイズを取得します。
- File Type Compatibility Atom
- Media Data Atom
- Media Header Atom
- Sample Description Atom
- Sample-to-Chunk Atom
- Sample Size Atom
- Chunk Offset Atom
- Time-to-Sample Atom
HEVCPlayerView はQuickTime Atoms を列挙するためQuickTime Atoms の深さ優先探索を行っています。
HEVC Video with Alpha サンプルデータ の場合、HEVCPlayerView はQuickTime 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 Atoms がHEVC Video with Alpha ファイルの 2 番目以降のTrack Atom 内に存在する場合エラーが発生します。
H.265 Decoder Configuration Record の取得
HEVCPlayerView はSample Description Atom を解析してH.265 Decoder Configuration Record を取得します。
たとえばHEVC Video with Alpha サンプルデータ の場合HEVCPlayerView は以下のような処理を行います。
- Sample Description Atom の
sample_descriptions[0](Video Sample Description) を取得 - Video Sample Description の
video_sample_extensions[0](HEVC Decoder Configuration Atom) を取得 - HEVC Decoder Configuration Atom の
data(H.265 Decoder Configuration Record) を取得
QuickTime サンプルの列挙
HEVCPlayerView はSample-to-Chunk Atom,Sample Size Atom,Chunk Offset Atom を用いて各QuickTime サンプル の開始位置を計算します。
たとえばHEVC Video with Alpha サンプルデータ の場合HEVCPlayerView は以下のような処理1 を行います。 (詳しい実装に関しては hevc::Decoder::InitializeSamples() を参照してください。)
- Sample-to-Chunk Atom を用いて表を作成します。
チャンク サンプル 番号 開始位置 番号 サイズ 開始位置 0 0 1 2 ⋮ ⋮ ⋮ 1 30 31 32 ⋮ ⋮ ⋮ 2 60 61 62 ⋮ ⋮ ⋮ 3 90 91 92 ⋮ ⋮ ⋮ - 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 ⋮ ⋮ ⋮ - チャンク開始位置とサンプルサイズを用いてサンプル開始位置を計算します。
チャンク サンプル 番号 開始位置 番号 サイズ 開始位置 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 Atom とComposition Offset Atom を用いるとQuickTime サンプル の表示時間 (表示順序) を計算できます。 しかし、この方法だとサンプル数が増えると表示順序の計算 (並び替え) に時間がかかる可能性があります。1 このためHEVCPlayerView はH.265 のpicture_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 を利用する際の 助けになれば幸いです。
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。


