Movatterモバイル変換


[0]ホーム

URL:


  • Culture
  • Team
  • Event
  • Output
  • Blog
Recruitment

blog

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

2022.07.19技術記事

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

by Hironori Bono

#hevcplayerview#h265#videotoolbox#quicktime

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

背景

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

HEVC Video with Alpha ファイル

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

HEVC Video with Alpha

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

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

QuickTime

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

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

HEVC Video with Alpha サンプルデータ

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

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

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

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

QuickTime Atoms

QuickTime の整数

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

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

QuickTime の FourCC

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

QuickTime の言語コード

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

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

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

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

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

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

QuickTime の時間

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

time_scaletime_count時間
600501/12 (0.083…) 秒
251/24 (0.0416…) 秒
201/30 (0.03…) 秒
121/50 (0.02) 秒
101/60 (0.016…) 秒
51/120 (0.0083…) 秒

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

QuickTime の固定小数点

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

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

QuickTime の日時

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

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

QuickTime の文字列

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

フィールド説明
0length8 ビット整数文字列の長さ
1characters[]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 を参照してください。)

フィールド説明
0a32 ビット固定小数点
1
2
3
4b32 ビット固定小数点
5
6
7
8u32 ビット固定小数点 (2,30)
9
10
11
12c32 ビット固定小数点
13
14
15
16d32 ビット固定小数点
17
18
19
20v32 ビット固定小数点 (2,30)
21
22
23
24tx32 ビット固定小数点
25
26
27
28ty32 ビット固定小数点
29
30
31
32w32 ビット固定小数点 (2,30)
33
34
35

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

actx
bdty
uvw

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

x'actxx
y'=bdty·y
1uvw1

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

100
010
001

QuickTime の描画モード

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

描画モード
0x0000Copy
0x0020Blend
0x0024Transparent
0x0040Dither Copy
0x0100Straight Alpha
0x0101Premultiplied White Alpha
0x0102Premultiplied Black Alpha
0x0103Composition (Dither Copy)
0x0104Straight Alpha Blend

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

QuickTime のカラー

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

フィールド説明
0red16 ビット整数赤色成分
1
2green16 ビット整数緑色成分
3
4blue16 ビット整数青色成分
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 にあります。)

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

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

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

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

データフィールド
000 00 00 14size20 バイト
1
2
3
466 74 79 70type"ftyp" (File Type Compatibility Atom)
5
6
7
8dataFile Type Compatibility Atom 固有データ
19
2000 00 00 08size8 バイト
21
22
23
2477 69 64 65type"wide" (Wide Atom)
25
26
27
2800 0B 72 69size750185 バイト
29
30
31
326d 64 61 74type"mdat" (Media Data Atom)
33
34
35
36dataMedia Data Atom 固有データ
750212
75021300 00 0A 0Dsize2573 バイト
750214
750215
750216
7502176D 6F 6F 76type"moov" (Movie Atom)
750218
750219
750220
750221dataMovie Atom 固有データ
752785

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

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

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

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

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

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

File Type Compatibility Atom

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

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

フィールド説明
0size32 ビット整数File Type Compatibility Atom のサイズ
1
2
3
4typeFourCC"ftyp" (File Type Compatibility Atom)
5
6
7
8major_brandFourCCブランド名
9
10
11
12minor_version32 ビット整数バージョン番号1
13
14
15
16compatible_brands[1]FourCC互換ブランド名1
17
18
19
size-4compatible_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 の個々のフィールドの値は以下の図のようになります。

データフィールド
000 00 00 1Csize28 バイト
1
2
3
466 74 79 70type"ftyp" (File Type Compatibility Atom)
5
6
7
871 74 20 20major_brand"qt " (QuickTime)
9
10
11
1220 20 06 00minor_version2020 年 6 月
13
14
15
1671 74 20 20compatible_brands[1]"qt " (QuickTime)
17
18
19
2069 73 6F 6Dcompatible_brands[2]"isom" (ISO MPEG-4)
21
22
23
246D 70 34 32compatible_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 の個々のフィールドの値は以下の図のようになります。

