[FFmpeg-trac] #11561(avcodec:new): libavformat/demux.c avformat_find_stream_info returns incorrect sample format

FFmpeg trac at avcodec.org
Mon Apr 28 22:20:40 EEST 2025


#11561: libavformat/demux.c avformat_find_stream_info returns incorrect sample
format
-------------------------------------+-------------------------------------
             Reporter:  keks51       |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:  avcodec      |                  Version:  7.1
             Keywords:  MP3 mp2      |               Blocked By:
  demuxer ffprobe codecpar format    |
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Summary of the bug:
 libavformat/demux.c avformat_find_stream_info returns AVFormatContext with
 streams[i]->codecpar->format = fltp but decodes frames with s16p

 How to reproduce:
 {{{
 % ffmpeg -f lavfi -i "aevalsrc='(sin(100*2*PI*t)):d=10'" res.mp2
 % ffprobe -show_frames res.mp2 |  grep sample_fmt
   ffprobe version 7.1.1 Copyright (c) 2007-2025 the FFmpeg developers
   built with Apple clang version 16.0.0 (clang-1600.0.26.6)
   configuration: ...
   libavutil      59. 39.100 / 59. 39.100
   libavcodec     61. 19.101 / 61. 19.101
   libavformat    61.  7.100 / 61.  7.100
   libavdevice    61.  3.100 / 61.  3.100
   libavfilter    10.  4.100 / 10.  4.100
   libswscale      8.  3.100 /  8.  3.100
   libswresample   5.  3.100 /  5.  3.100
   libpostproc    58.  3.100 / 58.  3.100
 [mp3 @ 0x155004fd0] Estimating duration from bitrate, this may be
 inaccurate
 Input #0, mp3, from 'res.mp2':
   Duration: 00:00:10.00, start: 0.000000, bitrate: 383 kb/s
   Stream #0:0: Audio: mp2 (mp3float), 44100 Hz, mono, fltp, 384 kb/s
 sample_fmt=s16p
 sample_fmt=s16p
 }}}

 The reason.
 avformat_find_stream_info steps:
 1.https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l2507
 2.https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l2575
 3.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l91
 4. codecs are chosen from libavcodec/codec_list.c. This file is generated
 based on
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavcodec/allcodecs.c#l503
 5. Since codec_id is AV_CODEC_ID_MP3 ff_mp3float_decoder is returned. Not
 ff_mp3_decoder despite they have the same codec_id AV_CODEC_ID_MP3. This
 is important for the following explanation
 6.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l2693
 7.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l1450
 8.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavcodec/parser.c#l163
 9.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavcodec/mpegaudio_parser.c#l73
 10.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavcodec/mpegaudiodecheader.c#l134
 11. decoder was changed from MP3 to MP2. This is important.
 12. avformat_find_stream_info returns codec_id = MP2 sample_format=fltp

 Decode frames steps:
 1. Find decoder for MP2
 2.
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavformat/demux.c#l91
 3. codecs are chosen from libavcodec/codec_list.c. This file is generated
 based on
 https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/refs/heads/master:/libavcodec/allcodecs.c#l500
 4. Since codec_id is AV_CODEC_ID_MP2 ff_mp2_decoder is returned. Not
 ff_mp2float_decoder despite they have the same codec_id AV_CODEC_ID_MP2.
 5. Decoding frames with sample_format=s16p

 Is there any reason to keep different codecs order for mp3 and mp2?

 Solution. Reorder mp3 decoder in the same order as mp2. For example
 ...
  499 extern const FFCodec ff_mp2_encoder;
  500 extern const FFCodec ff_mp2_decoder;
  501 extern const FFCodec ff_mp2float_decoder;
  502 extern const FFCodec ff_mp2fixed_encoder;

  # was
  503 extern const FFCodec ff_mp3float_decoder;
  504 extern const FFCodec ff_mp3_decoder;
  # reordered
  504 extern const FFCodec ff_mp3_decoder;
  503 extern const FFCodec ff_mp3float_decoder;

  505 extern const FFCodec ff_mp3adufloat_decoder;
  506 extern const FFCodec ff_mp3adu_decoder;
  507 extern const FFCodec ff_mp3on4float_decoder;
  508 extern const FFCodec ff_mp3on4_decoder;
  509 extern const FFCodec ff_mpc7_decoder;
  510 extern const FFCodec ff_mpc8_decoder;
 ...
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/11561>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list