Opened 5 months ago

Last modified 5 months ago

#10772 new defect

codec_whitelist does not influence codec picking

Reported by: Rudolf Polzer Owned by:
Priority: important Component: avformat
Version: git-master Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description (last modified by Rudolf Polzer)

Summary of the bug:

The codec_whitelist feature, as introduced in 5c8eb16769e581f828ce420373c558c190185cc1, appears to block codecs from decoding, but it does not prevent automatic codec selection from picking a blocked codec (and thus it does not make ffmpeg behave as if only the listed codecs were compiled in, which I presume was the intent - it is at least what the Chromium developers believe the intent was in https://source.chromium.org/chromium/chromium/src/+/02508a7461cde79277a7e5e55f1704d3fb6a5f7a).

Thus, when the feature is used and one wants to play/decode a file whose preferred codec is not on the whitelist, but a different codec is on the whitelist that can decode the file, decoding will fail unless explicitly selecting the decoder.

This currently breaks Opus decoding (and thus 100% of youtube.com) in Chromium on Alpine Linux (and probably any other system that compiles Chromium to link against a system-wide installed ffmpeg library, and configures that system-wide library to contain both the opus and libopus decoders): https://gitlab.alpinelinux.org/alpine/aports/-/issues/15585

Also, as the below log shows, even when explicitly setting the codec, there still appear to be issues during analysis of the file; these do not appear to break playback though.

Component set to avformat as I believe find_probe_decoder in libavformat/demux.c should take the whitelist into account and skip codecs not listed on it.

Priority set to important, as Chromium being able to play YouTube videos is pretty important.

Not sure if Type should really be defect or enhancement - it depends on what the intent of the codec whitelist feature was (and thus whether Chrome is abusing it). The documentation of the feature does not go into much detail.

How to reproduce:

(NOTE: this repro requires _any_ opus file, and a ffmpeg binary that has both the opus and libopus decoders enabled in it. For my tests I was using http://rm.cloudns.org/~xonotic/temp/b-opus.mp4)

% ffplay -codec_whitelist h264,libopus /tmp/b-opus.mp4
ffplay version N-113171-g85b8d59ec7 Copyright (c) 2003-2024 the FFmpeg developers
  built with gcc 13 (Debian 13.2.0-5)
  configuration: --prefix=/home/rpolzer/src/update-ffmpeg/out --cc=gcc --cxx=g++ --objcc= --dep-cc=gcc --disable-static --enable-shared --enable-nonfree --enable-gpl --enable-version3 --enable-libaom --enable-libvpx --enable-libwebp --enable-libx264 --enable-libfribidi --enable-libass --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libpulse --enable-vaapi --enable-vdpau --enable-demuxer=dash --enable-gnutls --enable-libxml2
  libavutil      58. 36.100 / 58. 36.100
  libavcodec     60. 36.100 / 60. 36.100
  libavformat    60. 20.100 / 60. 20.100
  libavdevice    60.  4.100 / 60.  4.100
  libavfilter     9. 16.100 /  9. 16.100
  libswscale      7.  6.100 /  7.  6.100
  libswresample   4. 13.100 /  4. 13.100
  libpostproc    57.  4.100 / 57.  4.100
[opus @ 0x7ff164007a80] Codec (opus) not on whitelist 'h264,libopus'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff164000c80] Failed to open codec in avformat_find_stream_info
[opus @ 0x7ff164007a80] Codec (opus) not on whitelist 'h264,libopus'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7ff164000c80] Could not find codec parameters for stream 1 (Audio: opus (Opus / 0x7375704F), 48000 Hz, 0 channels, 104 kb/s): unspecified number of channels
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/b-opus.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:25.48, start: 0.000000, bitrate: 884 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt470bg/unknown/unknown, progressive), 640x360, 768 kb/s, 60 fps, 60 tbr, 15360 tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
        encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](und): Audio: opus (Opus / 0x7375704F), 48000 Hz, 2 channels, 104 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]
[opus @ 0x7ff164022d80] Codec (opus) not on whitelist 'h264,libopus'
Failed to open file '/tmp/b-opus.mp4' or configure filtergraph

% ffplay -codec_whitelist h264,libopus -vn -codec:a libopus /tmp/b-opus.mp4 
ffplay version N-113171-g85b8d59ec7 Copyright (c) 2003-2024 the FFmpeg developers
  built with gcc 13 (Debian 13.2.0-5)
  configuration: --prefix=/home/rpolzer/src/update-ffmpeg/out --cc=gcc --cxx=g++ --objcc= --dep-cc=gcc --disable-static --enable-shared --enable-nonfree --enable-gpl --enable-version3 --enable-libaom --enable-libvpx --enable-libwebp --enable-libx264 --enable-libfribidi --enable-libass --enable-libfontconfig --enable-libfreetype --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libpulse --enable-vaapi --enable-vdpau --enable-demuxer=dash --enable-gnutls --enable-libxml2
  libavutil      58. 36.100 / 58. 36.100
  libavcodec     60. 36.100 / 60. 36.100
  libavformat    60. 20.100 / 60. 20.100
  libavdevice    60.  4.100 / 60.  4.100
  libavfilter     9. 16.100 /  9. 16.100
  libswscale      7.  6.100 /  7.  6.100
  libswresample   4. 13.100 /  4. 13.100
  libpostproc    57.  4.100 / 57.  4.100
[opus @ 0x7fd82c011d40] Codec (opus) not on whitelist 'h264,libopus'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd82c000c80] Failed to open codec in avformat_find_stream_info
[opus @ 0x7fd82c011d40] Codec (opus) not on whitelist 'h264,libopus'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fd82c000c80] Could not find codec parameters for stream 1 (Audio: opus (Opus / 0x7375704F), 48000 Hz, 0 channels, 104 kb/s): unspecified number of channels
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/b-opus.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:25.48, start: 0.000000, bitrate: 884 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt470bg/unknown/unknown, progressive), 640x360, 768 kb/s, 60 fps, 60 tbr, 15360 tbn (default)
      Metadata:
        handler_name    : VideoHandler
        vendor_id       : [0][0][0][0]
        encoder         : Lavc60.31.102 libx264
  Stream #0:1[0x2](und): Audio: opus (Opus / 0x7375704F), 48000 Hz, 2 channels, 104 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
        vendor_id       : [0][0][0][0]
   0.58 M-A:  0.000 fd=   0 aq=   10KB vq=    0KB sq=    0B f=0/0   

Change History (1)

comment:1 by Rudolf Polzer, 5 months ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.