Opened 6 years ago

Closed 5 years ago

Last modified 5 years ago

#7056 closed enhancement (wontfix)

Make ffmpeg to automatically convert audio sample format to floating point before apllying filters

Reported by: Rollinnn Owned by:
Priority: normal Component: undetermined
Version: git-master Keywords:
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug:
It seems that currently, if source file has sample format 16 or 24 bit fixed point, then ffmpeg process it also in fixed point format. With some processing this can result in audible clipping, even if "alimiter" filter is used in the end of filter chain. So it is needed to manually change sample format with "aformat=sample_fmts=flt" in the beginning if filters chain to be able to prevent clipping.

Suggestion is to convert sample format to floating point automatically before applying filters.

Example. If attached flac file is processed with command

ffmpeg -i input.flac -af "pan=stereo|FL=0.707*FC+FL+0.707*BL+0.707*SL+0.5*BC|FR=0.707*FC+FR+0.707*BR+0.707*SR+0.5*BC, alimiter=attack=0.1" output.flac

then resulted file contains obvious and audible clipping regardless alimiter was used

But if "aformat=sample_fmts=flt" is added to beginning of filter chain, so command is

ffmpeg -i input.flac -af "aformat=sample_fmts=flt, pan=stereo|FL=0.707*FC+FL+0.707*BL+0.707*SL+0.5*BC|FR=0.707*FC+FR+0.707*BR+0.707*SR+0.5*BC, alimiter=attack=0.1" output.flac

there is no clipping in resulted file, because alimiter succesfully supress it.
Yes, i know that i can simlpy use -ac 2 for downmixing.
ffmpeg is static build from Zeranoe.

How to reproduce:
Once again
This command results in file with no clipping

ffmpeg -i C:\000\sample_8channels_16bit.flac -af "aformat=sample_fmts=flt, pan=stereo|FL=0.707*FC+FL+0.707*BL+0.707*SL+0.5*BC|FR=0.707*FC+FR+0.707*BR+0.707*SR+0.5*BC, alimiter=attack=0.1" C:\000\downmixed.flac
ffmpeg version N-90173-gfa0c9d69d3 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth
  libavutil      56.  7.101 / 56.  7.101
  libavcodec     58. 13.100 / 58. 13.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 12.100 /  7. 12.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, flac, from 'C:\000\sample_8channels_16bit.flac':
  Duration: 00:00:11.04, start: 0.000000, bitrate: 2828 kb/s
    Stream #0:0: Audio: flac, 48000 Hz, 7.1, s16
Stream mapping:
  Stream #0:0 -> #0:0 (flac (native) -> flac (native))
Press [q] to stop, [?] for help
[flac @ 006dacc0] encoding as 24 bits-per-sample
Output #0, flac, to 'C:\000\downmixed.flac':
  Metadata:
    encoder         : Lavf58.10.100
    Stream #0:0: Audio: flac, 48000 Hz, stereo, s32 (24 bit), 128 kb/s
    Metadata:
      encoder         : Lavc58.13.100 flac
size=    2315kB time=00:00:11.04 bitrate=1717.9kbits/s speed=100x
video:0kB audio:2307kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.350835%

And this command results in file with audible clipping:

C:\Users\Андрей>ffmpeg -i C:\000\sample_8channels_16bit.flac -af "pan=stereo|FL=0.707*FC+FL+0.707*BL+0.707*SL+0.5*BC|FR=0.707*FC+FR+0.707*BR+0.707*SR+0.5*BC, alimiter=attack=0.1" C:\000\downmixed.flac
ffmpeg version N-90173-gfa0c9d69d3 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libmfx --enable-amf --enable-cuda --enable-cuvid --enable-d3d11va --enable-nvenc --enable-dxva2 --enable-avisynth
  libavutil      56.  7.101 / 56.  7.101
  libavcodec     58. 13.100 / 58. 13.100
  libavformat    58. 10.100 / 58. 10.100
  libavdevice    58.  2.100 / 58.  2.100
  libavfilter     7. 12.100 /  7. 12.100
  libswscale      5.  0.101 /  5.  0.101
  libswresample   3.  0.101 /  3.  0.101
  libpostproc    55.  0.100 / 55.  0.100
Input #0, flac, from 'C:\000\sample_8channels_16bit.flac':
  Duration: 00:00:11.04, start: 0.000000, bitrate: 2828 kb/s
    Stream #0:0: Audio: flac, 48000 Hz, 7.1, s16
Stream mapping:
  Stream #0:0 -> #0:0 (flac (native) -> flac (native))
Press [q] to stop, [?] for help
[flac @ 0487acc0] encoding as 24 bits-per-sample
Output #0, flac, to 'C:\000\downmixed.flac':
  Metadata:
    encoder         : Lavf58.10.100
    Stream #0:0: Audio: flac, 48000 Hz, stereo, s32 (24 bit), 128 kb/s
    Metadata:
      encoder         : Lavc58.13.100 flac
size=    1286kB time=00:00:11.04 bitrate= 954.5kbits/s speed=  69x
video:0kB audio:1278kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.633161%

Change History (4)

comment:2 by Elon Musk, 5 years ago

Resolution: wontfix
Status: newclosed

This is not good idea. There should not be auto conversion to float when it is not necessary, instead user is responsible to deal with filtergraphs issues by themselves.

in reply to:  2 comment:3 by Rollinnn, 5 years ago

Replying to richardpl:

This is not good idea. There should not be auto conversion to float when it is not necessary, instead user is responsible to deal with filtergraphs issues by themselves.

I don't get why "this is not good idea". Almost all software that can do some kind of audio processing (players, audio editors) silently does conversion to 32 bit float before applying effects. Why ffmpeg should be different in this regard?

Last edited 5 years ago by Rollinnn (previous) (diff)

comment:4 by Cigaes, 5 years ago

I do not know about other software (you seem to, but [citation needed]), but FFmpeg cares about things like performance and bit-exactness.

The filters in FFmpeg are meant to be efficient and versatile, but not fool-proof.

Note: See TracTickets for help on using tickets.