Stream For Cheap With RK3399 #3 - Compile RockChip's FFMPEG fork

Stream For Cheap With RK3399 #3 - Compile RockChip's FFMPEG fork

In part two of this series, I compiled the master branch of ffmpeg on the OrangePi RK3399, with the hope we would get hardware acceleration automagically and failed. Now, let’s try to compile RockChip’s ffmpeg fork on this very machine, if that could ever help us getting hardware acceleration. Yes, a fork from RockChip does exist, for a reason, so let’s try this out.

sudo apt install libass-devel libcaca-dev libdc1394-22-dev libopenmpt-dev libpulse-dev libssh-dev libzvbi-dev libcdio-dev libcdparanoia-dev libsdl2-dev

 PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --enable-rkmpp --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm -lnettle -lhogweed -lgmp" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"

./configure --enable-static --disable-shared
make && make install

wget https://github.com/rockchip-linux/rk-rootfs-build/blob/master/packages/armhf/libmali/libmali-rk-utgard-450-r7p0_1.7-1_armhf.deb
wget https://github.com/rockchip-linux/rk-rootfs-build/blob/master/packages/armhf/libmali/libmali-rk-dev_1.7-1_armhf.deb

sudo -E dpkg -i libmali-rk-dev_1.7-1_armhf.deb 

[insert gif rockchip-video-driver]

cd ~/ffmpeg_sources
git clone https://github.com/hizukiayaka/rockchip-video-driver.git
cd rockchip-video-driver/
cmake .
make -j$(nproc)
sudo make install

As I got an error telling me about the lack of rockchip_drv_video.so, I made a link:

sudo ln -s /usr/local/lib/dri/rockchip_drv_video.so /usr/lib/arm-linux-gnueabihf/dri/rockchip_drv_video.so

Let’s compile the RockChip mpp, so that we will be able to use it with ffmpeg afterwards:

[insert gif rockchip-mpp]

cd ~/ffmpeg_sources
git clone -b release https://github.com/rockchip-linux/mpp.git
cd mpp/
cmake -DRKPLATFORM=ON -DHAVE_DRM=ON && make -j$(nproc)
sudo make install

libva will be asked for later on, so let’s compile and install it now:

[insert gif libva]

wget http://deb.debian.org/debian/pool/main/libv/libva/libva_2.5.0.orig.tar.gz
tar -xvzf libva_2.5.0.orig.tar.gz
cd libva-2.5.0/
wget http://deb.debian.org/debian/pool/main/libv/libva/libva_2.5.0-1.debian.tar.xz
xz -d libva_2.5.0-1.debian.tar.xz && tar -xvf libva_2.5.0-1.debian.tar && rm libva_2.5.0-1.debian.tar
sudo -E dpkg-buildpackage -us -uc -d
sudo apt install mesa-va-drivers
cd .. && sudo dpkg -i libva2-dbgsym_2.5.0-1_armhf.deb va-driver-all_2.5.0-1_armhf.deb libva-drm2_2.5.0-1_armhf.deb libva-glx2_2.5.0-1_armhf.deb libva-wayland2_2.5.0-1_armhf.deb libva-x11-2_2.5.0-1_armhf.deb libva-dev_2.5.0-1_armhf.deb libva2_2.5.0-1_armhf.deb

As zmq was also missing:

[insert gif zmq]

cd ~/ffmpeg_sources
git clone https://github.com/zeromq/libzmq.git
export CFLAGS="-DZMQ_STATIC"
mkdir build && cd build/
cmake ../libzmq/ && make && sudo make install

sudo apt-get install libfdk-aac-dev nettle-dev

cd ~/ffmpeg_sources
git clone -b rockchip/release/4.1 https://github.com/rockchip-linux/ffmpeg.git


libavutil/hwcontext_drm.c:124:29: error: ‘DRM_FORMAT_NV12_10’ undeclared here (not in a function); did you mean ‘DRM_FORMAT_NV21’?

 PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --enable-rkmpp --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm -lnettle -lhogweed -lgmp" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"


PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopencv --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"


PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gnutls --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopencv --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"


ERROR: gnutls not found using pkg-config

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopencv --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"

ERROR: opencv not found using pkg-config

Ok, let’s get rid of opencv for the time being:

PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --arch=arm --bindir="$HOME/bin" --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --pkg-config-flags="--static" --prefix="$HOME/ffmpeg_build"

WARNING: Building with deprecated library libavresample
libavutil/avconfig.h is unchanged
libavcodec/parser_list.c is unchanged
libavcodec/bsf_list.c is unchanged
libavformat/muxer_list.c is unchanged


PATH="$HOME/bin:$PATH" make -j$(nproc)

I got ‘DRM_FORMAT_NV12_10’ undeclared here .

As stated there, I just removed the offending line I made the patch with diff -u ./libavutil/hwcontext_drm.c ./libavutil/hwcontext_drm.c.back >patch.

--- ./libavutil/hwcontext_drm.c 2019-11-14 17:19:09.134249800 +0000
+++ ./libavutil/hwcontext_drm.c.back    2019-11-14 17:18:27.530249780 +0000
@@ -121,7 +121,7 @@
     { AV_PIX_FMT_YUV422P,   DRM_FORMAT_YUV422,      },
     { AV_PIX_FMT_NV21,      DRM_FORMAT_NV21,        },
     { AV_PIX_FMT_NV12,      DRM_FORMAT_NV12,        },
-//    { AV_PIX_FMT_P010,      DRM_FORMAT_NV12_10,     },
+    { AV_PIX_FMT_P010,      DRM_FORMAT_NV12_10,     },
     { AV_PIX_FMT_YUV420P,   DRM_FORMAT_YUV420,      },
 };

sudo make -j$(nproc) install

wget http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4
sudo -E /home/linaro/bin/ffmpeg -benchmark -loglevel 48 -vcodec h264_rkmpp -i bbb_sunflower_1080p_30fps_normal.mp4 -map 0:v:0 -f null -

frame=19036 fps=237 q=-0.0 Lsize=N/A time=00:10:34.83 bitrate=N/A speed=7.91x
video:7585kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (/media/linaro/0E9ACA2339F586E5/slides_rushes/bbb_sunflower_1080p_30fps_normal.mp4):
  Input stream #0:0 (video): 19036 packets read (237848132 bytes); 19036 frames decoded;
  Input stream #0:1 (audio): 21 packets read (10080 bytes);
  Input stream #0:2 (audio): 2 packets read (2560 bytes);
  Total: 19059 packets (237860772 bytes) demuxed
Output file #0 (pipe:):
  Output stream #0:0 (video): 19036 frames encoded; 19036 packets muxed (7766688 bytes);
  Total: 19036 packets (7766688 bytes) muxed
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xab44b8f0
mpp_dec: mpp_dec_parser_thread exit
mpp_dec: mpp_dec_parser_thread exit ok
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xab44b9f8
mpp_dec: mpp_dec_hal_thread exit ok
bench: utime=10.101s
19036 frames successfully decoded, 0 decoding errors
bench: maxrss=93880kB
[AVIOContext @ 0xab3cd8a0] Statistics: 259311905 bytes read, 972 seeks

So it now works for decoding, that’s a good thing. What if we now tried that with the latest official version of ffmpeg, straight from github?

You know what? It worked. I just don’t know why, but it worked:

frame=19036 fps=234 q=-0.0 Lsize=N/A time=00:10:34.83 bitrate=N/A speed=7.79x
video:7585kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (/media/linaro/0E9ACA2339F586E5/slides_rushes/bbb_sunflower_1080p_30fps_normal.mp4):
  Input stream #0:0 (video): 19036 packets read (237848132 bytes); 19036 frames decoded;
  Input stream #0:1 (audio): 21 packets read (10080 bytes);
  Input stream #0:2 (audio): 2 packets read (2560 bytes);
  Total: 19059 packets (237860772 bytes) demuxed
Output file #0 (pipe:):
  Output stream #0:0 (video): 19036 frames encoded; 19036 packets muxed (7766688 bytes);
  Total: 19036 packets (7766688 bytes) muxed
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xab149dd0
mpp_dec: mpp_dec_parser_thread exit
mpp_dec: mpp_dec_parser_thread exit ok
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xab149ed8
mpp_dec: mpp_dec_hal_thread exit ok
bench: utime=9.628s stime=8.357s rtime=81.544s
19036 frames successfully decoded, 0 decoding errors
bench: maxrss=75008kB
[AVIOContext @ 0xab11b8b0] Statistics: 259311905 bytes read, 972 seeks

