On 02/15/2014 11:28 AM, Tim Walker wrote:
> ---
>  libavcodec/ac3dec.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
> 
> diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
> index fcb52e1..c1b0e8c 100644
> --- a/libavcodec/ac3dec.c
> +++ b/libavcodec/ac3dec.c
> @@ -31,6 +31,7 @@
>  
>  #include "libavutil/channel_layout.h"
>  #include "libavutil/crc.h"
> +#include "libavutil/downmix_info.h"
>  #include "libavutil/opt.h"
>  #include "internal.h"
>  #include "aac_ac3_parser.h"
> @@ -1308,6 +1309,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, 
> void *data,
>      const uint8_t *channel_map;
>      const float *output[AC3_MAX_CHANNELS];
>      enum AVMatrixEncoding matrix_encoding;
> +    AVDownmixInfo *downmix_info;
>  
>      /* copy input buffer to decoder context to avoid reading past the end
>         of the buffer, which can be caused by a damaged input stream. */
> @@ -1478,6 +1480,36 @@ static int ac3_decode_frame(AVCodecContext * avctx, 
> void *data,
>      if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) 
> < 0)
>          return ret;
>  
> +    /*
> +     * AVDownmixInfo
> +     *
> +     * Note: LFE mix level (dB) = 10 - LFE mix level code
> +     */
> +    if ((downmix_info = av_downmix_info_update_side_data(frame))) {

The only way downmix_info can be NULL is on allocation failure, so I
would prefer that this return AVERROR(ENOMEM) instead of silently
returning successfully.

> +        switch (s->preferred_downmix) {
> +        case AC3_DMIXMOD_LTRT:
> +            downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_LTRT;
> +            break;
> +        case AC3_DMIXMOD_LORO:
> +            downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_LORO;
> +            break;
> +        case AC3_DMIXMOD_DPLII:
> +            downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_DPLII;
> +            break;
> +        default:
> +            downmix_info->preferred_downmix_type = AV_DOWNMIX_TYPE_UNKNOWN;
> +            break;
> +        }
> +        downmix_info->center_mix_level        = gain_levels[s->       
> center_mix_level];
> +        downmix_info->center_mix_level_ltrt   = gain_levels[s->  
> center_mix_level_ltrt];
> +        downmix_info->surround_mix_level      = gain_levels[s->     
> surround_mix_level];
> +        downmix_info->surround_mix_level_ltrt = 
> gain_levels[s->surround_mix_level_ltrt];
> +        if (s->lfe_mix_level_exists)
> +            downmix_info->lfe_mix_level       = pow(10.0, (10 - 
> s->lfe_mix_level) / 20.0);
> +        else
> +            downmix_info->lfe_mix_level       = 0.0; // -inf dB

A table of lfe gain levels would be nice. Also you can remove the TODO
comment in eac3dec.c about using lfe mix level.


Thanks,
Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to