[FFmpeg-devel] [PATCH 2/3] lavfi: EBU R.128 channel weights
Clément Bœsch
ubitux at gmail.com
Sat Feb 2 13:02:09 CET 2013
On Sat, Jan 19, 2013 at 08:24:53PM +0000, David A. Sedacca wrote:
> Correct the recognition of channel layouts for good channel weight
> in the loudness computation.
> This suggested patch is 2 of 3 for Ticket #2144 "libavfilter ebur128
> loudness inaccuracy, irregular time interval, LFE interference".
>
> Signed-off-by: David A. Sedacca" <sedacca at comcast.net>
>
> ---
>
> This updated patch submission updates the style of the 'if' block
> per Clément's suggestion as clarified by Carl Eugen. It also
> reverts to the original pre-patch behavior to not allocate integrator
> cache memory for zero-weighted channels.
>
> libavfilter/f_ebur128.c | 24 +++++++++++++++++++-----
> 1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/libavfilter/f_ebur128.c b/libavfilter/f_ebur128.c
> index 85fddad..0265767 100644
> --- a/libavfilter/f_ebur128.c
> +++ b/libavfilter/f_ebur128.c
> @@ -314,12 +314,15 @@ static int config_video_output(AVFilterLink *outlink)
> static int config_audio_output(AVFilterLink *outlink)
> {
> int i;
> + int idx_bitposn = 0;
> AVFilterContext *ctx = outlink->src;
> EBUR128Context *ebur128 = ctx->priv;
> const int nb_channels = av_get_channel_layout_nb_channels(outlink->channel_layout);
>
> #define BACK_MASK (AV_CH_BACK_LEFT |AV_CH_BACK_CENTER |AV_CH_BACK_RIGHT| \
> - AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT)
> + AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_BACK_RIGHT| \
> + AV_CH_SIDE_LEFT |AV_CH_SIDE_RIGHT| \
> + AV_CH_SURROUND_DIRECT_LEFT |AV_CH_SURROUND_DIRECT_RIGHT)
What is the meaning of this "direct" left/right? It sounds like a "front"
speaker to me, but I may be wrong.
>
> ebur128->nb_channels = nb_channels;
> ebur128->ch_weighting = av_calloc(nb_channels, sizeof(*ebur128->ch_weighting));
> @@ -328,13 +331,24 @@ static int config_audio_output(AVFilterLink *outlink)
>
> for (i = 0; i < nb_channels; i++) {
>
> + /* find the next bit that is set starting from the right */
> + while ((outlink->channel_layout & 1ULL<<idx_bitposn) == 0 && idx_bitposn < 63)
> + idx_bitposn++;
> +
> /* channel weighting */
> - if ((outlink->channel_layout & 1ULL<<i) == AV_CH_LOW_FREQUENCY)
> - continue;
> - if (outlink->channel_layout & 1ULL<<i & BACK_MASK)
> + if ((1ULL<<idx_bitposn & AV_CH_LOW_FREQUENCY) ||
> + (1ULL<<idx_bitposn & AV_CH_LOW_FREQUENCY_2)) {
if (1ULL<<idx_bitposn & (AV_CH_LOW_FREQUENCY|AV_CH_LOW_FREQUENCY_2))?
nit: or you could #define LOW_FREQ_MASK to be consistent with BACK_MASK,
but feel free to ignore.
> + ebur128->ch_weighting[i] = 0;
> + } else if (1ULL<<idx_bitposn & BACK_MASK) {
> ebur128->ch_weighting[i] = 1.41;
> - else
> + } else {
> ebur128->ch_weighting[i] = 1.0;
> + }
> +
> + idx_bitposn++;
> +
> + if (!ebur128->ch_weighting[i])
> + continue;
>
> /* bins buffer for the two integration window (400ms and 3s) */
> ebur128->i400.cache[i] = av_calloc(I400_BINS, sizeof(*ebur128->i400.cache[0]));
Except these details, the patch looks OK (my request about someone
familiar with channel layouts still stands though). I don't have time to
test it, but I believe you did at least with the conformance tests. Thanks
for the patch.
PS: Sorry for the long delay of the review, I'm still having a good time
on another planet.
--
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130202/f3e28684/attachment.asc>
More information about the ffmpeg-devel
mailing list