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

FFmpeg trac at avcodec.org
Sat Mar 11 15:57:00 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().
>

> 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
 }
 }}}


 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

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


More information about the FFmpeg-trac mailing list