1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * The simplest AC-3 encoder 3cabdff1aSopenharmony_ci * Copyright (c) 2000 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com> 5cabdff1aSopenharmony_ci * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci/** 25cabdff1aSopenharmony_ci * @file 26cabdff1aSopenharmony_ci * The simplest AC-3 encoder. 27cabdff1aSopenharmony_ci */ 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include <stdint.h> 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 32cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 33cabdff1aSopenharmony_ci#include "libavutil/avstring.h" 34cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 35cabdff1aSopenharmony_ci#include "libavutil/crc.h" 36cabdff1aSopenharmony_ci#include "libavutil/internal.h" 37cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 38cabdff1aSopenharmony_ci#include "libavutil/opt.h" 39cabdff1aSopenharmony_ci#include "libavutil/thread.h" 40cabdff1aSopenharmony_ci#include "avcodec.h" 41cabdff1aSopenharmony_ci#include "codec_internal.h" 42cabdff1aSopenharmony_ci#include "config_components.h" 43cabdff1aSopenharmony_ci#include "encode.h" 44cabdff1aSopenharmony_ci#include "internal.h" 45cabdff1aSopenharmony_ci#include "me_cmp.h" 46cabdff1aSopenharmony_ci#include "put_bits.h" 47cabdff1aSopenharmony_ci#include "audiodsp.h" 48cabdff1aSopenharmony_ci#include "ac3dsp.h" 49cabdff1aSopenharmony_ci#include "ac3.h" 50cabdff1aSopenharmony_ci#include "ac3defs.h" 51cabdff1aSopenharmony_ci#include "ac3tab.h" 52cabdff1aSopenharmony_ci#include "fft.h" 53cabdff1aSopenharmony_ci#include "ac3enc.h" 54cabdff1aSopenharmony_ci#include "eac3enc.h" 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_citypedef struct AC3Mant { 57cabdff1aSopenharmony_ci int16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; ///< mantissa pointers for bap=1,2,4 58cabdff1aSopenharmony_ci int mant1_cnt, mant2_cnt, mant4_cnt; ///< mantissa counts for bap=1,2,4 59cabdff1aSopenharmony_ci} AC3Mant; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci#define CMIXLEV_NUM_OPTIONS 3 62cabdff1aSopenharmony_cistatic const float cmixlev_options[CMIXLEV_NUM_OPTIONS] = { 63cabdff1aSopenharmony_ci LEVEL_MINUS_3DB, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_6DB 64cabdff1aSopenharmony_ci}; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci#define SURMIXLEV_NUM_OPTIONS 3 67cabdff1aSopenharmony_cistatic const float surmixlev_options[SURMIXLEV_NUM_OPTIONS] = { 68cabdff1aSopenharmony_ci LEVEL_MINUS_3DB, LEVEL_MINUS_6DB, LEVEL_ZERO 69cabdff1aSopenharmony_ci}; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci#define EXTMIXLEV_NUM_OPTIONS 8 72cabdff1aSopenharmony_cistatic const float extmixlev_options[EXTMIXLEV_NUM_OPTIONS] = { 73cabdff1aSopenharmony_ci LEVEL_PLUS_3DB, LEVEL_PLUS_1POINT5DB, LEVEL_ONE, LEVEL_MINUS_1POINT5DB, 74cabdff1aSopenharmony_ci LEVEL_MINUS_3DB, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_6DB, LEVEL_ZERO 75cabdff1aSopenharmony_ci}; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci/* The first two options apply only to the AC-3 encoders; 78cabdff1aSopenharmony_ci * the rest is also valid for EAC-3. When modifying it, 79cabdff1aSopenharmony_ci * it might be necessary to adapt said offset in eac3enc.c. */ 80cabdff1aSopenharmony_ci#define OFFSET(param) offsetof(AC3EncodeContext, options.param) 81cabdff1aSopenharmony_ci#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) 82cabdff1aSopenharmony_ciconst AVOption ff_ac3_enc_options[] = { 83cabdff1aSopenharmony_ci/* AC-3 downmix levels */ 84cabdff1aSopenharmony_ci{"center_mixlev", "Center Mix Level", OFFSET(center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = LEVEL_MINUS_4POINT5DB }, 0.0, 1.0, AC3ENC_PARAM}, 85cabdff1aSopenharmony_ci{"surround_mixlev", "Surround Mix Level", OFFSET(surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = LEVEL_MINUS_6DB }, 0.0, 1.0, AC3ENC_PARAM}, 86cabdff1aSopenharmony_ci/* audio production information */ 87cabdff1aSopenharmony_ci{"mixing_level", "Mixing Level", OFFSET(mixing_level), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 111, AC3ENC_PARAM}, 88cabdff1aSopenharmony_ci{"room_type", "Room Type", OFFSET(room_type), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_SMALL_ROOM, AC3ENC_PARAM, "room_type"}, 89cabdff1aSopenharmony_ci {"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"}, 90cabdff1aSopenharmony_ci {"large", "Large Room", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_LARGE_ROOM }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"}, 91cabdff1aSopenharmony_ci {"small", "Small Room", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_SMALL_ROOM }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"}, 92cabdff1aSopenharmony_ci/* Metadata Options */ 93cabdff1aSopenharmony_ci{"per_frame_metadata", "Allow Changing Metadata Per-Frame", OFFSET(allow_per_frame_metadata), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AC3ENC_PARAM}, 94cabdff1aSopenharmony_ci{"copyright", "Copyright Bit", OFFSET(copyright), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 1, AC3ENC_PARAM}, 95cabdff1aSopenharmony_ci{"dialnorm", "Dialogue Level (dB)", OFFSET(dialogue_level), AV_OPT_TYPE_INT, {.i64 = -31 }, -31, -1, AC3ENC_PARAM}, 96cabdff1aSopenharmony_ci{"dsur_mode", "Dolby Surround Mode", OFFSET(dolby_surround_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dsur_mode"}, 97cabdff1aSopenharmony_ci {"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"}, 98cabdff1aSopenharmony_ci {"on", "Dolby Surround Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"}, 99cabdff1aSopenharmony_ci {"off", "Not Dolby Surround Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"}, 100cabdff1aSopenharmony_ci{"original", "Original Bit Stream", OFFSET(original), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 1, AC3ENC_PARAM}, 101cabdff1aSopenharmony_ci/* extended bitstream information */ 102cabdff1aSopenharmony_ci{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DOWNMIX_DPLII, AC3ENC_PARAM, "dmix_mode"}, 103cabdff1aSopenharmony_ci {"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"}, 104cabdff1aSopenharmony_ci {"ltrt", "Lt/Rt Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LTRT }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"}, 105cabdff1aSopenharmony_ci {"loro", "Lo/Ro Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LORO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"}, 106cabdff1aSopenharmony_ci {"dplii", "Dolby Pro Logic II Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_DPLII }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"}, 107cabdff1aSopenharmony_ci{"ltrt_cmixlev", "Lt/Rt Center Mix Level", OFFSET(ltrt_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM}, 108cabdff1aSopenharmony_ci{"ltrt_surmixlev", "Lt/Rt Surround Mix Level", OFFSET(ltrt_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM}, 109cabdff1aSopenharmony_ci{"loro_cmixlev", "Lo/Ro Center Mix Level", OFFSET(loro_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM}, 110cabdff1aSopenharmony_ci{"loro_surmixlev", "Lo/Ro Surround Mix Level", OFFSET(loro_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM}, 111cabdff1aSopenharmony_ci{"dsurex_mode", "Dolby Surround EX Mode", OFFSET(dolby_surround_ex_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DSUREX_DPLIIZ, AC3ENC_PARAM, "dsurex_mode"}, 112cabdff1aSopenharmony_ci {"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"}, 113cabdff1aSopenharmony_ci {"on", "Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"}, 114cabdff1aSopenharmony_ci {"off", "Not Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"}, 115cabdff1aSopenharmony_ci {"dpliiz", "Dolby Pro Logic IIz-encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DSUREX_DPLIIZ }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"}, 116cabdff1aSopenharmony_ci{"dheadphone_mode", "Dolby Headphone Mode", OFFSET(dolby_headphone_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dheadphone_mode"}, 117cabdff1aSopenharmony_ci {"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"}, 118cabdff1aSopenharmony_ci {"on", "Dolby Headphone Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"}, 119cabdff1aSopenharmony_ci {"off", "Not Dolby Headphone Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"}, 120cabdff1aSopenharmony_ci{"ad_conv_type", "A/D Converter Type", OFFSET(ad_converter_type), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_ADCONV_HDCD, AC3ENC_PARAM, "ad_conv_type"}, 121cabdff1aSopenharmony_ci {"standard", "Standard (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_ADCONV_STANDARD }, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"}, 122cabdff1aSopenharmony_ci {"hdcd", "HDCD", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_ADCONV_HDCD }, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"}, 123cabdff1aSopenharmony_ci/* Other Encoding Options */ 124cabdff1aSopenharmony_ci{"stereo_rematrixing", "Stereo Rematrixing", OFFSET(stereo_rematrixing), AV_OPT_TYPE_BOOL, {.i64 = 1 }, 0, 1, AC3ENC_PARAM}, 125cabdff1aSopenharmony_ci{"channel_coupling", "Channel Coupling", OFFSET(channel_coupling), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_AUTO }, AC3ENC_OPT_AUTO, AC3ENC_OPT_ON, AC3ENC_PARAM, "channel_coupling"}, 126cabdff1aSopenharmony_ci {"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_AUTO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "channel_coupling"}, 127cabdff1aSopenharmony_ci{"cpl_start_band", "Coupling Start Band", OFFSET(cpl_start), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_AUTO }, AC3ENC_OPT_AUTO, 15, AC3ENC_PARAM, "cpl_start_band"}, 128cabdff1aSopenharmony_ci {"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_AUTO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "cpl_start_band"}, 129cabdff1aSopenharmony_ci{NULL} 130cabdff1aSopenharmony_ci}; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ciconst AVClass ff_ac3enc_class = { 133cabdff1aSopenharmony_ci .class_name = "AC-3 Encoder", 134cabdff1aSopenharmony_ci .item_name = av_default_item_name, 135cabdff1aSopenharmony_ci .option = ff_ac3_enc_options, 136cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 137cabdff1aSopenharmony_ci}; 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ciconst FFCodecDefault ff_ac3_enc_defaults[] = { 140cabdff1aSopenharmony_ci { "b", "0" }, 141cabdff1aSopenharmony_ci { NULL } 142cabdff1aSopenharmony_ci}; 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci/** 145cabdff1aSopenharmony_ci * LUT for number of exponent groups. 146cabdff1aSopenharmony_ci * exponent_group_tab[coupling][exponent strategy-1][number of coefficients] 147cabdff1aSopenharmony_ci */ 148cabdff1aSopenharmony_cistatic uint8_t exponent_group_tab[2][3][256]; 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_ci/** 152cabdff1aSopenharmony_ci * List of supported channel layouts. 153cabdff1aSopenharmony_ci */ 154cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 155cabdff1aSopenharmony_ciconst uint64_t ff_ac3_channel_layouts[19] = { 156cabdff1aSopenharmony_ci AV_CH_LAYOUT_MONO, 157cabdff1aSopenharmony_ci AV_CH_LAYOUT_STEREO, 158cabdff1aSopenharmony_ci AV_CH_LAYOUT_2_1, 159cabdff1aSopenharmony_ci AV_CH_LAYOUT_SURROUND, 160cabdff1aSopenharmony_ci AV_CH_LAYOUT_2_2, 161cabdff1aSopenharmony_ci AV_CH_LAYOUT_QUAD, 162cabdff1aSopenharmony_ci AV_CH_LAYOUT_4POINT0, 163cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT0, 164cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT0_BACK, 165cabdff1aSopenharmony_ci (AV_CH_LAYOUT_MONO | AV_CH_LOW_FREQUENCY), 166cabdff1aSopenharmony_ci (AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY), 167cabdff1aSopenharmony_ci (AV_CH_LAYOUT_2_1 | AV_CH_LOW_FREQUENCY), 168cabdff1aSopenharmony_ci (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY), 169cabdff1aSopenharmony_ci (AV_CH_LAYOUT_2_2 | AV_CH_LOW_FREQUENCY), 170cabdff1aSopenharmony_ci (AV_CH_LAYOUT_QUAD | AV_CH_LOW_FREQUENCY), 171cabdff1aSopenharmony_ci (AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY), 172cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT1, 173cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT1_BACK, 174cabdff1aSopenharmony_ci 0 175cabdff1aSopenharmony_ci}; 176cabdff1aSopenharmony_ci#endif 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ciconst AVChannelLayout ff_ac3_ch_layouts[19] = { 179cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_MONO, 180cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_STEREO, 181cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_2_1, 182cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_SURROUND, 183cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_2_2, 184cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_QUAD, 185cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_4POINT0, 186cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT0, 187cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT0_BACK, 188cabdff1aSopenharmony_ci { 189cabdff1aSopenharmony_ci .nb_channels = 2, 190cabdff1aSopenharmony_ci .order = AV_CHANNEL_ORDER_NATIVE, 191cabdff1aSopenharmony_ci .u.mask = AV_CH_LAYOUT_MONO | AV_CH_LOW_FREQUENCY, 192cabdff1aSopenharmony_ci }, 193cabdff1aSopenharmony_ci { 194cabdff1aSopenharmony_ci .nb_channels = 3, 195cabdff1aSopenharmony_ci .order = AV_CHANNEL_ORDER_NATIVE, 196cabdff1aSopenharmony_ci .u.mask = AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY, 197cabdff1aSopenharmony_ci }, 198cabdff1aSopenharmony_ci { 199cabdff1aSopenharmony_ci .nb_channels = 4, 200cabdff1aSopenharmony_ci .order = AV_CHANNEL_ORDER_NATIVE, 201cabdff1aSopenharmony_ci .u.mask = AV_CH_LAYOUT_2_1 | AV_CH_LOW_FREQUENCY, 202cabdff1aSopenharmony_ci }, 203cabdff1aSopenharmony_ci { 204cabdff1aSopenharmony_ci .nb_channels = 4, 205cabdff1aSopenharmony_ci .order = AV_CHANNEL_ORDER_NATIVE, 206cabdff1aSopenharmony_ci .u.mask = AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY, 207cabdff1aSopenharmony_ci }, 208cabdff1aSopenharmony_ci { 209cabdff1aSopenharmony_ci .nb_channels = 5, 210cabdff1aSopenharmony_ci .order = AV_CHANNEL_ORDER_NATIVE, 211cabdff1aSopenharmony_ci .u.mask = AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY, 212cabdff1aSopenharmony_ci }, 213cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT1, 214cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT1_BACK, 215cabdff1aSopenharmony_ci { 0 }, 216cabdff1aSopenharmony_ci}; 217cabdff1aSopenharmony_ci 218cabdff1aSopenharmony_ci/** 219cabdff1aSopenharmony_ci * Table to remap channels from SMPTE order to AC-3 order. 220cabdff1aSopenharmony_ci * [channel_mode][lfe][ch] 221cabdff1aSopenharmony_ci */ 222cabdff1aSopenharmony_cistatic const uint8_t ac3_enc_channel_map[8][2][6] = { 223cabdff1aSopenharmony_ci COMMON_CHANNEL_MAP 224cabdff1aSopenharmony_ci { { 0, 1, 2, 3, }, { 0, 1, 3, 4, 2, } }, 225cabdff1aSopenharmony_ci { { 0, 2, 1, 3, 4, }, { 0, 2, 1, 4, 5, 3 } }, 226cabdff1aSopenharmony_ci}; 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci/** 229cabdff1aSopenharmony_ci * LUT to select the bandwidth code based on the bit rate, sample rate, and 230cabdff1aSopenharmony_ci * number of full-bandwidth channels. 231cabdff1aSopenharmony_ci * bandwidth_tab[fbw_channels-1][sample rate code][bit rate code] 232cabdff1aSopenharmony_ci */ 233cabdff1aSopenharmony_cistatic const uint8_t ac3_bandwidth_tab[5][3][19] = { 234cabdff1aSopenharmony_ci// 32 40 48 56 64 80 96 112 128 160 192 224 256 320 384 448 512 576 640 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci { { 0, 0, 0, 12, 16, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48 }, 237cabdff1aSopenharmony_ci { 0, 0, 0, 16, 20, 36, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56 }, 238cabdff1aSopenharmony_ci { 0, 0, 0, 32, 40, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60 } }, 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 20, 24, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48 }, 241cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 4, 24, 28, 36, 56, 56, 56, 56, 56, 56, 56, 56, 56 }, 242cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 20, 44, 52, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60 } }, 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 24, 32, 40, 48, 48, 48, 48, 48, 48 }, 245cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 4, 20, 28, 36, 44, 56, 56, 56, 56, 56, 56 }, 246cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 20, 40, 48, 60, 60, 60, 60, 60, 60, 60, 60 } }, 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 24, 32, 48, 48, 48, 48, 48, 48 }, 249cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 28, 36, 56, 56, 56, 56, 56, 56 }, 250cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 48, 60, 60, 60, 60, 60, 60, 60 } }, 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 20, 32, 40, 48, 48, 48, 48 }, 253cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 24, 36, 44, 56, 56, 56, 56 }, 254cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 44, 60, 60, 60, 60, 60, 60 } } 255cabdff1aSopenharmony_ci}; 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci/** 259cabdff1aSopenharmony_ci * LUT to select the coupling start band based on the bit rate, sample rate, and 260cabdff1aSopenharmony_ci * number of full-bandwidth channels. -1 = coupling off 261cabdff1aSopenharmony_ci * ac3_coupling_start_tab[channel_mode-2][sample rate code][bit rate code] 262cabdff1aSopenharmony_ci * 263cabdff1aSopenharmony_ci * TODO: more testing for optimal parameters. 264cabdff1aSopenharmony_ci * multi-channel tests at 44.1kHz and 32kHz. 265cabdff1aSopenharmony_ci */ 266cabdff1aSopenharmony_cistatic const int8_t ac3_coupling_start_tab[6][3][19] = { 267cabdff1aSopenharmony_ci// 32 40 48 56 64 80 96 112 128 160 192 224 256 320 384 448 512 576 640 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci // 2/0 270cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 1, 1, 7, 8, 11, 12, -1, -1, -1, -1, -1, -1 }, 271cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 1, 3, 5, 7, 10, 12, 13, -1, -1, -1, -1, -1, -1 }, 272cabdff1aSopenharmony_ci { 0, 0, 0, 0, 1, 2, 2, 9, 13, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci // 3/0 275cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6, 9, 11, 12, 13, -1, -1, -1, -1 }, 276cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6, 9, 11, 12, 13, -1, -1, -1, -1 }, 277cabdff1aSopenharmony_ci { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci // 2/1 - untested 280cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6, 9, 11, 12, 13, -1, -1, -1, -1 }, 281cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 6, 9, 11, 12, 13, -1, -1, -1, -1 }, 282cabdff1aSopenharmony_ci { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 283cabdff1aSopenharmony_ci 284cabdff1aSopenharmony_ci // 3/1 285cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 10, 11, 11, 12, 12, 14, -1 }, 286cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 10, 11, 11, 12, 12, 14, -1 }, 287cabdff1aSopenharmony_ci { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci // 2/2 - untested 290cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 10, 11, 11, 12, 12, 14, -1 }, 291cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 10, 11, 11, 12, 12, 14, -1 }, 292cabdff1aSopenharmony_ci { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci // 3/2 295cabdff1aSopenharmony_ci { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 8, 11, 12, 12, -1, -1 }, 296cabdff1aSopenharmony_ci { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 8, 11, 12, 12, -1, -1 }, 297cabdff1aSopenharmony_ci { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } }, 298cabdff1aSopenharmony_ci}; 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci/** 302cabdff1aSopenharmony_ci * Adjust the frame size to make the average bit rate match the target bit rate. 303cabdff1aSopenharmony_ci * This is only needed for 11025, 22050, and 44100 sample rates or any E-AC-3. 304cabdff1aSopenharmony_ci * 305cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 306cabdff1aSopenharmony_ci */ 307cabdff1aSopenharmony_civoid ff_ac3_adjust_frame_size(AC3EncodeContext *s) 308cabdff1aSopenharmony_ci{ 309cabdff1aSopenharmony_ci while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) { 310cabdff1aSopenharmony_ci s->bits_written -= s->bit_rate; 311cabdff1aSopenharmony_ci s->samples_written -= s->sample_rate; 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci s->frame_size = s->frame_size_min + 314cabdff1aSopenharmony_ci 2 * (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate); 315cabdff1aSopenharmony_ci s->bits_written += s->frame_size * 8; 316cabdff1aSopenharmony_ci s->samples_written += AC3_BLOCK_SIZE * s->num_blocks; 317cabdff1aSopenharmony_ci} 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci/** 321cabdff1aSopenharmony_ci * Set the initial coupling strategy parameters prior to coupling analysis. 322cabdff1aSopenharmony_ci * 323cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 324cabdff1aSopenharmony_ci */ 325cabdff1aSopenharmony_civoid ff_ac3_compute_coupling_strategy(AC3EncodeContext *s) 326cabdff1aSopenharmony_ci{ 327cabdff1aSopenharmony_ci int blk, ch; 328cabdff1aSopenharmony_ci int got_cpl_snr; 329cabdff1aSopenharmony_ci int num_cpl_blocks; 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci /* set coupling use flags for each block/channel */ 332cabdff1aSopenharmony_ci /* TODO: turn coupling on/off and adjust start band based on bit usage */ 333cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 334cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 335cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) 336cabdff1aSopenharmony_ci block->channel_in_cpl[ch] = s->cpl_on; 337cabdff1aSopenharmony_ci } 338cabdff1aSopenharmony_ci 339cabdff1aSopenharmony_ci /* enable coupling for each block if at least 2 channels have coupling 340cabdff1aSopenharmony_ci enabled for that block */ 341cabdff1aSopenharmony_ci got_cpl_snr = 0; 342cabdff1aSopenharmony_ci num_cpl_blocks = 0; 343cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 344cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 345cabdff1aSopenharmony_ci block->num_cpl_channels = 0; 346cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) 347cabdff1aSopenharmony_ci block->num_cpl_channels += block->channel_in_cpl[ch]; 348cabdff1aSopenharmony_ci block->cpl_in_use = block->num_cpl_channels > 1; 349cabdff1aSopenharmony_ci num_cpl_blocks += block->cpl_in_use; 350cabdff1aSopenharmony_ci if (!block->cpl_in_use) { 351cabdff1aSopenharmony_ci block->num_cpl_channels = 0; 352cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) 353cabdff1aSopenharmony_ci block->channel_in_cpl[ch] = 0; 354cabdff1aSopenharmony_ci } 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci block->new_cpl_strategy = !blk; 357cabdff1aSopenharmony_ci if (blk) { 358cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 359cabdff1aSopenharmony_ci if (block->channel_in_cpl[ch] != s->blocks[blk-1].channel_in_cpl[ch]) { 360cabdff1aSopenharmony_ci block->new_cpl_strategy = 1; 361cabdff1aSopenharmony_ci break; 362cabdff1aSopenharmony_ci } 363cabdff1aSopenharmony_ci } 364cabdff1aSopenharmony_ci } 365cabdff1aSopenharmony_ci block->new_cpl_leak = block->new_cpl_strategy; 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci if (!blk || (block->cpl_in_use && !got_cpl_snr)) { 368cabdff1aSopenharmony_ci block->new_snr_offsets = 1; 369cabdff1aSopenharmony_ci if (block->cpl_in_use) 370cabdff1aSopenharmony_ci got_cpl_snr = 1; 371cabdff1aSopenharmony_ci } else { 372cabdff1aSopenharmony_ci block->new_snr_offsets = 0; 373cabdff1aSopenharmony_ci } 374cabdff1aSopenharmony_ci } 375cabdff1aSopenharmony_ci if (!num_cpl_blocks) 376cabdff1aSopenharmony_ci s->cpl_on = 0; 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_ci /* set bandwidth for each channel */ 379cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 380cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 381cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 382cabdff1aSopenharmony_ci if (block->channel_in_cpl[ch]) 383cabdff1aSopenharmony_ci block->end_freq[ch] = s->start_freq[CPL_CH]; 384cabdff1aSopenharmony_ci else 385cabdff1aSopenharmony_ci block->end_freq[ch] = s->bandwidth_code * 3 + 73; 386cabdff1aSopenharmony_ci } 387cabdff1aSopenharmony_ci } 388cabdff1aSopenharmony_ci} 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci/** 392cabdff1aSopenharmony_ci * Apply stereo rematrixing to coefficients based on rematrixing flags. 393cabdff1aSopenharmony_ci * 394cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 395cabdff1aSopenharmony_ci */ 396cabdff1aSopenharmony_cistatic void ac3_apply_rematrixing(AC3EncodeContext *s) 397cabdff1aSopenharmony_ci{ 398cabdff1aSopenharmony_ci int nb_coefs; 399cabdff1aSopenharmony_ci int blk, bnd, i; 400cabdff1aSopenharmony_ci int start, end; 401cabdff1aSopenharmony_ci uint8_t *flags = NULL; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci if (!s->rematrixing_enabled) 404cabdff1aSopenharmony_ci return; 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 407cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 408cabdff1aSopenharmony_ci if (block->new_rematrixing_strategy) 409cabdff1aSopenharmony_ci flags = block->rematrixing_flags; 410cabdff1aSopenharmony_ci nb_coefs = FFMIN(block->end_freq[1], block->end_freq[2]); 411cabdff1aSopenharmony_ci for (bnd = 0; bnd < block->num_rematrixing_bands; bnd++) { 412cabdff1aSopenharmony_ci if (flags[bnd]) { 413cabdff1aSopenharmony_ci start = ff_ac3_rematrix_band_tab[bnd]; 414cabdff1aSopenharmony_ci end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]); 415cabdff1aSopenharmony_ci for (i = start; i < end; i++) { 416cabdff1aSopenharmony_ci int32_t lt = block->fixed_coef[1][i]; 417cabdff1aSopenharmony_ci int32_t rt = block->fixed_coef[2][i]; 418cabdff1aSopenharmony_ci block->fixed_coef[1][i] = (lt + rt) >> 1; 419cabdff1aSopenharmony_ci block->fixed_coef[2][i] = (lt - rt) >> 1; 420cabdff1aSopenharmony_ci } 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci } 423cabdff1aSopenharmony_ci } 424cabdff1aSopenharmony_ci} 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci/* 428cabdff1aSopenharmony_ci * Initialize exponent tables. 429cabdff1aSopenharmony_ci */ 430cabdff1aSopenharmony_cistatic av_cold void exponent_init(void) 431cabdff1aSopenharmony_ci{ 432cabdff1aSopenharmony_ci int expstr, i, grpsize; 433cabdff1aSopenharmony_ci 434cabdff1aSopenharmony_ci for (expstr = EXP_D15-1; expstr <= EXP_D45-1; expstr++) { 435cabdff1aSopenharmony_ci grpsize = 3 << expstr; 436cabdff1aSopenharmony_ci for (i = 12; i < 256; i++) { 437cabdff1aSopenharmony_ci exponent_group_tab[0][expstr][i] = (i + grpsize - 4) / grpsize; 438cabdff1aSopenharmony_ci exponent_group_tab[1][expstr][i] = (i ) / grpsize; 439cabdff1aSopenharmony_ci } 440cabdff1aSopenharmony_ci } 441cabdff1aSopenharmony_ci /* LFE */ 442cabdff1aSopenharmony_ci exponent_group_tab[0][0][7] = 2; 443cabdff1aSopenharmony_ci} 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci 446cabdff1aSopenharmony_ci/* 447cabdff1aSopenharmony_ci * Extract exponents from the MDCT coefficients. 448cabdff1aSopenharmony_ci */ 449cabdff1aSopenharmony_cistatic void extract_exponents(AC3EncodeContext *s) 450cabdff1aSopenharmony_ci{ 451cabdff1aSopenharmony_ci int ch = !s->cpl_on; 452cabdff1aSopenharmony_ci int chan_size = AC3_MAX_COEFS * s->num_blocks * (s->channels - ch + 1); 453cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[0]; 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci s->ac3dsp.extract_exponents(block->exp[ch], block->fixed_coef[ch], chan_size); 456cabdff1aSopenharmony_ci} 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_ci/** 460cabdff1aSopenharmony_ci * Exponent Difference Threshold. 461cabdff1aSopenharmony_ci * New exponents are sent if their SAD exceed this number. 462cabdff1aSopenharmony_ci */ 463cabdff1aSopenharmony_ci#define EXP_DIFF_THRESHOLD 500 464cabdff1aSopenharmony_ci 465cabdff1aSopenharmony_ci/** 466cabdff1aSopenharmony_ci * Table used to select exponent strategy based on exponent reuse block interval. 467cabdff1aSopenharmony_ci */ 468cabdff1aSopenharmony_cistatic const uint8_t exp_strategy_reuse_tab[4][6] = { 469cabdff1aSopenharmony_ci { EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, 470cabdff1aSopenharmony_ci { EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, 471cabdff1aSopenharmony_ci { EXP_D25, EXP_D25, EXP_D15, EXP_D15, EXP_D15, EXP_D15 }, 472cabdff1aSopenharmony_ci { EXP_D45, EXP_D25, EXP_D25, EXP_D15, EXP_D15, EXP_D15 } 473cabdff1aSopenharmony_ci}; 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci/* 476cabdff1aSopenharmony_ci * Calculate exponent strategies for all channels. 477cabdff1aSopenharmony_ci * Array arrangement is reversed to simplify the per-channel calculation. 478cabdff1aSopenharmony_ci */ 479cabdff1aSopenharmony_cistatic void compute_exp_strategy(AC3EncodeContext *s) 480cabdff1aSopenharmony_ci{ 481cabdff1aSopenharmony_ci int ch, blk, blk1; 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++) { 484cabdff1aSopenharmony_ci uint8_t *exp_strategy = s->exp_strategy[ch]; 485cabdff1aSopenharmony_ci uint8_t *exp = s->blocks[0].exp[ch]; 486cabdff1aSopenharmony_ci int exp_diff; 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci /* estimate if the exponent variation & decide if they should be 489cabdff1aSopenharmony_ci reused in the next frame */ 490cabdff1aSopenharmony_ci exp_strategy[0] = EXP_NEW; 491cabdff1aSopenharmony_ci exp += AC3_MAX_COEFS; 492cabdff1aSopenharmony_ci for (blk = 1; blk < s->num_blocks; blk++, exp += AC3_MAX_COEFS) { 493cabdff1aSopenharmony_ci if (ch == CPL_CH) { 494cabdff1aSopenharmony_ci if (!s->blocks[blk-1].cpl_in_use) { 495cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_NEW; 496cabdff1aSopenharmony_ci continue; 497cabdff1aSopenharmony_ci } else if (!s->blocks[blk].cpl_in_use) { 498cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_REUSE; 499cabdff1aSopenharmony_ci continue; 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci } else if (s->blocks[blk].channel_in_cpl[ch] != s->blocks[blk-1].channel_in_cpl[ch]) { 502cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_NEW; 503cabdff1aSopenharmony_ci continue; 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci exp_diff = s->mecc.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16); 506cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_REUSE; 507cabdff1aSopenharmony_ci if (ch == CPL_CH && exp_diff > (EXP_DIFF_THRESHOLD * (s->blocks[blk].end_freq[ch] - s->start_freq[ch]) / AC3_MAX_COEFS)) 508cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_NEW; 509cabdff1aSopenharmony_ci else if (ch > CPL_CH && exp_diff > EXP_DIFF_THRESHOLD) 510cabdff1aSopenharmony_ci exp_strategy[blk] = EXP_NEW; 511cabdff1aSopenharmony_ci } 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_ci /* now select the encoding strategy type : if exponents are often 514cabdff1aSopenharmony_ci recoded, we use a coarse encoding */ 515cabdff1aSopenharmony_ci blk = 0; 516cabdff1aSopenharmony_ci while (blk < s->num_blocks) { 517cabdff1aSopenharmony_ci blk1 = blk + 1; 518cabdff1aSopenharmony_ci while (blk1 < s->num_blocks && exp_strategy[blk1] == EXP_REUSE) 519cabdff1aSopenharmony_ci blk1++; 520cabdff1aSopenharmony_ci exp_strategy[blk] = exp_strategy_reuse_tab[s->num_blks_code][blk1-blk-1]; 521cabdff1aSopenharmony_ci blk = blk1; 522cabdff1aSopenharmony_ci } 523cabdff1aSopenharmony_ci } 524cabdff1aSopenharmony_ci if (s->lfe_on) { 525cabdff1aSopenharmony_ci ch = s->lfe_channel; 526cabdff1aSopenharmony_ci s->exp_strategy[ch][0] = EXP_D15; 527cabdff1aSopenharmony_ci for (blk = 1; blk < s->num_blocks; blk++) 528cabdff1aSopenharmony_ci s->exp_strategy[ch][blk] = EXP_REUSE; 529cabdff1aSopenharmony_ci } 530cabdff1aSopenharmony_ci 531cabdff1aSopenharmony_ci /* for E-AC-3, determine frame exponent strategy */ 532cabdff1aSopenharmony_ci if (CONFIG_EAC3_ENCODER && s->eac3) 533cabdff1aSopenharmony_ci ff_eac3_get_frame_exp_strategy(s); 534cabdff1aSopenharmony_ci} 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci 537cabdff1aSopenharmony_ci/** 538cabdff1aSopenharmony_ci * Update the exponents so that they are the ones the decoder will decode. 539cabdff1aSopenharmony_ci * 540cabdff1aSopenharmony_ci * @param[in,out] exp array of exponents for 1 block in 1 channel 541cabdff1aSopenharmony_ci * @param nb_exps number of exponents in active bandwidth 542cabdff1aSopenharmony_ci * @param exp_strategy exponent strategy for the block 543cabdff1aSopenharmony_ci * @param cpl indicates if the block is in the coupling channel 544cabdff1aSopenharmony_ci */ 545cabdff1aSopenharmony_cistatic void encode_exponents_blk_ch(uint8_t *exp, int nb_exps, int exp_strategy, 546cabdff1aSopenharmony_ci int cpl) 547cabdff1aSopenharmony_ci{ 548cabdff1aSopenharmony_ci int nb_groups, i, k; 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci nb_groups = exponent_group_tab[cpl][exp_strategy-1][nb_exps] * 3; 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci /* for each group, compute the minimum exponent */ 553cabdff1aSopenharmony_ci switch(exp_strategy) { 554cabdff1aSopenharmony_ci case EXP_D25: 555cabdff1aSopenharmony_ci for (i = 1, k = 1-cpl; i <= nb_groups; i++) { 556cabdff1aSopenharmony_ci uint8_t exp_min = exp[k]; 557cabdff1aSopenharmony_ci if (exp[k+1] < exp_min) 558cabdff1aSopenharmony_ci exp_min = exp[k+1]; 559cabdff1aSopenharmony_ci exp[i-cpl] = exp_min; 560cabdff1aSopenharmony_ci k += 2; 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci break; 563cabdff1aSopenharmony_ci case EXP_D45: 564cabdff1aSopenharmony_ci for (i = 1, k = 1-cpl; i <= nb_groups; i++) { 565cabdff1aSopenharmony_ci uint8_t exp_min = exp[k]; 566cabdff1aSopenharmony_ci if (exp[k+1] < exp_min) 567cabdff1aSopenharmony_ci exp_min = exp[k+1]; 568cabdff1aSopenharmony_ci if (exp[k+2] < exp_min) 569cabdff1aSopenharmony_ci exp_min = exp[k+2]; 570cabdff1aSopenharmony_ci if (exp[k+3] < exp_min) 571cabdff1aSopenharmony_ci exp_min = exp[k+3]; 572cabdff1aSopenharmony_ci exp[i-cpl] = exp_min; 573cabdff1aSopenharmony_ci k += 4; 574cabdff1aSopenharmony_ci } 575cabdff1aSopenharmony_ci break; 576cabdff1aSopenharmony_ci } 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_ci /* constraint for DC exponent */ 579cabdff1aSopenharmony_ci if (!cpl && exp[0] > 15) 580cabdff1aSopenharmony_ci exp[0] = 15; 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci /* decrease the delta between each groups to within 2 so that they can be 583cabdff1aSopenharmony_ci differentially encoded */ 584cabdff1aSopenharmony_ci for (i = 1; i <= nb_groups; i++) 585cabdff1aSopenharmony_ci exp[i] = FFMIN(exp[i], exp[i-1] + 2); 586cabdff1aSopenharmony_ci i--; 587cabdff1aSopenharmony_ci while (--i >= 0) 588cabdff1aSopenharmony_ci exp[i] = FFMIN(exp[i], exp[i+1] + 2); 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci if (cpl) 591cabdff1aSopenharmony_ci exp[-1] = exp[0] & ~1; 592cabdff1aSopenharmony_ci 593cabdff1aSopenharmony_ci /* now we have the exponent values the decoder will see */ 594cabdff1aSopenharmony_ci switch (exp_strategy) { 595cabdff1aSopenharmony_ci case EXP_D25: 596cabdff1aSopenharmony_ci for (i = nb_groups, k = (nb_groups * 2)-cpl; i > 0; i--) { 597cabdff1aSopenharmony_ci uint8_t exp1 = exp[i-cpl]; 598cabdff1aSopenharmony_ci exp[k--] = exp1; 599cabdff1aSopenharmony_ci exp[k--] = exp1; 600cabdff1aSopenharmony_ci } 601cabdff1aSopenharmony_ci break; 602cabdff1aSopenharmony_ci case EXP_D45: 603cabdff1aSopenharmony_ci for (i = nb_groups, k = (nb_groups * 4)-cpl; i > 0; i--) { 604cabdff1aSopenharmony_ci exp[k] = exp[k-1] = exp[k-2] = exp[k-3] = exp[i-cpl]; 605cabdff1aSopenharmony_ci k -= 4; 606cabdff1aSopenharmony_ci } 607cabdff1aSopenharmony_ci break; 608cabdff1aSopenharmony_ci } 609cabdff1aSopenharmony_ci} 610cabdff1aSopenharmony_ci 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci/* 613cabdff1aSopenharmony_ci * Encode exponents from original extracted form to what the decoder will see. 614cabdff1aSopenharmony_ci * This copies and groups exponents based on exponent strategy and reduces 615cabdff1aSopenharmony_ci * deltas between adjacent exponent groups so that they can be differentially 616cabdff1aSopenharmony_ci * encoded. 617cabdff1aSopenharmony_ci */ 618cabdff1aSopenharmony_cistatic void encode_exponents(AC3EncodeContext *s) 619cabdff1aSopenharmony_ci{ 620cabdff1aSopenharmony_ci int blk, blk1, ch, cpl; 621cabdff1aSopenharmony_ci uint8_t *exp, *exp_strategy; 622cabdff1aSopenharmony_ci int nb_coefs, num_reuse_blocks; 623cabdff1aSopenharmony_ci 624cabdff1aSopenharmony_ci for (ch = !s->cpl_on; ch <= s->channels; ch++) { 625cabdff1aSopenharmony_ci exp = s->blocks[0].exp[ch] + s->start_freq[ch]; 626cabdff1aSopenharmony_ci exp_strategy = s->exp_strategy[ch]; 627cabdff1aSopenharmony_ci 628cabdff1aSopenharmony_ci cpl = (ch == CPL_CH); 629cabdff1aSopenharmony_ci blk = 0; 630cabdff1aSopenharmony_ci while (blk < s->num_blocks) { 631cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 632cabdff1aSopenharmony_ci if (cpl && !block->cpl_in_use) { 633cabdff1aSopenharmony_ci exp += AC3_MAX_COEFS; 634cabdff1aSopenharmony_ci blk++; 635cabdff1aSopenharmony_ci continue; 636cabdff1aSopenharmony_ci } 637cabdff1aSopenharmony_ci nb_coefs = block->end_freq[ch] - s->start_freq[ch]; 638cabdff1aSopenharmony_ci blk1 = blk + 1; 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ci /* count the number of EXP_REUSE blocks after the current block 641cabdff1aSopenharmony_ci and set exponent reference block numbers */ 642cabdff1aSopenharmony_ci s->exp_ref_block[ch][blk] = blk; 643cabdff1aSopenharmony_ci while (blk1 < s->num_blocks && exp_strategy[blk1] == EXP_REUSE) { 644cabdff1aSopenharmony_ci s->exp_ref_block[ch][blk1] = blk; 645cabdff1aSopenharmony_ci blk1++; 646cabdff1aSopenharmony_ci } 647cabdff1aSopenharmony_ci num_reuse_blocks = blk1 - blk - 1; 648cabdff1aSopenharmony_ci 649cabdff1aSopenharmony_ci /* for the EXP_REUSE case we select the min of the exponents */ 650cabdff1aSopenharmony_ci s->ac3dsp.ac3_exponent_min(exp-s->start_freq[ch], num_reuse_blocks, 651cabdff1aSopenharmony_ci AC3_MAX_COEFS); 652cabdff1aSopenharmony_ci 653cabdff1aSopenharmony_ci encode_exponents_blk_ch(exp, nb_coefs, exp_strategy[blk], cpl); 654cabdff1aSopenharmony_ci 655cabdff1aSopenharmony_ci exp += AC3_MAX_COEFS * (num_reuse_blocks + 1); 656cabdff1aSopenharmony_ci blk = blk1; 657cabdff1aSopenharmony_ci } 658cabdff1aSopenharmony_ci } 659cabdff1aSopenharmony_ci 660cabdff1aSopenharmony_ci /* reference block numbers have been changed, so reset ref_bap_set */ 661cabdff1aSopenharmony_ci s->ref_bap_set = 0; 662cabdff1aSopenharmony_ci} 663cabdff1aSopenharmony_ci 664cabdff1aSopenharmony_ci 665cabdff1aSopenharmony_ci/* 666cabdff1aSopenharmony_ci * Count exponent bits based on bandwidth, coupling, and exponent strategies. 667cabdff1aSopenharmony_ci */ 668cabdff1aSopenharmony_cistatic int count_exponent_bits(AC3EncodeContext *s) 669cabdff1aSopenharmony_ci{ 670cabdff1aSopenharmony_ci int blk, ch; 671cabdff1aSopenharmony_ci int nb_groups, bit_count; 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci bit_count = 0; 674cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 675cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 676cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 677cabdff1aSopenharmony_ci int exp_strategy = s->exp_strategy[ch][blk]; 678cabdff1aSopenharmony_ci int cpl = (ch == CPL_CH); 679cabdff1aSopenharmony_ci int nb_coefs = block->end_freq[ch] - s->start_freq[ch]; 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_ci if (exp_strategy == EXP_REUSE) 682cabdff1aSopenharmony_ci continue; 683cabdff1aSopenharmony_ci 684cabdff1aSopenharmony_ci nb_groups = exponent_group_tab[cpl][exp_strategy-1][nb_coefs]; 685cabdff1aSopenharmony_ci bit_count += 4 + (nb_groups * 7); 686cabdff1aSopenharmony_ci } 687cabdff1aSopenharmony_ci } 688cabdff1aSopenharmony_ci 689cabdff1aSopenharmony_ci return bit_count; 690cabdff1aSopenharmony_ci} 691cabdff1aSopenharmony_ci 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci/** 694cabdff1aSopenharmony_ci * Group exponents. 695cabdff1aSopenharmony_ci * 3 delta-encoded exponents are in each 7-bit group. The number of groups 696cabdff1aSopenharmony_ci * varies depending on exponent strategy and bandwidth. 697cabdff1aSopenharmony_ci * 698cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 699cabdff1aSopenharmony_ci */ 700cabdff1aSopenharmony_cistatic void ac3_group_exponents(AC3EncodeContext *s) 701cabdff1aSopenharmony_ci{ 702cabdff1aSopenharmony_ci int blk, ch, i, cpl; 703cabdff1aSopenharmony_ci int group_size, nb_groups; 704cabdff1aSopenharmony_ci uint8_t *p; 705cabdff1aSopenharmony_ci int delta0, delta1, delta2; 706cabdff1aSopenharmony_ci int exp0, exp1; 707cabdff1aSopenharmony_ci 708cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 709cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 710cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 711cabdff1aSopenharmony_ci int exp_strategy = s->exp_strategy[ch][blk]; 712cabdff1aSopenharmony_ci if (exp_strategy == EXP_REUSE) 713cabdff1aSopenharmony_ci continue; 714cabdff1aSopenharmony_ci cpl = (ch == CPL_CH); 715cabdff1aSopenharmony_ci group_size = exp_strategy + (exp_strategy == EXP_D45); 716cabdff1aSopenharmony_ci nb_groups = exponent_group_tab[cpl][exp_strategy-1][block->end_freq[ch]-s->start_freq[ch]]; 717cabdff1aSopenharmony_ci p = block->exp[ch] + s->start_freq[ch] - cpl; 718cabdff1aSopenharmony_ci 719cabdff1aSopenharmony_ci /* DC exponent */ 720cabdff1aSopenharmony_ci exp1 = *p++; 721cabdff1aSopenharmony_ci block->grouped_exp[ch][0] = exp1; 722cabdff1aSopenharmony_ci 723cabdff1aSopenharmony_ci /* remaining exponents are delta encoded */ 724cabdff1aSopenharmony_ci for (i = 1; i <= nb_groups; i++) { 725cabdff1aSopenharmony_ci /* merge three delta in one code */ 726cabdff1aSopenharmony_ci exp0 = exp1; 727cabdff1aSopenharmony_ci exp1 = p[0]; 728cabdff1aSopenharmony_ci p += group_size; 729cabdff1aSopenharmony_ci delta0 = exp1 - exp0 + 2; 730cabdff1aSopenharmony_ci av_assert2(delta0 >= 0 && delta0 <= 4); 731cabdff1aSopenharmony_ci 732cabdff1aSopenharmony_ci exp0 = exp1; 733cabdff1aSopenharmony_ci exp1 = p[0]; 734cabdff1aSopenharmony_ci p += group_size; 735cabdff1aSopenharmony_ci delta1 = exp1 - exp0 + 2; 736cabdff1aSopenharmony_ci av_assert2(delta1 >= 0 && delta1 <= 4); 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_ci exp0 = exp1; 739cabdff1aSopenharmony_ci exp1 = p[0]; 740cabdff1aSopenharmony_ci p += group_size; 741cabdff1aSopenharmony_ci delta2 = exp1 - exp0 + 2; 742cabdff1aSopenharmony_ci av_assert2(delta2 >= 0 && delta2 <= 4); 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_ci block->grouped_exp[ch][i] = ((delta0 * 5 + delta1) * 5) + delta2; 745cabdff1aSopenharmony_ci } 746cabdff1aSopenharmony_ci } 747cabdff1aSopenharmony_ci } 748cabdff1aSopenharmony_ci} 749cabdff1aSopenharmony_ci 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_ci/** 752cabdff1aSopenharmony_ci * Calculate final exponents from the supplied MDCT coefficients and exponent shift. 753cabdff1aSopenharmony_ci * Extract exponents from MDCT coefficients, calculate exponent strategies, 754cabdff1aSopenharmony_ci * and encode final exponents. 755cabdff1aSopenharmony_ci * 756cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 757cabdff1aSopenharmony_ci */ 758cabdff1aSopenharmony_cistatic void ac3_process_exponents(AC3EncodeContext *s) 759cabdff1aSopenharmony_ci{ 760cabdff1aSopenharmony_ci extract_exponents(s); 761cabdff1aSopenharmony_ci 762cabdff1aSopenharmony_ci compute_exp_strategy(s); 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci encode_exponents(s); 765cabdff1aSopenharmony_ci 766cabdff1aSopenharmony_ci emms_c(); 767cabdff1aSopenharmony_ci} 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci/* 771cabdff1aSopenharmony_ci * Count frame bits that are based solely on fixed parameters. 772cabdff1aSopenharmony_ci * This only has to be run once when the encoder is initialized. 773cabdff1aSopenharmony_ci */ 774cabdff1aSopenharmony_cistatic void count_frame_bits_fixed(AC3EncodeContext *s) 775cabdff1aSopenharmony_ci{ 776cabdff1aSopenharmony_ci static const uint8_t frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 }; 777cabdff1aSopenharmony_ci int blk; 778cabdff1aSopenharmony_ci int frame_bits; 779cabdff1aSopenharmony_ci 780cabdff1aSopenharmony_ci /* assumptions: 781cabdff1aSopenharmony_ci * no dynamic range codes 782cabdff1aSopenharmony_ci * bit allocation parameters do not change between blocks 783cabdff1aSopenharmony_ci * no delta bit allocation 784cabdff1aSopenharmony_ci * no skipped data 785cabdff1aSopenharmony_ci * no auxiliary data 786cabdff1aSopenharmony_ci * no E-AC-3 metadata 787cabdff1aSopenharmony_ci */ 788cabdff1aSopenharmony_ci 789cabdff1aSopenharmony_ci /* header */ 790cabdff1aSopenharmony_ci frame_bits = 16; /* sync info */ 791cabdff1aSopenharmony_ci if (s->eac3) { 792cabdff1aSopenharmony_ci /* bitstream info header */ 793cabdff1aSopenharmony_ci frame_bits += 35; 794cabdff1aSopenharmony_ci frame_bits += 1 + 1; 795cabdff1aSopenharmony_ci if (s->num_blocks != 0x6) 796cabdff1aSopenharmony_ci frame_bits++; 797cabdff1aSopenharmony_ci frame_bits++; 798cabdff1aSopenharmony_ci /* audio frame header */ 799cabdff1aSopenharmony_ci if (s->num_blocks == 6) 800cabdff1aSopenharmony_ci frame_bits += 2; 801cabdff1aSopenharmony_ci frame_bits += 10; 802cabdff1aSopenharmony_ci /* exponent strategy */ 803cabdff1aSopenharmony_ci if (s->use_frame_exp_strategy) 804cabdff1aSopenharmony_ci frame_bits += 5 * s->fbw_channels; 805cabdff1aSopenharmony_ci else 806cabdff1aSopenharmony_ci frame_bits += s->num_blocks * 2 * s->fbw_channels; 807cabdff1aSopenharmony_ci if (s->lfe_on) 808cabdff1aSopenharmony_ci frame_bits += s->num_blocks; 809cabdff1aSopenharmony_ci /* converter exponent strategy */ 810cabdff1aSopenharmony_ci if (s->num_blks_code != 0x3) 811cabdff1aSopenharmony_ci frame_bits++; 812cabdff1aSopenharmony_ci else 813cabdff1aSopenharmony_ci frame_bits += s->fbw_channels * 5; 814cabdff1aSopenharmony_ci /* snr offsets */ 815cabdff1aSopenharmony_ci frame_bits += 10; 816cabdff1aSopenharmony_ci /* block start info */ 817cabdff1aSopenharmony_ci if (s->num_blocks != 1) 818cabdff1aSopenharmony_ci frame_bits++; 819cabdff1aSopenharmony_ci } else { 820cabdff1aSopenharmony_ci frame_bits += 49; 821cabdff1aSopenharmony_ci frame_bits += frame_bits_inc[s->channel_mode]; 822cabdff1aSopenharmony_ci } 823cabdff1aSopenharmony_ci 824cabdff1aSopenharmony_ci /* audio blocks */ 825cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 826cabdff1aSopenharmony_ci if (!s->eac3) { 827cabdff1aSopenharmony_ci /* block switch flags */ 828cabdff1aSopenharmony_ci frame_bits += s->fbw_channels; 829cabdff1aSopenharmony_ci 830cabdff1aSopenharmony_ci /* dither flags */ 831cabdff1aSopenharmony_ci frame_bits += s->fbw_channels; 832cabdff1aSopenharmony_ci } 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_ci /* dynamic range */ 835cabdff1aSopenharmony_ci frame_bits++; 836cabdff1aSopenharmony_ci 837cabdff1aSopenharmony_ci /* spectral extension */ 838cabdff1aSopenharmony_ci if (s->eac3) 839cabdff1aSopenharmony_ci frame_bits++; 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci /* coupling strategy exists: cplstre */ 842cabdff1aSopenharmony_ci if (!s->eac3) 843cabdff1aSopenharmony_ci frame_bits++; 844cabdff1aSopenharmony_ci 845cabdff1aSopenharmony_ci if (!s->eac3) { 846cabdff1aSopenharmony_ci /* exponent strategy */ 847cabdff1aSopenharmony_ci frame_bits += 2 * s->fbw_channels; 848cabdff1aSopenharmony_ci if (s->lfe_on) 849cabdff1aSopenharmony_ci frame_bits++; 850cabdff1aSopenharmony_ci 851cabdff1aSopenharmony_ci /* bit allocation params */ 852cabdff1aSopenharmony_ci frame_bits++; 853cabdff1aSopenharmony_ci if (!blk) 854cabdff1aSopenharmony_ci frame_bits += 2 + 2 + 2 + 2 + 3; 855cabdff1aSopenharmony_ci } 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci /* snroffste for AC-3, convsnroffste for E-AC-3 */ 858cabdff1aSopenharmony_ci frame_bits++; 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ci if (!s->eac3) { 861cabdff1aSopenharmony_ci /* delta bit allocation */ 862cabdff1aSopenharmony_ci frame_bits++; 863cabdff1aSopenharmony_ci 864cabdff1aSopenharmony_ci /* skipped data */ 865cabdff1aSopenharmony_ci frame_bits++; 866cabdff1aSopenharmony_ci } 867cabdff1aSopenharmony_ci } 868cabdff1aSopenharmony_ci 869cabdff1aSopenharmony_ci /* auxiliary data */ 870cabdff1aSopenharmony_ci frame_bits++; 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_ci /* CRC */ 873cabdff1aSopenharmony_ci frame_bits += 1 + 16; 874cabdff1aSopenharmony_ci 875cabdff1aSopenharmony_ci s->frame_bits_fixed = frame_bits; 876cabdff1aSopenharmony_ci} 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ci 879cabdff1aSopenharmony_ci/* 880cabdff1aSopenharmony_ci * Initialize bit allocation. 881cabdff1aSopenharmony_ci * Set default parameter codes and calculate parameter values. 882cabdff1aSopenharmony_ci */ 883cabdff1aSopenharmony_cistatic av_cold void bit_alloc_init(AC3EncodeContext *s) 884cabdff1aSopenharmony_ci{ 885cabdff1aSopenharmony_ci int ch; 886cabdff1aSopenharmony_ci 887cabdff1aSopenharmony_ci /* init default parameters */ 888cabdff1aSopenharmony_ci s->slow_decay_code = 2; 889cabdff1aSopenharmony_ci s->fast_decay_code = 1; 890cabdff1aSopenharmony_ci s->slow_gain_code = 1; 891cabdff1aSopenharmony_ci s->db_per_bit_code = s->eac3 ? 2 : 3; 892cabdff1aSopenharmony_ci s->floor_code = 7; 893cabdff1aSopenharmony_ci for (ch = 0; ch <= s->channels; ch++) 894cabdff1aSopenharmony_ci s->fast_gain_code[ch] = 4; 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci /* initial snr offset */ 897cabdff1aSopenharmony_ci s->coarse_snr_offset = 40; 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_ci /* compute real values */ 900cabdff1aSopenharmony_ci /* currently none of these values change during encoding, so we can just 901cabdff1aSopenharmony_ci set them once at initialization */ 902cabdff1aSopenharmony_ci s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->bit_alloc.sr_shift; 903cabdff1aSopenharmony_ci s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->bit_alloc.sr_shift; 904cabdff1aSopenharmony_ci s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code]; 905cabdff1aSopenharmony_ci s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code]; 906cabdff1aSopenharmony_ci s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code]; 907cabdff1aSopenharmony_ci s->bit_alloc.cpl_fast_leak = 0; 908cabdff1aSopenharmony_ci s->bit_alloc.cpl_slow_leak = 0; 909cabdff1aSopenharmony_ci 910cabdff1aSopenharmony_ci count_frame_bits_fixed(s); 911cabdff1aSopenharmony_ci} 912cabdff1aSopenharmony_ci 913cabdff1aSopenharmony_ci 914cabdff1aSopenharmony_ci/* 915cabdff1aSopenharmony_ci * Count the bits used to encode the frame, minus exponents and mantissas. 916cabdff1aSopenharmony_ci * Bits based on fixed parameters have already been counted, so now we just 917cabdff1aSopenharmony_ci * have to add the bits based on parameters that change during encoding. 918cabdff1aSopenharmony_ci */ 919cabdff1aSopenharmony_cistatic void count_frame_bits(AC3EncodeContext *s) 920cabdff1aSopenharmony_ci{ 921cabdff1aSopenharmony_ci AC3EncOptions *opt = &s->options; 922cabdff1aSopenharmony_ci int blk, ch; 923cabdff1aSopenharmony_ci int frame_bits = 0; 924cabdff1aSopenharmony_ci 925cabdff1aSopenharmony_ci /* header */ 926cabdff1aSopenharmony_ci if (s->eac3) { 927cabdff1aSopenharmony_ci if (opt->eac3_mixing_metadata) { 928cabdff1aSopenharmony_ci if (s->channel_mode > AC3_CHMODE_STEREO) 929cabdff1aSopenharmony_ci frame_bits += 2; 930cabdff1aSopenharmony_ci if (s->has_center) 931cabdff1aSopenharmony_ci frame_bits += 6; 932cabdff1aSopenharmony_ci if (s->has_surround) 933cabdff1aSopenharmony_ci frame_bits += 6; 934cabdff1aSopenharmony_ci frame_bits += s->lfe_on; 935cabdff1aSopenharmony_ci frame_bits += 1 + 1 + 2; 936cabdff1aSopenharmony_ci if (s->channel_mode < AC3_CHMODE_STEREO) 937cabdff1aSopenharmony_ci frame_bits++; 938cabdff1aSopenharmony_ci frame_bits++; 939cabdff1aSopenharmony_ci } 940cabdff1aSopenharmony_ci if (opt->eac3_info_metadata) { 941cabdff1aSopenharmony_ci frame_bits += 3 + 1 + 1; 942cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) 943cabdff1aSopenharmony_ci frame_bits += 2 + 2; 944cabdff1aSopenharmony_ci if (s->channel_mode >= AC3_CHMODE_2F2R) 945cabdff1aSopenharmony_ci frame_bits += 2; 946cabdff1aSopenharmony_ci frame_bits++; 947cabdff1aSopenharmony_ci if (opt->audio_production_info) 948cabdff1aSopenharmony_ci frame_bits += 5 + 2 + 1; 949cabdff1aSopenharmony_ci frame_bits++; 950cabdff1aSopenharmony_ci } 951cabdff1aSopenharmony_ci /* coupling */ 952cabdff1aSopenharmony_ci if (s->channel_mode > AC3_CHMODE_MONO) { 953cabdff1aSopenharmony_ci frame_bits++; 954cabdff1aSopenharmony_ci for (blk = 1; blk < s->num_blocks; blk++) { 955cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 956cabdff1aSopenharmony_ci frame_bits++; 957cabdff1aSopenharmony_ci if (block->new_cpl_strategy) 958cabdff1aSopenharmony_ci frame_bits++; 959cabdff1aSopenharmony_ci } 960cabdff1aSopenharmony_ci } 961cabdff1aSopenharmony_ci /* coupling exponent strategy */ 962cabdff1aSopenharmony_ci if (s->cpl_on) { 963cabdff1aSopenharmony_ci if (s->use_frame_exp_strategy) { 964cabdff1aSopenharmony_ci frame_bits += 5; 965cabdff1aSopenharmony_ci } else { 966cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 967cabdff1aSopenharmony_ci frame_bits += 2 * s->blocks[blk].cpl_in_use; 968cabdff1aSopenharmony_ci } 969cabdff1aSopenharmony_ci } 970cabdff1aSopenharmony_ci } else { 971cabdff1aSopenharmony_ci if (opt->audio_production_info) 972cabdff1aSopenharmony_ci frame_bits += 7; 973cabdff1aSopenharmony_ci if (s->bitstream_id == 6) { 974cabdff1aSopenharmony_ci if (opt->extended_bsi_1) 975cabdff1aSopenharmony_ci frame_bits += 14; 976cabdff1aSopenharmony_ci if (opt->extended_bsi_2) 977cabdff1aSopenharmony_ci frame_bits += 14; 978cabdff1aSopenharmony_ci } 979cabdff1aSopenharmony_ci } 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci /* audio blocks */ 982cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 983cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 984cabdff1aSopenharmony_ci 985cabdff1aSopenharmony_ci /* coupling strategy */ 986cabdff1aSopenharmony_ci if (block->new_cpl_strategy) { 987cabdff1aSopenharmony_ci if (!s->eac3) 988cabdff1aSopenharmony_ci frame_bits++; 989cabdff1aSopenharmony_ci if (block->cpl_in_use) { 990cabdff1aSopenharmony_ci if (s->eac3) 991cabdff1aSopenharmony_ci frame_bits++; 992cabdff1aSopenharmony_ci if (!s->eac3 || s->channel_mode != AC3_CHMODE_STEREO) 993cabdff1aSopenharmony_ci frame_bits += s->fbw_channels; 994cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) 995cabdff1aSopenharmony_ci frame_bits++; 996cabdff1aSopenharmony_ci frame_bits += 4 + 4; 997cabdff1aSopenharmony_ci if (s->eac3) 998cabdff1aSopenharmony_ci frame_bits++; 999cabdff1aSopenharmony_ci else 1000cabdff1aSopenharmony_ci frame_bits += s->num_cpl_subbands - 1; 1001cabdff1aSopenharmony_ci } 1002cabdff1aSopenharmony_ci } 1003cabdff1aSopenharmony_ci 1004cabdff1aSopenharmony_ci /* coupling coordinates */ 1005cabdff1aSopenharmony_ci if (block->cpl_in_use) { 1006cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 1007cabdff1aSopenharmony_ci if (block->channel_in_cpl[ch]) { 1008cabdff1aSopenharmony_ci if (!s->eac3 || block->new_cpl_coords[ch] != 2) 1009cabdff1aSopenharmony_ci frame_bits++; 1010cabdff1aSopenharmony_ci if (block->new_cpl_coords[ch]) { 1011cabdff1aSopenharmony_ci frame_bits += 2; 1012cabdff1aSopenharmony_ci frame_bits += (4 + 4) * s->num_cpl_bands; 1013cabdff1aSopenharmony_ci } 1014cabdff1aSopenharmony_ci } 1015cabdff1aSopenharmony_ci } 1016cabdff1aSopenharmony_ci } 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_ci /* stereo rematrixing */ 1019cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) { 1020cabdff1aSopenharmony_ci if (!s->eac3 || blk > 0) 1021cabdff1aSopenharmony_ci frame_bits++; 1022cabdff1aSopenharmony_ci if (s->blocks[blk].new_rematrixing_strategy) 1023cabdff1aSopenharmony_ci frame_bits += block->num_rematrixing_bands; 1024cabdff1aSopenharmony_ci } 1025cabdff1aSopenharmony_ci 1026cabdff1aSopenharmony_ci /* bandwidth codes & gain range */ 1027cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 1028cabdff1aSopenharmony_ci if (s->exp_strategy[ch][blk] != EXP_REUSE) { 1029cabdff1aSopenharmony_ci if (!block->channel_in_cpl[ch]) 1030cabdff1aSopenharmony_ci frame_bits += 6; 1031cabdff1aSopenharmony_ci frame_bits += 2; 1032cabdff1aSopenharmony_ci } 1033cabdff1aSopenharmony_ci } 1034cabdff1aSopenharmony_ci 1035cabdff1aSopenharmony_ci /* coupling exponent strategy */ 1036cabdff1aSopenharmony_ci if (!s->eac3 && block->cpl_in_use) 1037cabdff1aSopenharmony_ci frame_bits += 2; 1038cabdff1aSopenharmony_ci 1039cabdff1aSopenharmony_ci /* snr offsets and fast gain codes */ 1040cabdff1aSopenharmony_ci if (!s->eac3) { 1041cabdff1aSopenharmony_ci if (block->new_snr_offsets) 1042cabdff1aSopenharmony_ci frame_bits += 6 + (s->channels + block->cpl_in_use) * (4 + 3); 1043cabdff1aSopenharmony_ci } 1044cabdff1aSopenharmony_ci 1045cabdff1aSopenharmony_ci /* coupling leak info */ 1046cabdff1aSopenharmony_ci if (block->cpl_in_use) { 1047cabdff1aSopenharmony_ci if (!s->eac3 || block->new_cpl_leak != 2) 1048cabdff1aSopenharmony_ci frame_bits++; 1049cabdff1aSopenharmony_ci if (block->new_cpl_leak) 1050cabdff1aSopenharmony_ci frame_bits += 3 + 3; 1051cabdff1aSopenharmony_ci } 1052cabdff1aSopenharmony_ci } 1053cabdff1aSopenharmony_ci 1054cabdff1aSopenharmony_ci s->frame_bits = s->frame_bits_fixed + frame_bits; 1055cabdff1aSopenharmony_ci} 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_ci 1058cabdff1aSopenharmony_ci/* 1059cabdff1aSopenharmony_ci * Calculate masking curve based on the final exponents. 1060cabdff1aSopenharmony_ci * Also calculate the power spectral densities to use in future calculations. 1061cabdff1aSopenharmony_ci */ 1062cabdff1aSopenharmony_cistatic void bit_alloc_masking(AC3EncodeContext *s) 1063cabdff1aSopenharmony_ci{ 1064cabdff1aSopenharmony_ci int blk, ch; 1065cabdff1aSopenharmony_ci 1066cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 1067cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 1068cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 1069cabdff1aSopenharmony_ci /* We only need psd and mask for calculating bap. 1070cabdff1aSopenharmony_ci Since we currently do not calculate bap when exponent 1071cabdff1aSopenharmony_ci strategy is EXP_REUSE we do not need to calculate psd or mask. */ 1072cabdff1aSopenharmony_ci if (s->exp_strategy[ch][blk] != EXP_REUSE) { 1073cabdff1aSopenharmony_ci ff_ac3_bit_alloc_calc_psd(block->exp[ch], s->start_freq[ch], 1074cabdff1aSopenharmony_ci block->end_freq[ch], block->psd[ch], 1075cabdff1aSopenharmony_ci block->band_psd[ch]); 1076cabdff1aSopenharmony_ci ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, block->band_psd[ch], 1077cabdff1aSopenharmony_ci s->start_freq[ch], block->end_freq[ch], 1078cabdff1aSopenharmony_ci ff_ac3_fast_gain_tab[s->fast_gain_code[ch]], 1079cabdff1aSopenharmony_ci ch == s->lfe_channel, 1080cabdff1aSopenharmony_ci DBA_NONE, 0, NULL, NULL, NULL, 1081cabdff1aSopenharmony_ci block->mask[ch]); 1082cabdff1aSopenharmony_ci } 1083cabdff1aSopenharmony_ci } 1084cabdff1aSopenharmony_ci } 1085cabdff1aSopenharmony_ci} 1086cabdff1aSopenharmony_ci 1087cabdff1aSopenharmony_ci 1088cabdff1aSopenharmony_ci/* 1089cabdff1aSopenharmony_ci * Ensure that bap for each block and channel point to the current bap_buffer. 1090cabdff1aSopenharmony_ci * They may have been switched during the bit allocation search. 1091cabdff1aSopenharmony_ci */ 1092cabdff1aSopenharmony_cistatic void reset_block_bap(AC3EncodeContext *s) 1093cabdff1aSopenharmony_ci{ 1094cabdff1aSopenharmony_ci int blk, ch; 1095cabdff1aSopenharmony_ci uint8_t *ref_bap; 1096cabdff1aSopenharmony_ci 1097cabdff1aSopenharmony_ci if (s->ref_bap[0][0] == s->bap_buffer && s->ref_bap_set) 1098cabdff1aSopenharmony_ci return; 1099cabdff1aSopenharmony_ci 1100cabdff1aSopenharmony_ci ref_bap = s->bap_buffer; 1101cabdff1aSopenharmony_ci for (ch = 0; ch <= s->channels; ch++) { 1102cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 1103cabdff1aSopenharmony_ci s->ref_bap[ch][blk] = ref_bap + AC3_MAX_COEFS * s->exp_ref_block[ch][blk]; 1104cabdff1aSopenharmony_ci ref_bap += AC3_MAX_COEFS * s->num_blocks; 1105cabdff1aSopenharmony_ci } 1106cabdff1aSopenharmony_ci s->ref_bap_set = 1; 1107cabdff1aSopenharmony_ci} 1108cabdff1aSopenharmony_ci 1109cabdff1aSopenharmony_ci 1110cabdff1aSopenharmony_ci/** 1111cabdff1aSopenharmony_ci * Initialize mantissa counts. 1112cabdff1aSopenharmony_ci * These are set so that they are padded to the next whole group size when bits 1113cabdff1aSopenharmony_ci * are counted in compute_mantissa_size. 1114cabdff1aSopenharmony_ci * 1115cabdff1aSopenharmony_ci * @param[in,out] mant_cnt running counts for each bap value for each block 1116cabdff1aSopenharmony_ci */ 1117cabdff1aSopenharmony_cistatic void count_mantissa_bits_init(uint16_t mant_cnt[AC3_MAX_BLOCKS][16]) 1118cabdff1aSopenharmony_ci{ 1119cabdff1aSopenharmony_ci int blk; 1120cabdff1aSopenharmony_ci 1121cabdff1aSopenharmony_ci for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { 1122cabdff1aSopenharmony_ci memset(mant_cnt[blk], 0, sizeof(mant_cnt[blk])); 1123cabdff1aSopenharmony_ci mant_cnt[blk][1] = mant_cnt[blk][2] = 2; 1124cabdff1aSopenharmony_ci mant_cnt[blk][4] = 1; 1125cabdff1aSopenharmony_ci } 1126cabdff1aSopenharmony_ci} 1127cabdff1aSopenharmony_ci 1128cabdff1aSopenharmony_ci 1129cabdff1aSopenharmony_ci/** 1130cabdff1aSopenharmony_ci * Update mantissa bit counts for all blocks in 1 channel in a given bandwidth 1131cabdff1aSopenharmony_ci * range. 1132cabdff1aSopenharmony_ci * 1133cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 1134cabdff1aSopenharmony_ci * @param ch channel index 1135cabdff1aSopenharmony_ci * @param[in,out] mant_cnt running counts for each bap value for each block 1136cabdff1aSopenharmony_ci * @param start starting coefficient bin 1137cabdff1aSopenharmony_ci * @param end ending coefficient bin 1138cabdff1aSopenharmony_ci */ 1139cabdff1aSopenharmony_cistatic void count_mantissa_bits_update_ch(AC3EncodeContext *s, int ch, 1140cabdff1aSopenharmony_ci uint16_t mant_cnt[AC3_MAX_BLOCKS][16], 1141cabdff1aSopenharmony_ci int start, int end) 1142cabdff1aSopenharmony_ci{ 1143cabdff1aSopenharmony_ci int blk; 1144cabdff1aSopenharmony_ci 1145cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 1146cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 1147cabdff1aSopenharmony_ci if (ch == CPL_CH && !block->cpl_in_use) 1148cabdff1aSopenharmony_ci continue; 1149cabdff1aSopenharmony_ci s->ac3dsp.update_bap_counts(mant_cnt[blk], 1150cabdff1aSopenharmony_ci s->ref_bap[ch][blk] + start, 1151cabdff1aSopenharmony_ci FFMIN(end, block->end_freq[ch]) - start); 1152cabdff1aSopenharmony_ci } 1153cabdff1aSopenharmony_ci} 1154cabdff1aSopenharmony_ci 1155cabdff1aSopenharmony_ci 1156cabdff1aSopenharmony_ci/* 1157cabdff1aSopenharmony_ci * Count the number of mantissa bits in the frame based on the bap values. 1158cabdff1aSopenharmony_ci */ 1159cabdff1aSopenharmony_cistatic int count_mantissa_bits(AC3EncodeContext *s) 1160cabdff1aSopenharmony_ci{ 1161cabdff1aSopenharmony_ci int ch, max_end_freq; 1162cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(uint16_t, mant_cnt, [AC3_MAX_BLOCKS], [16]); 1163cabdff1aSopenharmony_ci 1164cabdff1aSopenharmony_ci count_mantissa_bits_init(mant_cnt); 1165cabdff1aSopenharmony_ci 1166cabdff1aSopenharmony_ci max_end_freq = s->bandwidth_code * 3 + 73; 1167cabdff1aSopenharmony_ci for (ch = !s->cpl_enabled; ch <= s->channels; ch++) 1168cabdff1aSopenharmony_ci count_mantissa_bits_update_ch(s, ch, mant_cnt, s->start_freq[ch], 1169cabdff1aSopenharmony_ci max_end_freq); 1170cabdff1aSopenharmony_ci 1171cabdff1aSopenharmony_ci return s->ac3dsp.compute_mantissa_size(mant_cnt); 1172cabdff1aSopenharmony_ci} 1173cabdff1aSopenharmony_ci 1174cabdff1aSopenharmony_ci 1175cabdff1aSopenharmony_ci/** 1176cabdff1aSopenharmony_ci * Run the bit allocation with a given SNR offset. 1177cabdff1aSopenharmony_ci * This calculates the bit allocation pointers that will be used to determine 1178cabdff1aSopenharmony_ci * the quantization of each mantissa. 1179cabdff1aSopenharmony_ci * 1180cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 1181cabdff1aSopenharmony_ci * @param snr_offset SNR offset, 0 to 1023 1182cabdff1aSopenharmony_ci * @return the number of bits needed for mantissas if the given SNR offset is 1183cabdff1aSopenharmony_ci * is used. 1184cabdff1aSopenharmony_ci */ 1185cabdff1aSopenharmony_cistatic int bit_alloc(AC3EncodeContext *s, int snr_offset) 1186cabdff1aSopenharmony_ci{ 1187cabdff1aSopenharmony_ci int blk, ch; 1188cabdff1aSopenharmony_ci 1189cabdff1aSopenharmony_ci snr_offset = (snr_offset - 240) * 4; 1190cabdff1aSopenharmony_ci 1191cabdff1aSopenharmony_ci reset_block_bap(s); 1192cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 1193cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 1194cabdff1aSopenharmony_ci 1195cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 1196cabdff1aSopenharmony_ci /* Currently the only bit allocation parameters which vary across 1197cabdff1aSopenharmony_ci blocks within a frame are the exponent values. We can take 1198cabdff1aSopenharmony_ci advantage of that by reusing the bit allocation pointers 1199cabdff1aSopenharmony_ci whenever we reuse exponents. */ 1200cabdff1aSopenharmony_ci if (s->exp_strategy[ch][blk] != EXP_REUSE) { 1201cabdff1aSopenharmony_ci s->ac3dsp.bit_alloc_calc_bap(block->mask[ch], block->psd[ch], 1202cabdff1aSopenharmony_ci s->start_freq[ch], block->end_freq[ch], 1203cabdff1aSopenharmony_ci snr_offset, s->bit_alloc.floor, 1204cabdff1aSopenharmony_ci ff_ac3_bap_tab, s->ref_bap[ch][blk]); 1205cabdff1aSopenharmony_ci } 1206cabdff1aSopenharmony_ci } 1207cabdff1aSopenharmony_ci } 1208cabdff1aSopenharmony_ci return count_mantissa_bits(s); 1209cabdff1aSopenharmony_ci} 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_ci 1212cabdff1aSopenharmony_ci/* 1213cabdff1aSopenharmony_ci * Constant bitrate bit allocation search. 1214cabdff1aSopenharmony_ci * Find the largest SNR offset that will allow data to fit in the frame. 1215cabdff1aSopenharmony_ci */ 1216cabdff1aSopenharmony_cistatic int cbr_bit_allocation(AC3EncodeContext *s) 1217cabdff1aSopenharmony_ci{ 1218cabdff1aSopenharmony_ci int ch; 1219cabdff1aSopenharmony_ci int bits_left; 1220cabdff1aSopenharmony_ci int snr_offset, snr_incr; 1221cabdff1aSopenharmony_ci 1222cabdff1aSopenharmony_ci bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits); 1223cabdff1aSopenharmony_ci if (bits_left < 0) 1224cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1225cabdff1aSopenharmony_ci 1226cabdff1aSopenharmony_ci snr_offset = s->coarse_snr_offset << 4; 1227cabdff1aSopenharmony_ci 1228cabdff1aSopenharmony_ci /* if previous frame SNR offset was 1023, check if current frame can also 1229cabdff1aSopenharmony_ci use SNR offset of 1023. if so, skip the search. */ 1230cabdff1aSopenharmony_ci if ((snr_offset | s->fine_snr_offset[1]) == 1023) { 1231cabdff1aSopenharmony_ci if (bit_alloc(s, 1023) <= bits_left) 1232cabdff1aSopenharmony_ci return 0; 1233cabdff1aSopenharmony_ci } 1234cabdff1aSopenharmony_ci 1235cabdff1aSopenharmony_ci while (snr_offset >= 0 && 1236cabdff1aSopenharmony_ci bit_alloc(s, snr_offset) > bits_left) { 1237cabdff1aSopenharmony_ci snr_offset -= 64; 1238cabdff1aSopenharmony_ci } 1239cabdff1aSopenharmony_ci if (snr_offset < 0) 1240cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1241cabdff1aSopenharmony_ci 1242cabdff1aSopenharmony_ci FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); 1243cabdff1aSopenharmony_ci for (snr_incr = 64; snr_incr > 0; snr_incr >>= 2) { 1244cabdff1aSopenharmony_ci while (snr_offset + snr_incr <= 1023 && 1245cabdff1aSopenharmony_ci bit_alloc(s, snr_offset + snr_incr) <= bits_left) { 1246cabdff1aSopenharmony_ci snr_offset += snr_incr; 1247cabdff1aSopenharmony_ci FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); 1248cabdff1aSopenharmony_ci } 1249cabdff1aSopenharmony_ci } 1250cabdff1aSopenharmony_ci FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); 1251cabdff1aSopenharmony_ci reset_block_bap(s); 1252cabdff1aSopenharmony_ci 1253cabdff1aSopenharmony_ci s->coarse_snr_offset = snr_offset >> 4; 1254cabdff1aSopenharmony_ci for (ch = !s->cpl_on; ch <= s->channels; ch++) 1255cabdff1aSopenharmony_ci s->fine_snr_offset[ch] = snr_offset & 0xF; 1256cabdff1aSopenharmony_ci 1257cabdff1aSopenharmony_ci return 0; 1258cabdff1aSopenharmony_ci} 1259cabdff1aSopenharmony_ci 1260cabdff1aSopenharmony_ci 1261cabdff1aSopenharmony_ci/* 1262cabdff1aSopenharmony_ci * Perform bit allocation search. 1263cabdff1aSopenharmony_ci * Finds the SNR offset value that maximizes quality and fits in the specified 1264cabdff1aSopenharmony_ci * frame size. Output is the SNR offset and a set of bit allocation pointers 1265cabdff1aSopenharmony_ci * used to quantize the mantissas. 1266cabdff1aSopenharmony_ci */ 1267cabdff1aSopenharmony_cistatic int ac3_compute_bit_allocation(AC3EncodeContext *s) 1268cabdff1aSopenharmony_ci{ 1269cabdff1aSopenharmony_ci count_frame_bits(s); 1270cabdff1aSopenharmony_ci 1271cabdff1aSopenharmony_ci s->exponent_bits = count_exponent_bits(s); 1272cabdff1aSopenharmony_ci 1273cabdff1aSopenharmony_ci bit_alloc_masking(s); 1274cabdff1aSopenharmony_ci 1275cabdff1aSopenharmony_ci return cbr_bit_allocation(s); 1276cabdff1aSopenharmony_ci} 1277cabdff1aSopenharmony_ci 1278cabdff1aSopenharmony_ci 1279cabdff1aSopenharmony_ci/** 1280cabdff1aSopenharmony_ci * Symmetric quantization on 'levels' levels. 1281cabdff1aSopenharmony_ci * 1282cabdff1aSopenharmony_ci * @param c unquantized coefficient 1283cabdff1aSopenharmony_ci * @param e exponent 1284cabdff1aSopenharmony_ci * @param levels number of quantization levels 1285cabdff1aSopenharmony_ci * @return quantized coefficient 1286cabdff1aSopenharmony_ci */ 1287cabdff1aSopenharmony_cistatic inline int sym_quant(int c, int e, int levels) 1288cabdff1aSopenharmony_ci{ 1289cabdff1aSopenharmony_ci int v = (((levels * c) >> (24 - e)) + levels) >> 1; 1290cabdff1aSopenharmony_ci av_assert2(v >= 0 && v < levels); 1291cabdff1aSopenharmony_ci return v; 1292cabdff1aSopenharmony_ci} 1293cabdff1aSopenharmony_ci 1294cabdff1aSopenharmony_ci 1295cabdff1aSopenharmony_ci/** 1296cabdff1aSopenharmony_ci * Asymmetric quantization on 2^qbits levels. 1297cabdff1aSopenharmony_ci * 1298cabdff1aSopenharmony_ci * @param c unquantized coefficient 1299cabdff1aSopenharmony_ci * @param e exponent 1300cabdff1aSopenharmony_ci * @param qbits number of quantization bits 1301cabdff1aSopenharmony_ci * @return quantized coefficient 1302cabdff1aSopenharmony_ci */ 1303cabdff1aSopenharmony_cistatic inline int asym_quant(int c, int e, int qbits) 1304cabdff1aSopenharmony_ci{ 1305cabdff1aSopenharmony_ci int m; 1306cabdff1aSopenharmony_ci 1307cabdff1aSopenharmony_ci c = (((c * (1<<e)) >> (24 - qbits)) + 1) >> 1; 1308cabdff1aSopenharmony_ci m = (1 << (qbits-1)); 1309cabdff1aSopenharmony_ci if (c >= m) 1310cabdff1aSopenharmony_ci c = m - 1; 1311cabdff1aSopenharmony_ci av_assert2(c >= -m); 1312cabdff1aSopenharmony_ci return c; 1313cabdff1aSopenharmony_ci} 1314cabdff1aSopenharmony_ci 1315cabdff1aSopenharmony_ci 1316cabdff1aSopenharmony_ci/** 1317cabdff1aSopenharmony_ci * Quantize a set of mantissas for a single channel in a single block. 1318cabdff1aSopenharmony_ci * 1319cabdff1aSopenharmony_ci * @param s Mantissa count context 1320cabdff1aSopenharmony_ci * @param fixed_coef unquantized fixed-point coefficients 1321cabdff1aSopenharmony_ci * @param exp exponents 1322cabdff1aSopenharmony_ci * @param bap bit allocation pointer indices 1323cabdff1aSopenharmony_ci * @param[out] qmant quantized coefficients 1324cabdff1aSopenharmony_ci * @param start_freq starting coefficient bin 1325cabdff1aSopenharmony_ci * @param end_freq ending coefficient bin 1326cabdff1aSopenharmony_ci */ 1327cabdff1aSopenharmony_cistatic void quantize_mantissas_blk_ch(AC3Mant *s, int32_t *fixed_coef, 1328cabdff1aSopenharmony_ci uint8_t *exp, uint8_t *bap, 1329cabdff1aSopenharmony_ci int16_t *qmant, int start_freq, 1330cabdff1aSopenharmony_ci int end_freq) 1331cabdff1aSopenharmony_ci{ 1332cabdff1aSopenharmony_ci int i; 1333cabdff1aSopenharmony_ci 1334cabdff1aSopenharmony_ci for (i = start_freq; i < end_freq; i++) { 1335cabdff1aSopenharmony_ci int c = fixed_coef[i]; 1336cabdff1aSopenharmony_ci int e = exp[i]; 1337cabdff1aSopenharmony_ci int v = bap[i]; 1338cabdff1aSopenharmony_ci switch (v) { 1339cabdff1aSopenharmony_ci case 0: 1340cabdff1aSopenharmony_ci break; 1341cabdff1aSopenharmony_ci case 1: 1342cabdff1aSopenharmony_ci v = sym_quant(c, e, 3); 1343cabdff1aSopenharmony_ci switch (s->mant1_cnt) { 1344cabdff1aSopenharmony_ci case 0: 1345cabdff1aSopenharmony_ci s->qmant1_ptr = &qmant[i]; 1346cabdff1aSopenharmony_ci v = 9 * v; 1347cabdff1aSopenharmony_ci s->mant1_cnt = 1; 1348cabdff1aSopenharmony_ci break; 1349cabdff1aSopenharmony_ci case 1: 1350cabdff1aSopenharmony_ci *s->qmant1_ptr += 3 * v; 1351cabdff1aSopenharmony_ci s->mant1_cnt = 2; 1352cabdff1aSopenharmony_ci v = 128; 1353cabdff1aSopenharmony_ci break; 1354cabdff1aSopenharmony_ci default: 1355cabdff1aSopenharmony_ci *s->qmant1_ptr += v; 1356cabdff1aSopenharmony_ci s->mant1_cnt = 0; 1357cabdff1aSopenharmony_ci v = 128; 1358cabdff1aSopenharmony_ci break; 1359cabdff1aSopenharmony_ci } 1360cabdff1aSopenharmony_ci break; 1361cabdff1aSopenharmony_ci case 2: 1362cabdff1aSopenharmony_ci v = sym_quant(c, e, 5); 1363cabdff1aSopenharmony_ci switch (s->mant2_cnt) { 1364cabdff1aSopenharmony_ci case 0: 1365cabdff1aSopenharmony_ci s->qmant2_ptr = &qmant[i]; 1366cabdff1aSopenharmony_ci v = 25 * v; 1367cabdff1aSopenharmony_ci s->mant2_cnt = 1; 1368cabdff1aSopenharmony_ci break; 1369cabdff1aSopenharmony_ci case 1: 1370cabdff1aSopenharmony_ci *s->qmant2_ptr += 5 * v; 1371cabdff1aSopenharmony_ci s->mant2_cnt = 2; 1372cabdff1aSopenharmony_ci v = 128; 1373cabdff1aSopenharmony_ci break; 1374cabdff1aSopenharmony_ci default: 1375cabdff1aSopenharmony_ci *s->qmant2_ptr += v; 1376cabdff1aSopenharmony_ci s->mant2_cnt = 0; 1377cabdff1aSopenharmony_ci v = 128; 1378cabdff1aSopenharmony_ci break; 1379cabdff1aSopenharmony_ci } 1380cabdff1aSopenharmony_ci break; 1381cabdff1aSopenharmony_ci case 3: 1382cabdff1aSopenharmony_ci v = sym_quant(c, e, 7); 1383cabdff1aSopenharmony_ci break; 1384cabdff1aSopenharmony_ci case 4: 1385cabdff1aSopenharmony_ci v = sym_quant(c, e, 11); 1386cabdff1aSopenharmony_ci switch (s->mant4_cnt) { 1387cabdff1aSopenharmony_ci case 0: 1388cabdff1aSopenharmony_ci s->qmant4_ptr = &qmant[i]; 1389cabdff1aSopenharmony_ci v = 11 * v; 1390cabdff1aSopenharmony_ci s->mant4_cnt = 1; 1391cabdff1aSopenharmony_ci break; 1392cabdff1aSopenharmony_ci default: 1393cabdff1aSopenharmony_ci *s->qmant4_ptr += v; 1394cabdff1aSopenharmony_ci s->mant4_cnt = 0; 1395cabdff1aSopenharmony_ci v = 128; 1396cabdff1aSopenharmony_ci break; 1397cabdff1aSopenharmony_ci } 1398cabdff1aSopenharmony_ci break; 1399cabdff1aSopenharmony_ci case 5: 1400cabdff1aSopenharmony_ci v = sym_quant(c, e, 15); 1401cabdff1aSopenharmony_ci break; 1402cabdff1aSopenharmony_ci case 14: 1403cabdff1aSopenharmony_ci v = asym_quant(c, e, 14); 1404cabdff1aSopenharmony_ci break; 1405cabdff1aSopenharmony_ci case 15: 1406cabdff1aSopenharmony_ci v = asym_quant(c, e, 16); 1407cabdff1aSopenharmony_ci break; 1408cabdff1aSopenharmony_ci default: 1409cabdff1aSopenharmony_ci v = asym_quant(c, e, v - 1); 1410cabdff1aSopenharmony_ci break; 1411cabdff1aSopenharmony_ci } 1412cabdff1aSopenharmony_ci qmant[i] = v; 1413cabdff1aSopenharmony_ci } 1414cabdff1aSopenharmony_ci} 1415cabdff1aSopenharmony_ci 1416cabdff1aSopenharmony_ci 1417cabdff1aSopenharmony_ci/** 1418cabdff1aSopenharmony_ci * Quantize mantissas using coefficients, exponents, and bit allocation pointers. 1419cabdff1aSopenharmony_ci * 1420cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 1421cabdff1aSopenharmony_ci */ 1422cabdff1aSopenharmony_cistatic void ac3_quantize_mantissas(AC3EncodeContext *s) 1423cabdff1aSopenharmony_ci{ 1424cabdff1aSopenharmony_ci int blk, ch, ch0=0, got_cpl; 1425cabdff1aSopenharmony_ci 1426cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 1427cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 1428cabdff1aSopenharmony_ci AC3Mant m = { 0 }; 1429cabdff1aSopenharmony_ci 1430cabdff1aSopenharmony_ci got_cpl = !block->cpl_in_use; 1431cabdff1aSopenharmony_ci for (ch = 1; ch <= s->channels; ch++) { 1432cabdff1aSopenharmony_ci if (!got_cpl && ch > 1 && block->channel_in_cpl[ch-1]) { 1433cabdff1aSopenharmony_ci ch0 = ch - 1; 1434cabdff1aSopenharmony_ci ch = CPL_CH; 1435cabdff1aSopenharmony_ci got_cpl = 1; 1436cabdff1aSopenharmony_ci } 1437cabdff1aSopenharmony_ci quantize_mantissas_blk_ch(&m, block->fixed_coef[ch], 1438cabdff1aSopenharmony_ci s->blocks[s->exp_ref_block[ch][blk]].exp[ch], 1439cabdff1aSopenharmony_ci s->ref_bap[ch][blk], block->qmant[ch], 1440cabdff1aSopenharmony_ci s->start_freq[ch], block->end_freq[ch]); 1441cabdff1aSopenharmony_ci if (ch == CPL_CH) 1442cabdff1aSopenharmony_ci ch = ch0; 1443cabdff1aSopenharmony_ci } 1444cabdff1aSopenharmony_ci } 1445cabdff1aSopenharmony_ci} 1446cabdff1aSopenharmony_ci 1447cabdff1aSopenharmony_ci 1448cabdff1aSopenharmony_ci/* 1449cabdff1aSopenharmony_ci * Write the AC-3 frame header to the output bitstream. 1450cabdff1aSopenharmony_ci */ 1451cabdff1aSopenharmony_cistatic void ac3_output_frame_header(AC3EncodeContext *s) 1452cabdff1aSopenharmony_ci{ 1453cabdff1aSopenharmony_ci AC3EncOptions *opt = &s->options; 1454cabdff1aSopenharmony_ci 1455cabdff1aSopenharmony_ci put_bits(&s->pb, 16, 0x0b77); /* frame header */ 1456cabdff1aSopenharmony_ci put_bits(&s->pb, 16, 0); /* crc1: will be filled later */ 1457cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->bit_alloc.sr_code); 1458cabdff1aSopenharmony_ci put_bits(&s->pb, 6, s->frame_size_code + (s->frame_size - s->frame_size_min) / 2); 1459cabdff1aSopenharmony_ci put_bits(&s->pb, 5, s->bitstream_id); 1460cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->bitstream_mode); 1461cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->channel_mode); 1462cabdff1aSopenharmony_ci if ((s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO) 1463cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->center_mix_level); 1464cabdff1aSopenharmony_ci if (s->channel_mode & 0x04) 1465cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->surround_mix_level); 1466cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) 1467cabdff1aSopenharmony_ci put_bits(&s->pb, 2, opt->dolby_surround_mode); 1468cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->lfe_on); /* LFE */ 1469cabdff1aSopenharmony_ci put_bits(&s->pb, 5, -opt->dialogue_level); 1470cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no compression control word */ 1471cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no lang code */ 1472cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->audio_production_info); 1473cabdff1aSopenharmony_ci if (opt->audio_production_info) { 1474cabdff1aSopenharmony_ci put_bits(&s->pb, 5, opt->mixing_level - 80); 1475cabdff1aSopenharmony_ci put_bits(&s->pb, 2, opt->room_type); 1476cabdff1aSopenharmony_ci } 1477cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->copyright); 1478cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->original); 1479cabdff1aSopenharmony_ci if (s->bitstream_id == 6) { 1480cabdff1aSopenharmony_ci /* alternate bit stream syntax */ 1481cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->extended_bsi_1); 1482cabdff1aSopenharmony_ci if (opt->extended_bsi_1) { 1483cabdff1aSopenharmony_ci put_bits(&s->pb, 2, opt->preferred_stereo_downmix); 1484cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->ltrt_center_mix_level); 1485cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->ltrt_surround_mix_level); 1486cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->loro_center_mix_level); 1487cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->loro_surround_mix_level); 1488cabdff1aSopenharmony_ci } 1489cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->extended_bsi_2); 1490cabdff1aSopenharmony_ci if (opt->extended_bsi_2) { 1491cabdff1aSopenharmony_ci put_bits(&s->pb, 2, opt->dolby_surround_ex_mode); 1492cabdff1aSopenharmony_ci put_bits(&s->pb, 2, opt->dolby_headphone_mode); 1493cabdff1aSopenharmony_ci put_bits(&s->pb, 1, opt->ad_converter_type); 1494cabdff1aSopenharmony_ci put_bits(&s->pb, 9, 0); /* xbsi2 and encinfo : reserved */ 1495cabdff1aSopenharmony_ci } 1496cabdff1aSopenharmony_ci } else { 1497cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no time code 1 */ 1498cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no time code 2 */ 1499cabdff1aSopenharmony_ci } 1500cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no additional bit stream info */ 1501cabdff1aSopenharmony_ci} 1502cabdff1aSopenharmony_ci 1503cabdff1aSopenharmony_ci 1504cabdff1aSopenharmony_ci/* 1505cabdff1aSopenharmony_ci * Write one audio block to the output bitstream. 1506cabdff1aSopenharmony_ci */ 1507cabdff1aSopenharmony_cistatic void output_audio_block(AC3EncodeContext *s, int blk) 1508cabdff1aSopenharmony_ci{ 1509cabdff1aSopenharmony_ci int ch, i, baie, bnd, got_cpl, av_uninit(ch0); 1510cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 1511cabdff1aSopenharmony_ci 1512cabdff1aSopenharmony_ci /* block switching */ 1513cabdff1aSopenharmony_ci if (!s->eac3) { 1514cabdff1aSopenharmony_ci for (ch = 0; ch < s->fbw_channels; ch++) 1515cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); 1516cabdff1aSopenharmony_ci } 1517cabdff1aSopenharmony_ci 1518cabdff1aSopenharmony_ci /* dither flags */ 1519cabdff1aSopenharmony_ci if (!s->eac3) { 1520cabdff1aSopenharmony_ci for (ch = 0; ch < s->fbw_channels; ch++) 1521cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 1); 1522cabdff1aSopenharmony_ci } 1523cabdff1aSopenharmony_ci 1524cabdff1aSopenharmony_ci /* dynamic range codes */ 1525cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); 1526cabdff1aSopenharmony_ci 1527cabdff1aSopenharmony_ci /* spectral extension */ 1528cabdff1aSopenharmony_ci if (s->eac3) 1529cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); 1530cabdff1aSopenharmony_ci 1531cabdff1aSopenharmony_ci /* channel coupling */ 1532cabdff1aSopenharmony_ci if (!s->eac3) 1533cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->new_cpl_strategy); 1534cabdff1aSopenharmony_ci if (block->new_cpl_strategy) { 1535cabdff1aSopenharmony_ci if (!s->eac3) 1536cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->cpl_in_use); 1537cabdff1aSopenharmony_ci if (block->cpl_in_use) { 1538cabdff1aSopenharmony_ci int start_sub, end_sub; 1539cabdff1aSopenharmony_ci if (s->eac3) 1540cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* enhanced coupling */ 1541cabdff1aSopenharmony_ci if (!s->eac3 || s->channel_mode != AC3_CHMODE_STEREO) { 1542cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) 1543cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->channel_in_cpl[ch]); 1544cabdff1aSopenharmony_ci } 1545cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) 1546cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* phase flags in use */ 1547cabdff1aSopenharmony_ci start_sub = (s->start_freq[CPL_CH] - 37) / 12; 1548cabdff1aSopenharmony_ci end_sub = (s->cpl_end_freq - 37) / 12; 1549cabdff1aSopenharmony_ci put_bits(&s->pb, 4, start_sub); 1550cabdff1aSopenharmony_ci put_bits(&s->pb, 4, end_sub - 3); 1551cabdff1aSopenharmony_ci /* coupling band structure */ 1552cabdff1aSopenharmony_ci if (s->eac3) { 1553cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* use default */ 1554cabdff1aSopenharmony_ci } else { 1555cabdff1aSopenharmony_ci for (bnd = start_sub+1; bnd < end_sub; bnd++) 1556cabdff1aSopenharmony_ci put_bits(&s->pb, 1, ff_eac3_default_cpl_band_struct[bnd]); 1557cabdff1aSopenharmony_ci } 1558cabdff1aSopenharmony_ci } 1559cabdff1aSopenharmony_ci } 1560cabdff1aSopenharmony_ci 1561cabdff1aSopenharmony_ci /* coupling coordinates */ 1562cabdff1aSopenharmony_ci if (block->cpl_in_use) { 1563cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 1564cabdff1aSopenharmony_ci if (block->channel_in_cpl[ch]) { 1565cabdff1aSopenharmony_ci if (!s->eac3 || block->new_cpl_coords[ch] != 2) 1566cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->new_cpl_coords[ch]); 1567cabdff1aSopenharmony_ci if (block->new_cpl_coords[ch]) { 1568cabdff1aSopenharmony_ci put_bits(&s->pb, 2, block->cpl_master_exp[ch]); 1569cabdff1aSopenharmony_ci for (bnd = 0; bnd < s->num_cpl_bands; bnd++) { 1570cabdff1aSopenharmony_ci put_bits(&s->pb, 4, block->cpl_coord_exp [ch][bnd]); 1571cabdff1aSopenharmony_ci put_bits(&s->pb, 4, block->cpl_coord_mant[ch][bnd]); 1572cabdff1aSopenharmony_ci } 1573cabdff1aSopenharmony_ci } 1574cabdff1aSopenharmony_ci } 1575cabdff1aSopenharmony_ci } 1576cabdff1aSopenharmony_ci } 1577cabdff1aSopenharmony_ci 1578cabdff1aSopenharmony_ci /* stereo rematrixing */ 1579cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) { 1580cabdff1aSopenharmony_ci if (!s->eac3 || blk > 0) 1581cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->new_rematrixing_strategy); 1582cabdff1aSopenharmony_ci if (block->new_rematrixing_strategy) { 1583cabdff1aSopenharmony_ci /* rematrixing flags */ 1584cabdff1aSopenharmony_ci for (bnd = 0; bnd < block->num_rematrixing_bands; bnd++) 1585cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->rematrixing_flags[bnd]); 1586cabdff1aSopenharmony_ci } 1587cabdff1aSopenharmony_ci } 1588cabdff1aSopenharmony_ci 1589cabdff1aSopenharmony_ci /* exponent strategy */ 1590cabdff1aSopenharmony_ci if (!s->eac3) { 1591cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->fbw_channels; ch++) 1592cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->exp_strategy[ch][blk]); 1593cabdff1aSopenharmony_ci if (s->lfe_on) 1594cabdff1aSopenharmony_ci put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]); 1595cabdff1aSopenharmony_ci } 1596cabdff1aSopenharmony_ci 1597cabdff1aSopenharmony_ci /* bandwidth */ 1598cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 1599cabdff1aSopenharmony_ci if (s->exp_strategy[ch][blk] != EXP_REUSE && !block->channel_in_cpl[ch]) 1600cabdff1aSopenharmony_ci put_bits(&s->pb, 6, s->bandwidth_code); 1601cabdff1aSopenharmony_ci } 1602cabdff1aSopenharmony_ci 1603cabdff1aSopenharmony_ci /* exponents */ 1604cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 1605cabdff1aSopenharmony_ci int nb_groups; 1606cabdff1aSopenharmony_ci int cpl = (ch == CPL_CH); 1607cabdff1aSopenharmony_ci 1608cabdff1aSopenharmony_ci if (s->exp_strategy[ch][blk] == EXP_REUSE) 1609cabdff1aSopenharmony_ci continue; 1610cabdff1aSopenharmony_ci 1611cabdff1aSopenharmony_ci /* DC exponent */ 1612cabdff1aSopenharmony_ci put_bits(&s->pb, 4, block->grouped_exp[ch][0] >> cpl); 1613cabdff1aSopenharmony_ci 1614cabdff1aSopenharmony_ci /* exponent groups */ 1615cabdff1aSopenharmony_ci nb_groups = exponent_group_tab[cpl][s->exp_strategy[ch][blk]-1][block->end_freq[ch]-s->start_freq[ch]]; 1616cabdff1aSopenharmony_ci for (i = 1; i <= nb_groups; i++) 1617cabdff1aSopenharmony_ci put_bits(&s->pb, 7, block->grouped_exp[ch][i]); 1618cabdff1aSopenharmony_ci 1619cabdff1aSopenharmony_ci /* gain range info */ 1620cabdff1aSopenharmony_ci if (ch != s->lfe_channel && !cpl) 1621cabdff1aSopenharmony_ci put_bits(&s->pb, 2, 0); 1622cabdff1aSopenharmony_ci } 1623cabdff1aSopenharmony_ci 1624cabdff1aSopenharmony_ci /* bit allocation info */ 1625cabdff1aSopenharmony_ci if (!s->eac3) { 1626cabdff1aSopenharmony_ci baie = (blk == 0); 1627cabdff1aSopenharmony_ci put_bits(&s->pb, 1, baie); 1628cabdff1aSopenharmony_ci if (baie) { 1629cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->slow_decay_code); 1630cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->fast_decay_code); 1631cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->slow_gain_code); 1632cabdff1aSopenharmony_ci put_bits(&s->pb, 2, s->db_per_bit_code); 1633cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->floor_code); 1634cabdff1aSopenharmony_ci } 1635cabdff1aSopenharmony_ci } 1636cabdff1aSopenharmony_ci 1637cabdff1aSopenharmony_ci /* snr offset */ 1638cabdff1aSopenharmony_ci if (!s->eac3) { 1639cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->new_snr_offsets); 1640cabdff1aSopenharmony_ci if (block->new_snr_offsets) { 1641cabdff1aSopenharmony_ci put_bits(&s->pb, 6, s->coarse_snr_offset); 1642cabdff1aSopenharmony_ci for (ch = !block->cpl_in_use; ch <= s->channels; ch++) { 1643cabdff1aSopenharmony_ci put_bits(&s->pb, 4, s->fine_snr_offset[ch]); 1644cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->fast_gain_code[ch]); 1645cabdff1aSopenharmony_ci } 1646cabdff1aSopenharmony_ci } 1647cabdff1aSopenharmony_ci } else { 1648cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no converter snr offset */ 1649cabdff1aSopenharmony_ci } 1650cabdff1aSopenharmony_ci 1651cabdff1aSopenharmony_ci /* coupling leak */ 1652cabdff1aSopenharmony_ci if (block->cpl_in_use) { 1653cabdff1aSopenharmony_ci if (!s->eac3 || block->new_cpl_leak != 2) 1654cabdff1aSopenharmony_ci put_bits(&s->pb, 1, block->new_cpl_leak); 1655cabdff1aSopenharmony_ci if (block->new_cpl_leak) { 1656cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->bit_alloc.cpl_fast_leak); 1657cabdff1aSopenharmony_ci put_bits(&s->pb, 3, s->bit_alloc.cpl_slow_leak); 1658cabdff1aSopenharmony_ci } 1659cabdff1aSopenharmony_ci } 1660cabdff1aSopenharmony_ci 1661cabdff1aSopenharmony_ci if (!s->eac3) { 1662cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no delta bit allocation */ 1663cabdff1aSopenharmony_ci put_bits(&s->pb, 1, 0); /* no data to skip */ 1664cabdff1aSopenharmony_ci } 1665cabdff1aSopenharmony_ci 1666cabdff1aSopenharmony_ci /* mantissas */ 1667cabdff1aSopenharmony_ci got_cpl = !block->cpl_in_use; 1668cabdff1aSopenharmony_ci for (ch = 1; ch <= s->channels; ch++) { 1669cabdff1aSopenharmony_ci int b, q; 1670cabdff1aSopenharmony_ci 1671cabdff1aSopenharmony_ci if (!got_cpl && ch > 1 && block->channel_in_cpl[ch-1]) { 1672cabdff1aSopenharmony_ci ch0 = ch - 1; 1673cabdff1aSopenharmony_ci ch = CPL_CH; 1674cabdff1aSopenharmony_ci got_cpl = 1; 1675cabdff1aSopenharmony_ci } 1676cabdff1aSopenharmony_ci for (i = s->start_freq[ch]; i < block->end_freq[ch]; i++) { 1677cabdff1aSopenharmony_ci q = block->qmant[ch][i]; 1678cabdff1aSopenharmony_ci b = s->ref_bap[ch][blk][i]; 1679cabdff1aSopenharmony_ci switch (b) { 1680cabdff1aSopenharmony_ci case 0: break; 1681cabdff1aSopenharmony_ci case 1: if (q != 128) put_bits (&s->pb, 5, q); break; 1682cabdff1aSopenharmony_ci case 2: if (q != 128) put_bits (&s->pb, 7, q); break; 1683cabdff1aSopenharmony_ci case 3: put_sbits(&s->pb, 3, q); break; 1684cabdff1aSopenharmony_ci case 4: if (q != 128) put_bits (&s->pb, 7, q); break; 1685cabdff1aSopenharmony_ci case 14: put_sbits(&s->pb, 14, q); break; 1686cabdff1aSopenharmony_ci case 15: put_sbits(&s->pb, 16, q); break; 1687cabdff1aSopenharmony_ci default: put_sbits(&s->pb, b-1, q); break; 1688cabdff1aSopenharmony_ci } 1689cabdff1aSopenharmony_ci } 1690cabdff1aSopenharmony_ci if (ch == CPL_CH) 1691cabdff1aSopenharmony_ci ch = ch0; 1692cabdff1aSopenharmony_ci } 1693cabdff1aSopenharmony_ci} 1694cabdff1aSopenharmony_ci 1695cabdff1aSopenharmony_ci 1696cabdff1aSopenharmony_ci/** CRC-16 Polynomial */ 1697cabdff1aSopenharmony_ci#define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) 1698cabdff1aSopenharmony_ci 1699cabdff1aSopenharmony_ci 1700cabdff1aSopenharmony_cistatic unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly) 1701cabdff1aSopenharmony_ci{ 1702cabdff1aSopenharmony_ci unsigned int c; 1703cabdff1aSopenharmony_ci 1704cabdff1aSopenharmony_ci c = 0; 1705cabdff1aSopenharmony_ci while (a) { 1706cabdff1aSopenharmony_ci if (a & 1) 1707cabdff1aSopenharmony_ci c ^= b; 1708cabdff1aSopenharmony_ci a = a >> 1; 1709cabdff1aSopenharmony_ci b = b << 1; 1710cabdff1aSopenharmony_ci if (b & (1 << 16)) 1711cabdff1aSopenharmony_ci b ^= poly; 1712cabdff1aSopenharmony_ci } 1713cabdff1aSopenharmony_ci return c; 1714cabdff1aSopenharmony_ci} 1715cabdff1aSopenharmony_ci 1716cabdff1aSopenharmony_ci 1717cabdff1aSopenharmony_cistatic unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly) 1718cabdff1aSopenharmony_ci{ 1719cabdff1aSopenharmony_ci unsigned int r; 1720cabdff1aSopenharmony_ci r = 1; 1721cabdff1aSopenharmony_ci while (n) { 1722cabdff1aSopenharmony_ci if (n & 1) 1723cabdff1aSopenharmony_ci r = mul_poly(r, a, poly); 1724cabdff1aSopenharmony_ci a = mul_poly(a, a, poly); 1725cabdff1aSopenharmony_ci n >>= 1; 1726cabdff1aSopenharmony_ci } 1727cabdff1aSopenharmony_ci return r; 1728cabdff1aSopenharmony_ci} 1729cabdff1aSopenharmony_ci 1730cabdff1aSopenharmony_ci 1731cabdff1aSopenharmony_ci/* 1732cabdff1aSopenharmony_ci * Fill the end of the frame with 0's and compute the two CRCs. 1733cabdff1aSopenharmony_ci */ 1734cabdff1aSopenharmony_cistatic void output_frame_end(AC3EncodeContext *s) 1735cabdff1aSopenharmony_ci{ 1736cabdff1aSopenharmony_ci const AVCRC *crc_ctx = av_crc_get_table(AV_CRC_16_ANSI); 1737cabdff1aSopenharmony_ci int frame_size_58, pad_bytes, crc1, crc2_partial, crc2, crc_inv; 1738cabdff1aSopenharmony_ci uint8_t *frame; 1739cabdff1aSopenharmony_ci 1740cabdff1aSopenharmony_ci frame_size_58 = ((s->frame_size >> 2) + (s->frame_size >> 4)) << 1; 1741cabdff1aSopenharmony_ci 1742cabdff1aSopenharmony_ci /* pad the remainder of the frame with zeros */ 1743cabdff1aSopenharmony_ci av_assert2(s->frame_size * 8 - put_bits_count(&s->pb) >= 18); 1744cabdff1aSopenharmony_ci flush_put_bits(&s->pb); 1745cabdff1aSopenharmony_ci frame = s->pb.buf; 1746cabdff1aSopenharmony_ci pad_bytes = s->frame_size - (put_bits_ptr(&s->pb) - frame) - 2; 1747cabdff1aSopenharmony_ci av_assert2(pad_bytes >= 0); 1748cabdff1aSopenharmony_ci if (pad_bytes > 0) 1749cabdff1aSopenharmony_ci memset(put_bits_ptr(&s->pb), 0, pad_bytes); 1750cabdff1aSopenharmony_ci 1751cabdff1aSopenharmony_ci if (s->eac3) { 1752cabdff1aSopenharmony_ci /* compute crc2 */ 1753cabdff1aSopenharmony_ci crc2_partial = av_crc(crc_ctx, 0, frame + 2, s->frame_size - 5); 1754cabdff1aSopenharmony_ci } else { 1755cabdff1aSopenharmony_ci /* compute crc1 */ 1756cabdff1aSopenharmony_ci /* this is not so easy because it is at the beginning of the data... */ 1757cabdff1aSopenharmony_ci crc1 = av_bswap16(av_crc(crc_ctx, 0, frame + 4, frame_size_58 - 4)); 1758cabdff1aSopenharmony_ci crc_inv = s->crc_inv[s->frame_size > s->frame_size_min]; 1759cabdff1aSopenharmony_ci crc1 = mul_poly(crc_inv, crc1, CRC16_POLY); 1760cabdff1aSopenharmony_ci AV_WB16(frame + 2, crc1); 1761cabdff1aSopenharmony_ci 1762cabdff1aSopenharmony_ci /* compute crc2 */ 1763cabdff1aSopenharmony_ci crc2_partial = av_crc(crc_ctx, 0, frame + frame_size_58, 1764cabdff1aSopenharmony_ci s->frame_size - frame_size_58 - 3); 1765cabdff1aSopenharmony_ci } 1766cabdff1aSopenharmony_ci crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); 1767cabdff1aSopenharmony_ci /* ensure crc2 does not match sync word by flipping crcrsv bit if needed */ 1768cabdff1aSopenharmony_ci if (crc2 == 0x770B) { 1769cabdff1aSopenharmony_ci frame[s->frame_size - 3] ^= 0x1; 1770cabdff1aSopenharmony_ci crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); 1771cabdff1aSopenharmony_ci } 1772cabdff1aSopenharmony_ci crc2 = av_bswap16(crc2); 1773cabdff1aSopenharmony_ci AV_WB16(frame + s->frame_size - 2, crc2); 1774cabdff1aSopenharmony_ci} 1775cabdff1aSopenharmony_ci 1776cabdff1aSopenharmony_ci 1777cabdff1aSopenharmony_ci/** 1778cabdff1aSopenharmony_ci * Write the frame to the output bitstream. 1779cabdff1aSopenharmony_ci * 1780cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 1781cabdff1aSopenharmony_ci * @param frame output data buffer 1782cabdff1aSopenharmony_ci */ 1783cabdff1aSopenharmony_cistatic void ac3_output_frame(AC3EncodeContext *s, unsigned char *frame) 1784cabdff1aSopenharmony_ci{ 1785cabdff1aSopenharmony_ci int blk; 1786cabdff1aSopenharmony_ci 1787cabdff1aSopenharmony_ci init_put_bits(&s->pb, frame, s->frame_size); 1788cabdff1aSopenharmony_ci 1789cabdff1aSopenharmony_ci s->output_frame_header(s); 1790cabdff1aSopenharmony_ci 1791cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 1792cabdff1aSopenharmony_ci output_audio_block(s, blk); 1793cabdff1aSopenharmony_ci 1794cabdff1aSopenharmony_ci output_frame_end(s); 1795cabdff1aSopenharmony_ci} 1796cabdff1aSopenharmony_ci 1797cabdff1aSopenharmony_ciint ff_ac3_encode_frame_common_end(AVCodecContext *avctx, AVPacket *avpkt, 1798cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 1799cabdff1aSopenharmony_ci{ 1800cabdff1aSopenharmony_ci AC3EncodeContext *const s = avctx->priv_data; 1801cabdff1aSopenharmony_ci int ret; 1802cabdff1aSopenharmony_ci 1803cabdff1aSopenharmony_ci ac3_apply_rematrixing(s); 1804cabdff1aSopenharmony_ci 1805cabdff1aSopenharmony_ci ac3_process_exponents(s); 1806cabdff1aSopenharmony_ci 1807cabdff1aSopenharmony_ci ret = ac3_compute_bit_allocation(s); 1808cabdff1aSopenharmony_ci if (ret) { 1809cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n"); 1810cabdff1aSopenharmony_ci return ret; 1811cabdff1aSopenharmony_ci } 1812cabdff1aSopenharmony_ci 1813cabdff1aSopenharmony_ci ac3_group_exponents(s); 1814cabdff1aSopenharmony_ci 1815cabdff1aSopenharmony_ci ac3_quantize_mantissas(s); 1816cabdff1aSopenharmony_ci 1817cabdff1aSopenharmony_ci ret = ff_get_encode_buffer(avctx, avpkt, s->frame_size, 0); 1818cabdff1aSopenharmony_ci if (ret < 0) 1819cabdff1aSopenharmony_ci return ret; 1820cabdff1aSopenharmony_ci ac3_output_frame(s, avpkt->data); 1821cabdff1aSopenharmony_ci 1822cabdff1aSopenharmony_ci if (frame->pts != AV_NOPTS_VALUE) 1823cabdff1aSopenharmony_ci avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding); 1824cabdff1aSopenharmony_ci 1825cabdff1aSopenharmony_ci *got_packet_ptr = 1; 1826cabdff1aSopenharmony_ci return 0; 1827cabdff1aSopenharmony_ci} 1828cabdff1aSopenharmony_ci 1829cabdff1aSopenharmony_cistatic void dprint_options(AC3EncodeContext *s) 1830cabdff1aSopenharmony_ci{ 1831cabdff1aSopenharmony_ci#ifdef DEBUG 1832cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 1833cabdff1aSopenharmony_ci AC3EncOptions *opt = &s->options; 1834cabdff1aSopenharmony_ci char strbuf[32]; 1835cabdff1aSopenharmony_ci 1836cabdff1aSopenharmony_ci switch (s->bitstream_id) { 1837cabdff1aSopenharmony_ci case 6: av_strlcpy(strbuf, "AC-3 (alt syntax)", 32); break; 1838cabdff1aSopenharmony_ci case 8: av_strlcpy(strbuf, "AC-3 (standard)", 32); break; 1839cabdff1aSopenharmony_ci case 9: av_strlcpy(strbuf, "AC-3 (dnet half-rate)", 32); break; 1840cabdff1aSopenharmony_ci case 10: av_strlcpy(strbuf, "AC-3 (dnet quater-rate)", 32); break; 1841cabdff1aSopenharmony_ci case 16: av_strlcpy(strbuf, "E-AC-3 (enhanced)", 32); break; 1842cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR"); 1843cabdff1aSopenharmony_ci } 1844cabdff1aSopenharmony_ci ff_dlog(avctx, "bitstream_id: %s (%d)\n", strbuf, s->bitstream_id); 1845cabdff1aSopenharmony_ci ff_dlog(avctx, "sample_fmt: %s\n", av_get_sample_fmt_name(avctx->sample_fmt)); 1846cabdff1aSopenharmony_ci av_channel_layout_describe(&avctx->ch_layout, strbuf, sizeof(strbuf)); 1847cabdff1aSopenharmony_ci ff_dlog(avctx, "channel_layout: %s\n", strbuf); 1848cabdff1aSopenharmony_ci ff_dlog(avctx, "sample_rate: %d\n", s->sample_rate); 1849cabdff1aSopenharmony_ci ff_dlog(avctx, "bit_rate: %d\n", s->bit_rate); 1850cabdff1aSopenharmony_ci ff_dlog(avctx, "blocks/frame: %d (code=%d)\n", s->num_blocks, s->num_blks_code); 1851cabdff1aSopenharmony_ci if (s->cutoff) 1852cabdff1aSopenharmony_ci ff_dlog(avctx, "cutoff: %d\n", s->cutoff); 1853cabdff1aSopenharmony_ci 1854cabdff1aSopenharmony_ci ff_dlog(avctx, "per_frame_metadata: %s\n", 1855cabdff1aSopenharmony_ci opt->allow_per_frame_metadata?"on":"off"); 1856cabdff1aSopenharmony_ci if (s->has_center) 1857cabdff1aSopenharmony_ci ff_dlog(avctx, "center_mixlev: %0.3f (%d)\n", opt->center_mix_level, 1858cabdff1aSopenharmony_ci s->center_mix_level); 1859cabdff1aSopenharmony_ci else 1860cabdff1aSopenharmony_ci ff_dlog(avctx, "center_mixlev: {not written}\n"); 1861cabdff1aSopenharmony_ci if (s->has_surround) 1862cabdff1aSopenharmony_ci ff_dlog(avctx, "surround_mixlev: %0.3f (%d)\n", opt->surround_mix_level, 1863cabdff1aSopenharmony_ci s->surround_mix_level); 1864cabdff1aSopenharmony_ci else 1865cabdff1aSopenharmony_ci ff_dlog(avctx, "surround_mixlev: {not written}\n"); 1866cabdff1aSopenharmony_ci if (opt->audio_production_info) { 1867cabdff1aSopenharmony_ci ff_dlog(avctx, "mixing_level: %ddB\n", opt->mixing_level); 1868cabdff1aSopenharmony_ci switch (opt->room_type) { 1869cabdff1aSopenharmony_ci case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break; 1870cabdff1aSopenharmony_ci case AC3ENC_OPT_LARGE_ROOM: av_strlcpy(strbuf, "large", 32); break; 1871cabdff1aSopenharmony_ci case AC3ENC_OPT_SMALL_ROOM: av_strlcpy(strbuf, "small", 32); break; 1872cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->room_type); 1873cabdff1aSopenharmony_ci } 1874cabdff1aSopenharmony_ci ff_dlog(avctx, "room_type: %s\n", strbuf); 1875cabdff1aSopenharmony_ci } else { 1876cabdff1aSopenharmony_ci ff_dlog(avctx, "mixing_level: {not written}\n"); 1877cabdff1aSopenharmony_ci ff_dlog(avctx, "room_type: {not written}\n"); 1878cabdff1aSopenharmony_ci } 1879cabdff1aSopenharmony_ci ff_dlog(avctx, "copyright: %s\n", opt->copyright?"on":"off"); 1880cabdff1aSopenharmony_ci ff_dlog(avctx, "dialnorm: %ddB\n", opt->dialogue_level); 1881cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO) { 1882cabdff1aSopenharmony_ci switch (opt->dolby_surround_mode) { 1883cabdff1aSopenharmony_ci case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break; 1884cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_ON: av_strlcpy(strbuf, "on", 32); break; 1885cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_OFF: av_strlcpy(strbuf, "off", 32); break; 1886cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_surround_mode); 1887cabdff1aSopenharmony_ci } 1888cabdff1aSopenharmony_ci ff_dlog(avctx, "dsur_mode: %s\n", strbuf); 1889cabdff1aSopenharmony_ci } else { 1890cabdff1aSopenharmony_ci ff_dlog(avctx, "dsur_mode: {not written}\n"); 1891cabdff1aSopenharmony_ci } 1892cabdff1aSopenharmony_ci ff_dlog(avctx, "original: %s\n", opt->original?"on":"off"); 1893cabdff1aSopenharmony_ci 1894cabdff1aSopenharmony_ci if (s->bitstream_id == 6) { 1895cabdff1aSopenharmony_ci if (opt->extended_bsi_1) { 1896cabdff1aSopenharmony_ci switch (opt->preferred_stereo_downmix) { 1897cabdff1aSopenharmony_ci case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break; 1898cabdff1aSopenharmony_ci case AC3ENC_OPT_DOWNMIX_LTRT: av_strlcpy(strbuf, "ltrt", 32); break; 1899cabdff1aSopenharmony_ci case AC3ENC_OPT_DOWNMIX_LORO: av_strlcpy(strbuf, "loro", 32); break; 1900cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->preferred_stereo_downmix); 1901cabdff1aSopenharmony_ci } 1902cabdff1aSopenharmony_ci ff_dlog(avctx, "dmix_mode: %s\n", strbuf); 1903cabdff1aSopenharmony_ci ff_dlog(avctx, "ltrt_cmixlev: %0.3f (%d)\n", 1904cabdff1aSopenharmony_ci opt->ltrt_center_mix_level, s->ltrt_center_mix_level); 1905cabdff1aSopenharmony_ci ff_dlog(avctx, "ltrt_surmixlev: %0.3f (%d)\n", 1906cabdff1aSopenharmony_ci opt->ltrt_surround_mix_level, s->ltrt_surround_mix_level); 1907cabdff1aSopenharmony_ci ff_dlog(avctx, "loro_cmixlev: %0.3f (%d)\n", 1908cabdff1aSopenharmony_ci opt->loro_center_mix_level, s->loro_center_mix_level); 1909cabdff1aSopenharmony_ci ff_dlog(avctx, "loro_surmixlev: %0.3f (%d)\n", 1910cabdff1aSopenharmony_ci opt->loro_surround_mix_level, s->loro_surround_mix_level); 1911cabdff1aSopenharmony_ci } else { 1912cabdff1aSopenharmony_ci ff_dlog(avctx, "extended bitstream info 1: {not written}\n"); 1913cabdff1aSopenharmony_ci } 1914cabdff1aSopenharmony_ci if (opt->extended_bsi_2) { 1915cabdff1aSopenharmony_ci switch (opt->dolby_surround_ex_mode) { 1916cabdff1aSopenharmony_ci case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break; 1917cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_ON: av_strlcpy(strbuf, "on", 32); break; 1918cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_OFF: av_strlcpy(strbuf, "off", 32); break; 1919cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_surround_ex_mode); 1920cabdff1aSopenharmony_ci } 1921cabdff1aSopenharmony_ci ff_dlog(avctx, "dsurex_mode: %s\n", strbuf); 1922cabdff1aSopenharmony_ci switch (opt->dolby_headphone_mode) { 1923cabdff1aSopenharmony_ci case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break; 1924cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_ON: av_strlcpy(strbuf, "on", 32); break; 1925cabdff1aSopenharmony_ci case AC3ENC_OPT_MODE_OFF: av_strlcpy(strbuf, "off", 32); break; 1926cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_headphone_mode); 1927cabdff1aSopenharmony_ci } 1928cabdff1aSopenharmony_ci ff_dlog(avctx, "dheadphone_mode: %s\n", strbuf); 1929cabdff1aSopenharmony_ci 1930cabdff1aSopenharmony_ci switch (opt->ad_converter_type) { 1931cabdff1aSopenharmony_ci case AC3ENC_OPT_ADCONV_STANDARD: av_strlcpy(strbuf, "standard", 32); break; 1932cabdff1aSopenharmony_ci case AC3ENC_OPT_ADCONV_HDCD: av_strlcpy(strbuf, "hdcd", 32); break; 1933cabdff1aSopenharmony_ci default: snprintf(strbuf, 32, "ERROR (%d)", opt->ad_converter_type); 1934cabdff1aSopenharmony_ci } 1935cabdff1aSopenharmony_ci ff_dlog(avctx, "ad_conv_type: %s\n", strbuf); 1936cabdff1aSopenharmony_ci } else { 1937cabdff1aSopenharmony_ci ff_dlog(avctx, "extended bitstream info 2: {not written}\n"); 1938cabdff1aSopenharmony_ci } 1939cabdff1aSopenharmony_ci } 1940cabdff1aSopenharmony_ci#endif 1941cabdff1aSopenharmony_ci} 1942cabdff1aSopenharmony_ci 1943cabdff1aSopenharmony_ci 1944cabdff1aSopenharmony_ci#define FLT_OPTION_THRESHOLD 0.01 1945cabdff1aSopenharmony_ci 1946cabdff1aSopenharmony_cistatic int validate_float_option(float v, const float *v_list, int v_list_size) 1947cabdff1aSopenharmony_ci{ 1948cabdff1aSopenharmony_ci int i; 1949cabdff1aSopenharmony_ci 1950cabdff1aSopenharmony_ci for (i = 0; i < v_list_size; i++) { 1951cabdff1aSopenharmony_ci if (v < (v_list[i] + FLT_OPTION_THRESHOLD) && 1952cabdff1aSopenharmony_ci v > (v_list[i] - FLT_OPTION_THRESHOLD)) 1953cabdff1aSopenharmony_ci break; 1954cabdff1aSopenharmony_ci } 1955cabdff1aSopenharmony_ci if (i == v_list_size) 1956cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1957cabdff1aSopenharmony_ci 1958cabdff1aSopenharmony_ci return i; 1959cabdff1aSopenharmony_ci} 1960cabdff1aSopenharmony_ci 1961cabdff1aSopenharmony_ci 1962cabdff1aSopenharmony_cistatic void validate_mix_level(void *log_ctx, const char *opt_name, 1963cabdff1aSopenharmony_ci float *opt_param, const float *list, 1964cabdff1aSopenharmony_ci int list_size, int default_value, int min_value, 1965cabdff1aSopenharmony_ci int *ctx_param) 1966cabdff1aSopenharmony_ci{ 1967cabdff1aSopenharmony_ci int mixlev = validate_float_option(*opt_param, list, list_size); 1968cabdff1aSopenharmony_ci if (mixlev < min_value) { 1969cabdff1aSopenharmony_ci mixlev = default_value; 1970cabdff1aSopenharmony_ci if (*opt_param >= 0.0) { 1971cabdff1aSopenharmony_ci av_log(log_ctx, AV_LOG_WARNING, "requested %s is not valid. using " 1972cabdff1aSopenharmony_ci "default value: %0.3f\n", opt_name, list[mixlev]); 1973cabdff1aSopenharmony_ci } 1974cabdff1aSopenharmony_ci } 1975cabdff1aSopenharmony_ci *opt_param = list[mixlev]; 1976cabdff1aSopenharmony_ci *ctx_param = mixlev; 1977cabdff1aSopenharmony_ci} 1978cabdff1aSopenharmony_ci 1979cabdff1aSopenharmony_ci 1980cabdff1aSopenharmony_ci/** 1981cabdff1aSopenharmony_ci * Validate metadata options as set by AVOption system. 1982cabdff1aSopenharmony_ci * These values can optionally be changed per-frame. 1983cabdff1aSopenharmony_ci * 1984cabdff1aSopenharmony_ci * @param s AC-3 encoder private context 1985cabdff1aSopenharmony_ci */ 1986cabdff1aSopenharmony_ciint ff_ac3_validate_metadata(AC3EncodeContext *s) 1987cabdff1aSopenharmony_ci{ 1988cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 1989cabdff1aSopenharmony_ci AC3EncOptions *opt = &s->options; 1990cabdff1aSopenharmony_ci 1991cabdff1aSopenharmony_ci opt->audio_production_info = 0; 1992cabdff1aSopenharmony_ci opt->extended_bsi_1 = 0; 1993cabdff1aSopenharmony_ci opt->extended_bsi_2 = 0; 1994cabdff1aSopenharmony_ci opt->eac3_mixing_metadata = 0; 1995cabdff1aSopenharmony_ci opt->eac3_info_metadata = 0; 1996cabdff1aSopenharmony_ci 1997cabdff1aSopenharmony_ci /* determine mixing metadata / xbsi1 use */ 1998cabdff1aSopenharmony_ci if (s->channel_mode > AC3_CHMODE_STEREO && opt->preferred_stereo_downmix != AC3ENC_OPT_NONE) { 1999cabdff1aSopenharmony_ci opt->extended_bsi_1 = 1; 2000cabdff1aSopenharmony_ci opt->eac3_mixing_metadata = 1; 2001cabdff1aSopenharmony_ci } 2002cabdff1aSopenharmony_ci if (s->has_center && 2003cabdff1aSopenharmony_ci (opt->ltrt_center_mix_level >= 0 || opt->loro_center_mix_level >= 0)) { 2004cabdff1aSopenharmony_ci opt->extended_bsi_1 = 1; 2005cabdff1aSopenharmony_ci opt->eac3_mixing_metadata = 1; 2006cabdff1aSopenharmony_ci } 2007cabdff1aSopenharmony_ci if (s->has_surround && 2008cabdff1aSopenharmony_ci (opt->ltrt_surround_mix_level >= 0 || opt->loro_surround_mix_level >= 0)) { 2009cabdff1aSopenharmony_ci opt->extended_bsi_1 = 1; 2010cabdff1aSopenharmony_ci opt->eac3_mixing_metadata = 1; 2011cabdff1aSopenharmony_ci } 2012cabdff1aSopenharmony_ci 2013cabdff1aSopenharmony_ci if (s->eac3) { 2014cabdff1aSopenharmony_ci /* determine info metadata use */ 2015cabdff1aSopenharmony_ci if (avctx->audio_service_type != AV_AUDIO_SERVICE_TYPE_MAIN) 2016cabdff1aSopenharmony_ci opt->eac3_info_metadata = 1; 2017cabdff1aSopenharmony_ci if (opt->copyright != AC3ENC_OPT_NONE || opt->original != AC3ENC_OPT_NONE) 2018cabdff1aSopenharmony_ci opt->eac3_info_metadata = 1; 2019cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO && 2020cabdff1aSopenharmony_ci (opt->dolby_headphone_mode != AC3ENC_OPT_NONE || opt->dolby_surround_mode != AC3ENC_OPT_NONE)) 2021cabdff1aSopenharmony_ci opt->eac3_info_metadata = 1; 2022cabdff1aSopenharmony_ci if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE) 2023cabdff1aSopenharmony_ci opt->eac3_info_metadata = 1; 2024cabdff1aSopenharmony_ci if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE || 2025cabdff1aSopenharmony_ci opt->ad_converter_type != AC3ENC_OPT_NONE) { 2026cabdff1aSopenharmony_ci opt->audio_production_info = 1; 2027cabdff1aSopenharmony_ci opt->eac3_info_metadata = 1; 2028cabdff1aSopenharmony_ci } 2029cabdff1aSopenharmony_ci } else { 2030cabdff1aSopenharmony_ci /* determine audio production info use */ 2031cabdff1aSopenharmony_ci if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE) 2032cabdff1aSopenharmony_ci opt->audio_production_info = 1; 2033cabdff1aSopenharmony_ci 2034cabdff1aSopenharmony_ci /* determine xbsi2 use */ 2035cabdff1aSopenharmony_ci if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE) 2036cabdff1aSopenharmony_ci opt->extended_bsi_2 = 1; 2037cabdff1aSopenharmony_ci if (s->channel_mode == AC3_CHMODE_STEREO && opt->dolby_headphone_mode != AC3ENC_OPT_NONE) 2038cabdff1aSopenharmony_ci opt->extended_bsi_2 = 1; 2039cabdff1aSopenharmony_ci if (opt->ad_converter_type != AC3ENC_OPT_NONE) 2040cabdff1aSopenharmony_ci opt->extended_bsi_2 = 1; 2041cabdff1aSopenharmony_ci } 2042cabdff1aSopenharmony_ci 2043cabdff1aSopenharmony_ci /* validate AC-3 mixing levels */ 2044cabdff1aSopenharmony_ci if (!s->eac3) { 2045cabdff1aSopenharmony_ci if (s->has_center) { 2046cabdff1aSopenharmony_ci validate_mix_level(avctx, "center_mix_level", &opt->center_mix_level, 2047cabdff1aSopenharmony_ci cmixlev_options, CMIXLEV_NUM_OPTIONS, 1, 0, 2048cabdff1aSopenharmony_ci &s->center_mix_level); 2049cabdff1aSopenharmony_ci } 2050cabdff1aSopenharmony_ci if (s->has_surround) { 2051cabdff1aSopenharmony_ci validate_mix_level(avctx, "surround_mix_level", &opt->surround_mix_level, 2052cabdff1aSopenharmony_ci surmixlev_options, SURMIXLEV_NUM_OPTIONS, 1, 0, 2053cabdff1aSopenharmony_ci &s->surround_mix_level); 2054cabdff1aSopenharmony_ci } 2055cabdff1aSopenharmony_ci } 2056cabdff1aSopenharmony_ci 2057cabdff1aSopenharmony_ci /* validate extended bsi 1 / mixing metadata */ 2058cabdff1aSopenharmony_ci if (opt->extended_bsi_1 || opt->eac3_mixing_metadata) { 2059cabdff1aSopenharmony_ci /* default preferred stereo downmix */ 2060cabdff1aSopenharmony_ci if (opt->preferred_stereo_downmix == AC3ENC_OPT_NONE) 2061cabdff1aSopenharmony_ci opt->preferred_stereo_downmix = AC3ENC_OPT_NOT_INDICATED; 2062cabdff1aSopenharmony_ci if (!s->eac3 || s->has_center) { 2063cabdff1aSopenharmony_ci /* validate Lt/Rt center mix level */ 2064cabdff1aSopenharmony_ci validate_mix_level(avctx, "ltrt_center_mix_level", 2065cabdff1aSopenharmony_ci &opt->ltrt_center_mix_level, extmixlev_options, 2066cabdff1aSopenharmony_ci EXTMIXLEV_NUM_OPTIONS, 5, 0, 2067cabdff1aSopenharmony_ci &s->ltrt_center_mix_level); 2068cabdff1aSopenharmony_ci /* validate Lo/Ro center mix level */ 2069cabdff1aSopenharmony_ci validate_mix_level(avctx, "loro_center_mix_level", 2070cabdff1aSopenharmony_ci &opt->loro_center_mix_level, extmixlev_options, 2071cabdff1aSopenharmony_ci EXTMIXLEV_NUM_OPTIONS, 5, 0, 2072cabdff1aSopenharmony_ci &s->loro_center_mix_level); 2073cabdff1aSopenharmony_ci } 2074cabdff1aSopenharmony_ci if (!s->eac3 || s->has_surround) { 2075cabdff1aSopenharmony_ci /* validate Lt/Rt surround mix level */ 2076cabdff1aSopenharmony_ci validate_mix_level(avctx, "ltrt_surround_mix_level", 2077cabdff1aSopenharmony_ci &opt->ltrt_surround_mix_level, extmixlev_options, 2078cabdff1aSopenharmony_ci EXTMIXLEV_NUM_OPTIONS, 6, 3, 2079cabdff1aSopenharmony_ci &s->ltrt_surround_mix_level); 2080cabdff1aSopenharmony_ci /* validate Lo/Ro surround mix level */ 2081cabdff1aSopenharmony_ci validate_mix_level(avctx, "loro_surround_mix_level", 2082cabdff1aSopenharmony_ci &opt->loro_surround_mix_level, extmixlev_options, 2083cabdff1aSopenharmony_ci EXTMIXLEV_NUM_OPTIONS, 6, 3, 2084cabdff1aSopenharmony_ci &s->loro_surround_mix_level); 2085cabdff1aSopenharmony_ci } 2086cabdff1aSopenharmony_ci } 2087cabdff1aSopenharmony_ci 2088cabdff1aSopenharmony_ci /* validate audio service type / channels combination */ 2089cabdff1aSopenharmony_ci if ((avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_KARAOKE && 2090cabdff1aSopenharmony_ci avctx->ch_layout.nb_channels == 1) || 2091cabdff1aSopenharmony_ci ((avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_COMMENTARY || 2092cabdff1aSopenharmony_ci avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_EMERGENCY || 2093cabdff1aSopenharmony_ci avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_VOICE_OVER) 2094cabdff1aSopenharmony_ci && avctx->ch_layout.nb_channels > 1)) { 2095cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid audio service type for the " 2096cabdff1aSopenharmony_ci "specified number of channels\n"); 2097cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2098cabdff1aSopenharmony_ci } 2099cabdff1aSopenharmony_ci 2100cabdff1aSopenharmony_ci /* validate extended bsi 2 / info metadata */ 2101cabdff1aSopenharmony_ci if (opt->extended_bsi_2 || opt->eac3_info_metadata) { 2102cabdff1aSopenharmony_ci /* default dolby headphone mode */ 2103cabdff1aSopenharmony_ci if (opt->dolby_headphone_mode == AC3ENC_OPT_NONE) 2104cabdff1aSopenharmony_ci opt->dolby_headphone_mode = AC3ENC_OPT_NOT_INDICATED; 2105cabdff1aSopenharmony_ci /* default dolby surround ex mode */ 2106cabdff1aSopenharmony_ci if (opt->dolby_surround_ex_mode == AC3ENC_OPT_NONE) 2107cabdff1aSopenharmony_ci opt->dolby_surround_ex_mode = AC3ENC_OPT_NOT_INDICATED; 2108cabdff1aSopenharmony_ci /* default A/D converter type */ 2109cabdff1aSopenharmony_ci if (opt->ad_converter_type == AC3ENC_OPT_NONE) 2110cabdff1aSopenharmony_ci opt->ad_converter_type = AC3ENC_OPT_ADCONV_STANDARD; 2111cabdff1aSopenharmony_ci } 2112cabdff1aSopenharmony_ci 2113cabdff1aSopenharmony_ci /* copyright & original defaults */ 2114cabdff1aSopenharmony_ci if (!s->eac3 || opt->eac3_info_metadata) { 2115cabdff1aSopenharmony_ci /* default copyright */ 2116cabdff1aSopenharmony_ci if (opt->copyright == AC3ENC_OPT_NONE) 2117cabdff1aSopenharmony_ci opt->copyright = AC3ENC_OPT_OFF; 2118cabdff1aSopenharmony_ci /* default original */ 2119cabdff1aSopenharmony_ci if (opt->original == AC3ENC_OPT_NONE) 2120cabdff1aSopenharmony_ci opt->original = AC3ENC_OPT_ON; 2121cabdff1aSopenharmony_ci } 2122cabdff1aSopenharmony_ci 2123cabdff1aSopenharmony_ci /* dolby surround mode default */ 2124cabdff1aSopenharmony_ci if (!s->eac3 || opt->eac3_info_metadata) { 2125cabdff1aSopenharmony_ci if (opt->dolby_surround_mode == AC3ENC_OPT_NONE) 2126cabdff1aSopenharmony_ci opt->dolby_surround_mode = AC3ENC_OPT_NOT_INDICATED; 2127cabdff1aSopenharmony_ci } 2128cabdff1aSopenharmony_ci 2129cabdff1aSopenharmony_ci /* validate audio production info */ 2130cabdff1aSopenharmony_ci if (opt->audio_production_info) { 2131cabdff1aSopenharmony_ci if (opt->mixing_level == AC3ENC_OPT_NONE) { 2132cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "mixing_level must be set if " 2133cabdff1aSopenharmony_ci "room_type is set\n"); 2134cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2135cabdff1aSopenharmony_ci } 2136cabdff1aSopenharmony_ci if (opt->mixing_level < 80) { 2137cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid mixing level. must be between " 2138cabdff1aSopenharmony_ci "80dB and 111dB\n"); 2139cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2140cabdff1aSopenharmony_ci } 2141cabdff1aSopenharmony_ci /* default room type */ 2142cabdff1aSopenharmony_ci if (opt->room_type == AC3ENC_OPT_NONE) 2143cabdff1aSopenharmony_ci opt->room_type = AC3ENC_OPT_NOT_INDICATED; 2144cabdff1aSopenharmony_ci } 2145cabdff1aSopenharmony_ci 2146cabdff1aSopenharmony_ci /* set bitstream id for alternate bitstream syntax */ 2147cabdff1aSopenharmony_ci if (!s->eac3 && (opt->extended_bsi_1 || opt->extended_bsi_2)) { 2148cabdff1aSopenharmony_ci if (s->bitstream_id > 8 && s->bitstream_id < 11) { 2149cabdff1aSopenharmony_ci if (!s->warned_alternate_bitstream) { 2150cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "alternate bitstream syntax is " 2151cabdff1aSopenharmony_ci "not compatible with reduced samplerates. writing of " 2152cabdff1aSopenharmony_ci "extended bitstream information will be disabled.\n"); 2153cabdff1aSopenharmony_ci s->warned_alternate_bitstream = 1; 2154cabdff1aSopenharmony_ci } 2155cabdff1aSopenharmony_ci } else { 2156cabdff1aSopenharmony_ci s->bitstream_id = 6; 2157cabdff1aSopenharmony_ci } 2158cabdff1aSopenharmony_ci } 2159cabdff1aSopenharmony_ci 2160cabdff1aSopenharmony_ci return 0; 2161cabdff1aSopenharmony_ci} 2162cabdff1aSopenharmony_ci 2163cabdff1aSopenharmony_ci 2164cabdff1aSopenharmony_ci/** 2165cabdff1aSopenharmony_ci * Finalize encoding and free any memory allocated by the encoder. 2166cabdff1aSopenharmony_ci * 2167cabdff1aSopenharmony_ci * @param avctx Codec context 2168cabdff1aSopenharmony_ci */ 2169cabdff1aSopenharmony_ciav_cold int ff_ac3_encode_close(AVCodecContext *avctx) 2170cabdff1aSopenharmony_ci{ 2171cabdff1aSopenharmony_ci int blk, ch; 2172cabdff1aSopenharmony_ci AC3EncodeContext *s = avctx->priv_data; 2173cabdff1aSopenharmony_ci 2174cabdff1aSopenharmony_ci av_freep(&s->mdct_window); 2175cabdff1aSopenharmony_ci av_freep(&s->windowed_samples); 2176cabdff1aSopenharmony_ci if (s->planar_samples) 2177cabdff1aSopenharmony_ci for (ch = 0; ch < s->channels; ch++) 2178cabdff1aSopenharmony_ci av_freep(&s->planar_samples[ch]); 2179cabdff1aSopenharmony_ci av_freep(&s->planar_samples); 2180cabdff1aSopenharmony_ci av_freep(&s->bap_buffer); 2181cabdff1aSopenharmony_ci av_freep(&s->bap1_buffer); 2182cabdff1aSopenharmony_ci av_freep(&s->mdct_coef_buffer); 2183cabdff1aSopenharmony_ci av_freep(&s->fixed_coef_buffer); 2184cabdff1aSopenharmony_ci av_freep(&s->exp_buffer); 2185cabdff1aSopenharmony_ci av_freep(&s->grouped_exp_buffer); 2186cabdff1aSopenharmony_ci av_freep(&s->psd_buffer); 2187cabdff1aSopenharmony_ci av_freep(&s->band_psd_buffer); 2188cabdff1aSopenharmony_ci av_freep(&s->mask_buffer); 2189cabdff1aSopenharmony_ci av_freep(&s->qmant_buffer); 2190cabdff1aSopenharmony_ci av_freep(&s->cpl_coord_exp_buffer); 2191cabdff1aSopenharmony_ci av_freep(&s->cpl_coord_mant_buffer); 2192cabdff1aSopenharmony_ci av_freep(&s->fdsp); 2193cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 2194cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 2195cabdff1aSopenharmony_ci av_freep(&block->mdct_coef); 2196cabdff1aSopenharmony_ci av_freep(&block->fixed_coef); 2197cabdff1aSopenharmony_ci av_freep(&block->exp); 2198cabdff1aSopenharmony_ci av_freep(&block->grouped_exp); 2199cabdff1aSopenharmony_ci av_freep(&block->psd); 2200cabdff1aSopenharmony_ci av_freep(&block->band_psd); 2201cabdff1aSopenharmony_ci av_freep(&block->mask); 2202cabdff1aSopenharmony_ci av_freep(&block->qmant); 2203cabdff1aSopenharmony_ci av_freep(&block->cpl_coord_exp); 2204cabdff1aSopenharmony_ci av_freep(&block->cpl_coord_mant); 2205cabdff1aSopenharmony_ci } 2206cabdff1aSopenharmony_ci 2207cabdff1aSopenharmony_ci s->mdct_end(s); 2208cabdff1aSopenharmony_ci 2209cabdff1aSopenharmony_ci return 0; 2210cabdff1aSopenharmony_ci} 2211cabdff1aSopenharmony_ci 2212cabdff1aSopenharmony_ci 2213cabdff1aSopenharmony_ci/* 2214cabdff1aSopenharmony_ci * Set channel information during initialization. 2215cabdff1aSopenharmony_ci */ 2216cabdff1aSopenharmony_cistatic av_cold int set_channel_info(AVCodecContext *avctx) 2217cabdff1aSopenharmony_ci{ 2218cabdff1aSopenharmony_ci AC3EncodeContext *s = avctx->priv_data; 2219cabdff1aSopenharmony_ci int channels = avctx->ch_layout.nb_channels; 2220cabdff1aSopenharmony_ci uint64_t mask = avctx->ch_layout.u.mask; 2221cabdff1aSopenharmony_ci 2222cabdff1aSopenharmony_ci if (channels < 1 || channels > AC3_MAX_CHANNELS) 2223cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2224cabdff1aSopenharmony_ci if (mask > 0x7FF) 2225cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2226cabdff1aSopenharmony_ci 2227cabdff1aSopenharmony_ci if (!mask) 2228cabdff1aSopenharmony_ci av_channel_layout_default(&avctx->ch_layout, channels); 2229cabdff1aSopenharmony_ci mask = avctx->ch_layout.u.mask; 2230cabdff1aSopenharmony_ci 2231cabdff1aSopenharmony_ci s->lfe_on = !!(mask & AV_CH_LOW_FREQUENCY); 2232cabdff1aSopenharmony_ci s->channels = channels; 2233cabdff1aSopenharmony_ci s->fbw_channels = channels - s->lfe_on; 2234cabdff1aSopenharmony_ci s->lfe_channel = s->lfe_on ? s->fbw_channels + 1 : -1; 2235cabdff1aSopenharmony_ci if (s->lfe_on) 2236cabdff1aSopenharmony_ci mask -= AV_CH_LOW_FREQUENCY; 2237cabdff1aSopenharmony_ci 2238cabdff1aSopenharmony_ci switch (mask) { 2239cabdff1aSopenharmony_ci case AV_CH_LAYOUT_MONO: s->channel_mode = AC3_CHMODE_MONO; break; 2240cabdff1aSopenharmony_ci case AV_CH_LAYOUT_STEREO: s->channel_mode = AC3_CHMODE_STEREO; break; 2241cabdff1aSopenharmony_ci case AV_CH_LAYOUT_SURROUND: s->channel_mode = AC3_CHMODE_3F; break; 2242cabdff1aSopenharmony_ci case AV_CH_LAYOUT_2_1: s->channel_mode = AC3_CHMODE_2F1R; break; 2243cabdff1aSopenharmony_ci case AV_CH_LAYOUT_4POINT0: s->channel_mode = AC3_CHMODE_3F1R; break; 2244cabdff1aSopenharmony_ci case AV_CH_LAYOUT_QUAD: 2245cabdff1aSopenharmony_ci case AV_CH_LAYOUT_2_2: s->channel_mode = AC3_CHMODE_2F2R; break; 2246cabdff1aSopenharmony_ci case AV_CH_LAYOUT_5POINT0: 2247cabdff1aSopenharmony_ci case AV_CH_LAYOUT_5POINT0_BACK: s->channel_mode = AC3_CHMODE_3F2R; break; 2248cabdff1aSopenharmony_ci default: 2249cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2250cabdff1aSopenharmony_ci } 2251cabdff1aSopenharmony_ci s->has_center = (s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO; 2252cabdff1aSopenharmony_ci s->has_surround = s->channel_mode & 0x04; 2253cabdff1aSopenharmony_ci 2254cabdff1aSopenharmony_ci s->channel_map = ac3_enc_channel_map[s->channel_mode][s->lfe_on]; 2255cabdff1aSopenharmony_ci if (s->lfe_on) 2256cabdff1aSopenharmony_ci mask |= AV_CH_LOW_FREQUENCY; 2257cabdff1aSopenharmony_ci av_channel_layout_from_mask(&avctx->ch_layout, mask); 2258cabdff1aSopenharmony_ci 2259cabdff1aSopenharmony_ci return 0; 2260cabdff1aSopenharmony_ci} 2261cabdff1aSopenharmony_ci 2262cabdff1aSopenharmony_ci 2263cabdff1aSopenharmony_cistatic av_cold int validate_options(AC3EncodeContext *s) 2264cabdff1aSopenharmony_ci{ 2265cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 2266cabdff1aSopenharmony_ci int i, ret, max_sr; 2267cabdff1aSopenharmony_ci 2268cabdff1aSopenharmony_ci /* validate channel layout */ 2269cabdff1aSopenharmony_ci if (!avctx->ch_layout.nb_channels) { 2270cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The " 2271cabdff1aSopenharmony_ci "encoder will guess the layout, but it " 2272cabdff1aSopenharmony_ci "might be incorrect.\n"); 2273cabdff1aSopenharmony_ci } 2274cabdff1aSopenharmony_ci ret = set_channel_info(avctx); 2275cabdff1aSopenharmony_ci if (ret) { 2276cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid channel layout\n"); 2277cabdff1aSopenharmony_ci return ret; 2278cabdff1aSopenharmony_ci } 2279cabdff1aSopenharmony_ci 2280cabdff1aSopenharmony_ci /* validate sample rate */ 2281cabdff1aSopenharmony_ci /* note: max_sr could be changed from 2 to 5 for E-AC-3 once we find a 2282cabdff1aSopenharmony_ci decoder that supports half sample rate so we can validate that 2283cabdff1aSopenharmony_ci the generated files are correct. */ 2284cabdff1aSopenharmony_ci max_sr = s->eac3 ? 2 : 8; 2285cabdff1aSopenharmony_ci for (i = 0; i <= max_sr; i++) { 2286cabdff1aSopenharmony_ci if ((ff_ac3_sample_rate_tab[i % 3] >> (i / 3)) == avctx->sample_rate) 2287cabdff1aSopenharmony_ci break; 2288cabdff1aSopenharmony_ci } 2289cabdff1aSopenharmony_ci if (i > max_sr) { 2290cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n"); 2291cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2292cabdff1aSopenharmony_ci } 2293cabdff1aSopenharmony_ci s->sample_rate = avctx->sample_rate; 2294cabdff1aSopenharmony_ci s->bit_alloc.sr_shift = i / 3; 2295cabdff1aSopenharmony_ci s->bit_alloc.sr_code = i % 3; 2296cabdff1aSopenharmony_ci s->bitstream_id = s->eac3 ? 16 : 8 + s->bit_alloc.sr_shift; 2297cabdff1aSopenharmony_ci 2298cabdff1aSopenharmony_ci /* select a default bit rate if not set by the user */ 2299cabdff1aSopenharmony_ci if (!avctx->bit_rate) { 2300cabdff1aSopenharmony_ci switch (s->fbw_channels) { 2301cabdff1aSopenharmony_ci case 1: avctx->bit_rate = 96000; break; 2302cabdff1aSopenharmony_ci case 2: avctx->bit_rate = 192000; break; 2303cabdff1aSopenharmony_ci case 3: avctx->bit_rate = 320000; break; 2304cabdff1aSopenharmony_ci case 4: avctx->bit_rate = 384000; break; 2305cabdff1aSopenharmony_ci case 5: avctx->bit_rate = 448000; break; 2306cabdff1aSopenharmony_ci } 2307cabdff1aSopenharmony_ci } 2308cabdff1aSopenharmony_ci 2309cabdff1aSopenharmony_ci /* validate bit rate */ 2310cabdff1aSopenharmony_ci if (s->eac3) { 2311cabdff1aSopenharmony_ci int max_br, min_br, wpf, min_br_code; 2312cabdff1aSopenharmony_ci int num_blks_code, num_blocks, frame_samples; 2313cabdff1aSopenharmony_ci long long min_br_dist; 2314cabdff1aSopenharmony_ci 2315cabdff1aSopenharmony_ci /* calculate min/max bitrate */ 2316cabdff1aSopenharmony_ci /* TODO: More testing with 3 and 2 blocks. All E-AC-3 samples I've 2317cabdff1aSopenharmony_ci found use either 6 blocks or 1 block, even though 2 or 3 blocks 2318cabdff1aSopenharmony_ci would work as far as the bit rate is concerned. */ 2319cabdff1aSopenharmony_ci for (num_blks_code = 3; num_blks_code >= 0; num_blks_code--) { 2320cabdff1aSopenharmony_ci num_blocks = ((int[]){ 1, 2, 3, 6 })[num_blks_code]; 2321cabdff1aSopenharmony_ci frame_samples = AC3_BLOCK_SIZE * num_blocks; 2322cabdff1aSopenharmony_ci max_br = 2048 * s->sample_rate / frame_samples * 16; 2323cabdff1aSopenharmony_ci min_br = ((s->sample_rate + (frame_samples-1)) / frame_samples) * 16; 2324cabdff1aSopenharmony_ci if (avctx->bit_rate <= max_br) 2325cabdff1aSopenharmony_ci break; 2326cabdff1aSopenharmony_ci } 2327cabdff1aSopenharmony_ci if (avctx->bit_rate < min_br || avctx->bit_rate > max_br) { 2328cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid bit rate. must be %d to %d " 2329cabdff1aSopenharmony_ci "for this sample rate\n", min_br, max_br); 2330cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2331cabdff1aSopenharmony_ci } 2332cabdff1aSopenharmony_ci s->num_blks_code = num_blks_code; 2333cabdff1aSopenharmony_ci s->num_blocks = num_blocks; 2334cabdff1aSopenharmony_ci 2335cabdff1aSopenharmony_ci /* calculate words-per-frame for the selected bitrate */ 2336cabdff1aSopenharmony_ci wpf = (avctx->bit_rate / 16) * frame_samples / s->sample_rate; 2337cabdff1aSopenharmony_ci av_assert1(wpf > 0 && wpf <= 2048); 2338cabdff1aSopenharmony_ci 2339cabdff1aSopenharmony_ci /* find the closest AC-3 bitrate code to the selected bitrate. 2340cabdff1aSopenharmony_ci this is needed for lookup tables for bandwidth and coupling 2341cabdff1aSopenharmony_ci parameter selection */ 2342cabdff1aSopenharmony_ci min_br_code = -1; 2343cabdff1aSopenharmony_ci min_br_dist = INT64_MAX; 2344cabdff1aSopenharmony_ci for (i = 0; i < 19; i++) { 2345cabdff1aSopenharmony_ci long long br_dist = llabs(ff_ac3_bitrate_tab[i] * 1000 - avctx->bit_rate); 2346cabdff1aSopenharmony_ci if (br_dist < min_br_dist) { 2347cabdff1aSopenharmony_ci min_br_dist = br_dist; 2348cabdff1aSopenharmony_ci min_br_code = i; 2349cabdff1aSopenharmony_ci } 2350cabdff1aSopenharmony_ci } 2351cabdff1aSopenharmony_ci 2352cabdff1aSopenharmony_ci /* make sure the minimum frame size is below the average frame size */ 2353cabdff1aSopenharmony_ci s->frame_size_code = min_br_code << 1; 2354cabdff1aSopenharmony_ci while (wpf > 1 && wpf * s->sample_rate / AC3_FRAME_SIZE * 16 > avctx->bit_rate) 2355cabdff1aSopenharmony_ci wpf--; 2356cabdff1aSopenharmony_ci s->frame_size_min = 2 * wpf; 2357cabdff1aSopenharmony_ci } else { 2358cabdff1aSopenharmony_ci int best_br = 0, best_code = 0; 2359cabdff1aSopenharmony_ci long long best_diff = INT64_MAX; 2360cabdff1aSopenharmony_ci for (i = 0; i < 19; i++) { 2361cabdff1aSopenharmony_ci int br = (ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift) * 1000; 2362cabdff1aSopenharmony_ci long long diff = llabs(br - avctx->bit_rate); 2363cabdff1aSopenharmony_ci if (diff < best_diff) { 2364cabdff1aSopenharmony_ci best_br = br; 2365cabdff1aSopenharmony_ci best_code = i; 2366cabdff1aSopenharmony_ci best_diff = diff; 2367cabdff1aSopenharmony_ci } 2368cabdff1aSopenharmony_ci if (!best_diff) 2369cabdff1aSopenharmony_ci break; 2370cabdff1aSopenharmony_ci } 2371cabdff1aSopenharmony_ci avctx->bit_rate = best_br; 2372cabdff1aSopenharmony_ci s->frame_size_code = best_code << 1; 2373cabdff1aSopenharmony_ci s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code]; 2374cabdff1aSopenharmony_ci s->num_blks_code = 0x3; 2375cabdff1aSopenharmony_ci s->num_blocks = 6; 2376cabdff1aSopenharmony_ci } 2377cabdff1aSopenharmony_ci s->bit_rate = avctx->bit_rate; 2378cabdff1aSopenharmony_ci s->frame_size = s->frame_size_min; 2379cabdff1aSopenharmony_ci 2380cabdff1aSopenharmony_ci /* validate cutoff */ 2381cabdff1aSopenharmony_ci if (avctx->cutoff < 0) { 2382cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "invalid cutoff frequency\n"); 2383cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2384cabdff1aSopenharmony_ci } 2385cabdff1aSopenharmony_ci s->cutoff = avctx->cutoff; 2386cabdff1aSopenharmony_ci if (s->cutoff > (s->sample_rate >> 1)) 2387cabdff1aSopenharmony_ci s->cutoff = s->sample_rate >> 1; 2388cabdff1aSopenharmony_ci 2389cabdff1aSopenharmony_ci ret = ff_ac3_validate_metadata(s); 2390cabdff1aSopenharmony_ci if (ret) 2391cabdff1aSopenharmony_ci return ret; 2392cabdff1aSopenharmony_ci 2393cabdff1aSopenharmony_ci s->rematrixing_enabled = s->options.stereo_rematrixing && 2394cabdff1aSopenharmony_ci (s->channel_mode == AC3_CHMODE_STEREO); 2395cabdff1aSopenharmony_ci 2396cabdff1aSopenharmony_ci s->cpl_enabled = s->options.channel_coupling && 2397cabdff1aSopenharmony_ci s->channel_mode >= AC3_CHMODE_STEREO; 2398cabdff1aSopenharmony_ci 2399cabdff1aSopenharmony_ci return 0; 2400cabdff1aSopenharmony_ci} 2401cabdff1aSopenharmony_ci 2402cabdff1aSopenharmony_ci 2403cabdff1aSopenharmony_ci/* 2404cabdff1aSopenharmony_ci * Set bandwidth for all channels. 2405cabdff1aSopenharmony_ci * The user can optionally supply a cutoff frequency. Otherwise an appropriate 2406cabdff1aSopenharmony_ci * default value will be used. 2407cabdff1aSopenharmony_ci */ 2408cabdff1aSopenharmony_cistatic av_cold void set_bandwidth(AC3EncodeContext *s) 2409cabdff1aSopenharmony_ci{ 2410cabdff1aSopenharmony_ci int blk, ch, av_uninit(cpl_start); 2411cabdff1aSopenharmony_ci 2412cabdff1aSopenharmony_ci if (s->cutoff) { 2413cabdff1aSopenharmony_ci /* calculate bandwidth based on user-specified cutoff frequency */ 2414cabdff1aSopenharmony_ci int fbw_coeffs; 2415cabdff1aSopenharmony_ci fbw_coeffs = s->cutoff * 2 * AC3_MAX_COEFS / s->sample_rate; 2416cabdff1aSopenharmony_ci s->bandwidth_code = av_clip((fbw_coeffs - 73) / 3, 0, 60); 2417cabdff1aSopenharmony_ci } else { 2418cabdff1aSopenharmony_ci /* use default bandwidth setting */ 2419cabdff1aSopenharmony_ci s->bandwidth_code = ac3_bandwidth_tab[s->fbw_channels-1][s->bit_alloc.sr_code][s->frame_size_code/2]; 2420cabdff1aSopenharmony_ci } 2421cabdff1aSopenharmony_ci 2422cabdff1aSopenharmony_ci /* set number of coefficients for each channel */ 2423cabdff1aSopenharmony_ci for (ch = 1; ch <= s->fbw_channels; ch++) { 2424cabdff1aSopenharmony_ci s->start_freq[ch] = 0; 2425cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 2426cabdff1aSopenharmony_ci s->blocks[blk].end_freq[ch] = s->bandwidth_code * 3 + 73; 2427cabdff1aSopenharmony_ci } 2428cabdff1aSopenharmony_ci /* LFE channel always has 7 coefs */ 2429cabdff1aSopenharmony_ci if (s->lfe_on) { 2430cabdff1aSopenharmony_ci s->start_freq[s->lfe_channel] = 0; 2431cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 2432cabdff1aSopenharmony_ci s->blocks[blk].end_freq[ch] = 7; 2433cabdff1aSopenharmony_ci } 2434cabdff1aSopenharmony_ci 2435cabdff1aSopenharmony_ci /* initialize coupling strategy */ 2436cabdff1aSopenharmony_ci if (s->cpl_enabled) { 2437cabdff1aSopenharmony_ci if (s->options.cpl_start != AC3ENC_OPT_AUTO) { 2438cabdff1aSopenharmony_ci cpl_start = s->options.cpl_start; 2439cabdff1aSopenharmony_ci } else { 2440cabdff1aSopenharmony_ci cpl_start = ac3_coupling_start_tab[s->channel_mode-2][s->bit_alloc.sr_code][s->frame_size_code/2]; 2441cabdff1aSopenharmony_ci if (cpl_start < 0) { 2442cabdff1aSopenharmony_ci if (s->options.channel_coupling == AC3ENC_OPT_AUTO) 2443cabdff1aSopenharmony_ci s->cpl_enabled = 0; 2444cabdff1aSopenharmony_ci else 2445cabdff1aSopenharmony_ci cpl_start = 15; 2446cabdff1aSopenharmony_ci } 2447cabdff1aSopenharmony_ci } 2448cabdff1aSopenharmony_ci } 2449cabdff1aSopenharmony_ci if (s->cpl_enabled) { 2450cabdff1aSopenharmony_ci int i, cpl_start_band, cpl_end_band; 2451cabdff1aSopenharmony_ci uint8_t *cpl_band_sizes = s->cpl_band_sizes; 2452cabdff1aSopenharmony_ci 2453cabdff1aSopenharmony_ci cpl_end_band = s->bandwidth_code / 4 + 3; 2454cabdff1aSopenharmony_ci cpl_start_band = av_clip(cpl_start, 0, FFMIN(cpl_end_band-1, 15)); 2455cabdff1aSopenharmony_ci 2456cabdff1aSopenharmony_ci s->num_cpl_subbands = cpl_end_band - cpl_start_band; 2457cabdff1aSopenharmony_ci 2458cabdff1aSopenharmony_ci s->num_cpl_bands = 1; 2459cabdff1aSopenharmony_ci *cpl_band_sizes = 12; 2460cabdff1aSopenharmony_ci for (i = cpl_start_band + 1; i < cpl_end_band; i++) { 2461cabdff1aSopenharmony_ci if (ff_eac3_default_cpl_band_struct[i]) { 2462cabdff1aSopenharmony_ci *cpl_band_sizes += 12; 2463cabdff1aSopenharmony_ci } else { 2464cabdff1aSopenharmony_ci s->num_cpl_bands++; 2465cabdff1aSopenharmony_ci cpl_band_sizes++; 2466cabdff1aSopenharmony_ci *cpl_band_sizes = 12; 2467cabdff1aSopenharmony_ci } 2468cabdff1aSopenharmony_ci } 2469cabdff1aSopenharmony_ci 2470cabdff1aSopenharmony_ci s->start_freq[CPL_CH] = cpl_start_band * 12 + 37; 2471cabdff1aSopenharmony_ci s->cpl_end_freq = cpl_end_band * 12 + 37; 2472cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) 2473cabdff1aSopenharmony_ci s->blocks[blk].end_freq[CPL_CH] = s->cpl_end_freq; 2474cabdff1aSopenharmony_ci } 2475cabdff1aSopenharmony_ci} 2476cabdff1aSopenharmony_ci 2477cabdff1aSopenharmony_ci 2478cabdff1aSopenharmony_cistatic av_cold int allocate_buffers(AC3EncodeContext *s) 2479cabdff1aSopenharmony_ci{ 2480cabdff1aSopenharmony_ci int blk, ch; 2481cabdff1aSopenharmony_ci int channels = s->channels + 1; /* includes coupling channel */ 2482cabdff1aSopenharmony_ci int channel_blocks = channels * s->num_blocks; 2483cabdff1aSopenharmony_ci int total_coefs = AC3_MAX_COEFS * channel_blocks; 2484cabdff1aSopenharmony_ci 2485cabdff1aSopenharmony_ci if (s->allocate_sample_buffers(s)) 2486cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2487cabdff1aSopenharmony_ci 2488cabdff1aSopenharmony_ci if (!FF_ALLOC_TYPED_ARRAY(s->bap_buffer, total_coefs) || 2489cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->bap1_buffer, total_coefs) || 2490cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(s->mdct_coef_buffer, total_coefs) || 2491cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->exp_buffer, total_coefs) || 2492cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->grouped_exp_buffer, channel_blocks * 128) || 2493cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->psd_buffer, total_coefs) || 2494cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->band_psd_buffer, channel_blocks * 64) || 2495cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->mask_buffer, channel_blocks * 64) || 2496cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->qmant_buffer, total_coefs)) 2497cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2498cabdff1aSopenharmony_ci 2499cabdff1aSopenharmony_ci if (s->cpl_enabled) { 2500cabdff1aSopenharmony_ci if (!FF_ALLOC_TYPED_ARRAY(s->cpl_coord_exp_buffer, channel_blocks * 16) || 2501cabdff1aSopenharmony_ci !FF_ALLOC_TYPED_ARRAY(s->cpl_coord_mant_buffer, channel_blocks * 16)) 2502cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2503cabdff1aSopenharmony_ci } 2504cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 2505cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 2506cabdff1aSopenharmony_ci 2507cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(block->mdct_coef, channels) || 2508cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->exp, channels) || 2509cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->grouped_exp, channels) || 2510cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->psd, channels) || 2511cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->band_psd, channels) || 2512cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->mask, channels) || 2513cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->qmant, channels)) 2514cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2515cabdff1aSopenharmony_ci 2516cabdff1aSopenharmony_ci if (s->cpl_enabled) { 2517cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(block->cpl_coord_exp, channels) || 2518cabdff1aSopenharmony_ci !FF_ALLOCZ_TYPED_ARRAY(block->cpl_coord_mant, channels)) 2519cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2520cabdff1aSopenharmony_ci } 2521cabdff1aSopenharmony_ci 2522cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 2523cabdff1aSopenharmony_ci /* arrangement: block, channel, coeff */ 2524cabdff1aSopenharmony_ci block->grouped_exp[ch] = &s->grouped_exp_buffer[128 * (blk * channels + ch)]; 2525cabdff1aSopenharmony_ci block->psd[ch] = &s->psd_buffer [AC3_MAX_COEFS * (blk * channels + ch)]; 2526cabdff1aSopenharmony_ci block->band_psd[ch] = &s->band_psd_buffer [64 * (blk * channels + ch)]; 2527cabdff1aSopenharmony_ci block->mask[ch] = &s->mask_buffer [64 * (blk * channels + ch)]; 2528cabdff1aSopenharmony_ci block->qmant[ch] = &s->qmant_buffer [AC3_MAX_COEFS * (blk * channels + ch)]; 2529cabdff1aSopenharmony_ci if (s->cpl_enabled) { 2530cabdff1aSopenharmony_ci block->cpl_coord_exp[ch] = &s->cpl_coord_exp_buffer [16 * (blk * channels + ch)]; 2531cabdff1aSopenharmony_ci block->cpl_coord_mant[ch] = &s->cpl_coord_mant_buffer[16 * (blk * channels + ch)]; 2532cabdff1aSopenharmony_ci } 2533cabdff1aSopenharmony_ci 2534cabdff1aSopenharmony_ci /* arrangement: channel, block, coeff */ 2535cabdff1aSopenharmony_ci block->exp[ch] = &s->exp_buffer [AC3_MAX_COEFS * (s->num_blocks * ch + blk)]; 2536cabdff1aSopenharmony_ci block->mdct_coef[ch] = &s->mdct_coef_buffer [AC3_MAX_COEFS * (s->num_blocks * ch + blk)]; 2537cabdff1aSopenharmony_ci } 2538cabdff1aSopenharmony_ci } 2539cabdff1aSopenharmony_ci 2540cabdff1aSopenharmony_ci if (!s->fixed_point) { 2541cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(s->fixed_coef_buffer, total_coefs)) 2542cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2543cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 2544cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 2545cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(block->fixed_coef, channels)) 2546cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2547cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 2548cabdff1aSopenharmony_ci block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (s->num_blocks * ch + blk)]; 2549cabdff1aSopenharmony_ci } 2550cabdff1aSopenharmony_ci } else { 2551cabdff1aSopenharmony_ci for (blk = 0; blk < s->num_blocks; blk++) { 2552cabdff1aSopenharmony_ci AC3Block *block = &s->blocks[blk]; 2553cabdff1aSopenharmony_ci if (!FF_ALLOCZ_TYPED_ARRAY(block->fixed_coef, channels)) 2554cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2555cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 2556cabdff1aSopenharmony_ci block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch]; 2557cabdff1aSopenharmony_ci } 2558cabdff1aSopenharmony_ci } 2559cabdff1aSopenharmony_ci 2560cabdff1aSopenharmony_ci return 0; 2561cabdff1aSopenharmony_ci} 2562cabdff1aSopenharmony_ci 2563cabdff1aSopenharmony_ci 2564cabdff1aSopenharmony_ciav_cold int ff_ac3_encode_init(AVCodecContext *avctx) 2565cabdff1aSopenharmony_ci{ 2566cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 2567cabdff1aSopenharmony_ci AC3EncodeContext *s = avctx->priv_data; 2568cabdff1aSopenharmony_ci int ret, frame_size_58; 2569cabdff1aSopenharmony_ci 2570cabdff1aSopenharmony_ci s->avctx = avctx; 2571cabdff1aSopenharmony_ci 2572cabdff1aSopenharmony_ci s->eac3 = avctx->codec_id == AV_CODEC_ID_EAC3; 2573cabdff1aSopenharmony_ci 2574cabdff1aSopenharmony_ci ret = validate_options(s); 2575cabdff1aSopenharmony_ci if (ret) 2576cabdff1aSopenharmony_ci return ret; 2577cabdff1aSopenharmony_ci 2578cabdff1aSopenharmony_ci avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks; 2579cabdff1aSopenharmony_ci avctx->initial_padding = AC3_BLOCK_SIZE; 2580cabdff1aSopenharmony_ci 2581cabdff1aSopenharmony_ci s->bitstream_mode = avctx->audio_service_type; 2582cabdff1aSopenharmony_ci if (s->bitstream_mode == AV_AUDIO_SERVICE_TYPE_KARAOKE) 2583cabdff1aSopenharmony_ci s->bitstream_mode = 0x7; 2584cabdff1aSopenharmony_ci 2585cabdff1aSopenharmony_ci s->bits_written = 0; 2586cabdff1aSopenharmony_ci s->samples_written = 0; 2587cabdff1aSopenharmony_ci 2588cabdff1aSopenharmony_ci /* calculate crc_inv for both possible frame sizes */ 2589cabdff1aSopenharmony_ci frame_size_58 = (( s->frame_size >> 2) + ( s->frame_size >> 4)) << 1; 2590cabdff1aSopenharmony_ci s->crc_inv[0] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY); 2591cabdff1aSopenharmony_ci if (s->bit_alloc.sr_code == 1) { 2592cabdff1aSopenharmony_ci frame_size_58 = (((s->frame_size+2) >> 2) + ((s->frame_size+2) >> 4)) << 1; 2593cabdff1aSopenharmony_ci s->crc_inv[1] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY); 2594cabdff1aSopenharmony_ci } 2595cabdff1aSopenharmony_ci 2596cabdff1aSopenharmony_ci if (CONFIG_EAC3_ENCODER && s->eac3) { 2597cabdff1aSopenharmony_ci static AVOnce init_static_once_eac3 = AV_ONCE_INIT; 2598cabdff1aSopenharmony_ci ff_thread_once(&init_static_once_eac3, ff_eac3_exponent_init); 2599cabdff1aSopenharmony_ci s->output_frame_header = ff_eac3_output_frame_header; 2600cabdff1aSopenharmony_ci } else 2601cabdff1aSopenharmony_ci s->output_frame_header = ac3_output_frame_header; 2602cabdff1aSopenharmony_ci 2603cabdff1aSopenharmony_ci set_bandwidth(s); 2604cabdff1aSopenharmony_ci 2605cabdff1aSopenharmony_ci bit_alloc_init(s); 2606cabdff1aSopenharmony_ci 2607cabdff1aSopenharmony_ci ret = s->mdct_init(s); 2608cabdff1aSopenharmony_ci if (ret) 2609cabdff1aSopenharmony_ci return ret; 2610cabdff1aSopenharmony_ci 2611cabdff1aSopenharmony_ci ret = allocate_buffers(s); 2612cabdff1aSopenharmony_ci if (ret) 2613cabdff1aSopenharmony_ci return ret; 2614cabdff1aSopenharmony_ci 2615cabdff1aSopenharmony_ci ff_audiodsp_init(&s->adsp); 2616cabdff1aSopenharmony_ci ff_me_cmp_init(&s->mecc, avctx); 2617cabdff1aSopenharmony_ci ff_ac3dsp_init(&s->ac3dsp, avctx->flags & AV_CODEC_FLAG_BITEXACT); 2618cabdff1aSopenharmony_ci 2619cabdff1aSopenharmony_ci dprint_options(s); 2620cabdff1aSopenharmony_ci 2621cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, exponent_init); 2622cabdff1aSopenharmony_ci 2623cabdff1aSopenharmony_ci return 0; 2624cabdff1aSopenharmony_ci} 2625