ソフトウェアエンジニアの坊野です。 この 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..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A mdat....&....4+*
00000030: AA 89 A6 9A 70 55 F0 AD 8F EF 51 5E 4B DD 88 EA ....pU....Q^K...
00000040: 8A 08 24 33 D6 C8 FD E0 9A 00 00 7A 80 01 1B 64 ..$3.......z...d
00000050: 22 4C 12 30 00 AA 80 A3 15 3F 16 4D 00 00 3D 40 "L.0.....?.M..=@
00000060: 00 71 80 05 D8 00 08 48 2D 5E A8 28 0F 68 93 00 .q.....H-^.(.h..
(中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02 .....> .q.......
000B7280: A6 03 CA 05 C4 00 00 0A 0D 6D 6F 6F 76 00 00 00 .........moov...
000B7290: 6C 6D 76 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5 lmvhd.....d...d.
000B72A0: D8 00 00 02 58 00 00 09 60 00 01 00 00 01 00 00 ....X...`.......
000B72B0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 ................
000B72C0: 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 ................
000B72D0: 00 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 .........@......
000B72E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B72F0: 00 00 00 00 00 00 00 00 02 00 00 09 99 74 72 61 .............tra
000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5 k...\tkhd.....d.
000B7310: B3 DC 64 B5 D8 00 00 00 01 00 00 00 00 00 00 09 ..d.............
000B7320: 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 `...............
000B7330: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7340: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00 00 00 00 .@....h.........
000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00 Dtapt....clef...
000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F ..h..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00 f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00 .enof.....h.....
000B73A0: 00 00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73 ....$edts....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00 t...........`...
000B73C0: 00 00 01 00 00 00 00 08 CD 6D 64 69 61 00 00 00 .........mdia...
000B73D0: 20 6D 64 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5 mdhd.....d...d.
000B73E0: D8 00 00 02 58 00 00 09 60 55 C4 00 00 00 00 00 ....X...`U......
000B73F0: 31 68 64 6C 72 00 00 00 00 6D 68 6C 72 76 69 64 1hdlr....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F 00 00 re Media Video..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00 .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64 ...@.........8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20 pl.........Core
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C Media Data Handl
000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 er...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al
000B7490: 69 73 00 00 00 01 00 00 07 FC 73 74 62 6C 00 00 is........stbl..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00 .0stsd..........
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00 . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68 ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01 ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00 .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00 ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00 ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60 .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00 ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03 ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33 ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01 .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02 `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05 2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00 2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 00 00 .N..............
000B75D0: 00 18 73 74 74 73 00 00 00 00 00 00 00 01 00 00 ..stts..........
000B75E0: 00 78 00 00 00 14 00 00 03 B8 63 74 74 73 00 00 .x........ctts..
000B75F0: 00 00 00 00 00 75 00 00 00 01 00 00 00 00 00 00 .....u..........
000B7600: 00 01 00 00 00 3C 00 00 00 01 00 00 00 00 00 00 .....<..........
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00 ................
(中略)
000B7980: 00 01 00 00 00 00 00 00 00 01 FF FF FF D8 00 00 ................
000B7990: 00 01 FF FF FF EC 00 00 00 01 00 00 00 00 00 00 ................
000B79A0: 00 20 63 73 6C 67 00 00 00 00 00 00 00 28 FF FF . cslg.......(..
000B79B0: FF D8 00 00 00 3C 00 00 00 00 00 00 09 60 00 00 .....<.......`..
000B79C0: 00 20 73 74 73 73 00 00 00 00 00 00 00 04 00 00 . stss..........
000B79D0: 00 01 00 00 00 1F 00 00 00 3D 00 00 00 5B 00 00 .........=...[..
000B79E0: 00 84 73 64 74 70 00 00 00 00 20 10 10 18 18 10 ..sdtp.... .....
000B79F0: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10 ................
000B7A00: 10 18 18 10 10 18 18 18 20 10 10 18 18 10 10 18 ........ .......
000B7A10: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18 ................
000B7A20: 18 10 10 18 18 18 20 10 10 18 18 10 10 18 18 10 ...... .........
000B7A30: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10 ................
000B7A40: 10 18 18 18 20 10 10 18 18 10 10 18 18 10 10 18 .... ...........
000B7A50: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18 ................
000B7A60: 18 18 00 00 00 1C 73 74 73 63 00 00 00 00 00 00 ......stsc......
000B7A70: 00 01 00 00 00 01 00 00 00 1E 00 00 00 01 00 00 ................
000B7A80: 01 F4 73 74 73 7A 00 00 00 00 00 00 00 00 00 00 ..stsz..........
000B7A90: 00 78 00 00 01 7C 00 00 23 D3 00 00 0E 2F 00 00 .x...|..#..../..
(中略)
000B7C60: 00 5A 00 00 00 56 00 00 00 55 00 00 00 55 00 00 .Z...V...U...U..
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00 .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
この HEVC Video with Alpha サンプルデータ は QuickTime Atoms の階層的な構造になっています。
- 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 20 00 00 00 08 77 69 64 65 00 0B 72 69 qt ....wide..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A mdat....&....4+*
(中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02 .....> .q.......
000B7280: A6 03 CA 05 C4 00 00 0A 0D 6D 6F 6F 76 00 00 00 .........moov...
(中略)
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
また、これら最上位 QuickTime Atoms の各フィールドの値は以下のようになります。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 14 |
size | 20 バイト |
1 | |||
2 | |||
3 | |||
4 | 66 74 79 70 |
type | "ftyp" (File Type Compatibility Atom) |
5 | |||
6 | |||
7 | |||
8 | data | File Type Compatibility Atom 固有データ | |
⋮ | |||
19 | |||
20 | 00 00 00 08 |
size | 8 バイト |
21 | |||
22 | |||
23 | |||
24 | 77 69 64 65 |
type | "wide" (Wide Atom) |
25 | |||
26 | |||
27 | |||
28 | 00 0B 72 69 |
size | 750185 バイト |
29 | |||
30 | |||
31 | |||
32 | 6d 64 61 74 |
type | "mdat" (Media Data Atom) |
33 | |||
34 | |||
35 | |||
36 | data | Media Data Atom 固有データ | |
⋮ | |||
750212 | |||
750213 | 00 00 0A 0D |
size | 2573 バイト |
750214 | |||
750215 | |||
750216 | |||
750217 | 6D 6F 6F 76 |
type | "moov" (Movie Atom) |
750218 | |||
750219 | |||
750220 | |||
750221 | data | Movie Atom 固有データ | |
⋮ | |||
752785 |
QuickTime 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 ....qt
extended_size
フィールドは通常 QuickTime Atoms の大きさが 232 = 4 GB を超える場合に用いられます。
とはいえ、この例のようにサイズが 4 GB 未満の QuickTime Atoms に対しても extended_size
フィールドを用いることは可能です。
(実際、常に extended_size
フィールドを用いて Media Data Atom のサイズを指定する MP4 エンコーダが存在します。)
File Type Compatibility Atom
File Type Compatibility Atom はファイルの互換性情報を記述した QuickTime Atom です。 File Type Compatibility Atom は常に QuickTime ファイルの先頭に配置されています。 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 ..ri
00000020: 6D 64 61 74 00 00 00 EB 26 01 AD 0E 8A 34 2B 2A mdat....&....4+*
00000030: AA 89 A6 9A 70 55 F0 AD 8F EF 51 5E 4B DD 88 EA ....pU....Q^K...
00000040: 8A 08 24 33 D6 C8 FD E0 9A 00 00 7A 80 01 1B 64 ..$3.......z...d
00000050: 22 4C 12 30 00 AA 80 A3 15 3F 16 4D 00 00 3D 40 "L.0.....?.M..=@
00000060: 00 71 80 05 D8 00 08 48 2D 5E A8 28 0F 68 93 00 .q.....H-^.(.h..
(中略)
000B7270: A8 00 17 B0 00 3E 20 00 71 C0 00 E7 80 01 87 02 .....> .q.......
000B7280: A6 03 CA 05 C4 .....
一般に k
個の QuickTime サンプル で構成された H.265 ファイルの場合、その Media Data 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 を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "trak" (Track Atom) |
5 | |||
6 | |||
7 | |||
data | Track Profile Atom | ||
Track Header Atom (必須) | |||
Track Aperture Mode Dimension Atom | |||
Clipping Atom | |||
Track Matte Atom | |||
Edit Atom | |||
Track Reference Atom | |||
Track Exclude from Autoselection Atom | |||
Track Load Settings Atom | |||
Track Input Map Atom | |||
Media Atom (必須) | |||
User Data Atom |
HEVC Video with Alpha サンプルデータ の場合 Track Atom はアドレス 0x000B72F9
から始まる 2457 バイトのデータです。
(この HEVC Video with Alpha サンプルデータ には Track Atom が 1 個しか存在しません。
しかし、多くの HEVC Video with Alpha ファイルには Track Atoms が複数個存在します。)
000B72F0: 00 00 09 99 74 72 61 ....tra
000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5 k...\tkhd.....d.
000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00 00 00 00 .@....h.........
000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00 Dtapt....clef...
000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F ..h..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00 f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00 .enof.....h.....
000B73A0: 00 00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73 ....$edts....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00 t...........`...
000B73C0: 00 00 01 00 00 00 00 08 CD 6D 64 69 61 00 00 00 .........mdia...
(中略)
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
この Track Atom は 4 個の QuickTime Atoms で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 09 99 |
size | 2457 バイト |
1 | |||
2 | |||
3 | |||
4 | 74 72 61 68 |
type | "trak" (Track Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Track Header Atom | |
⋮ | |||
99 | |||
100 | Track Aperture Mode Dimension Atom | ||
⋮ | |||
167 | |||
168 | Edit Atom | ||
⋮ | |||
203 | |||
204 | Media Atom | ||
⋮ | |||
2456 |
Track Profile Atom
Track Profile Atom は 2022 年 4 月現在 QuickTime ファイルでは利用されていません。 HEVCPlayerView も利用していないため説明は省略します。 (詳しい情報は QuickTime File Format Specification - Track Profile Atom を参照してください。)
Track Header Atom
Track Header Atom は各トラックの情報 (メタデータ) を提供する QuickTime Atom です。 Track Header Atom は 17 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Header Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Header Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "tkhd" (Track Header Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | ビットマスク | トラック利用情報 (1: enabled, 2: movie, 4: preview, 8: poster) |
10 | |||
11 | |||
12 | creation_time | DateTime | 作成日時 |
13 | |||
14 | |||
15 | |||
16 | modification_time | DateTime | 更新日時 |
17 | |||
18 | |||
19 | |||
20 | track_id | 32 ビット整数 | トラック ID |
21 | |||
22 | |||
23 | |||
24 | reserved | 未使用 | |
25 | |||
26 | |||
27 | |||
28 | duration | タイムカウント | 再生時間1 |
29 | |||
30 | |||
31 | |||
32 | reserved | 未使用 | |
⋮ | |||
39 | |||
40 | layer | 16 ビット整数 | |
41 | |||
42 | alternate_group | 16 ビット整数 | |
43 | |||
44 | volume | 16 ビット固定小数点 | 再生音量 |
45 | |||
46 | reserved | 未使用 | |
47 | |||
48 | matrix_structure | フレーム変換行列 | フレーム変換行列 |
⋮ | |||
83 | |||
84 | track_width | 32 ビット固定小数点 | フレーム画像の幅 |
85 | |||
86 | |||
87 | |||
88 | track_height | 32 ビット固定小数点 | フレーム画像の高さ |
89 | |||
90 | |||
91 |
1. この duration
フィールド値の単位は Movie Header 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
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Aperture Mode Dimension Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "tapt" (Track Aperture Mode Dimension Atom) |
5 | |||
6 | |||
7 | |||
data | Track Clean Aperture Dimensions Atom | ||
Track Production Aperture Dimensions Atom | |||
Track Encoded Pixels Dimensions Atom |
Pococha が利用する HEVC Video with Alpha ファイルはこれらの表示サイズを設定していません。 つまり Track Aperture Mode Dimension Atom のすべての表示サイズは Track Header Atom のピクセルサイズと同一になっています。 このため 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..........pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00 f.....h.........
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00 .enof.....h.....
000B73A0: 00 .
この Track Aperture Mode Dimension Atom は以下の 3 個の QuickTime Atoms で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 44 |
size | 68 バイト |
1 | |||
2 | |||
3 | |||
4 | 74 61 70 74 |
type | "tapt" (Track Aperture Mode Dimension Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Track Clean Aperture Dimensions Atom | |
⋮ | |||
27 | |||
28 | Track Production Aperture Dimensions Atom | ||
⋮ | |||
47 | |||
48 | Track Encoded Pixels Dimensions Atom | ||
⋮ | |||
67 |
Track Clean Aperture Dimensions Atom
Track Clean Aperture Dimensions Atom は Clean Mode における表示サイズを記述した QuickTime Atom です。 Track Clean Aperture Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Clean Aperture Dimensions Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Clean Aperture Dimensions Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "clef" (Track Clean Aperture Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | track_width | 32 ビット固定小数点 | フレーム画像の幅 |
13 | |||
14 | |||
15 | |||
16 | track_height | 32 ビット固定小数点 | フレーム画像の高さ |
17 | |||
18 | |||
19 |
HEVC Video with Alpha サンプルデータ の場合 Track Clean Aperture Dimensions Atom はアドレス 0x000B7365
から始まる 20 バイトのデータです。
000B7360: 00 00 00 14 63 6C 65 66 00 00 00 ....clef...
000B7370: 00 01 68 00 00 02 80 00 00 ..h......
この Track Clean Aperture Dimensions Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 14 |
size | 20 バイト |
1 | |||
2 | |||
3 | |||
4 | 63 6C 65 66 |
type | "clef" (Track Clean Aperture Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 01 68 00 00 |
track_width | 0x01680000/216 = 360 |
13 | |||
14 | |||
15 | |||
16 | 02 80 00 00 |
track_height | 0x02800000/216 = 640 |
17 | |||
18 | |||
19 |
この HEVC Video with Alpha サンプルデータ は Clean Mode の表示サイズを設定していません。 このため、この Track Clean Aperture Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。
Track Production Aperture Dimensions Atom
Track Production Aperture Dimensions Atom は Production Mode における表示サイズを記述した QuickTime Atom です。 Track Production Aperture Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Production Aperture Dimensions Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Production Aperture Dimensions Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "prof" (Track Production Aperture Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | track_width | 32 ビット固定小数点 | フレーム画像の幅 |
13 | |||
14 | |||
15 | |||
16 | track_height | 32 ビット固定小数点 | フレーム画像の高さ |
17 | |||
18 | |||
19 |
HEVC Video with Alpha サンプルデータ の場合 Track Production Aperture Dimensions Atom はアドレス 0x000B7379
から始まる 20 バイトのデータです。
000B7370: 00 00 00 14 70 72 6F ....pro
000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 f.....h......
この Track Production Aperture Dimensions Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 14 |
size | 20 バイト |
1 | |||
2 | |||
3 | |||
4 | 70 72 6F 66 |
type | "prof" (Track Production Aperture Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 01 68 00 00 |
track_width | 0x01680000/216 = 360 |
13 | |||
14 | |||
15 | |||
16 | 02 80 00 00 |
track_height | 0x02800000/216 = 640 |
17 | |||
18 | |||
19 |
この HEVC Video with Alpha サンプルデータ は Production Mode の表示サイズを設定していません。 このため、この Track Production Aperture Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。
Track Encoded Pixels Dimensions Atom
Track Encoded Pixels Dimensions Atom は Encoded Pixels における表示サイズを記述した QuickTime Atom です。 Track Encoded Pixels Dimensions Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Track Encoded Pixels Dimensions Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Track Encoded Pixels Dimensions Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "enof" (Track Encoded Pixels Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | track_width | 32 ビット固定小数点 | フレーム画像の幅 |
13 | |||
14 | |||
15 | |||
16 | track_height | 32 ビット固定小数点 | フレーム画像の高さ |
17 | |||
18 | |||
19 |
HEVC Video with Alpha サンプルデータ の場合 Track Encoded Pixels Dimensions Atom はアドレス 0x000B738D
から始まる 20 バイトのデータです。
000B7380: 00 00 00 ...
000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00 .enof.....h.....
000B73A0: 00 .
この Track Encoded Pixels Dimensions Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 14 |
size | 20 バイト |
1 | |||
2 | |||
3 | |||
4 | 65 6E 6F 66 |
type | "enof" (Track Encoded Pixels Dimensions Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 01 68 00 00 |
track_width | 0x01680000/216 = 360 |
13 | |||
14 | |||
15 | |||
16 | 02 80 00 00 |
track_height | 0x02800000/216 = 640 |
17 | |||
18 | |||
19 |
この HEVC Video with Alpha サンプルデータ は Encoded Pixels の表示サイズを設定していません。 このため、この Track Encoded Pixels Dimensions Atom の表示サイズは Track Header Atom のピクセルサイズと同じになります。
Clipping Atom
Clipping Atom はトラックのクリップ情報を記述した QuickTime Atom です。 Clipping Atom は QuickDraw Region (Apple の非公開情報) を利用しているため Clipping Atom に関する情報は QuickTime File Format Specification - Clipping Atom を参照してください。 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....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00 t...........`...
000B73C0: 00 00 01 00 00 .....
この Edit Atom は 1 個の Edit List Atom で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 24 |
size | 36 バイト |
1 | |||
2 | |||
3 | |||
4 | 65 64 74 73 |
type | "edts" (Edit Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Edit List Atom | |
⋮ | |||
35 |
Edit List Atom
Edit List 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 ....els
000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00 t...........`...
000B73C0: 00 00 01 00 00 .....
この Edit List Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | ||
---|---|---|---|---|
0 | 00 00 00 1C |
size | 28 バイト | |
1 | ||||
2 | ||||
3 | ||||
4 | 65 6C 73 74 |
type | "elst" (Edit List Atom) |
|
5 | ||||
6 | ||||
7 | ||||
8 | 00 |
version | 0 | |
9 | 00 00 00 |
flags | ||
10 | ||||
11 | ||||
12 | 00 00 00 01 |
number_of_entries | 1 個 | |
13 | ||||
14 | ||||
15 | ||||
16 | 00 00 09 60 |
edit_list_entries[1] | track_duration | 0x00000960/600 = 4.0 秒2 |
17 | ||||
18 | ||||
19 | ||||
20 | 00 00 00 00 |
media_time | 0x00000000/600 = 0.0 秒2 | |
21 | ||||
22 | ||||
23 | ||||
24 | 00 01 00 00 |
media_rate | 0x00010000/216 = 1.0 | |
25 | ||||
26 | ||||
27 |
この Edit List Atom の再生範囲は Track Header Atom の情報と同一です。 また、この Edit List Atom の再生速度も 1.0 です。 これらのことから、この HEVC Video with Alpha サンプルデータ は無編集ということを表しています。
2. Movie Header 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....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F 00 00 re Media Video..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00 .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64 ...@.........8hd
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00 ................
(中略)
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00 .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
この Media Atom は 3 個の QuickTime Atoms で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 08 CD |
size | 2253 バイト |
1 | |||
2 | |||
3 | |||
4 | 6D 64 69 61 |
type | "mdia" (Media Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Media Header Atom | |
⋮ | |||
39 | |||
40 | Handler Reference Atom | ||
⋮ | |||
88 | |||
89 | Media Information Atom | ||
⋮ | |||
2252 |
Media Header Atom
Media Header Atom は (メディアの種類に依存しない) メディア情報を記述した QuickTime Atom です。 Media Header Atom は 10 個のフィールドでで構成されています。 (詳しい情報は QuickTime File Format Specification - Media Header Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Media Header Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "mdhd" (Media Header Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | creation_time | DateTime | 作成日時 |
13 | |||
14 | |||
15 | |||
16 | modification_time | DateTime | 更新日時 |
17 | |||
18 | |||
19 | |||
20 | time_scale | タイムスケール | 基準時間1 |
21 | |||
22 | |||
23 | |||
24 | duration | タイムカウント | 再生時間 |
25 | |||
26 | |||
27 | |||
28 | language | 言語コード | 言語 |
29 | |||
30 | quality | 16 ビット整数 | 再生品質 |
31 |
1. この time_scale
の値は Time-to-Sample Atom, Composition Offset Atom, Composition Shift Least Greatest Atom で利用されます。
HEVC Video with Alpha サンプルデータ の場合 Media Header Atom はアドレス 0x000B73CD
から始まる 32 バイトのデータです。
000B73C0: 00 00 00 ...
000B73D0: 20 6D 64 68 64 00 00 00 00 DC 64 B5 B3 DC 64 B5 mdhd.....d...d.
000B73E0: D8 00 00 02 58 00 00 09 60 55 C4 00 00 ....X...`U...
この Media Header Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 20 |
size | 32 バイト |
1 | |||
2 | |||
3 | |||
4 | 6D 64 68 64 |
type | "mdhd" (Media Header Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | DC 64 B5 B3 |
creation_time | 2021-03-03T03:40:35Z (2021 年 3 月 3 日 12:40:35 JST) |
13 | |||
14 | |||
15 | |||
16 | DC 64 B5 D8 |
modification_time | 2021-03-03T03:41:12Z (2021 年 3 月 3 日 12:41:12 JST) |
17 | |||
18 | |||
19 | |||
20 | 00 00 02 58 |
time_scale | 1/0x00000258 = 1/600 秒 (約 1.6 ms) |
21 | |||
22 | |||
23 | |||
24 | 00 00 09 60 |
duration | 0x00000960/600 = 4.0 秒 |
25 | |||
26 | |||
27 | |||
28 | 55 C4 |
language | "und" (未定義) |
29 | |||
30 | 00 00 |
quality | 0 |
31 |
Extended Language Tag Atom
Extended Language Tag Atom はメディアの言語情報を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルは言語情報を常に含みません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Extended Language Tag Atom を利用していません。 このため、本 blog では Extended Language Tag Atom の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Extended Language Tag Atom を参照してください。)
Media Information Atom
Media Information Atom は動画情報や音声情報など (メディアの種類に依存した) メディア情報を記述した QuickTime Atom です。 (詳しい情報は QuickTime File Format Specification - Media Information Atom を参照してください。)
動画メディアの場合 Media Information Atom は 4 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Video Media Information Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Media Information Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "minf" (Media Information Atom) |
5 | |||
6 | |||
7 | |||
data | Video Media Information Header Atom (必須) | ||
Handler Reference Atom (必須) | |||
Data Information Atom | |||
Sample Table Atom |
音声メディアの場合 Media Information Atom は 4 個の QuickTime Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Sound Media Information Atoms を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Media Information Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "minf" (Media Information Atom) |
5 | |||
6 | |||
7 | |||
data | Sound Media Information Header Atoms (必須) | ||
Handler Reference Atom (必須) | |||
Data Information Atom | |||
Sample Table Atom |
HEVC Video with Alpha サンプルデータ の場合 Media Information Atom はアドレス 0x000B741E
から始まる 2164 バイトのデータです。
000B7410: 00 00 ..
000B7420: 08 74 6D 69 6E 66 00 00 00 14 76 6D 68 64 00 00 .tminf....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 00 00 00 38 68 64 ...@.........8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20 pl.........Core
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C Media Data Handl
000B7470: 65 72 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 er...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al
000B7490: 69 73 00 00 00 01 00 00 07 FC 73 74 62 6C 00 00 is........stbl..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00 .0stsd..........
(中略)
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00 .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
この Media Information Atom は 4 個の QuickTime Atoms で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 08 74 |
size | 2164 バイト |
1 | |||
2 | |||
3 | |||
4 | 6D 69 6E 66 |
type | "minf" (Media Information Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Video Media Information Header Atom | |
⋮ | |||
27 | |||
28 | Handler Reference Atom | ||
⋮ | |||
83 | |||
84 | Data Information Atom | ||
⋮ | |||
119 | |||
120 | Sample Table Atom | ||
⋮ | |||
2163 |
Video Media Information Header Atom を含んでいるので、この Media Information Atom は動画メディアの情報を表しています。
Video Media Information Header Atom
Video Media Information Header Atom は動画の描画情報を記述した QuickTime Atom です。 Video Media Information Header Atom は 6 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Video Media Information Header Atoms を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Video Media Information Header Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "vmhd" (Video Media Information Header Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | ビデオメディア情報 | |
10 | |||
11 | |||
12 | graphics_mode | Graphics Mode | 描画モード |
13 | |||
14 | opcolor | Color | 合成色 (描画モードが blend の時に利用) |
15 | |||
16 | |||
17 | |||
18 | |||
19 |
HEVC Video with Alpha サンプルデータ の場合 Video Media Information Header Atom はアドレス 0x000B7426
から始まる 20 バイトのデータです。
000B7420: 00 00 00 14 76 6D 68 64 00 00 ....vmhd..
000B7430: 00 01 00 40 80 00 80 00 80 00 ...@......
この Video Media Information Header Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | ||
---|---|---|---|---|
0 | 00 00 00 14 |
size | 20 バイト | |
1 | ||||
2 | ||||
3 | ||||
4 | 76 6D 68 64 |
type | "vmhd" (Video Media Information Header Atom) |
|
5 | ||||
6 | ||||
7 | ||||
8 | 00 |
version | 0 | |
9 | 00 00 01 |
flags | 1 (no lean ahead) | |
10 | ||||
11 | ||||
12 | 00 40 |
graphics_mode | dither copy | |
13 | ||||
14 | 80 00 |
opcolor | red | 32768 |
15 | ||||
16 | 80 00 |
green | 32768 | |
17 | ||||
18 | 80 00 |
blue | 32768 | |
19 |
Sound Media Information Header Atoms
Sound Media Information Header Atoms はサウンドの再生情報を記述した QuickTime Atom です。 Pococha が利用する HEVC Video with Alpha ファイルはサウンドを常に含みません。 つまり、Pococha が利用する HEVC Video with Alpha ファイルは Sound Media Information Header Atoms を利用していません。 このため、本 blog では Sound Media Information Header Atoms の説明を省略させていただきます。 (詳しい情報は QuickTime File Format Specification - Sound Media Information Header Atom を参照してください。)
Handler Reference Atom
Handler Reference Atom はメディア (およびメディアデータ) の製作者などの情報を記述した QuickTime Atom です。 Handler Reference Atom は 10 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Handler Reference Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Handler Reference Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "hdlr" (Handler Reference Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | component type | FourCC | コンポーネントのタイプ (主) ( "mhlr" media handler または "dhlr" data handler) |
13 | |||
14 | |||
15 | |||
16 | component subtype | FourCC | コンポーネントのタイプ (副) |
17 | |||
18 | |||
19 | |||
20 | component manufacturer | FourCC | コンポーネント製作者 |
21 | |||
22 | |||
23 | |||
24 | component flags | 未使用 | |
25 | |||
26 | |||
27 | |||
28 | component flags mask | 未使用 | |
29 | |||
30 | |||
31 | |||
32 | component name | 文字列 | コンポーネント名 |
⋮ | |||
size-1 |
HEVC Video with Alpha サンプルデータ は 2 個の Handler Reference Atoms を含んでいます。
最初の Handler Reference Atom はアドレス 0x000B73ED
から始まる 49 バイトのデータです。
000B73E0: 00 00 00 ...
000B73F0: 31 68 64 6C 72 00 00 00 00 6D 68 6C 72 76 69 64 1hdlr....mhlrvid
000B7400: 65 61 70 70 6C 00 00 00 00 00 00 00 00 10 43 6F eappl.........Co
000B7410: 72 65 20 4D 65 64 69 61 20 56 69 64 65 6F re Media Video
この Handler Reference Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 31 |
size | 49 バイト |
1 | |||
2 | |||
3 | |||
4 | 68 64 6C 72 |
type | "hdlr" (Handler Reference Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 6D 68 6C 72 |
component type | "mhlr" (Media Handler) |
13 | |||
14 | |||
15 | |||
16 | 76 69 64 65 |
component subtype | "vide" (Video Data) |
17 | |||
18 | |||
19 | |||
20 | 61 70 70 6C |
component manufacturer | "appl" (Apple) |
21 | |||
22 | |||
23 | |||
24 | 00 00 00 00 |
component flags | |
25 | |||
26 | |||
27 | |||
28 | 00 00 00 00 |
component flags mask | |
29 | |||
30 | |||
31 | |||
32 | component name | "Core Media Video" | |
⋮ | |||
48 |
この Handler Reference Atom は "この HEVC Video with Alpha サンプルデータ が Apple の Code Media Video を利用してエンコードされた" ことを表しています。 (実際、この HEVC Video with Alpha サンプルデータ は AVAssetWriter を利用して作成されています。)
2 個目の Handler Reference Atom はアドレス 0x000B743A
から始まる 56 バイトのデータです。
000B7430: 00 00 00 38 68 64 ...8hd
000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70 lr....dhlralisap
000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20 pl.........Core
000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C Media Data Handl
000B7470: 65 72 er
この Handler Reference Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 38 |
size | 56 バイト |
1 | |||
2 | |||
3 | |||
4 | 68 64 6C 72 |
type | "hdlr" (Handler Reference Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 64 68 6C 72 |
component type | "dhlr" (Data Handler) |
13 | |||
14 | |||
15 | |||
16 | 61 6C 69 73 |
component subtype | "alis" (File Alias) |
17 | |||
18 | |||
19 | |||
20 | 61 70 70 6C |
component manufacturer | "appl" (Apple) |
21 | |||
22 | |||
23 | |||
24 | 00 00 00 00 |
component flags | |
25 | |||
26 | |||
27 | |||
28 | 00 00 00 00 |
component flags mask | |
29 | |||
30 | |||
31 | |||
32 | component name | "Core Media Data Handler" | |
⋮ | |||
55 |
この Handler Reference Atom は "この HEVC Video with Alpha サンプルデータ の元データが Apple の Core Media を利用して読み込まれたファイル" ということを表しています。 (実際、この HEVC Video with Alpha サンプルデータ の元データは AVAssetReader を利用して読み込まれています。)
Data Information Atom
Data Information Atom はメディアデータの情報を記述した QuickTime Atom です。 Data Information Atom は 1 個の Data Reference Atom で構成される container atom です。 (詳しい情報は QuickTime File Format Specification - Data Information Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Data Information Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "dinf" (Data Information Atom) |
5 | |||
6 | |||
7 | |||
data | Data Reference Atom (必須) |
HEVC Video with Alpha サンプルデータ の場合 Data Information Atom はアドレス 0x000B7472
から始まる 36 バイトのデータです。
000B7470: 00 00 00 24 64 69 6E 66 00 00 00 1C 64 72 ...$dinf....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al
000B7490: 69 73 00 00 00 01 is....
この Data Information Atom は 1 個の Data Reference Atom で構成されています。
データ | フィールド | 説明 | |
---|---|---|---|
0 | 00 00 00 24 |
size | 36 バイト |
1 | |||
2 | |||
3 | |||
4 | 64 69 6E 66 |
type | "dinf" (Data Information Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Data Reference Atom | |
⋮ | |||
35 |
Data Reference Atom
Data Reference Atom はメディアデータの情報 (Data Reference) を列挙した QuickTime Atom です。
Data Reference Atom は (data_references[]
を 1 個として考えると) 6 個のフィールドで構成されています。
(詳しい情報は QuickTime File Format Specification - Data Information Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Data Reference Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "dref" (Data Reference Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | number_of_entries | 32 ビット整数 | data_reference[] の要素数 (k ) |
13 | |||
14 | |||
15 | |||
data_references[1] | Data Reference | 参照情報1 | |
data_references[k] | Data Reference | 参照情報k |
Data Reference は以下の図のように 5 個のフィールドで構成されています。
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Data Reference のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | Data Reference の種類 ( "alis" (ファイル) または "url " (URL)) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 参照情報 ( 1 自己参照1) |
|
10 | |||
11 | |||
12 | data | Data Reference 固有データ | |
⋮ | |||
size-1 |
1. "外部のファイルを参照していない" という意味です。 (ローカルファイルを AVAssetReader を利用して読み込むと自己参照になります。)
HEVC Video with Alpha サンプルデータ の場合 Data Reference Atom はアドレス 0x000B747A
から始まる 28 バイトのデータです。
000B7470: 00 00 00 1C 64 72 ....dr
000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C ef............al
000B7490: 69 73 00 00 00 01 is....
この Data Reference Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | ||
---|---|---|---|---|
0 | 00 00 00 1C |
size | 28 バイト | |
1 | ||||
2 | ||||
3 | ||||
4 | 64 72 65 66 |
type | "dref" (Data Reference Atom) |
|
5 | ||||
6 | ||||
7 | ||||
8 | 00 |
version | 0 | |
9 | 00 00 00 |
flags | ||
10 | ||||
11 | ||||
12 | 00 00 00 01 |
number_of_entries | 1 個 | |
13 | ||||
14 | ||||
15 | ||||
16 | 00 00 00 0C |
data_references[1] | size | 12 バイト |
17 | ||||
18 | ||||
19 | ||||
20 | 61 6C 69 73 |
type | "alis" (ファイル) |
|
21 | ||||
22 | ||||
23 | ||||
24 | 00 |
version | 0 | |
25 | 00 00 01 |
flag | 1 (自己参照) | |
26 | ||||
27 |
この HEVC Video with Alpha サンプルデータ はファイルを AVAssetReader を利用して読み込んだものです。
このため data_references[0]
の type
は "alis"
, 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 ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01 ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00 .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00 ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00 ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60 .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00 ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03 ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33 ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01 .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02 `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05 2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00 2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 00 00 .N..............
000B75D0: 00 18 73 74 74 73 00 00 00 00 00 00 00 01 00 00 ..stts..........
000B75E0: 00 78 00 00 00 14 00 00 03 B8 63 74 74 73 00 00 .x........ctts..
000B75F0: 00 00 00 00 00 75 00 00 00 01 00 00 00 00 00 00 .....u..........
000B7600: 00 01 00 00 00 3C 00 00 00 01 00 00 00 00 00 00 .....<..........
000B7610: 00 01 FF FF FF D8 00 00 00 01 FF FF FF EC 00 00 ................
(中略)
000B7980: 00 01 00 00 00 00 00 00 00 01 FF FF FF D8 00 00 ................
000B7990: 00 01 FF FF FF EC 00 00 00 01 00 00 00 00 00 00 ................
000B79A0: 00 20 63 73 6C 67 00 00 00 00 00 00 00 28 FF FF . cslg.......(..
000B79B0: FF D8 00 00 00 3C 00 00 00 00 00 00 09 60 00 00 .....<.......`..
000B79C0: 00 20 73 74 73 73 00 00 00 00 00 00 00 04 00 00 . stss..........
000B79D0: 00 01 00 00 00 1F 00 00 00 3D 00 00 00 5B 00 00 .........=...[..
000B79E0: 00 84 73 64 74 70 00 00 00 00 20 10 10 18 18 10 ..sdtp.... .....
000B79F0: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10 ................
000B7A00: 10 18 18 10 10 18 18 18 20 10 10 18 18 10 10 18 ........ .......
000B7A10: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18 ................
000B7A20: 18 10 10 18 18 18 20 10 10 18 18 10 10 18 18 10 ...... .........
000B7A30: 10 18 18 10 10 18 18 10 10 18 18 10 10 18 18 10 ................
000B7A40: 10 18 18 18 20 10 10 18 18 10 10 18 18 10 10 18 .... ...........
000B7A50: 18 10 10 18 18 10 10 18 18 10 10 18 18 10 10 18 ................
000B7A60: 18 18 00 00 00 1C 73 74 73 63 00 00 00 00 00 00 ......stsc......
000B7A70: 00 01 00 00 00 01 00 00 00 1E 00 00 00 01 00 00 ................
000B7A80: 01 F4 73 74 73 7A 00 00 00 00 00 00 00 00 00 00 ..stsz..........
000B7A90: 00 78 00 00 01 7C 00 00 23 D3 00 00 0E 2F 00 00 .x...|..#..../..
(中略)
000B7C60: 00 5A 00 00 00 56 00 00 00 55 00 00 00 55 00 00 .Z...V...U...U..
000B7C70: 00 57 00 00 00 20 73 74 63 6F 00 00 00 00 00 00 .W... stco......
000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B .....$..d ......
000B7C90: 67 D2 g.
この Sample Table Atom は以下の 9 個の QuickTime Atoms で構成されています。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 07 FC |
size | 2044 バイト |
1 | |||
2 | |||
3 | |||
4 | 73 74 62 6C |
type | "stbl" (Sample Table Atom) |
5 | |||
6 | |||
7 | |||
8 | data | Sample Description Atom | |
⋮ | |||
311 | |||
312 | Time-to-Sample Atom | ||
⋮ | |||
335 | |||
336 | Composition Offset Atom | ||
⋮ | |||
1287 | |||
1288 | Composition Shift Least Greatest Atom | ||
⋮ | |||
1319 | |||
1320 | Sync Sample Atom | ||
⋮ | |||
1351 | |||
1352 | Sample Dependency Flags Atom | ||
⋮ | |||
1483 | |||
1484 | Sample-to-Chunk Atom | ||
⋮ | |||
1511 | |||
1512 | Sample Size Atom | ||
⋮ | |||
2011 | |||
2012 | Chunk Offset Atom | ||
⋮ | |||
2043 |
Sample Description Atom
Sample Description Atom はサンプルの複数のメディア依存情報 (Sample Description) を列挙した QuickTime Atom です。
Sample Description Atom は (sample_descriptions[]
を 1 個として考えると) 6 個のフィールドで構成されています。
(詳しい情報は QuickTime File Format Specification - Sample Description Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Sample Description Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "stsd" (Sample Description Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | number_of_entries | 32 ビット整数 | sample_descriptions[] の要素数 (k ) |
13 | |||
14 | |||
15 | |||
sample_descriptions[1] | Sample Description | サンプル情報1 | |
sample_descriptions[k] | Sample Description | サンプル情報k |
HEVC Video with Alpha サンプルデータ の場合 Sample Description Atom はアドレス 0x000B749E
から始まる 304 バイトのデータです。
000B7490: 00 00 ..
000B74A0: 01 30 73 74 73 64 00 00 00 00 00 00 00 01 00 00 .0stsd..........
000B74B0: 01 20 68 76 63 31 00 00 00 00 00 00 00 01 00 00 . hvc1..........
000B74C0: 00 00 00 00 00 00 00 00 02 00 00 00 02 00 01 68 ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01 ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00 .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00 ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00 ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60 .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00 ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03 ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33 ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01 .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02 `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05 2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00 2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 .N............
この Sample Description Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 01 30 |
size | 304 バイト |
1 | |||
2 | |||
3 | |||
4 | 73 74 73 64 |
type | "stsd" (Sample Description Atom) |
5 | |||
6 | |||
7 | |||
8 | 00 |
version | 0 |
9 | 00 00 00 |
flags | |
10 | |||
11 | |||
12 | 00 00 00 01 |
number_of_entries | 1 個 |
13 | |||
14 | |||
15 | |||
16 | sample_descriptions[1] | Video Sample Description (H.265 non-elementary stream) |
|
⋮ | |||
303 |
Sample Description
Sample Description はデコード情報などメディア依存のサンプル情報を記述した QuickTime Atoms です。 Sample Descriptions は 4 個のフィールドで構成されています。 (詳しい情報は QuickTime File Format Specification - Media Data Atom Types を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Sample Description のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | フォーマット名1 |
5 | |||
6 | |||
7 | |||
8 | reserved | 未使用 | |
⋮ | |||
13 | |||
14 | data_reference_index | 参照番号1 | |
15 | |||
16 | data | メディア依存データ | |
⋮ | |||
size-1 |
Sample Description には Video Sample 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 には以下のものがあります。
-
gama
Gamma Level
サンプルのガンマ情報を記述した QuickTime Atom です。 -
fiel
Field Handling
デコードされたデータ処理方法を記述した QuickTime Atom です。 -
mjqt
Motion-JPEG Quantification Table
Motion JPEG の量子化テーブルを記述した QuickTime Atom です。 -
mjht
Motion-JPEG Huffman Table
Motion JPEG のハフマンテーブルを記述した QuickTime Atom です。 -
esds
MPEG-4 Elementary Stream Descriptor Atom
MPEG-4 の Elementary Stream Descriptor を包含した QuickTime Atom です。 -
avcC
AVC Decoder Configuration Atom
H.264 Decoder Configuration Record を包含した QuickTime Atom です。 -
hvcC
HEVC Decoder Configuration Atom
H.265 Decoder Configuration Record を包含した QuickTime Atom です。 -
pasp
Pixel Aspect Ratio
サンプルのピクセル比を記述した QuickTime Atom です。 -
colr
Color Parameter Atoms
サンプルの色変換方法を記述した QuickTime Atom です。 -
clap
Clean 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 ...............h
000B74D0: 02 80 00 48 00 00 00 48 00 00 00 00 00 00 00 01 ...H...H........
000B74E0: 04 48 45 56 43 00 00 00 00 00 00 00 00 00 00 00 .HEVC...........
000B74F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000B7500: 00 18 FF FF 00 00 00 C6 68 76 63 43 01 21 60 00 ........hvcC.!`.
000B7510: 00 00 B0 00 00 00 00 00 3F F0 00 FC FD F8 F8 00 ........?.......
000B7520: 00 0F 04 A0 00 01 00 26 40 01 0C 11 FF FF 21 60 .......&@.....!`
000B7530: 00 00 03 00 B0 00 00 03 00 00 03 00 3F 11 C0 BF ............?...
000B7540: 3F 08 00 08 30 28 52 00 00 03 00 00 65 20 A1 00 ?...0(R.....e ..
000B7550: 02 00 27 42 01 01 21 60 00 00 03 00 B0 00 00 03 ..'B..!`........
000B7560: 00 00 03 00 3F A0 0B 48 02 81 67 11 E4 91 22 33 ....?..H..g..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01 .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02 `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05 2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00 2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 00 00 00 00 .N............
この Video Sample Description の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 01 20 |
size | 288 バイト |
1 | |||
2 | |||
3 | |||
4 | 68 76 63 31 |
type | "hvc1" (H.265 non-elementary stream) |
5 | |||
6 | |||
7 | |||
8 | reserved | ||
⋮ | |||
13 | |||
14 | 00 01 |
data_reference_index | 1 |
15 | |||
16 | 00 00 |
version | 0 |
17 | |||
18 | 00 00 |
revision_level | 0 |
19 | |||
20 | 00 00 00 00 |
vendor | |
21 | |||
22 | |||
23 | |||
24 | 00 00 02 00 |
temporal_quality | 512 |
25 | |||
26 | |||
27 | |||
28 | 00 00 02 00 |
spatial_quality | 512 |
29 | |||
30 | |||
31 | |||
32 | 01 68 |
width | 360 |
33 | |||
34 | 02 80 |
height | 640 |
35 | |||
36 | 00 48 00 00 |
horizontal resolution | 0x00480000/216 = 72.0 pixels/inch |
37 | |||
38 | |||
39 | |||
40 | 00 48 00 00 |
vertical resolution | 0x00480000/216 = 72.0 pixels/inch |
41 | |||
42 | |||
43 | |||
44 | 00 00 00 00 |
data_size | 0 |
45 | |||
46 | |||
47 | |||
48 | 00 01 |
frame_count | 1 |
49 | |||
50 | compressor_name | "HEVC" |
|
⋮ | |||
81 | |||
82 | 00 18 |
depth | 241 bits/pixel |
83 | |||
84 | FF FF |
color_table_id | -1 (the default color table) |
85 | |||
86 | video_sample_extensions[1] | HEVC Decoder Configuration Atom | |
⋮ | |||
287 | |||
284 | 00 00 00 00 |
video_sample_extensions[2] | 空 QuickTime Atom2 |
285 | |||
286 | |||
287 |
AVAssetWriter を用いてエンコードされた HEVC Video with Alpha ファイルは HEVC Video with Alpha Interoperability Profile (Preliminary) に準拠します。
このため type
の値が "hvc1"
になっています。
(実際、この HEVC Video with Alpha サンプルデータ は H.265 elementary stream ではないです。)
Safari など type
の値が "hvc1"
以外のとき期待通りに動作しないアプリケーションがあるため AVAssetWriter 以外の方法で HEVC Video with Alpha ファイルを作成する場合 type
の値を "hvc1"
にする必要3があります。
1. AVAssetWriter でエンコードされた HEVC Video with Alpha ファイルの depth
の値はなぜか 32 ではなく 24 になります。(理由は不明です。)
2. 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..."3
000B7570: 92 49 25 52 7E 86 B4 CA 48 20 00 29 42 09 01 01 .I%R~...H .)B...
000B7580: 60 00 00 03 00 B0 00 00 03 00 00 03 00 3F 48 02 `............?H.
000B7590: D2 00 A0 59 C4 79 24 48 8C E4 92 49 54 9F A1 AD ...Y.y$H...IT...
000B75A0: 32 92 26 C0 10 A2 00 02 00 08 44 01 C0 25 2F 05 2.&.......D..%/.
000B75B0: 32 40 00 08 44 09 48 02 52 F0 53 24 27 00 01 00 2@..D.H.R.S$'...
000B75C0: 09 4E 01 A5 04 10 00 7F 90 80 .N........
この HEVC Decoder Configuration Atom の各フィールドの値は以下のとおりです。
データ | フィールド | 値 | |
---|---|---|---|
0 | 00 00 00 C6 |
size | 198 バイト |
1 | |||
2 | |||
3 | |||
4 | 68 76 63 43 |
type | "hvcC" (HEVC Decoder Configuration Atom) |
5 | |||
6 | |||
7 | |||
8 | data | H.265 Decoder Configuration Record | |
⋮ | |||
197 |
Time-to-Sample Atom
Time-to-Sample Atom は各サンプルの表示期間 (Time-to-Sample Entry) を列挙した QuickTime Atoms です。
また、各サンプルのデコード時間 (デコード順序) も Time-to-Sample Atom を用いて計算可能1です。
(Composition Offset Atom で説明しますが、このデコード時間と表示時間は Composition Offset Atom が存在しない時のみ一致します。)
Time-to-Sample Atom は (time_to_samples[]
を 1 個として考えると) 6 個のフィールドで構成されています。
(詳しい情報は QuickTime File Format Specification - Time-to-Sample Atom を参照してください。)
フィールド | 型 | 説明 | |
---|---|---|---|
0 | size | 32 ビット整数 | Time-to-Sample Atom のサイズ |
1 | |||
2 | |||
3 | |||
4 | type | FourCC | "stts" (Time-to-Sample Atom) |
5 | |||
6 | |||
7 | |||
8 | version | バージョン番号 | |
9 | flags | 未使用 | |
10 | |||
11 | |||
12 | number_of_entries | 32 ビット整数 | time_to_samples[] の要素数 (k ) |
13 | |||
14 | |||
15 | |||
time_to_samples[1] | Time-to-Sample Entry | サンプル表示期間1 | |
time_to_samples[k] | Time-to-Sample Entry | サンプル表示期間k |
Time-to-Sample Entry は以下の図のように 2 個のフィールドで構成されています。
フィールド | 型 | 説明 | |
---|---|---|---|
0 | sample_count | 32 ビット整数 | サンプル数 |
1 | |||
2 | |||
3 | |||
4 | sample_duration | タイムカウント | 再生期間2 |
5 | |||
6 | |||
7 |
1. サンプル番号を i
のとき、サンプル時間は time_to_samples[1]
から time_to_samples[i]
までの合計値です。
2. この sample_duration
フィールド値の単位は Media Header 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() を参照してください。)
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 を利用する際の 助けになれば幸いです。
最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。