[FFmpeg-trac] #10252(ffmpeg:new): v4l2 fails on AMD Geode

FFmpeg trac at avcodec.org
Mon Mar 13 02:51:57 EET 2023


#10252: v4l2 fails on AMD Geode
-------------------------------------+-------------------------------------
             Reporter:               |                    Owner:  (none)
  cherniaev.andrei                   |
                 Type:  defect       |                   Status:  new
             Priority:  normal       |                Component:  ffmpeg
              Version:  git-master   |               Resolution:
             Keywords:  avcodec      |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
Description changed by cherniaev.andrei:

Old description:

> I try get photo from my webcam. But ffmpeg process was killed by Linux
> because of two reasons.
>
> How to reproduce:
> {{{
> ffmpeg -v 9 -loglevel 99 -f video4linux2 -i /dev/video0 -vframes 1
> -video_size 640x480 test.jpeg
> }}}
>
> I use Ubuntu 22 with kernel 5.19.0-35-generic on my x86-64 PC. My webcam
> works good.
> I use Buildroot with kernel 5.4.228 on my AMD Geode. (I also try 4.19.269
> and 6.2.2) My webcam (ffmpeg) fails becasue of:
>
> Reason 1) Look at libavdevice/v4l2.c Why 256 buffers in
> static const int desired_video_buffers = 256;
> ?
> My Geode can't work with 256 buffers. I don't know why. But i try to set
> static const int desired_video_buffers = 2;
> And no more fails because of reason 1)
>
> Reason 2) Looks at libavcodec/raw.c
> What happend in avcodec_pix_fmt_to_codec_tag() ?
> {{{
>     while (tags->pix_fmt >= 0) {
> ...
>         tags++;
>     }
> }}}
> Looks like this functions should use while like in find_pix_fmt()
> {{{
> while (tags->pix_fmt != AV_PIX_FMT_NONE) {
>         ...
>         tags++;
>     }
> }}}
> Isn't it?
> In my case ffmpeg fails in avcodec_pix_fmt_to_codec_tag(). To solve
> Reason 2) I make:
> {{{
> unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat fmt)
> {
>     return 0; //rude decision
> }
> }}}
>

> This is information about ffmpeg on my PC
>
> a at PC:~$ ffmpeg --version
> ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg
> developers
>   built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
>   configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1
> --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu
> --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl
> --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom
> --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
> --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librubberband --enable-
> libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-
> libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-
> libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-
> libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-
> libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal
> --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx
> --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm
> --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-
> libx264 --enable-shared
>   libavutil      56. 70.100 / 56. 70.100
>   libavcodec     58.134.100 / 58.134.100
>   libavformat    58. 76.100 / 58. 76.100
>   libavdevice    58. 13.100 / 58. 13.100
>   libavfilter     7.110.100 /  7.110.100
>   libswscale      5.  9.100 /  5.  9.100
>   libswresample   3.  9.100 /  3.  9.100
>   libpostproc    55.  9.100 / 55.  9.100
>

