8つのFull HD映像をフレーム同期してプロジェクター出力する

## 8つのFull HD映像をフレーム同期してプロジェクター出力する

本稿は[とある展示システム](https://vimeo.com/322671485)を制作するにあたり、「8つのFull HD映像をフレーム同期してプロジェクター投影する」という必要があり、結果、入手性のある機材で実現するソリューションが確立できたので、記載しておきます。

### フレーム同期してプロジェクター投影する

本システムでは、複数投影映像を合成して1つの映像を生成するため、その複数投影映像が完全に同期して投影される必要がある。本件のシステムでは（最低4つ）8つのFull HD (1920 x x1080 60p) 映像を同期する必要があった。

映像同期おいては主に

- PCからの送出信号の同期
- プロジェクター側の映像出力の同期

の2つが重要である。後者の「プロジェクター側の映像出力の同期」は、別項プロジェクター選定に関して機会をみて記載するが、今回はプロジェクターへの映像信号が同期していれば、投影される映像も同期する、という仮定で説明する。

PCからの出力信号の同期では、いくつかのシステム構成を試験したので、それらの結果とともに記載する。

## TL;DR

なお、結果的には

- お金があれば**NVIDIA Quadro GPU 複数台 + NVIDIA Quadro Sync IIで Mosaic機能**
- Full HDでよければ：**それなりのGPU (GTX, RTX) + AJA HA5-4K x 2** (運用的にはこちらほうが良かった）
    - GPUからの4K2出力が同期して出力さえできれば大丈夫です。

なお、全てシステムは下記の条件で構成した。

- Windows 10
- TouchDesigner 2018.27910 もしくは 2019.11370 (GPU Direct使用時)
- BenQ DLP Projector

また、手元にあった機材で検証をしたため、もっとより良いシステムはもちろん存在するかとは思う。

> In [this](https://vimeo.com/322671485) exhibition, we’ve needed to find a solution to output eight Full HD (1920 x 1080 60p) projections with all frame synchronized. Eventually, we found these two following system setups made it possible.

> 1. Mosaic display function with Multiple NVIDIA Quadro GPU + NVIDIA Quadro Sync II
2. NVIDIA Quadro (or maybe GTX as well) GPU + AJA HA5-4K x 2  (output two 3840 x 2160 60p which is consist of 4 tiled layout images, from GPU Display port and split them into eight 1920 x 1080 60p SDI images by AJA HA5-4K. Pls, see the figure below. 

> In our case, opt. 2 is more cost effective and better for operational use. 


## GTX1070 + DeckLink Quad 2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/02432def-b1f8-5190-70a7-fe9ee5d91761.png)

BMD DeckLink Quad 2は、SDI IN/OUTを8つ持つので、それらすべてから1080p60映像を送出することができる。 ここでGTX1070上でレンダリングした結果を、DeckLink Quad 2のSDI outから送出する。Touch Designer上からは、Video Device Out TOPから行う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/0e586d5f-0a02-636f-cd97-74aceca4cd37.png)

しかし、この方式は GTX1070 - DeckLink Quad 2間はPCI Expressで接続されGTX1070で生成されたテクスチャがCPUメモリを経由して転送されるために、SDI出力毎に転送時間がかかってしまい結果SDI出力はまったく同期されない。かつ、フレームドロップも観測されてしまうので実用に耐えない。

## Quadro P5000 + DeckLink Quad 2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/fa0d6b38-b01a-d9a0-9a51-f5fdbd83ebf6.png)

Quadro P5000 GPUとBMD DeckLink Quad 2、GPUDirect使えるため、上記のCPUメモリ転送時間に影響されずにテクスチャ転送が処理できる期待ができる。（Touch Designer上からは、Video Device Out TOPから行う。検証時点では、Experimental Buildの2019.11370を使用）
しかし、結果GPUDirectを用いたとしてもそれぞれの映像生成毎に処理時間が発生してしまいその分の時間で、GPUDirectを用いない状況よりかは改善されるものの、出力結果のSDI映像は同期されない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/b0b01a82-abbd-57a7-4b63-3d867f80f0b9.png)

## Quadro P5000  x 2 + NVIDIA Quadro Sync 2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/e6e5b160-dbac-ca34-68b8-5c39f314fe13.png)

[Quadro Sync 2](http://www.elsa-jp.co.jp/products/products-top/graphicsboard_pro/quadro_sync/quadro_sync_option/nvidia-quadro-sync2/)を用いて、Quadro GPUからの映像出力を同期させることができる。合計8つのDisplay Portからそれぞれ1080p60映像を送出することで同期映像を出力できることを期待した。しかし、同一GPU内での映像同期を可能であるが、GPU間での映像同期は確認できなかった。こちらは、TDのwindowを8つ構成してそれぞれのDisplay IDを指定。Vsync ON/OFFともに同期せず。

## Quadro P5000  x 2 + NVIDIA Quadro Sync II with Mosaic機能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/e6e5b160-dbac-ca34-68b8-5c39f314fe13.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/27e3d81c-c7e3-cac4-ceb2-efb7c855c552.png)

上記の構成で同期できなかったため、複数枚同期システムで用いられる[Mosaic機能](https://www.nvidia.com/ja-jp/design-visualization/solutions/nvidia-mosaic-technology/)を利用して、8つの画面を1つの大きな画面として構成して、映像を送出する。この構成でならば8つの映像を同期送出させることが可能であった。しかし、この構成の場合、2つのQuadro P5000に接続できる最大画面数は8つであり、その8つが全て一つのMosaicによる1つの画面になるので制御用の画面を構成することができない。よって映像同期ができるものの、展示システムとしての使用用途としては好ましくない。

(GPUを増設する選択肢もあるが、さらにコストがかかる、かつ3つ以上のGPUを設置するためのPCI Expressレーンが必要になる）

## Quadro P5000 + DeckLink 8K Pro x 2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/a9466f26-5192-311e-7bba-d092a052652c.png)

DeckLink 8K Proのクアッドリンク (Quad-Link 3G-SDI, 4本のSDIで同期したHD映像を送受信することで、4Kの映像伝送を実現する) を用いることで、GPU上で1080pの4つの映像をタイル状に配置した3840 x 2160映像を生成して、DeckLink 8K ProからクアッドリンクとしてHD-SDIとして送出、プロジェクター手前で、SDI-HDMI変換をして用いる。
（Touch Designer上からは、Video Device Out TOPへ、2x2状にタイル配置した3840 x 2160 60pの映像を入力する。検証時点では、Experimental Buildの[2019.11370](https://www.derivative.ca/Builds/TouchDesigner099.2019.11370.exe)を使用)

この手法であれば、Quadro GPU側で生成した1080pの映像4枚は、GPU Directを用いて3840 x 2160のフレームとしてDeckLink 8K Proへ転送されて、4つの映像は同期した状態で4つのHD-SDI出力になるので同期を確保することができる。

しかし、検証しているPC機材では、Quadro P5000がPCIeのレーンを16レーン使用し、DeckLink 8K Pro1つで8レーン消費していまい、もう片方のDeckLink 8K Proが4レーンでの接続状態にしかならなかった。これによって、期待していたGPU Directによる転送も性能が出ないためDeckLink 8K Proの片方で大幅なフレームドロップが発生し使用に耐える状況までは行かなかった。

## Quadro P5000 + HA5-4K x 2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/d0424fab-6759-a8ee-43b0-456a284e289f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/7dfcb2c3-0e44-4825-b8f9-978ed76e08ae.png)

PCI Express経由でのQuad-Link 3G-SDIのテクニックを使用することを断念し、その代り4K HDMIをQuad-Link 3G-SDIへ変換する装置を用いて、システムを構成した。[HA5-4K](https://www.aja.com/products/mini-converters/ha5-4k)は入力として60pの4K/UltraHD から1080p x 4のクアッドリンクSDIへ変換することができる。
よって、Quadro P5000から同期されている4K (3840 x 2160, 60p)を2つ横に連結したWindow2つ分として送出し（おそらくGPUはGTX系でも問題ない）、それぞれのHDMIをHA5-4KによってSDIへ変換する。プロジェクター手前でSDI - HDMI変換を行い、プロジェクターからの出力をする。

(なお、2つの独立した画面として描画しても可能かもしれないが、調査段階でTDのTipsとして上記のような構成にしたほうがよい、という情報からこの構成を用いた）

HA5-4Kと後段のSDI-HDMI変換では計測される遅延差はなかったため、GPUから送出する2枚の4K映像のみ同期を担保することができれば、結果8枚1080pの同期を実現できる。

最終的にこのシステム構成が

- 制御画面のためのDisplay Portを確保することができる
- PCIeのレーン数などの制限を受けない
- （検証していないが）GTX系のGPUでも本構成が可能なので、コストメリットがある。

なお、[HA5-4K](https://www.aja.com/products/mini-converters/ha5-4k)は使用経験のある方からの情報により、熱暴走をする場合があるという報告があり、かつテスト運用においても数回の熱暴走が観測されたため、ヒートシンクを設置した上でかつ、冷却ファボードを併設することで冷却対策をした。これによって、8時間 / 4日間での連続運用でも熱暴走が発生することはなかった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70810/04ddae34-7c0d-9b97-75c6-03360d41a3f4.png)

以上、8つの1920 x 1080 60p映像を同期投影した場合のソリューションに関する調査報告でした。
最終的に複数GPU同期とかにならなかったので、システムのコストパフォマンスもよくなりました。

なお、とあるインスタレーションとは、[これ](https://vimeo.com/322671485)です。
本件は、@satoruhiga  と @comoccとともに取り組んだ内容になります。

いつか誰かの役に立ちますように。

### 2019.4.2追記
ラップトップでのGTX1070 + HA5-4Kでも4画面同期できたので、多分GTX1070 + HA5-4K x 2(もしくは3とか）ができるはず。ラップトップで持ち運べる１２画面同期とかできそう。