It looks like gstreamer already has the hardware encoding enabled: https://github.com/rockchip-linux/mpp/issues/104

git clone https://github.com/rockchip-linux/gstreamer-rockchip.git
cd gstreamer-rockchip
sudo apt install gstreamer-1.0
./autogen.sh


configure: No package 'gstreamer-1.0' found
configure: error: no gstreamer-1.0 >= 1.12.0 (GStreamer) found

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
./autogen.sh
PATH="$HOME/bin:$PATH" make -j$(nproc)


gstkmsutils.c:41:5: error: ‘DRM_FORMAT_NV12_10’ undeclared here (not in a function); did you mean ‘DRM_FORMAT_NV12’?

So I commented this line:

//  DEF_FMT (NV12_10, P010_10LE),
git clone https://github.com/rockchip-linux/gstreamer-rockchip-extra.git
cd gstreamer-rockchip-extra
./autogen.sh
linaro@captation-techforum-rk3399-4GB:~/ffmpeg_sources/gstreamer-rockchip-extra$ PATH="$HOME/bin:$PATH" make -j$(nproc)

rkx_kmsutils.c:41:5: error: ‘DRM_FORMAT_NV12_10’ undeclared here (not in a function); did you mean ‘DRM_FORMAT_NV12’?

linaro@captation-techforum-rk3399-4GB:~/ffmpeg_sources/gstreamer-rockchip-extra$ vi ./gst/rkximage/rkx_kmsutils.c
//  DEF_FMT (NV12_10, P010_10LE),

PATH="$HOME/bin:$PATH" make -j$(nproc)

other errors, abandonned but opened an issue: https://github.com/rockchip-linux/gstreamer-rockchip-extra/issues/19

linaro@captation-techforum-rk3399-4GB:~/ffmpeg_sources$ git clone https://github.com/rockchip-linux/gstreamer-camera.git
linaro@captation-techforum-rk3399-4GB:~/ffmpeg_sources$ cd gstreamer-camera
linaro@captation-techforum-rk3399-4GB:~/ffmpeg_sources/gstreamer-camera$ ./autogen.sh

make gives an error regarding osThread does not name a type. I added some comment to this issue: https://github.com/rockchip-linux/gstreamer-camera/issues/1#issuecomment-554295804

Let’s try to encode:

gst-launch-1.0 v4l2src ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! queue ! mpph264enc ! queue ! h264parse ! mpegtsmux ! filesink location=/home/linaro/2k.ts 

Most of the time, it completly crashes the machine

/usr/bin/gst-launch-1.0 v4l2src device=/dev/video0 io-mode=4 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! mpph264enc ! filesink location=2k.h264
Setting pipeline to PAUSED ...
mpi: mpp version: b212d1b author: Jacob Chen [mpp]: fix mjpeg buffer leak
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
h264e_api: h264e_config MPP_ENC_SET_RC_CFG bps 7776000 [7290000 : 8262000]
client_loop: send disconnect: Connection reset by peer

Then I tried that, but the machine kept on crashing

gst-launch-1.0 videotestsrc ! 'video/x-raw,format=YUY2,width=1920,height=1080,framerate=30/1' ! mpph264enc ! fpsdisplaysink video-sink=fakesink text-overlay=false sync=false -ve
Setting pipeline to PAUSED ...
mpi: mpp version: b212d1b author: Jacob Chen [mpp]: fix mjpeg buffer leak
Pipeline is PREROLLING ...
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
h264e_api: h264e_config MPP_ENC_SET_RC_CFG bps 7776000 [7290000 : 8262000]
/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstMppH264Enc:mpph264enc0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstMppH264Enc:mpph264enc0.GstPad:src: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink: caps = video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1, interlace-mode=(string)progressive, colorimetry=(string)bt709, chroma-site=(string)mpeg2, multiview-mode=(string)mono, multiview-flags=(GstVideoMultiviewFlagsSet)0:ffffffff:/right-view-first/left-flipped/left-flopped/right-flipped/right-flopped/half-aspect/mixed-mono
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 2, dropped: 0, current: 2.90, average: 2.90
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 4, dropped: 0, current: 3.10, average: 3.00
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 6, dropped: 0, current: 0.58, average: 1.25
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 7, dropped: 0, current: 1.05, average: 1.22
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 10, dropped: 0, current: 2.83, average: 1.47
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 11, dropped: 0, current: 0.46, average: 1.23
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 12, dropped: 0, current: 0.40, average: 1.05
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 13, dropped: 0, current: 0.68, average: 1.00
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 14, dropped: 0, current: 1.28, average: 1.02
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 20, dropped: 0, current: 2.80, average: 1.26
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 22, dropped: 0, current: 3.87, average: 1.34
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 33, dropped: 0, current: 21.28, average: 1.95
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 45, dropped: 0, current: 22.33, average: 2.58
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 57, dropped: 0, current: 22.35, average: 3.17
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 76, dropped: 0, current: 36.54, average: 4.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 97, dropped: 0, current: 41.57, average: 5.11
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 118, dropped: 0, current: 41.99, average: 6.05
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 139, dropped: 0, current: 41.53, average: 6.95

But this command does work

$ sudo gst-launch-1.0 -e videotestsrc is-live=false num-buffers=500 \
> ! video/x-raw,format=NV12,width=1280,height=720 \
> ! mpph264enc ! filesink location=1280.h264

(gst-plugin-scanner:741): GLib-GObject-WARNING **: 09:29:09.504: cannot register existing type 'GstKMSSink'

(gst-plugin-scanner:741): GLib-GObject-CRITICAL **: 09:29:09.504: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed

(gst-plugin-scanner:741): GLib-GObject-CRITICAL **: 09:29:09.504: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed

(gst-plugin-scanner:741): GLib-CRITICAL **: 09:29:09.504: g_once_init_leave: assertion 'result != 0' failed

(gst-plugin-scanner:741): GStreamer-CRITICAL **: 09:29:09.504: gst_element_register: assertion 'g_type_is_a (type, GST_TYPE_ELEMENT)' failed
Setting pipeline to PAUSED ...
mpi: mpp version: b212d1b author: Jacob Chen [mpp]: fix mjpeg buffer leak
Pipeline is PREROLLING ...
h264e_api: h264e_config MPP_ENC_SET_RC_CFG bps 3456000 [3240000 : 3672000]
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:14.428808048
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xab2a1c30
Freeing pipeline ...
linaro@captation-techforum-rk3399-4GB:~$ ffprobe -hide_banner 1280.h264
Input #0, h264, from '1280.h264':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720, 30 fps, 30 tbr, 1200k tbn, 60 tbc

gst-launch-1.0 videotestsrc num-buffers=512 ! video/x-raw,format=NV12,width=1920,height= 1080,framerate=30/1 \
    ! queue ! mpph264enc ! queue ! h264parse ! mpegtsmux ! filesink location=/home/linaro/2k.ts

crashe la machine à tous les coups quelques infos (en chinois) ici: http://blog.iotwrt.com/media/2017/05/04/VIDEO/

J’essaye de coupler les deux:

ffmpeg  -f v4l2 -pix_fmt nv12 -s 1920x1080 -r 30 -i /dev/video0 -vcodec copy - | gst-launch-1.0 fdsrc ! 'video/x-h264,framerate=30/1,stream-format=byte-stream'! mpph264enc ! filesink location=test1.mp4
WARNING: erroneous pipeline: could not link fdsrc0 to mpph264enc0, mpph264enc0 can't handle caps video/x-h264, framerate=(fraction)30/1, stream-format=(string)byte-stream
ffmpeg version N-95733-g73ee53f317 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9 (Debian 9.2.1-19)
  configuration: --arch=arm --bindir=/home/linaro/bin --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags=-I/home/linaro/ffmpeg_build/include --extra-ldflags=-L/home/linaro/ffmpeg_build/lib --extra-libs='-lpthread -lm' --pkg-config-flags=--static --prefix=/home/linaro/ffmpeg_build
  WARNING: library configuration mismatch
  avresample  configuration: --prefix=/usr --extra-version=2 --toolchain=hardened --libdir=/usr/lib/arm-linux-gnueabihf --incdir=/usr/include/arm-linux-gnueabihf --arch=arm --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 35.101 / 56. 35.101
  libavcodec     58. 62.100 / 58. 62.100
  libavformat    58. 35.100 / 58. 35.100
  libavdevice    58.  9.100 / 58.  9.100
  libavfilter     7. 66.100 /  7. 66.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