データフィールド
000 00 00 1Csize28 バイト
1
2
3
466 74 79 70type"ftyp" (File Type Compatibility Atom)
5
6
7
871 74 20 20major_brand"qt " (QuickTime)
9
10
11
1200 00 00 00minor_version0000 年 0 月
13
14
15
1671 74 20 20compatible_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 を参照してください。)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

データフィールド
000 00 00 08size8 バイト
1
2
3
477 69 64 65type"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 を参照してください。)

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

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

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

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

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

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

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

Movie Atom

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

フィールド説明
0size32 ビット整数Movie Atom のサイズ
1
2
3
4typeFourCC"moov" (Movie Atom)
5
6
7
dataMovie 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 フィールドの内容は省略します。)

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

Movie Profile Atom

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

Movie Header Atom

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

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

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

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

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

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

データフィールド
000 00 00 6Csize108 バイト
1
2
3
46D 76 68 64type"mvhd" (Movie Header Atom)
5
6
7
800version0
900 00 00flags
10
11
12DC 64 B5 B3creation_time2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16DC 64 B5 D8modification_time2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
2000 00 02 58time_scale1/0x00000258 = 1/600 秒 (約 1.6 ms)
21
22
23
2400 00 09 60duration0x00000960/600 = 4.0 秒
25
26
27
2800 01 00 00preferred_rate0x00010000/216 = 1.0
29
30
31
3201 00preferred_volume0x0100/28 = 1.0
33
34reserved
43
4400 01 00 00matrix_structurea0x00010000/216 = 1.0
00 00 00 00b0x00000000/216 = 0.0
00 00 00 00u0x00000000/230 = 0.0
00 00 00 00c0x00000000/216 = 0.0
00 01 00 00d0x00010000/216 = 1.0
00 00 00 00v0x00000000/230 = 0.0
00 00 00 00tx0x00000000/216 = 0.0
00 00 00 00ty0x00000000/216 = 0.0
7940 00 00 00w0x40000000/230 = 1.0
8000 00 00 00preview_time0x00000000/600 = 0.0 秒
81
82
83
8400 00 00 00preview_duration0x00000000/600 = 0.0 秒
85
86
87
8800 00 00 00poster_duration0x00000000/600 = 0.0 秒
89
90
91
9200 00 00 00selection_time0x00000000/600 = 0.0 秒
93
94
95
9600 00 00 00selection_duration0x00000000/600 = 0.0 秒
97
98
99
10000 00 00 00current_time0x00000000/0.0 秒
101
102
103
10400 00 00 02next_track_id2
105
106
107

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

Track Atom

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

