[FFmpeg-user] MLP encoder: encodes 24-bit wav files into 16-bit MLP

Moritz Barsnick barsnick at gmx.net
Sun Jul 7 04:58:32 EEST 2019


On Sat, Jul 06, 2019 at 03:57:38 +0200, fabrice nicol wrote:
> ffmpeg is build from git source code. Choosing a simple 2-channel 24
> -bit 96khz wav file yields:
>
>    `~ $  /usr/local/bin/ffmpeg -i a_2_24_96.wav -c:a mlp -strict experimental a_2_24_96.mlp`
[...]
> Input #0, wav, from 'a_2_24_96.wav':
>    Duration: 00:14:14.05, bitrate: 4608 kb/s
>      Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 96000 Hz, stereo, s32 (24 bit), 4608 kb/s
[...]
>      Stream #0:0: Audio: mlp, 96000 Hz, stereo, s16, 128 kb/s
[...]
> Is this a limitation of the currently still experimental encoder or am I
> doing something wrong?

Indeed, this seems to be a limitation of the mlp encoder:

$ ffmpeg -h encoder=mlp
[...]
    Supported sample formats: s16

But looking at the code (mplenc.c), there does seem to be support for
24 bit MLP in there. It just can't be accessed, because the encoder is
not configured to accept such input:

    .sample_fmts            = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE},
(This is a list of supported input formats.)

If you edit this line to:
    .sample_fmts            = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_NONE},

and recompile, it seems to actually produce 24 bit output. (And this
output plays with ffplay and mpv at least, which both use libavcodec to
decode though).

The reason for the support missing can be read in the commit message:
https://github.com/FFmpeg/FFmpeg/commit/15b86f480a9c748aeeafb42a877ee755c64f90f2

  * 32-bit sample support has been removed for now, will add it later

    While testing, some samples gave lossless check failures when enforcing
    s32. Probably this will also get solved with the LFE issues.

So it was disabled because some encodings were incorrect.

Cheers,
Moritz


More information about the ffmpeg-user mailing list