[video4linux2,v4l2 @ 0xab27de70] The driver does not permit changing the time per frame
[video4linux2,v4l2 @ 0xab27de70] Time per frame unknown
[video4linux2,v4l2 @ 0xab27de70] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (NV12 / 0x3231564E), nv12, 1920x1080, 1000k tbr, 1000k tbn, 1000k tbc
[NULL @ 0xab2812a0] Unable to find a suitable output format for 'pipe:'
pipe:: Invalid argument
ffmpeg  -f v4l2 -pix_fmt nv12 -s 1920x1080 -r 30 -i /dev/video0 -c copy -f mpegts - >/dev/null

fonctionne

ffmpeg  -f v4l2 -pix_fmt nv12 -s 1920x1080 -r 30 -i /dev/video0 -c:v rawvideo -f rawvideo - >/dev/null

fonctionne aussi…

Donc

ffmpeg  -f v4l2 -pix_fmt nv12 -s 1920x1080 -r 30 -i /dev/video0 -c:v rawvideo -f rawvideo - >/dev/null| gst-launch-1.0 fdsrc ! 'video/x-raw,format=YUY2,width=1920,height=1080,framerate=30/1'! mpph264enc ! filesink location=test1.mp4

passe à Setting pipeline to NULL … donc fichier vide

et gstreamer tout seul foire uasis:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! 'video/x-raw,format=YUY2,width=1920,height=1080,framerate=30/1'! mpph264enc ! filesink location=test1.mp4
Setting pipeline to PAUSED ...
mpi: mpp version: b212d1b author: Jacob Chen [mpp]: fix mjpeg buffer leak
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
h264e_api: h264e_config MPP_ENC_SET_RC_CFG bps 7776000 [7290000 : 8262000]
/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
New clock: GstSystemClock
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstMppH264Enc:mpph264enc0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)YUY2, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, colorimetry=(string)bt709, interlace-mode=(string)progressive
^Chandling interrupt.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:44.645408271
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
mpp_thread: MPP_THREAD_STOPPING status set mThread 0xaaf23140
Freeing pipeline ...

fichier vide

  configuration: --arch=arm --bindir=/home/linaro/bin --disable-stripping --enable-libaom --enable-avisynth --enable-avresample --enable-chromaprint --enable-frei0r --enable-gpl --enable-ladspa --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libiec61883 --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-shared --incdir=/usr/include/arm-linux-gnueabihf --libdir=/usr/lib/arm-linux-gnueabihf --enable-nonfree --enable-rkmpp --enable-version3 --enable-libdrm --extra-cflags=-I/home/linaro/ffmpeg_build/include --extra-ldflags=-L/home/linaro/ffmpeg_build/lib --extra-libs='-lpthread -lm' --pkg-config-flags=--static --prefix=/home/linaro/ffmpeg_build

ffmpeg -benchmark -loglevel 48 -vcodec h264_rkmpp -i ffmpeg-30fps-vaapi-HQ42.mov -map 0:v:0 -f null -


 385 ll /usr/local/lib/librockchip_*
 386 ffmpeg -hide_banner -f lavfi -i nullsrc -c:v libx264 -preset help -f mp4 -
 387 cd /media/linaro/0E9ACA2339F586E5/
 388 ll
 389 cd camera-rushes/
 390 ll
 391 ffmpeg -i 1562251002.mkv -c:v libx264 -preset slow -crf 22 -c:a copy output.mkv
 392 ffmpeg -i 1562251002.mkv -c:v libxh264_rkmpp -preset slow -crf 22 -c:a copy output.mkv
 393 cat ~/youtube-main-camera.sh 
 394 ffmpeg -vcodec h264_rkmpp -i rtmp://192.168.1.210:1935/live/stream15 -s 320x240 /tmp/test.avi
 395 ffmpeg -hwaccel drm -hwaccel_device /dev/dri/card0 -c:v h264_rkmpp -i rtmp://192.168.1.210:1935/live/stream15 -f null - -benchmark
 396 history >~/history1.txt