[FFmpeg-devel] Strange qmax behaviour with mpeg2

Joseph Artsimovich joseph at mirriad.com
Tue Sep 11 14:14:20 CEST 2012

On 11/09/2012 12:44, Reimar Döffinger wrote:
> On 11 Sep 2012, at 13:02, Joseph Artsimovich <joseph at mirriad.com> wrote:
>> When encoding IMX 30 content (I-frame only mpeg2 at fixed bitrate) I noticed ffmpeg produces lower quality output than other encoders. Digging deeper, I found strange behaviour of qmax parameter with mpeg2video encoder that I can only explain away as a bug.
>> Before explaining further, here is my command line:
>> ffmpeg -i input.mov -vtag mx3p -vcodec mpeg2video -r 25 -pix_fmt yuv422p -minrate 30000k -maxrate 30000k -b:v 30000k -intra -flags +ildct+low_delay -dc 10 -intra_vlc 1 -non_linear_quant 1 -ps 1 -qmin 1 -qmax 8 -top 1 -bufsize 1200000 -rc_init_occupancy 1200000 -rc_buf_aggressivity 0.25 -an out.mov
>> The value of qmax=8 was taken from http://www.itbroadcastanddigitalcinema.com/ffmpeg_howto.html#Encoding_D10
>> This value guarantees the encoded frame size won't exceed 150000 bytes, which is the maximum for IMX 30. If I set it even higher to 12 (the maximum -non_linear_quant would allow me), I get a file with identical size but lower quality. That seems very wrong. I mean if it fits bitrate restrictions at qmax=8, it shouldn't degrate quality just because you allow it to.
>> Thoughts?
> For one-pass bitrate-based encoding the encoder almost certainly will make mistakes.
> With larger qmax the mistakes can be bigger.
> While it is likely the encoder could be improved a lot (e.g. by adding rc-lookahead) to work better with 1-pass, unless you can reproduce it in a 2-pass encode I don't think it is particularly unexpected.
The number of passes is irrelevant in this case, as it's an I-frame 
only, fixed-bits-per-frame variant of mpeg2. From my perhaps naive 
understanding, having done the DCT, you just need to do binary search to 
find the best quantization factor that produces output not larger than 
the maximum allowed size. From this point of view, as long as your 
optimal quantization factor is within [qmin, qmax], further increasing 
this interval should not affect the selected quantization factor. Yet, 
that's what happens.

> Btw. you did not define "lower quality", so the encode might just disagree with you on which is better, in which case 2-pass would probably make it worse.
By "lower quality" I mean blockiness.
I also did a synthetic test:
1. Take a black frame with some white text on it. The idea is that even 
qmin=1, qmax=1 will fit the size restrictions.
2. Compress it first with qmin=1, qmax=1 and then with qmin=1, qmax=12
3. Make sure the file sizes are identical.
4. Compare visual quality.
The one with qmin=1, qmax=1 looks identical to the original, while the 
one with qmin=1, qmax=12 has jpeg-like artifacts. File sizes are identical.

Joseph Artsimovich
Senior C++ Applications Developer
MirriAd Ltd

More information about the ffmpeg-devel mailing list