> This is information about ffmpeg on my AMD Geode. ffmpeg 6.0 has the same
> code.
> --Buildroot with Linux Kernel is 5.4.228--
> # ffmpeg -v 9 -loglevel 99 -f video4linux2 -i /dev/video0 -vframes 1
> -video_size 640x480 test.jpeg
> ffmpeg version 5.1 Copyright (c) 2000-2022 the FFmpeg developers
>   built with gcc 12.2.0 (Buildroot -gaff43177-dirty)
>   configuration: --enable-cross-compile --cross-
> prefix=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/bin/i586
> -buildroot-linux-gnu-
> --sysroot=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/i586
> -buildroot-linux-gnu/sysroot --host-cc=/usr/bin/gcc --arch=i586 --target-
> os=linux --disable-stripping --pkg-
> config=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/bin/pkg-
> config --disable-static --enable-shared --prefix=/usr --enable-avfilter
> --disable-version3 --enable-logging --disable-optimizations --disable-
> extra-warnings --enable-avdevice --enable-avcodec --enable-avformat
> --disable-network --disable-gray --enable-swscale-alpha --disable-small
> --enable-dct --enable-fft --enable-mdct --enable-rdft --disable-crystalhd
> --disable-dxva2 --enable-runtime-cpudetect --disable-hardcoded-tables
> --disable-mipsdsp --disable-mipsdspr2 --disable-msa --enable-hwaccels
> --disable-cuda --disable-cuvid --disable-nvenc --disable-avisynth
> --disable-frei0r --disable-libopencore-amrnb --disable-libopencore-amrwb
> --disable-libdc1394 --disable-libgsm --disable-libilbc --disable-libvo-
> amrwbenc --disable-symver --disable-doc --enable-gpl --enable-nonfree
> --enable-ffmpeg --disable-ffplay --enable-libv4l2 --disable-ffprobe
> --disable-libxcb --enable-postproc --enable-swscale --enable-indevs
> --disable-alsa --disable-outdevs --enable-pthreads --enable-zlib
> --enable-bzlib --disable-libfdk-aac --disable-libcdio --enable-gnutls
> --disable-openssl --disable-libdrm --disable-libopenh264 --disable-vaapi
> --disable-vdpau --disable-mmal --disable-omx --disable-omx-rpi --disable-
> libopencv --disable-libopus --disable-libvpx --disable-libass --disable-
> libbluray --disable-libmfx --disable-librtmp --disable-libmp3lame
> --disable-libmodplug --disable-libspeex --disable-libtheora --disable-
> iconv --disable-libfreetype --disable-fontconfig --disable-libopenjpeg
> --disable-libx264 --disable-libx265 --disable-libdav1d --disable-x86asm
> --enable-mmx --disable-sse --disable-sse2 --disable-sse3 --disable-ssse3
> --disable-sse4 --disable-sse42 --disable-avx --disable-avx2 --disable-
> armv6 --disable-armv6t2 --disable-vfp --disable-neon --disable-altivec
> --extra-libs=-latomic --enable-pic --cpu=geode
>   libavutil      57. 28.100 / 57. 28.100
>   libavcodec     59. 37.100 / 59. 37.100
>   libavformat    59. 27.100 / 59. 27.100
>   libavdevice    59.  7.100 / 59.  7.100
>   libavfilter     8. 44.100 /  8. 44.100
>   libswscale      6.  7.100 /  6.  7.100
>   libswresample   4.  7.100 /  4.  7.100
>   libpostproc    56.  6.100 / 56.  6.100
> Splitting the commandline.
> Reading option '-v' ... matched as option 'v' (set logging level) with
> argument '9'.
> Reading option '-loglevel' ... matched as option 'loglevel' (set logging
> level) with argument '99'.
> Reading option '-f' ... matched as option 'f' (force format) with
> argument 'video4linux2'.
> Reading option '-i' ... matched as input url with argument '/dev/video0'.
> Reading option '-vframes' ... matched as option 'vframes' (set the number
> of video frames to output) with argument '1'.
> Reading option '-video_size' ... matched as AVOption 'video_size' with
> argument '640x480'.
> Reading option 'test.jpeg' ... matched as output url.
> Finished splitting the commandline.
> Parsing a group of options: global .
> Applying option v (set logging level) with argument 9.
> Successfully parsed a group of options.
> Parsing a group of options: input url /dev/video0.
> Applying option f (force format) with argument video4linux2.
> Successfully parsed a group of options.
> Opening an input file: /dev/video0.
> [video4linux2,v4l2 @ 0x197b2c0] fd:3 capabilities:84a00001
> [video4linux2,v4l2 @ 0x197b2c0] Current input_channel: 0, input_name:
> Camera 1, input_std: 0
> [video4linux2,v4l2 @ 0x197b2c0] Querying the device for the current frame
> size
> [video4linux2,v4l2 @ 0x197b2c0] Setting frame size to 3840x2160
> [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
> from 0x32315559 to 0x47504A4D
> [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
> pix_fmt:yuv420p
> [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
> from 0x32315559 to 0x47504A4D
> [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
> pix_fmt:yuv420p
> [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
> from 0x32315659 to 0x47504A4D
> [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
> pix_fmt:yuv422p
> [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
> from 0x50323234 to 0x47504A4D
> [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
> pix_fmt:yuyv422
> Killed
>
> Webcam is ELP-USB4K02AF-KL100W http://www.elpcctv.com/elp-128-sony-imx415
> -sensor-night-vision-4k-usb-camera-with-white-led-p-169.html

New description:

 I try get photo from my webcam. But ffmpeg process was killed by Linux
 because of two reasons.

 How to reproduce:
 {{{
 ffmpeg -v 9 -loglevel 99 -f video4linux2 -i /dev/video0 -vframes 1
 -video_size 640x480 test.jpeg
 }}}

 I use Ubuntu 22 with kernel 5.19.0-35-generic on my x86-64 PC. My webcam
 works good.
 I use Buildroot with kernel 5.4.228 on my AMD Geode. (I also try 4.19.269
 and 6.2.2) My webcam (ffmpeg) fails becasue of:

 Reason 1) Look at libavdevice/v4l2.c Why 256 buffers in
 static const int desired_video_buffers = 256;
 ?
 My Geode can't work with 256 buffers. I don't know why. But i try to set
 static const int desired_video_buffers = 2;
 And no more fails because of reason 1)

 Reason 2) Looks at libavcodec/raw.c
 What happend in avcodec_pix_fmt_to_codec_tag() ?
 {{{
     while (tags->pix_fmt >= 0) {
 ...
         tags++;
     }
 }}}
 Looks like this functions should use while like in find_pix_fmt()
 {{{
 while (tags->pix_fmt != AV_PIX_FMT_NONE) {
         ...
         tags++;
     }
 }}}
 Isn't it?
 In my case ffmpeg fails in avcodec_pix_fmt_to_codec_tag(). To solve Reason
 2) I make:
 {{{
 unsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat fmt)
 {
     return 0; //rude decision
 }
 }}}


 After I fix reason 1) and reason 2) my ffmpeg allow me to get photo using
 AMD Geode.


 This is information about ffmpeg (without any patch) on my AMD Geode.
 ffmpeg 6.0 has the same code. Buildroot with Linux Kernel is 5.4.228
 {{{
 # ffmpeg -v 9 -loglevel 99 -f video4linux2 -i /dev/video0 -vframes 1
 -video_size 640x480 test.jpeg
 }}}
 ffmpeg version 5.1 Copyright (c) 2000-2022 the FFmpeg developers
   built with gcc 12.2.0 (Buildroot -gaff43177-dirty)
   configuration: --enable-cross-compile --cross-
 prefix=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/bin/i586
 -buildroot-linux-gnu-
 --sysroot=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/i586
 -buildroot-linux-gnu/sysroot --host-cc=/usr/bin/gcc --arch=i586 --target-
 os=linux --disable-stripping --pkg-
 config=/home/a/LINUX_TARGET/Buildroot_repo/buildroot/output/host/bin/pkg-
 config --disable-static --enable-shared --prefix=/usr --enable-avfilter
 --disable-version3 --enable-logging --disable-optimizations --disable-
 extra-warnings --enable-avdevice --enable-avcodec --enable-avformat
 --disable-network --disable-gray --enable-swscale-alpha --disable-small
 --enable-dct --enable-fft --enable-mdct --enable-rdft --disable-crystalhd
 --disable-dxva2 --enable-runtime-cpudetect --disable-hardcoded-tables
 --disable-mipsdsp --disable-mipsdspr2 --disable-msa --enable-hwaccels
 --disable-cuda --disable-cuvid --disable-nvenc --disable-avisynth
 --disable-frei0r --disable-libopencore-amrnb --disable-libopencore-amrwb
 --disable-libdc1394 --disable-libgsm --disable-libilbc --disable-libvo-
 amrwbenc --disable-symver --disable-doc --enable-gpl --enable-nonfree
 --enable-ffmpeg --disable-ffplay --enable-libv4l2 --disable-ffprobe
 --disable-libxcb --enable-postproc --enable-swscale --enable-indevs
 --disable-alsa --disable-outdevs --enable-pthreads --enable-zlib --enable-
 bzlib --disable-libfdk-aac --disable-libcdio --enable-gnutls --disable-
 openssl --disable-libdrm --disable-libopenh264 --disable-vaapi --disable-
 vdpau --disable-mmal --disable-omx --disable-omx-rpi --disable-libopencv
 --disable-libopus --disable-libvpx --disable-libass --disable-libbluray
 --disable-libmfx --disable-librtmp --disable-libmp3lame --disable-
 libmodplug --disable-libspeex --disable-libtheora --disable-iconv
 --disable-libfreetype --disable-fontconfig --disable-libopenjpeg
 --disable-libx264 --disable-libx265 --disable-libdav1d --disable-x86asm
 --enable-mmx --disable-sse --disable-sse2 --disable-sse3 --disable-ssse3
 --disable-sse4 --disable-sse42 --disable-avx --disable-avx2 --disable-
 armv6 --disable-armv6t2 --disable-vfp --disable-neon --disable-altivec
 --extra-libs=-latomic --enable-pic --cpu=geode
   libavutil      57. 28.100 / 57. 28.100
   libavcodec     59. 37.100 / 59. 37.100
   libavformat    59. 27.100 / 59. 27.100
   libavdevice    59.  7.100 / 59.  7.100
   libavfilter     8. 44.100 /  8. 44.100
   libswscale      6.  7.100 /  6.  7.100
   libswresample   4.  7.100 /  4.  7.100
   libpostproc    56.  6.100 / 56.  6.100
 Splitting the commandline.
 Reading option '-v' ... matched as option 'v' (set logging level) with
 argument '9'.
 Reading option '-loglevel' ... matched as option 'loglevel' (set logging
 level) with argument '99'.
 Reading option '-f' ... matched as option 'f' (force format) with argument
 'video4linux2'.
 Reading option '-i' ... matched as input url with argument '/dev/video0'.
 Reading option '-vframes' ... matched as option 'vframes' (set the number
 of video frames to output) with argument '1'.
 Reading option '-video_size' ... matched as AVOption 'video_size' with
 argument '640x480'.
 Reading option 'test.jpeg' ... matched as output url.
 Finished splitting the commandline.
 Parsing a group of options: global .
 Applying option v (set logging level) with argument 9.
 Successfully parsed a group of options.
 Parsing a group of options: input url /dev/video0.
 Applying option f (force format) with argument video4linux2.
 Successfully parsed a group of options.
 Opening an input file: /dev/video0.
 [video4linux2,v4l2 @ 0x197b2c0] fd:3 capabilities:84a00001
 [video4linux2,v4l2 @ 0x197b2c0] Current input_channel: 0, input_name:
 Camera 1, input_std: 0
 [video4linux2,v4l2 @ 0x197b2c0] Querying the device for the current frame
 size
 [video4linux2,v4l2 @ 0x197b2c0] Setting frame size to 3840x2160
 [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
 from 0x32315559 to 0x47504A4D
 [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
 pix_fmt:yuv420p
 [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
 from 0x32315559 to 0x47504A4D
 [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
 pix_fmt:yuv420p
 [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
 from 0x32315659 to 0x47504A4D
 [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
 pix_fmt:yuv422p
 [video4linux2,v4l2 @ 0x197b2c0] The V4L2 driver changed the pixel format
 from 0x50323234 to 0x47504A4D
 [video4linux2,v4l2 @ 0x197b2c0] Trying to set codec:rawvideo
 pix_fmt:yuyv422
 Killed

 This is information about ffmpeg on my PC (ffmpeg works without any patch)

 {{{
 a at PC:~$ ffmpeg --version
 }}}
 ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg
 developers
   built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
   configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1
 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu
 --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl
 --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom
 --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
 --enable-libcdio --enable-libcodec2 --enable-libdav1d --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-librabbitmq --enable-librubberband --enable-
 libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-
 libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-
 libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-
 libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq
 --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl
 --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg
 --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883
 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
   libavutil      56. 70.100 / 56. 70.100
   libavcodec     58.134.100 / 58.134.100
   libavformat    58. 76.100 / 58. 76.100
   libavdevice    58. 13.100 / 58. 13.100
   libavfilter     7.110.100 /  7.110.100
   libswscale      5.  9.100 /  5.  9.100
   libswresample   3.  9.100 /  3.  9.100
   libpostproc    55.  9.100 / 55.  9.100

 Webcam is ELP-USB4K02AF-KL100W http://www.elpcctv.com/elp-128-sony-imx415
 -sensor-night-vision-4k-usb-camera-with-white-led-p-169.html

--
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/10252#comment:2>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list