DekTecの Matrix API® 2.0 は、同社のPCIeカードを介してSDIストリームを受信・送信する、ソフトウェアベースの映像処理ソリューションを容易に開発するための使いやすいAPIです。
新しい Zero-Copy(ゼロコピー)機能 により、カードとPC間での映像データ転送時に発生するオーバーヘッドを低減し、可能な限り高効率なデータ処理を実現します。
本記事では、Zero-Copy機能の内部動作について詳しく説明します。
Matrix APIは、ソフトウェア上でオーディオおよびビデオのリアルタイム処理を可能にするC++クラス群です。
ビデオエンコーダやデコーダなど、ソフトウェアベースでありながらリアルタイム動作および低遅延が要求される、PCベースのプロフェッショナル向けA/V(オーディオ・ビジュアル)アプリケーションで広く利用されています。
特に、DekTecのSDI PCIeカードを介してインターフェースを構成する場合、Matrix APIはSDIレイヤーの複雑な処理を完全に隠蔽し、アプリケーション開発を大幅に容易にします。
一方で、UHDのエンコードやマルチチャンネル映像処理をすべてソフトウェアで実現するなど、性能限界に挑戦する用途では、システムレベルで解決すべきいくつかの課題があります。
実際の運用環境では、メモリ帯域幅がCPU処理能力よりも大きなボトルネックになる場合があります。
メモリ帯域幅の使用量を削減するため、最新バージョンのMatrix APIには Zero-Copy(ゼロコピー) と呼ばれる新機能が搭載されています。
本記事の以降では、このZero-Copy機能がどのように動作するのかについて説明します。
以下の図は、DTA-2174Bを例として、Matrix APIを使用した場合の標準的なSDIデータ処理フローを示しています。
左から右への処理フロー:
注記:
SDI出力側(例:デコーダアプリケーションでの出力処理)におけるMatrix APIのフローも基本的には同様ですが、データ処理の方向は逆になります。
前述した処理フローでは、ユーザーアプリケーションは、以降の処理に最も適したピクセルフォーマットで映像データを読み込みます(出力処理の場合は書き込みます)。
この利便性の一方で、デメリットもあります。
ピクセル変換処理では、ピクセルの変換を行いながら、DMAバッファから中間ビデオバッファへ映像データを実質的にコピーしています。
Matrix APIにおけるこの「コピー」処理により、メモリとの間で追加のデータ転送が発生し、使用するメモリ帯域幅が増加します。
ビデオエンコーダやデコーダのように、すでに大きなメモリ帯域幅を必要とするアプリケーションでは、避けることのできるコピー処理を削減することが非常に重要です。
そこで登場するのが Zero-Copy(ゼロコピー) です。
Zero-Copy機能は、ドライバのDMAバッファからビデオバッファへのコピー処理(出力の場合は逆方向のコピー処理)を排除します。
これは、ユーザーアプリケーションがDMAバッファ内の映像データへ直接アクセスできるようにすることで実現しています。
これによりコピー処理を回避できますが、その一方で、映像データはユーザーアプリケーション側ではネイティブ形式である10bit UYVYフォーマットでのみ利用可能になります。
高性能なエンコーダ実装では、Matrix APIにエンコード前のピクセルフォーマット変換を任せるよりも、ピクセル変換処理とエンコード処理そのものを直接組み合わせる方が、より効率的です。
以下の図では、エンコーダ用途のアプリケーションにおけるデータフローを再度示していますが、今回は映像処理にZero-Copyを使用した場合のフローとなっています。
基本的な考え方は、映像データをDMAバッファからフレームバッファへ転送するのではなく、Frame構造体に対して、DMAバッファ内に存在する個々の映像ラインへのポインタのリストを渡すというものです。
この方式により、ユーザーのコールバック関数はポインタを順番に参照しながら、DMAバッファから映像ラインデータを直接読み込み、その映像データをピクセル処理パイプラインへ渡すことができます。
注記:
SDI出力を行うアプリケーションの場合、Zero-Copyの考え方は同じですが、処理方向は逆になります。
つまり、アプリケーションはラインポインタによって指定されたDMAバッファ内の位置へ、映像データを直接書き込みます。
Matrix APIを使用して4K UHD映像を読み込みまたは書き込みする場合、新しいZero-Copy機能により、約20Gbit/sのメモリ帯域幅を削減できます。
これは、一般的なPCで利用可能な総メモリ帯域幅の中でも大きな割合を占める量であり、その分の帯域幅を他の処理用途に有効活用できます。
その結果、特にマルチコアシステムでは、システム全体の動作がよりスムーズになります