[FFmpeg-devel] [WIP PATCH 0/1] avcodec/aacenc: improve bit_rate_tolerance=0

Pauli Virtanen pav at iki.fi
Sun Sep 15 18:14:47 EEST 2024


la, 2024-09-14 kello 00:15 +0300, Pauli Virtanen kirjoitti:

[clip]
> - it appears the resulting frame_bits depends also on some other state
>   than s->lambda. iteration with lambda1, lambda2>lambda1, and then again
>   with lambda1 can produce different frame_bits on the two lambda1
>   iterations. Is there some state that is modified across iterations?

Looking at the code, there seem to be at least a few things:

1. aacpsy analyze internal state, AacPsyChannel.prev_band
   AacPsyContext.pe.previous, get updated on each re-encode iteration
   of the same frame

2. avoid_clipping() is applied on coeffs only on first iteration,
   in later iterations coeffs can get overwritten by pcoeffs

3. adjust_frame_information() changes sce->ics.max_sfb which would
   affect clipping

The aacpsy prev state is documented to relate to previous frame, but it
seems it can here be overwritten by that from the previous re-encode
iteration. This looks a bit suspicious.

Probably the clipping factor also should be re-applied on re-encodes.

Maybe s->psy.model->analyze() should be done only on the first encode
iteration, and the same bitres.alloc result be used for all potential
re-encodes of the same frame?

-- 
Pauli Virtanen


More information about the ffmpeg-devel mailing list