はじめに
この記事では、以下ドキュメンテーションの和訳(意訳含む)を行います。
Movie File In TOPを扱ううえで重要な概念が詰まっていますので、
押さえておくと良いのではないかと思い、和訳させていただきました。
Derivative Official Documentation - Movie Playback
概要
この記事では、ムービーの再生に必要なデータ転送と処理の段階について説明します。
特に、Movie File In TOPが、どのようにGPU上のフレームを取得するのかについて詳細に示します。
ディスクからの読み込み
動画データは、非圧縮のRGBAまたはYUV画像データにデコードできるよう、一度CPUメモリ上に読み込む必要があります。
ビットレート
動画のビットレートとは、ファイルを再生するためにディスクから読み込む必要がある1秒あたりのデータ量を指し、
bit/secで与えられます。
一方で、ディスクドライブの読み込み速度は、通常Byte/secで与えられるため、
動画を再生するのに必要な読み取り速度が適切であるかどうかを判断する際には、正しい単位に変換する必要があります。
バイトは通常、大文字の「B」、ビットは小文字の「b」で表されます。
例えば、「1バイト = 8ビット」ですので、ビットレートが80Mb/sのファイルは、ディスク読み込み帯域幅を10MB/s消費します。
バッファ/キャッシュ読み込み
デフォルトでは、OSで読み込まれたすべてのファイルは、バッファ/キャッシュ読み込みの機能を利用して読み込まれます。
つまり、ファイルのデータが、最初にOSが所有するCPUメモリ上にコピーされ、次にTouchDesignerのCPUメモリにコピーされることを意味します。
OSは、そのCPUメモリ領域が他の処理で必要な場合にのみ、キャッシュデータを破棄します。
OSによってメモリに保持されるデータは、圧縮されたファイルデータであり、非圧縮RGB/YUVフレームではありません。
例えば、合計4GBのサイズのファイルを再生する際に、RAMが16GBであった場合を考えます。
アプリケーションが他のRAMを使い切っていない限り、ファイルは一度だけディスクから読み込まれ、以降はOSのCPUメモリ内のデータが読み込まれます。
データは、読み込んだ時点でキャッシュされるため、ファイル全体を一度再生し切るまで完全にキャッシュされません。
ディスクの使用状況を確認することで、再生がディスクから読み取っているのか、キャッシュされたデータを使用しているのかを確認できます。
Note :
最初の再生がうまく再生されず、2回目の再生が早いコンテンツがあった場合、ディスクが必要なレートでデータを配信できず、
再生はキャッシュされたデータからのみ可能であったことを意味しています。
これは、OSがキャッシュされたデータをRAMから削除するかどうかを制御できないため、十分なRAMがないと危険な状態になることがあります。
非常に高いデータレート(圧縮されていないデータ、HAP、ロスレスH264など)を持つファイルを再生していない限り、これは通常です。
High-Performance Read (バッファなし読み込み)
Movie File In TOPのHigh-Performance Readパラメータは、バッファ/キャッシュされたファイルの読み取りを無効にします。
キャッシングを無効にすることで、動画データがディスクから直接TouchDesignerのCPUメモリに読み込まれます。
先ほど述べた、OSのメモリコピー操作を避けられる分、高速に動作します。
また、このモードはTouchDesigner用にアルゴリズムの最適化が行われており、非常に高速なデータレートでの再生が可能です。
このモードを使用することで、再生中にディスクが常に使用され、コンテンツの真のレートで再生が行われます。
フレームのデコード
動画として再生するには、ファイルデータがCPUメモリに格納された後に、イメージ形式にデコードする必要があります。
このイメージ形式とは、通常、非圧縮のRGBまたはYUVデータとなります。
一部のコーデックは、データのデコードのために複数のスレッドを使用しますが、
これはTOPのムービーファイルの「Max Decode CPUs」パラメータで制御できます。
HAPなどのコーデックは非常に軽いCPUデコーディング機能を持ちますが、一方でH264などのコーデックは非常に重いCPUデコーディングとなってしまいます。
Hapの一部はGPUでデコードされますが、依然としてCPUコストがかかります。
デフォルトでは、ロスレスなCPU圧縮がかかってしまい、時間がかる場合があります。
エンコード時にこの圧縮を無効にすると、コストが大幅に削減されますが、メモリコピーが発生し時間がかかることがあります。
デコーディングされたフレームは、TOPのムービーファイルのプレリードキャッシュに配置されます。
このキャッシュのサイズは、「Pre-Read Frames」パラメータによって制御可能です。
Movie File In TOPのpreload()メソッドを使用して、ファイルの残りの再生に与える影響を最小限に抑えた状態で、プレリードキャッシュを埋めることができます。
Movie In CPU Cache Size
従来の機能
TouchDesignerの環境設定のTOPのページには、「Movie In CPU Cache Size」と呼ばれる設定があります。
これは、圧縮されたフレームが次に必要とされるときに再利用されるよう配置可能なメモリのブロックを示しています。
この機能は、圧縮されていない動画がキャッシュに収まるような短いループである場合にのみ機能するため、従来の機能とされています。
非圧縮のデータサイズを指定するため、この機能の使いどころはあまりなく、通常デフォルトの0のままにする必要があります。
GPUへのアップロード
Movie File In TOPが特定のフレームを出力する場合、再生の最終段階に入ります。
フレームは、プレリードキャッシュ上からGPUメモリ上にアップロードされ、GPU上のすべてのTOPで使用可能になります。
フレームがプレリードキャッシュ上にない場合、ムービーを新しいインデックスにキューイングすることによってプレリードミスが発生し、Movie File In TOPが、フレームが読み込み/デコードされるまで待機させられます。