This section details the configuration and usage of the NETINT video transcoder device in a Docker container. This can also be used for other NETINT video transcoder solutions.
Pre-requisites for the Quadra Environment on Host
The Linux Host must have the following working environment.
Quadra libxcoder and FFmpeg source installed and compiled successfully. FFmpeg 4.2.1 is referenced in this document, follow the Quick Start Guide to install libxcoder and FFmpeg.
Running ‘ffmpeg’ dumps similar output to the sample below.
ffmpeg
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --pkg-config-flags=--static --enable-gpl --enable-nonfree --extra-ldflags=-lm --extra-ldflags=-ldl --enable-libxcoder --enable-ni --enable-pthreads --extra-libs=-lpthread --enable-encoders --enable-decoders --enable-avfilter --enable-muxers --enable-demuxers --enable-parsers --enable-x86asm --disable-debug --disable-ffplay --enable-ffprobe --enable-libx264 --enable-libx265 --enable-libaom --disable-libvpx --disable-cuda-nvcc --disable-cuda --disable-cuvid --disable-nvdec --disable-nvenc --disable-libvmaf --enable-static --disable-shared --extra-cflags=-UNIENC_MULTI_THREAD
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Use -h to get full help or, even better, run 'man ffmpeg'
Executing
sudo nvme listwill display all installed Quadra NVMe devices.
sudo nvme list
Example:
Node SN Model Namespace Usage Format FW Rev ---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 Q1A10BA11FC060-0124 QuadraT1A 1 8.59 TB / 8.59 TB 4 KiB + 0 B ---00DEV /dev/nvme1n1 Q1A10BA11FC060-0142 QuadraT1A-EP1 1 8.59 TB / 8.59 TB 4 KiB + 0 B ---00DEV
Executing
ni_rsrc_monorsudo ni_rsrc_monwill produce an output similar to the sample below.
ni_rsrc_mon
Example:
NI resource init'd already .. ************************************************** 2 devices retrieved from current pool at start up Mon Jan 31 13:35:40 2022 up 00:00:00 v---00DEV Num decoders: 2 BEST INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM DEVICE NAMESPACE L 0 0 0 0 0 0 /dev/nvme0 /dev/nvme0n1 1 0 0 0 0 0 /dev/nvme1 /dev/nvme1n1 Num encoders: 2 BEST INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM DEVICE NAMESPACE L 0 0 0 0 0 0 /dev/nvme0 /dev/nvme0n1 1 0 0 0 0 0 /dev/nvme1 /dev/nvme1n1 Num scalers: 2 BEST INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM DEVICE NAMESPACE L 0 0 0 0 0 0 /dev/nvme0 /dev/nvme0n1 1 0 0 0 0 0 /dev/nvme1 /dev/nvme1n1 Num ais: 2 BEST INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM DEVICE NAMESPACE L 0 0 0 0 0 0 /dev/nvme0 /dev/nvme0n1 1 0 0 0 0 0 /dev/nvme1 /dev/nvme1n1 **************************************************
Create a Docker Image
This section describes how to build a Docker image using a Dockerfile and the NETINT Quadra SW release package.
Install the Docker module on your Linux Host. Refer to the links in the previous section 5.1 of this document, Pre-requisites for the Quadra Environment on Host, this describes the installation steps based on the OS type of your Linux Host.
Install Python Docker package:
sudo pip install docker
Download the Dockerfile from NETINTs public repository on Github:
https://github.com/NETINT-Technologies/quadra_dockerfile/blob/main/Dockerfile
Copy the NETINT release package, for example
Quadra_V5.0.0.zipto the same folder as the Dockerfile.
Generate the Docker image:
sudo docker build --tag ni_quadra_sw .
Note, there are two options that can be set with the --build-arg command:
Parameter | Description |
|---|---|
NI_RELEASE_VERSION | Version number of NETINT Quadra SW release package (e.g. --build-arg NI_RELEASE_VERSION=5.0.0) |
FFMPEG_VERSION | Version number of FFmpeg to use (e.g. --build-arg FFMPEG_VERSION=n5.0) |
Confirm the Docker image is created:
sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ni_quadra_sw latest fc6cf4086561 5 weeks ago 1.32GB
Useful Docker Links
https://download.docker.com/linux/centos/8/x86_64/stable/Packages/
Docker container and Quadra interworking
Scope
This section demonstrates a Quadra transcoding session within the Docker container.
Pre-built Images
Each GA release includes pre-built images available to Docker Hub
Launch Docker container with Quadra device
Run the following command to start a container using Docker image ni_quadra_sw
sudo docker run -it --privileged --device /dev/nvme0n1 --device /dev/nvme0 ni_quadra_sw /bin/sh
The ‘-v’ option can be updated to point to the host folder where FFmpeg and libxcoder are installed. For example: ~/FFmpeg, ~/FFmpegXcoder etc.
You should get a shell prompt to demonstrate a successful container has started.
Sh-4.2#
Running sudo nvme list should list all the Quadra devices.
sudo nvme list
Example
Node SN Model Namespace Usage Format FW Rev --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 Q1A10BA11FC060-0124 QuadraT1A 1 8.59 TB / 8.59 TB 4 KiB + 0 B ---00DEV /dev/nvme1n1 Q1A10BA11FC060-0142 QuadraT1A-EP1 1 8.59 TB / 8.59 TB 4 KiB + 0 B ---00DEV
Transcoding
Run a transcoding operation using FFmpeg. The sample below is for an AVC to HEVC transcode on a 1920x1080p_ParkScene.264 clip.
There are some test clips in the FFmpegXcoder/libxcoder/test folder.
ffmpeg -y -nostdin -hide_banner -vsync 0 -c:v h264_ni_quadra_dec -dec 0 -i 1920x1080p_ParkScene.264 -vf scale=1920:1080 -xcoder-params intraQP=27:intraPeriod=120 -c:v h265_ni_quadra_enc -enc 0 -xcoder-params intraQP=27:intraPeriod=120 1920x1080p_ParkScene-0-0.265 Input #0, h264, from '1920x1080p_ParkScene.264': Duration: N/A, bitrate: N/A Stream #0:0: Video: h264 (High), yuv420p(progressive), 1920x1080, 24 fps, 24 tbr, 1200k tbn, 48 tbc Stream mapping: Stream #0:0 -> #0:0 (h264 (h264_ni_quadra_dec) -> hevc (h265_ni_quadra_enc)) [h265_ni_quadra_enc @ 0x2705180] Session state: 0 allocate frame fifo. [h265_ni_quadra_enc @ 0x2705180] pix_fmt is 0, sw_pix_fmt is -1 [h265_ni_quadra_enc @ 0x2705180] sw_pix_fmt assigned to pix_fmt was 0, is now -1 [h265_ni_quadra_enc @ 0x2705180] p_param->hwframes = 0 [h265_ni_quadra_enc @ 0x2705180] dts offset: 7, gop_offset_count: 0 Output #0, hevc, to '1920x1080p_ParkScene-0-0.265': Metadata: encoder : Lavf58.29.100 Stream #0:0: Video: hevc (h265_ni_quadra_enc), yuv420p, 1920x1080, q=2-31, 200 kb/s, 24 fps, 24 tbn, 24 tbc Metadata: encoder : Lavc58.54.100 h265_ni_quadra_enc frame= 240 fps=208 q=-0.0 Lsize= 2572kB time=00:00:09.62 bitrate=2188.7kbits/s speed=8.34x video:2572kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%