GPL ライセンス違反で FFmpeg 4.1 系以降から削除された NDI ライブラリを最新のソースツリーに組み込んでビルドする手順 

# はじめに
FFmpeg 3.4 で NDI がサポートされましたが、その後 NewTek 社が GPL ライセンス違反で適切な対応が取られなかったことで、FFmpeg 4.1系以降から NDI のサポートが削除されました。

<img width="50%" alt="スクリーンショット 2020-04-29 0.32.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c281198f-f9ef-f5fe-0283-add522af243e.png">

(参考)
https://trac.ffmpeg.org/ticket/7589
https://patchwork.ffmpeg.org/project/ffmpeg/patch/CAB0OVGpkpyFzmkuC+kO3-Er3iNYH9hpO4zDTQZbRpEyFu=fjuQ@mail.gmail.com/

# FFmepg 4.0 系でビルドする手順
FFmpeg 4.0 系 (4.0 系の最終 4.0.5) であれば適切な NDI SDK ライブラリを組み込めば問題なくビルドできます。

(参考)
https://qiita.com/kitazaki/items/eeb710a78c657024f844
https://qiita.com/kitazaki/items/8b1f730903d3a62025e9

# FFmpeg 4.1 系以降でビルドする方法
FFmpeg 4.2 系 (2020 年 4 月 29 日時点の最終 4.2.2) で NDI SDK ライブラリを組み込んでビルドする手順です。
手掛かりは FFmpeg 4.1 で NDI に関連するソースコードが削除された履歴 (Patch) です。
<img width="75%" alt="hints.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6e84e79b-c9fd-3386-bc56-478dda46317e.png">

削除されたコードを最新のソースツリーに反映することで NDI SDK ライブラリを組み込めば問題なくビルドできました。

最初に FFmpeg 4.2 系 (2020 年 4 月 29 日時点の最終 4.2.2) のソースコードをダウンロードします。

```bash
$ git clone git://source.ffmpeg.org/ffmpeg.git -b release/4.2 --depth=1
$ cd ffmpeg
```

１. configure ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を configure ファイルに追加します。

```patch
@@ -297,7 +297,6 @@  External library support:
   --enable-lv2             enable LV2 audio filtering [no]
   --disable-lzma           disable lzma [autodetect]
   --enable-decklink        enable Blackmagic DeckLink I/O support [no]
-  --enable-libndi_newtek   enable Newteck NDI I/O support [no]</font>
   --enable-mbedtls         enable mbedTLS, needed for https support
                            if openssl, gnutls or libtls is not used [no]
   --enable-mediacodec      enable Android MediaCodec support [no]
@@ -1675,7 +1674,6 @@  EXTERNAL_LIBRARY_GPL_LIST="
 
 EXTERNAL_LIBRARY_NONFREE_LIST="
     decklink
-    libndi_newtek
     libfdk_aac
     openssl
     libtls
@@ -3256,10 +3254,6 @@  decklink_indev_extralibs="-lstdc++"
 decklink_outdev_deps="decklink threads"
 decklink_outdev_suggest="libklvanc"
 decklink_outdev_extralibs="-lstdc++"
-libndi_newtek_indev_deps="libndi_newtek"
-libndi_newtek_indev_extralibs="-lndi"
-libndi_newtek_outdev_deps="libndi_newtek"
-libndi_newtek_outdev_extralibs="-lndi"
 dshow_indev_deps="IBaseFilter"
 dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
 fbdev_indev_deps="linux_fb_h"
@@ -6064,7 +6058,6 @@  enabled cuda_sdk          && require cuda_sdk cuda.h cuCtxCreate -lcuda
 enabled chromaprint       && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
 enabled decklink          && { require_headers DeckLinkAPI.h &&
                                { test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a090500" || die "ERROR: Decklink API version must be >= 10.9.5."; } }
-enabled libndi_newtek     && require_headers Processing.NDI.Lib.h
 enabled frei0r            && require_headers frei0r.h
 enabled gmp               && require gmp gmp.h mpz_export -lgmp
 enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
```

次に libavdevice ディレクトリへ移動します。

```bash
$ cd libavdevice
```

２. libavdevice/Makefile　ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を Makefile ファイルに追加します。

```patch
@@ -20,8 +20,6 @@  OBJS-$(CONFIG_BKTR_INDEV)                += bktr.o
 OBJS-$(CONFIG_CACA_OUTDEV)               += caca.o
 OBJS-$(CONFIG_DECKLINK_OUTDEV)           += decklink_enc.o decklink_enc_c.o decklink_common.o
 OBJS-$(CONFIG_DECKLINK_INDEV)            += decklink_dec.o decklink_dec_c.o decklink_common.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_OUTDEV)      += libndi_newtek_enc.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_INDEV)       += libndi_newtek_dec.o
 OBJS-$(CONFIG_DSHOW_INDEV)               += dshow_crossbar.o dshow.o dshow_enummediatypes.o \
                                             dshow_enumpins.o dshow_filter.o \
                                             dshow_pin.o dshow_common.o
```

３. libavdevice/libndi_newtek_common.h、libndi_newtek_dec.c、libndi_newtek_enc.cファイルを追加する
ファイルをダウンロードします。

```bash
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_common.h
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_dec.c
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_enc.c
```

４. libavdevice/alldevices.c ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を alldevices.c ファイルに追加します。

```patch
@@ -32,8 +32,6 @@ extern AVInputFormat  ff_bktr_demuxer;
 extern AVOutputFormat ff_caca_muxer;
 extern AVInputFormat  ff_decklink_demuxer;
 extern AVOutputFormat ff_decklink_muxer;
-extern AVInputFormat  ff_libndi_newtek_demuxer;
-extern AVOutputFormat ff_libndi_newtek_muxer;
 extern AVInputFormat  ff_dshow_demuxer;
 extern AVInputFormat  ff_fbdev_demuxer;
 extern AVOutputFormat ff_fbdev_muxer;
```

以上で NDI に関連するソースコードの反映は完了です。

```bash
$ cd ..
```

別途、NDI SDK ライブラリをダウンロード、インストールしてビルドします。

(参考: NDI SDK ライブラリをダウンロード、インストール)
https://qiita.com/kitazaki/items/eeb710a78c657024f844
https://qiita.com/kitazaki/items/8b1f730903d3a62025e9

```bash
$ ./configure --enable-nonfree --enable-libndi_newtek --extra-cflags="-I/usr/include/ndi/" --extra-ldflags="-L/usr/include/ndi/" --enable-libx264 --enable-gpl
```

Jetson Nano で NVMPI の有効化と合わせて NDI を組み込むことも可能です。

(参考: Jetson Nano で NVMPI を有効化する場合)
https://qiita.com/kitazaki/items/02298356703418450dcc

```bash
$ ./configure --enable-nvmpi --enable-nonfree --enable-libndi_newtek --extra-cflags="-I/usr/include/ndi/" --extra-ldflags="-L/usr/include/ndi/" --enable-libx264 --enable-gpl
```

<img width="75%" alt="JetsonNano_FFmpeg+NDI.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ab858bda-97ce-181f-6668-04d0789b050e.png">