[FFmpeg-trac] #8786(avfilter:new): af_loudnorm: FINAL_FRAME handling does not update loudness anymore

FFmpeg trac at avcodec.org
Sat Jul 11 18:02:17 EEST 2020


#8786: af_loudnorm: FINAL_FRAME handling does not update loudness anymore
----------------------------------+---------------------------------------
             Reporter:  slomo     |                     Type:  defect
               Status:  new       |                 Priority:  normal
            Component:  avfilter  |                  Version:  unspecified
             Keywords:  loudnorm  |               Blocked By:
             Blocking:            |  Reproduced by developer:  0
Analyzed by developer:  0         |
----------------------------------+---------------------------------------
 At the last frame there will be up to 3s of samples left in the buffer.
 These are currently copied out into a new AVFrame and then handled
 specially. While they were all already passed to the input EBUR128 context
 and the corresponding gain adjustments for them were stored in the deltas
 array in the previous INNER_FRAME processing, the whole last frame in the
 FINAL_FRAME handling is using the same index into that array.

 Currently the last 30 gain adjustments stored in the deltas array are not
 used at all

 In theory every 100ms (i.e. up to 30 times) the index into the deltas
 array would have to be incremented in the FINAL_FRAME handling, and like
 in the INNER_FRAME handling it would make sense to do linear interpolation
 between the current/next gain.


 I've found this while porting the filter to Rust for a GStreamer plugin,
 the code of which can be found here:
 ​https://gitlab.freedesktop.org/gstreamer/gst-plugins-
 rs/-/blob/master/audio/audiofx/src/audioloudnorm.rs . This also contains
 lots of code comments for all the steps, which might be helpful to take
 over to the ffmpeg code too.

 My solution for this might not be the best or most simple approach, but
 during my testing they worked so feel free to adapt them for the ffmpeg
 code.

 You can find the solution for this issue here:
 https://gitlab.freedesktop.org/gstreamer/gst-plugins-
 rs/-/blob/1730de6cea10cb73ff1ab882a8235d540bfa5061/audio/audiofx/src/audioloudnorm.rs#L735


 If you agree that the above approach (incrementing the index every 100ms
 and linear interpolation as for INNER_FRAME) is the right thing to do
 here, I can also prepare a patch for the C code in ffmpeg.

--
Ticket URL: <https://trac.ffmpeg.org/ticket/8786>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list