フィールド説明
0size32 ビット整数Track Atom のサイズ
1
2
3
4typeFourCC"trak" (Track Atom)
5
6
7
dataTrack 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           ....tra000B7300: 6B 00 00 00 5C 74 6B 68 64 00 00 00 0F DC 64 B5  k...\tkhd.....d.000B7350: 00 40 00 00 00 01 68 00 00 02 80 00 00 00 00 00  .@....h.........000B7360: 44 74 61 70 74 00 00 00 14 63 6C 65 66 00 00 00  Dtapt....clef...000B7370: 00 01 68 00 00 02 80 00 00 00 00 00 14 70 72 6F  ..h..........pro000B7380: 66 00 00 00 00 01 68 00 00 02 80 00 00 00 00 00  f.....h.........000B7390: 14 65 6E 6F 66 00 00 00 00 01 68 00 00 02 80 00  .enof.....h.....000B73A0: 00 00 00 00 24 65 64 74 73 00 00 00 1C 65 6C 73  ....$edts....els000B73B0: 74 00 00 00 00 00 00 00 01 00 00 09 60 00 00 00  t...........`...000B73C0: 00 00 01 00 00 00 00 08 CD 6D 64 69 61 00 00 00  .........mdia...                               (中略)000B7C80: 00 04 00 00 00 24 00 06 64 20 00 0A C6 C9 00 0B  .....$..d ......000B7C90: 67 D2                                            g.

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

データフィールド
000 00 09 99size2457 バイト
1
2
3
474 72 61 68type"trak" (Track Atom)
5
6
7
8dataTrack Header Atom
99
100Track Aperture Mode Dimension Atom
167
168Edit Atom
203
204Media 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 を参照してください。)

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

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

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

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

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

データフィールド
000 00 00 5Csize92 バイト
1
2
3
474 6B 68 64type"tkhd" (Track Header Atom)
5
6
7
800version0
900 00 0Fflagsenabled, movie, preview, poster
10
11
12DC 64 B5 B3creation_time2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16DC 64 B5 D8modification_time2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
2000 00 00 01track_id1
21
22
23
24reserved
25
26
27
2800 00 09 60duration0x00000960/600 = 4.0 秒1
29
30
31
32reserved
39
4000 00layer0
41
4200 00alternate_group0
43
4400 00volume0x0000/28 = 0.0
45
46reserved
47
4800 01 00 00matrix_structurea0x00010000/216 = 1.0
00 00 00 00b0x00000000/216 = 0.0
00 00 00 00u0x00000000/230 = 0.0
00 00 00 00c0x00000000/216 = 0.0
00 01 00 00d0x00010000/216 = 1.0
00 00 00 00v0x00000000/230 = 0.0
00 00 00 00tx0x00000000/216 = 0.0
00 00 00 00ty0x00000000/216 = 0.0
8340 00 00 00w0x40000000/230 = 1.0
8401 68 00 00track_width0x01680000/216 = 360
85
86
87
8802 80 00 00track_height0x02800000/216 = 640
89
90
91

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

Track Aperture Mode Dimension Atom

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

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

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

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

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

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

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

データフィールド
000 00 00 44size68 バイト
1
2
3
474 61 70 74type"tapt" (Track Aperture Mode Dimension Atom)
5
6
7
8dataTrack Clean Aperture Dimensions Atom
27
28Track Production Aperture Dimensions Atom
47
48Track 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 を参照してください。)

フィールド説明
0size32 ビット整数Track Clean Aperture Dimensions Atom のサイズ
1
2
3
4typeFourCC"clef" (Track Clean Aperture Dimensions Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12track_width32 ビット固定小数点フレーム画像の幅
13
14
15
16track_height32 ビット固定小数点フレーム画像の高さ
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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 14size20 バイト
1
2
3
463 6C 65 66type"clef" (Track Clean Aperture Dimensions Atom)
5
6
7
800version0
900 00 00flags
10
11
1201 68 00 00track_width0x01680000/216 = 360
13
14
15
1602 80 00 00track_height0x02800000/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 を参照してください。)

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

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

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

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

データフィールド
000 00 00 14size20 バイト
1
2
3
470 72 6F 66type"prof" (Track Production Aperture Dimensions Atom)
5
6
7
800version0
900 00 00flags
10
11
1201 68 00 00track_width0x01680000/216 = 360
13
14
15
1602 80 00 00track_height0x02800000/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 を参照してください。)

フィールド説明
0size32 ビット整数Track Encoded Pixels Dimensions Atom のサイズ
1
2
3
4typeFourCC"enof" (Track Encoded Pixels Dimensions Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12track_width32 ビット固定小数点フレーム画像の幅
13
14
15
16track_height32 ビット固定小数点フレーム画像の高さ
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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 14size20 バイト
1
2
3
465 6E 6F 66type"enof" (Track Encoded Pixels Dimensions Atom)
5
6
7
800version0
900 00 00flags
10
11
1201 68 00 00track_width0x01680000/216 = 360
13
14
15
1602 80 00 00track_height0x02800000/216 = 640
17
18
19

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

Clipping Atom

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

Track Matte Atom

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

Edit Atom

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

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

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

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

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

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

データフィールド
000 00 00 24size36 バイト
1
2
3
465 64 74 73type"edts" (Edit Atom)
5
6
7
8dataEdit List Atom
35

Edit List Atom

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

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

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

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

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

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

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

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

データフィールド
000 00 00 1Csize28 バイト
1
2
3
465 6C 73 74type"elst" (Edit List Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 01number_of_entries1 個
13
14
15
1600 00 09 60edit_list_entries[1]track_duration0x00000960/600 = 4.0 秒2
17
18
19
2000 00 00 00media_time0x00000000/600 = 0.0 秒2
21
22
23
2400 01 00 00media_rate0x00010000/216 = 1.0
25
26
27

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

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

Track Reference Atom

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

Track Exclude from Autoselection Atom

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

Track Load Settings Atom

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

Track Input Map Atom

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

Media Atom

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

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

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

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

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

データフィールド
000 00 08 CDsize2253 バイト
1
2
3
46D 64 69 61type"mdia" (Media Atom)
5
6
7
8dataMedia Header Atom
39
40Handler Reference Atom
88
89Media Information Atom
2252

Media Header Atom

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

フィールド説明
0size32 ビット整数Media Header Atom のサイズ
1
2
3
4typeFourCC"mdhd" (Media Header Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12creation_timeDateTime作成日時
13
14
15
16modification_timeDateTime更新日時
17
18
19
20time_scaleタイムスケール基準時間1
21
22
23
24durationタイムカウント再生時間
25
26
27
28language言語コード言語
29
30quality16 ビット整数再生品質
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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 20size32 バイト
1
2
3
46D 64 68 64type"mdhd" (Media Header Atom)
5
6
7
800version0
900 00 00flags
10
11
12DC 64 B5 B3creation_time2021-03-03T03:40:35Z
(2021 年 3 月 3 日 12:40:35 JST)
13
14
15
16DC 64 B5 D8modification_time2021-03-03T03:41:12Z
(2021 年 3 月 3 日 12:41:12 JST)
17
18
19
2000 00 02 58time_scale1/0x00000258 = 1/600 秒 (約 1.6 ms)
21
22
23
2400 00 09 60duration0x00000960/600 = 4.0 秒
25
26
27
2855 C4language"und" (未定義)
29
3000 00quality0
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 を参照してください。)

フィールド説明
0size32 ビット整数Media Information Atom のサイズ
1
2
3
4typeFourCC"minf" (Media Information Atom)
5
6
7
dataVideo 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 を参照してください。)

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

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

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

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

データフィールド
000 00 08 74size2164 バイト
1
2
3
46D 69 6E 66type"minf" (Media Information Atom)
5
6
7
8dataVideo Media Information Header Atom
27
28Handler Reference Atom
83
84Data Information Atom
119
120Sample 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 を参照してください。)

フィールド説明
0size32 ビット整数Video Media Information Header Atom のサイズ
1
2
3
4typeFourCC"vmhd" (Video Media Information Header Atom)
5
6
7
8versionバージョン番号
9flagsビデオメディア情報
10
11
12graphics_modeGraphics Mode描画モード
13
14opcolorColor合成色
(描画モードが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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 14size20 バイト
1
2
3
476 6D 68 64type"vmhd" (Video Media Information Header Atom)
5
6
7
800version0
900 00 01flags1 (no lean ahead)
10
11
1200 40graphics_modedither copy
13
1480 00opcolorred32768
15
1680 00green32768
17
1880 00blue32768
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 を参照してください。)

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

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

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

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

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

データフィールド
000 00 00 31size49 バイト
1
2
3
468 64 6C 72type"hdlr" (Handler Reference Atom)
5
6
7
800version0
900 00 00flags
10
11
126D 68 6C 72component type"mhlr" (Media Handler)
13
14
15
1676 69 64 65component subtype"vide" (Video Data)
17
18
19
2061 70 70 6Ccomponent manufacturer"appl" (Apple)
21
22
23
2400 00 00 00component flags
25
26
27
2800 00 00 00component flags mask
29
30
31
32component name"Core Media Video"
48

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

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

000B7430:                               00 00 00 38 68 64            ...8hd000B7440: 6C 72 00 00 00 00 64 68 6C 72 61 6C 69 73 61 70  lr....dhlralisap000B7450: 70 6C 00 00 00 00 00 00 00 00 17 43 6F 72 65 20  pl.........Core 000B7460: 4D 65 64 69 61 20 44 61 74 61 20 48 61 6E 64 6C  Media Data Handl000B7470: 65 72                                            er

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

データフィールド
000 00 00 38size56 バイト
1
2
3
468 64 6C 72type"hdlr" (Handler Reference Atom)
5
6
7
800version0
900 00 00flags
10
11
1264 68 6C 72component type"dhlr" (Data Handler)
13
14
15
1661 6C 69 73component subtype"alis" (File Alias)
17
18
19
2061 70 70 6Ccomponent manufacturer"appl" (Apple)
21
22
23
2400 00 00 00component flags
25
26
27
2800 00 00 00component flags mask
29
30
31
32component 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 を参照してください。)

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

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

000B7470:       00 00 00 24 64 69 6E 66 00 00 00 1C 64 72    ...$dinf....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al000B7490: 69 73 00 00 00 01                                is....

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

データフィールド説明
000 00 00 24size36 バイト
1
2
3
464 69 6E 66type"dinf" (Data Information Atom)
5
6
7
8dataData 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 を参照してください。)

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

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

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

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

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

000B7470:                               00 00 00 1C 64 72            ....dr000B7480: 65 66 00 00 00 00 00 00 00 01 00 00 00 0C 61 6C  ef............al000B7490: 69 73 00 00 00 01                                is....

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

データフィールド
000 00 00 1Csize28 バイト
1
2
3
464 72 65 66type"dref" (Data Reference Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 01number_of_entries1 個
13
14
15
1600 00 00 0Cdata_references[1]size12 バイト
17
18
19
2061 6C 69 73type"alis" (ファイル)
21
22
23
2400version0
2500 00 01flag1 (自己参照)
26
27

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

Sample Table Atom

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

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

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

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

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

データフィールド
000 00 07 FCsize2044 バイト
1
2
3
473 74 62 6Ctype"stbl" (Sample Table Atom)
5
6
7
8dataSample Description Atom
311
312Time-to-Sample Atom
335
336Composition Offset Atom
1287
1288Composition Shift Least Greatest Atom
1319
1320Sync Sample Atom
1351
1352Sample Dependency Flags Atom
1483
1484Sample-to-Chunk Atom
1511
1512Sample Size Atom
2011
2012Chunk 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 を参照してください。)

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

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

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

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

データフィールド
000 00 01 30size304 バイト
1
2
3
473 74 73 64type"stsd" (Sample Description Atom)
5
6
7
800version0
9 00 00 00flags
10
11
1200 00 00 01number_of_entries1 個
13
14
15
16sample_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 を参照してください。)

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

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

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

Video Sample Description

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

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

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

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

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

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

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

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

データフィールド
000 00 01 20size288 バイト
1
2
3
468 76 63 31type"hvc1" (H.265 non-elementary stream)
5
6
7
8reserved
13
1400 01data_reference_index1
15
1600 00version0
17
1800 00revision_level0
19
2000 00 00 00vendor
21
22
23
2400 00 02 00temporal_quality512
25
26
27
2800 00 02 00spatial_quality512
29
30
31
3201 68width360
33
3402 80height640
35
3600 48 00 00horizontal resolution0x00480000/216 = 72.0 pixels/inch
37
38
39
4000 48 00 00vertical resolution0x00480000/216 = 72.0 pixels/inch
41
42
43
4400 00 00 00data_size0
45
46
47
4800 01frame_count1
49
50compressor_name"HEVC"
81
8200 18depth241 bits/pixel
83
84FF FFcolor_table_id-1 (the default color table)
85
86video_sample_extensions[1]HEVC Decoder Configuration Atom
287
28400 00 00 00video_sample_extensions[2]QuickTime Atom2
285
286
287

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

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

Sound Sample Description

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

HEVC Decoder Configuration Atom

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

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

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

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

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

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

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

データフィールド
000 00 00 C6size198 バイト
1
2
3
468 76 63 43type"hvcC" (HEVC Decoder Configuration Atom)
5
6
7
8dataH.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 を参照してください。)

フィールド説明
0size32 ビット整数Time-to-Sample Atom のサイズ
1
2
3
4typeFourCC"stts" (Time-to-Sample Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12number_of_entries32 ビット整数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 個のフィールドで構成されています。

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

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

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

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

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

データフィールド
000 00 00 18size24 バイト
1
2
3
473 74 74 73type"stts" (Time-to-Sample Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 01number_of_entries1 個
13
14
15
1600 00 00 78time_to_samples[1]sample_count120 サンプル
17
18
19
2000 00 00 78sample_duration0x00000014/600 = 0.033… 秒1
21
22
23

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

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

サンプルsample_durationデコード時間
11/300.0 秒
21/300.033… 秒
31/300.066… 秒
41/300.1 秒
51/300.133… 秒
1201/303.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 を参照してください。)

フィールド説明
0size32 ビット整数Composition Offset Atom のサイズ
1
2
3
4typeFourCC"ctts" (Composition Offset Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12entry_count32 ビット整数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 個のフィールドで構成されています。

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

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

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

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

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

データフィールド
000 00 03 B8size952 バイト
1
2
3
463 74 74 73type"ctts" (Composition Offset Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 75number_of_entries117 個
13
14
15
1600 00 00 01composition_offsets[1]sample_count1 サンプル
17
18
19
2000 00 00 00composition_offset0x00000000/600 = 0.0 秒1
21
22
23
2400 00 00 01composition_offsets[2]sample_count1 サンプル
25
26
27
2800 00 00 3Ccomposition_offset0x0000003C/600 = 0.1 秒1
29
30
31
3200 00 00 01composition_offsets[3]sample_count1 サンプル
33
34
35
3600 00 00 00composition_offset0x00000000/600 = 0.0 秒1
37
38
39
4000 00 00 01composition_offsets[4]sample_count1 サンプル
41
42
43
44FF FF FF D8composition_offset0xFFFFFFD8/600 = -0.066… 秒1
45
46
47
4800 00 00 01composition_offsets[5]sample_count1 サンプル
49
50
51
52FF FF FF ECcomposition_offset0xFFFFFFEC/600 = -0.033… 秒1
53
54
55
94400 00 00 01composition_offsets[117]sample_count1 サンプル
945
946
947
94800 00 00 00composition_offset0x00000000/600 = 0.0 秒1
949
950
951

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

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

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

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

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

Composition Shift Least Greatest Atom

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

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

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

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

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

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

データフィールド
000 00 00 20size32 バイト
1
2
3
463 73 6C 67type"cslg" (Composition Shift Least Greatest Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 28composition_offset_to_display_offset_shift0x00000028/600 = 0.066… 秒1
13
14
15
16FF FF FF D8least_display_offset0xFFFFFFD8/600 = -0.066… 秒1
17
18
19
2100 00 00 3Cgreatest_display_offset0x0000003C/600 = 0.1 秒1
22
23
24
2500 00 00 00display_start_time0x00000000/600 = 0.0 秒1
26
27
28
2900 00 09 60display_end_time0x00000960/600 = 4.0 秒1
30
31
32

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

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

Sync Sample Atom

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

フィールド説明
0size32 ビット整数Sync Sample Atom のサイズ
1
2
3
4typeFourCC"stss" (Sync Sample Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12number_of_entries32 ビット整数sync_samples[] の要素数 (k)
13
14
15
16sync_samples[1]32 ビット整数サンプル番号1
17
18
19
size-4sync_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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 20size32 バイト
1
2
3
463 73 6C 67type"stss" (Sync Sample Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 04number_of_entries4 個
13
14
15
1600 00 00 01sync_samples[1]1
17
18
19
2000 00 00 1Fsync_samples[2]31
21
22
23
2400 00 00 3Dsync_samples[3]61
25
26
27
2800 00 00 5Bsync_samples[4]91
29
30
31

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

Partial Sync Sample Atom

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

Sample Dependency Flags Atom

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

フィールド説明
0size32 ビット整数Sample Dependency Flags Atom のサイズ
1
2
3
4typeFourCC"sdtp" (Sample Dependency Flags Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12sample_dependency_flags[1]Sample Dependency Flagサンプル依存情報1
size-1sample_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_EarlierDisplayTimesAllowed0x40
kQTSampleDependency_SampleDoesNotDependOnOthers0x20他のサンプルへの依存がない (キーフレーム)
kQTSampleDependency_SampleDependsOnOthers0x10他のサンプルへの依存がある (キーフレーム以外)
kQTSampleDependency_NoOtherSampleDependsOnThisSample0x08他のサンプルからの依存がない (スキップ可)
kQTSampleDependency_OtherSamplesDependOnThisSample0x04他のサンプルからの依存がある (スキップ不可)
kQTSampleDependency_ThereIsNoRedundantCodingInThisSample0x02冗長な (エラー修正) データがない
kQTSampleDependency_ThereIsRedundantCodingInThisSample0x01冗長な (エラー修正) データがある

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 の各フィールドの値は以下のとおりです。 (要素数が多いので省略しています。)

データフィールド
000 00 00 84size132 バイト
1
2
3
484 73 64 74type"sdtp" (Sample Dependency Flags Atom)
5
6
7
800version0
900 00 00flags
10
11
1220sample_dependency_flags[1]キーフレーム
1310sample_dependency_flags[2]キーフレーム以外
1410sample_dependency_flags[3]キーフレーム以外
1518sample_dependency_flags[4]キーフレーム以外、スキップ可
13118sample_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 を参照してください。)

フィールド説明
0size32 ビット整数Sample-to-Chunk Atom のサイズ
1
2
3
4typeFourCC"stsc" (Sample-to-Chunk Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12number_of_entries32 ビット整数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 個のフィールドで構成されています。

フィールド説明
0first_chunk32 ビット整数最初のサンプル番号
1
2
3
4samples_per_chunk32 ビット整数サンプル数
5
6
7
8samples_description_id32 ビット整数サンプル情報番号
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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 00 1Csize28 バイト
1
2
3
463 74 74 73type"stsc" (Sample-to-Chunk Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 01number_of_entries1 個
13
14
15
1600 00 00 01sample_to_chunks[1]first_chunk1
17
18
19
2000 00 00 1Esamples_per_chunk30
21
22
23
2400 00 00 01sample_description_id1
25
26
27

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

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

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

Sample Size Atom

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

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

データフィールド
000 00 01 F4size500 バイト
1
2
3
473 74 73 7Atype"stsz" (Sample Size Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 00sample_size0 (可変ビットレート)
13
14
15
1600 00 00 78number_of_entries120 個
17
18
19
2000 00 01 7Csample_sizes[1]380 バイト
21
22
23
2400 00 23 D3sample_sizes[2]9171 バイト
25
26
27
2800 00 0E 2Fsample_sizes[3]3631 バイト
29
30
31
49200 00 00 55sample_sizes[119]85 バイト
493
494
495
49600 00 00 57sample_sizes[120]87 バイト
497
498
499

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

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

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

サンプルチャンク開始位置サンプルサイズサンプル開始位置
13638036
29171416 = 36 + 380
39587 = 416 + 9171
3141884825121418848
3214458443969 = 418848 + 25121
33458427 = 443969 + 14458
6170624913882706249
624315820131 = 706249 + 13882
63824446 = 820131 + 4315
91747474274747474
9288747748 = 747474 + 274
93747836 = 747748 + 88

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

Chunk Offset Atom

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

フィールド説明
0size32 ビット整数Chunk Offset Atom のサイズ
1
2
3
4typeFourCC"stco" (Chunk Offset Atom)
5
6
7
8versionバージョン番号
9flags未使用
10
11
12number_of_entries32 ビット整数chunk_offsets[] の要素数 (k)
13
14
15
16chunk_offsets[1]32 ビット整数チャンク 1 の開始位置
17
18
19
size-4chunk_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 の各フィールドの値は以下のとおりです。

データフィールド
000 00 01 F4size32 バイト
1
2
3
473 74 63 6Ftype"stco" (Chunk Offset Atom)
5
6
7
800version0
900 00 00flags
10
11
1200 00 00 04number_of_entries4 個
13
14
15
1600 00 00 24chunk_offsets[1]36
17
18
19
2000 06 64 20chunk_offsets[2]418848
21
22
23
2400 0A C6 C9chunk_offsets[3]706249
25
26
27
2800 0B 67 D2chunk_offsets[4]747474
29
30
31

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

User Data Atom

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

Color Table Atom

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

Compressed Movie Atom

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

Reference Movie Atom

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

HEVCPlayerView の実装

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

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

QuickTime Atoms の列挙

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

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

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

探索順序QuickTime Atom開始位置出力
1File Type Compatibility Atom0x00000000
2Wide Atom0x00000014
3Media Data Atom0x0000001C
4Movie Atom0x000B7285
5Movie Header Atom0x000B728D
6Track Atom0x000B72F9
7Track Header Atom0x000B7301
8Track Aperture Mode Dimension Atom0x000B735D
9Track Clean Aperture Dimensions Atom0x000B7365
10Track Production Aperture Dimensions Atom0x000B7379
11Track Encoded Pixels Dimensions Atom0x000B738D
12Edit Atom0x000B73A1
13Media Atom0x000B73C5
14Media Header Atom0x000B73CD
15Handler Reference Atom0x000B73ED
16Media Information Atom0x000B741E
17Video Media Information Header Atom0x000B7426
18Handler Reference Atom0x000B743A
19Data Information Atom0x000B7472
20Sample Table Atom0x000B7496
21Sample Description Atom0x000B749E
22Time-to-Sample Atom0x000B75CE
23Composition Offset Atom0x000B75E6
24Composition Shift Least Greatest Atom0x000B799E
25Sync Sample Atom0x000B79BE
26Sample Dependency Flags Atom0x000B79DE
27Sample-to-Chunk Atom0x000B7A62
28Sample Size Atom0x000B7A7E
29Chunk Offset Atom0x000B7C72

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

H.265 Decoder Configuration Record の取得

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

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

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

QuickTime サンプルの列挙

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

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

  1. Sample-to-Chunk Atom を用いて表を作成します。
    チャンクサンプル
    番号開始位置番号サイズ開始位置
    00
    1
    2
    130
    31
    32
    260
    61
    62
    390
    91
    92
  2. Chunk Offset Atom のチャンク開始位置とSample Size Atom のサンプルサイズを書き込みます。
    チャンクサンプル
    番号開始位置番号サイズ開始位置
    0360380
    19171
    2
    14188483025121
    3114458
    32
    27062496013882
    614315
    62
    374747490274
    9188
    92
  3. チャンク開始位置とサンプルサイズを用いてサンプル開始位置を計算します。
    チャンクサンプル
    番号開始位置番号サイズ開始位置
    036038036
    19171416 = 36 + 380
    29587 = 416 + 9171
    14188483025121418848
    3114458443969 = 418848 + 25121
    32458427 = 443969 + 14458
    27062496013882706249
    614315820131 = 706249 + 13882
    62824446 = 820131 + 4315
    374747490274747474
    9188747748 = 747474 + 274
    92747836 = 747748 + 88

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

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

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

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

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

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

さいごに

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

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

  • x
  • facebook
  • linkedin
  • hatena

related articles

recruit

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


[8]ページ先頭

©2009-2025 Movatter.jp