diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c index 87b7f183f9..ef9ab8855e 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" @@ -77,6 +78,15 @@ static const float gain_levels[9] = { LEVEL_MINUS_9DB }; +/** Adjustments in dB gain (LFE, +10 to -21 dB) */ +static const float gain_levels_lfe[32] = { + 3.162275, 2.818382, 2.511886, 2.238719, 1.995261, 1.778278, 1.584893, + 1.412536, 1.258924, 1.122018, 1.000000, 0.891251, 0.794328, 0.707946, + 0.630957, 0.562341, 0.501187, 0.446683, 0.398107, 0.354813, 0.316227, + 0.281838, 0.251188, 0.223872, 0.199526, 0.177828, 0.158489, 0.141253, + 0.125892, 0.112201, 0.100000, 0.089125 +}; + /** * Table for default stereo downmixing coefficients * reference: Section 7.8.2 Downmixing Into Two Channels @@ -1312,6 +1322,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. */ @@ -1489,6 +1500,33 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data, if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0) return ret; + /* AVDownmixInfo */ + if ((downmix_info = av_downmix_info_update_side_data(frame))) { + 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 = gain_levels_lfe[s->lfe_mix_level]; + else + downmix_info->lfe_mix_level = 0.0; // -inf dB + } else + return AVERROR(ENOMEM); + *got_frame_ptr = 1; return FFMIN(buf_size, s->frame_size); diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c index e623f0d3fe..8e931fddeb 100644 --- a/libavcodec/eac3dec.c +++ b/libavcodec/eac3dec.c @@ -360,7 +360,6 @@ int ff_eac3_parse_header(AC3DecodeContext *s) /* lfe mix level */ if (s->lfe_on && (s->lfe_mix_level_exists = get_bits1(gbc))) { - // TODO: use LFE mix level s->lfe_mix_level = get_bits(gbc, 5); } diff --git a/libavcodec/version.h b/libavcodec/version.h index f805a64bf2..61a7968524 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #define LIBAVCODEC_VERSION_MAJOR 55 #define LIBAVCODEC_VERSION_MINOR 52 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MICRO 102 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \