[FFmpeg-user] FFMPEG - AMD GPU Transcoding MJPEG to HEVC provides a skewed split screen video
Rajh U
rajhlinux at yahoo.com
Thu Jul 28 16:55:19 EEST 2022
Hello,
I have six CCTV 8MP camera which outputs CVI analog video signal.
Each camera is connected to it's own individual standalone special converter box which converts the analog signal to common HDMI output. Each of the converter boxes is then connected to it's own individual standalone USB 3.0 HDMI capture card.
So now I literally have six USB capture cards (all of them of the same exact brand and model) connected to my PC.The real time video stream plays perfectly at 60FPS and each of the output stream format is MJPG.
I would like to do AMD GPU hardware transcoding to HEVC of the six MJPG streams, all simultaneously.
I checked some FFMPEG commands to do hardware transcoding from this link:
https://trac.ffmpeg.org/wiki/Hardware/VAAPI
I settled using this transcoding command since it is the only command which works with no crash errors:
ffmpeg -report -f v4l2 -input_format mjpeg -framerate 30 -video_size 1920x1080 -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i /dev/video0 -vf 'scale_vaapi=format=nv12,hwupload' -c:v hevc_vaapi output.mp4 -y
Primary issue I am facing:
When playback of the output video file, half of the video on the screen is the actual video and the other half is all noise data. Why is this happening and how can I resolve this issue?
Picture of the video (Please note that the video is in greyscale due to the fact that the camera is a CCTV camera and the infrared lights are switched on due to the low lighting condition):
https://i.stack.imgur.com/T86kG.png
Here is a YouTube video of the output file:
https://youtu.be/XCC4JDffTxM
Here is the report.log file if needed:
https://drive.google.com/file/d/1S7aV9cHhGUv1H0uebnt109n5V3rbU-94/view
I would also like to mention that when using the following command below (which is only encoding from RAW stream):
ffmpeg -vaapi_device /dev/dri/renderD128 -f v4l2 -framerate 30 -video_size 1920x1080 -i /dev/video0 -vf 'format=nv12,hwupload' -c:v hevc_vaapi output.mp4 -y
The video playback works properly, however it only works great when set to 30FPS and uses about 20% of CPU resource. When I set the command to 60 FPS, it uses about 2-3% of CPU resource but the video file becomes corrupted and freezes after 3-5 secs when playback.
Details of my PC:
OS: Arch Linux x86_64Host: MS-7693 3.0Kernel: 5.18.12-arch1-1Uptime: 3 hours, 37 minsPackages: 1076 (pacman)Shell: bash 5.1.16Resolution: 1920x1080Terminal: /dev/pts/0CPU: AMD FX-8350 (8) @ 4.000GHzGPU: NVIDIA GeForce GT 710GPU: AMD ATI Radeon PRO WX 2100Memory: 561MiB / 23987MiB
Details about the AMD GPU driver:
$ lspci -k | grep -A 2 -E "(VGA|3D)"
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Lexa XT [Radeon PRO WX 2100] Subsystem: Dell Device 0b0c Kernel driver in use: amdgpu
Details about FFMPEG:
$ ffmpeg
ffmpeg version n5.0.1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12.1.0 (GCC) configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-nvdec --enable-nvenc --enable-shared --enable-version3 libavutil 57. 17.100 / 57. 17.100 libavcodec 59. 18.100 / 59. 18.100 libavformat 59. 16.100 / 59. 16.100 libavdevice 59. 4.100 / 59. 4.100 libavfilter 8. 24.100 / 8. 24.100 libswscale 6. 4.100 / 6. 4.100 libswresample 4. 3.100 / 4. 3.100 libpostproc 56. 3.100 / 56. 3.100Hyper fast Audio and Video encoder
Here are the details of the video stream and the USB 3.0 capture card device with the help of V4L2:
$ v4l2-ctl --all --device /dev/video0:
Driver Info: Driver name : uvcvideo Card type : USB3.0 HD Video Capture: USB3.0 Bus info : usb-0000:04:00.0-2 Driver version : 5.18.12 Capabilities : 0x84a00001 Video Capture Metadata Capture Streaming Extended Pix Format Device Capabilities Device Caps : 0x04200001 Video Capture Streaming Extended Pix FormatMedia Driver Info: Driver name : uvcvideo Model : USB3.0 HD Video Capture: USB3.0 Serial : HU123450 Bus info : usb-0000:04:00.0-2 Media version : 5.18.12 Hardware revision: 0x00000328 (808) Driver version : 5.18.12Interface Info: ID : 0x03000002 Type : V4L VideoEntity Info: ID : 0x00000001 (1) Name : USB3.0 HD Video Capture: USB3.0 Function : V4L2 I/O Flags : default Pad 0x01000007 : 0: Sink Link 0x02000010: from remote pad 0x100000a of entity 'Processing 3' (Video Pixel Formatter): Data, Enabled, ImmutablePriority: 2Video input : 0 (Camera 1: ok)Format Video Capture: Width/Height : 1920/1080 Pixel Format : 'MJPG' (Motion-JPEG) Field : None Bytes per Line : 0 Size Image : 2073600 [Megapixels: 2.1 MP (2,073,600 pixels)] Colorspace : sRGB Transfer Function : Rec. 709 YCbCr/HSV Encoding: ITU-R 601 Quantization : Default (maps to Full Range) Flags :Crop Capability Video Capture: Bounds : Left 0, Top 0, Width 1920, Height 1080 Default : Left 0, Top 0, Width 1920, Height 1080 Pixel Aspect: 1/1Selection Video Capture: crop_default, Left 0, Top 0, Width 1920, Height 1080, Flags:Selection Video Capture: crop_bounds, Left 0, Top 0, Width 1920, Height 1080, Flags:Streaming Parameters Video Capture: Capabilities : timeperframe Frames per second: 60.000 (60/1) Read buffers : 0
More details about the USB 3.0 capture card device stream capabilities:
$ v4l2-ctl --list-formats-ext --device /dev/video0
ioctl: VIDIOC_ENUM_FMT Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 1920x1080 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Size: Discrete 960x540 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Size: Discrete 800x450 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps) Size: Discrete 640x360 Interval: Discrete 0.017s (60.000 fps) Interval: Discrete 0.033s (30.000 fps)
Thanks for any advice and help.
-Rajh
More information about the ffmpeg-user
mailing list