1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * DCA encoder 3cabdff1aSopenharmony_ci * Copyright (C) 2008-2012 Alexander E. Patrakov 4cabdff1aSopenharmony_ci * 2010 Benjamin Larsson 5cabdff1aSopenharmony_ci * 2011 Xiang Wang 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#define FFT_FLOAT 0 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 27cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 28cabdff1aSopenharmony_ci#include "libavutil/common.h" 29cabdff1aSopenharmony_ci#include "libavutil/ffmath.h" 30cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 31cabdff1aSopenharmony_ci#include "libavutil/opt.h" 32cabdff1aSopenharmony_ci#include "avcodec.h" 33cabdff1aSopenharmony_ci#include "codec_internal.h" 34cabdff1aSopenharmony_ci#include "dca.h" 35cabdff1aSopenharmony_ci#include "dcaadpcm.h" 36cabdff1aSopenharmony_ci#include "dcamath.h" 37cabdff1aSopenharmony_ci#include "dca_core.h" 38cabdff1aSopenharmony_ci#include "dcadata.h" 39cabdff1aSopenharmony_ci#include "dcaenc.h" 40cabdff1aSopenharmony_ci#include "encode.h" 41cabdff1aSopenharmony_ci#include "fft.h" 42cabdff1aSopenharmony_ci#include "internal.h" 43cabdff1aSopenharmony_ci#include "mathops.h" 44cabdff1aSopenharmony_ci#include "put_bits.h" 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define MAX_CHANNELS 6 47cabdff1aSopenharmony_ci#define DCA_MAX_FRAME_SIZE 16384 48cabdff1aSopenharmony_ci#define DCA_HEADER_SIZE 13 49cabdff1aSopenharmony_ci#define DCA_LFE_SAMPLES 8 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci#define DCAENC_SUBBANDS 32 52cabdff1aSopenharmony_ci#define SUBFRAMES 1 53cabdff1aSopenharmony_ci#define SUBSUBFRAMES 2 54cabdff1aSopenharmony_ci#define SUBBAND_SAMPLES (SUBFRAMES * SUBSUBFRAMES * 8) 55cabdff1aSopenharmony_ci#define AUBANDS 25 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci#define COS_T(x) (c->cos_table[(x) & 2047]) 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_citypedef struct CompressionOptions { 60cabdff1aSopenharmony_ci int adpcm_mode; 61cabdff1aSopenharmony_ci} CompressionOptions; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_citypedef struct DCAEncContext { 64cabdff1aSopenharmony_ci AVClass *class; 65cabdff1aSopenharmony_ci PutBitContext pb; 66cabdff1aSopenharmony_ci DCAADPCMEncContext adpcm_ctx; 67cabdff1aSopenharmony_ci FFTContext mdct; 68cabdff1aSopenharmony_ci CompressionOptions options; 69cabdff1aSopenharmony_ci int frame_size; 70cabdff1aSopenharmony_ci int frame_bits; 71cabdff1aSopenharmony_ci int fullband_channels; 72cabdff1aSopenharmony_ci int channels; 73cabdff1aSopenharmony_ci int lfe_channel; 74cabdff1aSopenharmony_ci int samplerate_index; 75cabdff1aSopenharmony_ci int bitrate_index; 76cabdff1aSopenharmony_ci int channel_config; 77cabdff1aSopenharmony_ci const int32_t *band_interpolation; 78cabdff1aSopenharmony_ci const int32_t *band_spectrum; 79cabdff1aSopenharmony_ci int lfe_scale_factor; 80cabdff1aSopenharmony_ci softfloat lfe_quant; 81cabdff1aSopenharmony_ci int32_t lfe_peak_cb; 82cabdff1aSopenharmony_ci const int8_t *channel_order_tab; ///< channel reordering table, lfe and non lfe 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci int32_t prediction_mode[MAX_CHANNELS][DCAENC_SUBBANDS]; 85cabdff1aSopenharmony_ci int32_t adpcm_history[MAX_CHANNELS][DCAENC_SUBBANDS][DCA_ADPCM_COEFFS * 2]; 86cabdff1aSopenharmony_ci int32_t history[MAX_CHANNELS][512]; /* This is a circular buffer */ 87cabdff1aSopenharmony_ci int32_t *subband[MAX_CHANNELS][DCAENC_SUBBANDS]; 88cabdff1aSopenharmony_ci int32_t quantized[MAX_CHANNELS][DCAENC_SUBBANDS][SUBBAND_SAMPLES]; 89cabdff1aSopenharmony_ci int32_t peak_cb[MAX_CHANNELS][DCAENC_SUBBANDS]; 90cabdff1aSopenharmony_ci int32_t diff_peak_cb[MAX_CHANNELS][DCAENC_SUBBANDS]; ///< expected peak of residual signal 91cabdff1aSopenharmony_ci int32_t downsampled_lfe[DCA_LFE_SAMPLES]; 92cabdff1aSopenharmony_ci int32_t masking_curve_cb[SUBSUBFRAMES][256]; 93cabdff1aSopenharmony_ci int32_t bit_allocation_sel[MAX_CHANNELS]; 94cabdff1aSopenharmony_ci int abits[MAX_CHANNELS][DCAENC_SUBBANDS]; 95cabdff1aSopenharmony_ci int scale_factor[MAX_CHANNELS][DCAENC_SUBBANDS]; 96cabdff1aSopenharmony_ci softfloat quant[MAX_CHANNELS][DCAENC_SUBBANDS]; 97cabdff1aSopenharmony_ci int32_t quant_index_sel[MAX_CHANNELS][DCA_CODE_BOOKS]; 98cabdff1aSopenharmony_ci int32_t eff_masking_curve_cb[256]; 99cabdff1aSopenharmony_ci int32_t band_masking_cb[32]; 100cabdff1aSopenharmony_ci int32_t worst_quantization_noise; 101cabdff1aSopenharmony_ci int32_t worst_noise_ever; 102cabdff1aSopenharmony_ci int consumed_bits; 103cabdff1aSopenharmony_ci int consumed_adpcm_bits; ///< Number of bits to transmit ADPCM related info 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci int32_t cos_table[2048]; 106cabdff1aSopenharmony_ci int32_t band_interpolation_tab[2][512]; 107cabdff1aSopenharmony_ci int32_t band_spectrum_tab[2][8]; 108cabdff1aSopenharmony_ci int32_t auf[9][AUBANDS][256]; 109cabdff1aSopenharmony_ci int32_t cb_to_add[256]; 110cabdff1aSopenharmony_ci int32_t cb_to_level[2048]; 111cabdff1aSopenharmony_ci int32_t lfe_fir_64i[512]; 112cabdff1aSopenharmony_ci} DCAEncContext; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci/* Transfer function of outer and middle ear, Hz -> dB */ 115cabdff1aSopenharmony_cistatic double hom(double f) 116cabdff1aSopenharmony_ci{ 117cabdff1aSopenharmony_ci double f1 = f / 1000; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci return -3.64 * pow(f1, -0.8) 120cabdff1aSopenharmony_ci + 6.8 * exp(-0.6 * (f1 - 3.4) * (f1 - 3.4)) 121cabdff1aSopenharmony_ci - 6.0 * exp(-0.15 * (f1 - 8.7) * (f1 - 8.7)) 122cabdff1aSopenharmony_ci - 0.0006 * (f1 * f1) * (f1 * f1); 123cabdff1aSopenharmony_ci} 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_cistatic double gammafilter(int i, double f) 126cabdff1aSopenharmony_ci{ 127cabdff1aSopenharmony_ci double h = (f - fc[i]) / erb[i]; 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci h = 1 + h * h; 130cabdff1aSopenharmony_ci h = 1 / (h * h); 131cabdff1aSopenharmony_ci return 20 * log10(h); 132cabdff1aSopenharmony_ci} 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_cistatic int subband_bufer_alloc(DCAEncContext *c) 135cabdff1aSopenharmony_ci{ 136cabdff1aSopenharmony_ci int ch, band; 137cabdff1aSopenharmony_ci int32_t *bufer = av_calloc(MAX_CHANNELS * DCAENC_SUBBANDS * 138cabdff1aSopenharmony_ci (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS), 139cabdff1aSopenharmony_ci sizeof(int32_t)); 140cabdff1aSopenharmony_ci if (!bufer) 141cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci /* we need a place for DCA_ADPCM_COEFF samples from previous frame 144cabdff1aSopenharmony_ci * to calc prediction coefficients for each subband */ 145cabdff1aSopenharmony_ci for (ch = 0; ch < MAX_CHANNELS; ch++) { 146cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) { 147cabdff1aSopenharmony_ci c->subband[ch][band] = bufer + 148cabdff1aSopenharmony_ci ch * DCAENC_SUBBANDS * (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS) + 149cabdff1aSopenharmony_ci band * (SUBBAND_SAMPLES + DCA_ADPCM_COEFFS) + DCA_ADPCM_COEFFS; 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci return 0; 153cabdff1aSopenharmony_ci} 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_cistatic void subband_bufer_free(DCAEncContext *c) 156cabdff1aSopenharmony_ci{ 157cabdff1aSopenharmony_ci if (c->subband[0][0]) { 158cabdff1aSopenharmony_ci int32_t *bufer = c->subband[0][0] - DCA_ADPCM_COEFFS; 159cabdff1aSopenharmony_ci av_free(bufer); 160cabdff1aSopenharmony_ci c->subband[0][0] = NULL; 161cabdff1aSopenharmony_ci } 162cabdff1aSopenharmony_ci} 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_cistatic int encode_init(AVCodecContext *avctx) 165cabdff1aSopenharmony_ci{ 166cabdff1aSopenharmony_ci DCAEncContext *c = avctx->priv_data; 167cabdff1aSopenharmony_ci AVChannelLayout layout = avctx->ch_layout; 168cabdff1aSopenharmony_ci int i, j, k, min_frame_bits; 169cabdff1aSopenharmony_ci int ret; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci if ((ret = subband_bufer_alloc(c)) < 0) 172cabdff1aSopenharmony_ci return ret; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci c->fullband_channels = c->channels = layout.nb_channels; 175cabdff1aSopenharmony_ci c->lfe_channel = (c->channels == 3 || c->channels == 6); 176cabdff1aSopenharmony_ci c->band_interpolation = c->band_interpolation_tab[1]; 177cabdff1aSopenharmony_ci c->band_spectrum = c->band_spectrum_tab[1]; 178cabdff1aSopenharmony_ci c->worst_quantization_noise = -2047; 179cabdff1aSopenharmony_ci c->worst_noise_ever = -2047; 180cabdff1aSopenharmony_ci c->consumed_adpcm_bits = 0; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci if (ff_dcaadpcm_init(&c->adpcm_ctx)) 183cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci if (layout.order == AV_CHANNEL_ORDER_UNSPEC) { 186cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The " 187cabdff1aSopenharmony_ci "encoder will guess the layout, but it " 188cabdff1aSopenharmony_ci "might be incorrect.\n"); 189cabdff1aSopenharmony_ci av_channel_layout_default(&layout, layout.nb_channels); 190cabdff1aSopenharmony_ci } 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci if (!av_channel_layout_compare(&layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_MONO)) 193cabdff1aSopenharmony_ci c->channel_config = 0; 194cabdff1aSopenharmony_ci else if (!av_channel_layout_compare(&layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)) 195cabdff1aSopenharmony_ci c->channel_config = 2; 196cabdff1aSopenharmony_ci else if (!av_channel_layout_compare(&layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_2_2)) 197cabdff1aSopenharmony_ci c->channel_config = 8; 198cabdff1aSopenharmony_ci else if (!av_channel_layout_compare(&layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0)) 199cabdff1aSopenharmony_ci c->channel_config = 9; 200cabdff1aSopenharmony_ci else if (!av_channel_layout_compare(&layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)) 201cabdff1aSopenharmony_ci c->channel_config = 9; 202cabdff1aSopenharmony_ci else { 203cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Unsupported channel layout!\n"); 204cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 205cabdff1aSopenharmony_ci } 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci if (c->lfe_channel) { 208cabdff1aSopenharmony_ci c->fullband_channels--; 209cabdff1aSopenharmony_ci c->channel_order_tab = channel_reorder_lfe[c->channel_config]; 210cabdff1aSopenharmony_ci } else { 211cabdff1aSopenharmony_ci c->channel_order_tab = channel_reorder_nolfe[c->channel_config]; 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci 214cabdff1aSopenharmony_ci for (i = 0; i < MAX_CHANNELS; i++) { 215cabdff1aSopenharmony_ci for (j = 0; j < DCA_CODE_BOOKS; j++) { 216cabdff1aSopenharmony_ci c->quant_index_sel[i][j] = ff_dca_quant_index_group_size[j]; 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci /* 6 - no Huffman */ 219cabdff1aSopenharmony_ci c->bit_allocation_sel[i] = 6; 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci for (j = 0; j < DCAENC_SUBBANDS; j++) { 222cabdff1aSopenharmony_ci /* -1 - no ADPCM */ 223cabdff1aSopenharmony_ci c->prediction_mode[i][j] = -1; 224cabdff1aSopenharmony_ci memset(c->adpcm_history[i][j], 0, sizeof(int32_t)*DCA_ADPCM_COEFFS); 225cabdff1aSopenharmony_ci } 226cabdff1aSopenharmony_ci } 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci for (i = 0; i < 9; i++) { 229cabdff1aSopenharmony_ci if (sample_rates[i] == avctx->sample_rate) 230cabdff1aSopenharmony_ci break; 231cabdff1aSopenharmony_ci } 232cabdff1aSopenharmony_ci if (i == 9) 233cabdff1aSopenharmony_ci return AVERROR(EINVAL); 234cabdff1aSopenharmony_ci c->samplerate_index = i; 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci if (avctx->bit_rate < 32000 || avctx->bit_rate > 3840000) { 237cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Bit rate %"PRId64" not supported.", avctx->bit_rate); 238cabdff1aSopenharmony_ci return AVERROR(EINVAL); 239cabdff1aSopenharmony_ci } 240cabdff1aSopenharmony_ci for (i = 0; ff_dca_bit_rates[i] < avctx->bit_rate; i++) 241cabdff1aSopenharmony_ci ; 242cabdff1aSopenharmony_ci c->bitrate_index = i; 243cabdff1aSopenharmony_ci c->frame_bits = FFALIGN((avctx->bit_rate * 512 + avctx->sample_rate - 1) / avctx->sample_rate, 32); 244cabdff1aSopenharmony_ci min_frame_bits = 132 + (493 + 28 * 32) * c->fullband_channels + c->lfe_channel * 72; 245cabdff1aSopenharmony_ci if (c->frame_bits < min_frame_bits || c->frame_bits > (DCA_MAX_FRAME_SIZE << 3)) 246cabdff1aSopenharmony_ci return AVERROR(EINVAL); 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci c->frame_size = (c->frame_bits + 7) / 8; 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci avctx->frame_size = 32 * SUBBAND_SAMPLES; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci if ((ret = ff_mdct_init(&c->mdct, 9, 0, 1.0)) < 0) 253cabdff1aSopenharmony_ci return ret; 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_ci /* Init all tables */ 256cabdff1aSopenharmony_ci c->cos_table[0] = 0x7fffffff; 257cabdff1aSopenharmony_ci c->cos_table[512] = 0; 258cabdff1aSopenharmony_ci c->cos_table[1024] = -c->cos_table[0]; 259cabdff1aSopenharmony_ci for (i = 1; i < 512; i++) { 260cabdff1aSopenharmony_ci c->cos_table[i] = (int32_t)(0x7fffffff * cos(M_PI * i / 1024)); 261cabdff1aSopenharmony_ci c->cos_table[1024-i] = -c->cos_table[i]; 262cabdff1aSopenharmony_ci c->cos_table[1024+i] = -c->cos_table[i]; 263cabdff1aSopenharmony_ci c->cos_table[2048-i] = +c->cos_table[i]; 264cabdff1aSopenharmony_ci } 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci for (i = 0; i < 2048; i++) 267cabdff1aSopenharmony_ci c->cb_to_level[i] = (int32_t)(0x7fffffff * ff_exp10(-0.005 * i)); 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci for (k = 0; k < 32; k++) { 270cabdff1aSopenharmony_ci for (j = 0; j < 8; j++) { 271cabdff1aSopenharmony_ci c->lfe_fir_64i[64 * j + k] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]); 272cabdff1aSopenharmony_ci c->lfe_fir_64i[64 * (7-j) + (63 - k)] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]); 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci } 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci for (i = 0; i < 512; i++) { 277cabdff1aSopenharmony_ci c->band_interpolation_tab[0][i] = (int32_t)(0x1000000000ULL * ff_dca_fir_32bands_perfect[i]); 278cabdff1aSopenharmony_ci c->band_interpolation_tab[1][i] = (int32_t)(0x1000000000ULL * ff_dca_fir_32bands_nonperfect[i]); 279cabdff1aSopenharmony_ci } 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci for (i = 0; i < 9; i++) { 282cabdff1aSopenharmony_ci for (j = 0; j < AUBANDS; j++) { 283cabdff1aSopenharmony_ci for (k = 0; k < 256; k++) { 284cabdff1aSopenharmony_ci double freq = sample_rates[i] * (k + 0.5) / 512; 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci c->auf[i][j][k] = (int32_t)(10 * (hom(freq) + gammafilter(j, freq))); 287cabdff1aSopenharmony_ci } 288cabdff1aSopenharmony_ci } 289cabdff1aSopenharmony_ci } 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) { 292cabdff1aSopenharmony_ci double add = 1 + ff_exp10(-0.01 * i); 293cabdff1aSopenharmony_ci c->cb_to_add[i] = (int32_t)(100 * log10(add)); 294cabdff1aSopenharmony_ci } 295cabdff1aSopenharmony_ci for (j = 0; j < 8; j++) { 296cabdff1aSopenharmony_ci double accum = 0; 297cabdff1aSopenharmony_ci for (i = 0; i < 512; i++) { 298cabdff1aSopenharmony_ci double reconst = ff_dca_fir_32bands_perfect[i] * ((i & 64) ? (-1) : 1); 299cabdff1aSopenharmony_ci accum += reconst * cos(2 * M_PI * (i + 0.5 - 256) * (j + 0.5) / 512); 300cabdff1aSopenharmony_ci } 301cabdff1aSopenharmony_ci c->band_spectrum_tab[0][j] = (int32_t)(200 * log10(accum)); 302cabdff1aSopenharmony_ci } 303cabdff1aSopenharmony_ci for (j = 0; j < 8; j++) { 304cabdff1aSopenharmony_ci double accum = 0; 305cabdff1aSopenharmony_ci for (i = 0; i < 512; i++) { 306cabdff1aSopenharmony_ci double reconst = ff_dca_fir_32bands_nonperfect[i] * ((i & 64) ? (-1) : 1); 307cabdff1aSopenharmony_ci accum += reconst * cos(2 * M_PI * (i + 0.5 - 256) * (j + 0.5) / 512); 308cabdff1aSopenharmony_ci } 309cabdff1aSopenharmony_ci c->band_spectrum_tab[1][j] = (int32_t)(200 * log10(accum)); 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci return 0; 313cabdff1aSopenharmony_ci} 314cabdff1aSopenharmony_ci 315cabdff1aSopenharmony_cistatic av_cold int encode_close(AVCodecContext *avctx) 316cabdff1aSopenharmony_ci{ 317cabdff1aSopenharmony_ci DCAEncContext *c = avctx->priv_data; 318cabdff1aSopenharmony_ci ff_mdct_end(&c->mdct); 319cabdff1aSopenharmony_ci subband_bufer_free(c); 320cabdff1aSopenharmony_ci ff_dcaadpcm_free(&c->adpcm_ctx); 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci return 0; 323cabdff1aSopenharmony_ci} 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_cistatic void subband_transform(DCAEncContext *c, const int32_t *input) 326cabdff1aSopenharmony_ci{ 327cabdff1aSopenharmony_ci int ch, subs, i, k, j; 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 330cabdff1aSopenharmony_ci /* History is copied because it is also needed for PSY */ 331cabdff1aSopenharmony_ci int32_t hist[512]; 332cabdff1aSopenharmony_ci int hist_start = 0; 333cabdff1aSopenharmony_ci const int chi = c->channel_order_tab[ch]; 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci memcpy(hist, &c->history[ch][0], 512 * sizeof(int32_t)); 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci for (subs = 0; subs < SUBBAND_SAMPLES; subs++) { 338cabdff1aSopenharmony_ci int32_t accum[64]; 339cabdff1aSopenharmony_ci int32_t resp; 340cabdff1aSopenharmony_ci int band; 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci /* Calculate the convolutions at once */ 343cabdff1aSopenharmony_ci memset(accum, 0, 64 * sizeof(int32_t)); 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci for (k = 0, i = hist_start, j = 0; 346cabdff1aSopenharmony_ci i < 512; k = (k + 1) & 63, i++, j++) 347cabdff1aSopenharmony_ci accum[k] += mul32(hist[i], c->band_interpolation[j]); 348cabdff1aSopenharmony_ci for (i = 0; i < hist_start; k = (k + 1) & 63, i++, j++) 349cabdff1aSopenharmony_ci accum[k] += mul32(hist[i], c->band_interpolation[j]); 350cabdff1aSopenharmony_ci 351cabdff1aSopenharmony_ci for (k = 16; k < 32; k++) 352cabdff1aSopenharmony_ci accum[k] = accum[k] - accum[31 - k]; 353cabdff1aSopenharmony_ci for (k = 32; k < 48; k++) 354cabdff1aSopenharmony_ci accum[k] = accum[k] + accum[95 - k]; 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 357cabdff1aSopenharmony_ci resp = 0; 358cabdff1aSopenharmony_ci for (i = 16; i < 48; i++) { 359cabdff1aSopenharmony_ci int s = (2 * band + 1) * (2 * (i + 16) + 1); 360cabdff1aSopenharmony_ci resp += mul32(accum[i], COS_T(s << 3)) >> 3; 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci c->subband[ch][band][subs] = ((band + 1) & 2) ? -resp : resp; 364cabdff1aSopenharmony_ci } 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci /* Copy in 32 new samples from input */ 367cabdff1aSopenharmony_ci for (i = 0; i < 32; i++) 368cabdff1aSopenharmony_ci hist[i + hist_start] = input[(subs * 32 + i) * c->channels + chi]; 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_ci hist_start = (hist_start + 32) & 511; 371cabdff1aSopenharmony_ci } 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci} 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_cistatic void lfe_downsample(DCAEncContext *c, const int32_t *input) 376cabdff1aSopenharmony_ci{ 377cabdff1aSopenharmony_ci /* FIXME: make 128x LFE downsampling possible */ 378cabdff1aSopenharmony_ci const int lfech = lfe_index[c->channel_config]; 379cabdff1aSopenharmony_ci int i, j, lfes; 380cabdff1aSopenharmony_ci int32_t hist[512]; 381cabdff1aSopenharmony_ci int32_t accum; 382cabdff1aSopenharmony_ci int hist_start = 0; 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci memcpy(hist, &c->history[c->channels - 1][0], 512 * sizeof(int32_t)); 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci for (lfes = 0; lfes < DCA_LFE_SAMPLES; lfes++) { 387cabdff1aSopenharmony_ci /* Calculate the convolution */ 388cabdff1aSopenharmony_ci accum = 0; 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci for (i = hist_start, j = 0; i < 512; i++, j++) 391cabdff1aSopenharmony_ci accum += mul32(hist[i], c->lfe_fir_64i[j]); 392cabdff1aSopenharmony_ci for (i = 0; i < hist_start; i++, j++) 393cabdff1aSopenharmony_ci accum += mul32(hist[i], c->lfe_fir_64i[j]); 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci c->downsampled_lfe[lfes] = accum; 396cabdff1aSopenharmony_ci 397cabdff1aSopenharmony_ci /* Copy in 64 new samples from input */ 398cabdff1aSopenharmony_ci for (i = 0; i < 64; i++) 399cabdff1aSopenharmony_ci hist[i + hist_start] = input[(lfes * 64 + i) * c->channels + lfech]; 400cabdff1aSopenharmony_ci 401cabdff1aSopenharmony_ci hist_start = (hist_start + 64) & 511; 402cabdff1aSopenharmony_ci } 403cabdff1aSopenharmony_ci} 404cabdff1aSopenharmony_ci 405cabdff1aSopenharmony_cistatic int32_t get_cb(DCAEncContext *c, int32_t in) 406cabdff1aSopenharmony_ci{ 407cabdff1aSopenharmony_ci int i, res = 0; 408cabdff1aSopenharmony_ci in = FFABS(in); 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci for (i = 1024; i > 0; i >>= 1) { 411cabdff1aSopenharmony_ci if (c->cb_to_level[i + res] >= in) 412cabdff1aSopenharmony_ci res += i; 413cabdff1aSopenharmony_ci } 414cabdff1aSopenharmony_ci return -res; 415cabdff1aSopenharmony_ci} 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_cistatic int32_t add_cb(DCAEncContext *c, int32_t a, int32_t b) 418cabdff1aSopenharmony_ci{ 419cabdff1aSopenharmony_ci if (a < b) 420cabdff1aSopenharmony_ci FFSWAP(int32_t, a, b); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci if (a - b >= 256) 423cabdff1aSopenharmony_ci return a; 424cabdff1aSopenharmony_ci return a + c->cb_to_add[a - b]; 425cabdff1aSopenharmony_ci} 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_cistatic void calc_power(DCAEncContext *c, 428cabdff1aSopenharmony_ci const int32_t in[2 * 256], int32_t power[256]) 429cabdff1aSopenharmony_ci{ 430cabdff1aSopenharmony_ci int i; 431cabdff1aSopenharmony_ci LOCAL_ALIGNED_32(int32_t, data, [512]); 432cabdff1aSopenharmony_ci LOCAL_ALIGNED_32(int32_t, coeff, [256]); 433cabdff1aSopenharmony_ci 434cabdff1aSopenharmony_ci for (i = 0; i < 512; i++) 435cabdff1aSopenharmony_ci data[i] = norm__(mul32(in[i], 0x3fffffff - (COS_T(4 * i + 2) >> 1)), 4); 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci c->mdct.mdct_calc(&c->mdct, coeff, data); 438cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) { 439cabdff1aSopenharmony_ci const int32_t cb = get_cb(c, coeff[i]); 440cabdff1aSopenharmony_ci power[i] = add_cb(c, cb, cb); 441cabdff1aSopenharmony_ci } 442cabdff1aSopenharmony_ci} 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_cistatic void adjust_jnd(DCAEncContext *c, 445cabdff1aSopenharmony_ci const int32_t in[512], int32_t out_cb[256]) 446cabdff1aSopenharmony_ci{ 447cabdff1aSopenharmony_ci int32_t power[256]; 448cabdff1aSopenharmony_ci int32_t out_cb_unnorm[256]; 449cabdff1aSopenharmony_ci int32_t denom; 450cabdff1aSopenharmony_ci const int32_t ca_cb = -1114; 451cabdff1aSopenharmony_ci const int32_t cs_cb = 928; 452cabdff1aSopenharmony_ci const int samplerate_index = c->samplerate_index; 453cabdff1aSopenharmony_ci int i, j; 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci calc_power(c, in, power); 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_ci for (j = 0; j < 256; j++) 458cabdff1aSopenharmony_ci out_cb_unnorm[j] = -2047; /* and can only grow */ 459cabdff1aSopenharmony_ci 460cabdff1aSopenharmony_ci for (i = 0; i < AUBANDS; i++) { 461cabdff1aSopenharmony_ci denom = ca_cb; /* and can only grow */ 462cabdff1aSopenharmony_ci for (j = 0; j < 256; j++) 463cabdff1aSopenharmony_ci denom = add_cb(c, denom, power[j] + c->auf[samplerate_index][i][j]); 464cabdff1aSopenharmony_ci for (j = 0; j < 256; j++) 465cabdff1aSopenharmony_ci out_cb_unnorm[j] = add_cb(c, out_cb_unnorm[j], 466cabdff1aSopenharmony_ci -denom + c->auf[samplerate_index][i][j]); 467cabdff1aSopenharmony_ci } 468cabdff1aSopenharmony_ci 469cabdff1aSopenharmony_ci for (j = 0; j < 256; j++) 470cabdff1aSopenharmony_ci out_cb[j] = add_cb(c, out_cb[j], -out_cb_unnorm[j] - ca_cb - cs_cb); 471cabdff1aSopenharmony_ci} 472cabdff1aSopenharmony_ci 473cabdff1aSopenharmony_citypedef void (*walk_band_t)(DCAEncContext *c, int band1, int band2, int f, 474cabdff1aSopenharmony_ci int32_t spectrum1, int32_t spectrum2, int channel, 475cabdff1aSopenharmony_ci int32_t * arg); 476cabdff1aSopenharmony_ci 477cabdff1aSopenharmony_cistatic void walk_band_low(DCAEncContext *c, int band, int channel, 478cabdff1aSopenharmony_ci walk_band_t walk, int32_t *arg) 479cabdff1aSopenharmony_ci{ 480cabdff1aSopenharmony_ci int f; 481cabdff1aSopenharmony_ci 482cabdff1aSopenharmony_ci if (band == 0) { 483cabdff1aSopenharmony_ci for (f = 0; f < 4; f++) 484cabdff1aSopenharmony_ci walk(c, 0, 0, f, 0, -2047, channel, arg); 485cabdff1aSopenharmony_ci } else { 486cabdff1aSopenharmony_ci for (f = 0; f < 8; f++) 487cabdff1aSopenharmony_ci walk(c, band, band - 1, 8 * band - 4 + f, 488cabdff1aSopenharmony_ci c->band_spectrum[7 - f], c->band_spectrum[f], channel, arg); 489cabdff1aSopenharmony_ci } 490cabdff1aSopenharmony_ci} 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_cistatic void walk_band_high(DCAEncContext *c, int band, int channel, 493cabdff1aSopenharmony_ci walk_band_t walk, int32_t *arg) 494cabdff1aSopenharmony_ci{ 495cabdff1aSopenharmony_ci int f; 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci if (band == 31) { 498cabdff1aSopenharmony_ci for (f = 0; f < 4; f++) 499cabdff1aSopenharmony_ci walk(c, 31, 31, 256 - 4 + f, 0, -2047, channel, arg); 500cabdff1aSopenharmony_ci } else { 501cabdff1aSopenharmony_ci for (f = 0; f < 8; f++) 502cabdff1aSopenharmony_ci walk(c, band, band + 1, 8 * band + 4 + f, 503cabdff1aSopenharmony_ci c->band_spectrum[f], c->band_spectrum[7 - f], channel, arg); 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci} 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_cistatic void update_band_masking(DCAEncContext *c, int band1, int band2, 508cabdff1aSopenharmony_ci int f, int32_t spectrum1, int32_t spectrum2, 509cabdff1aSopenharmony_ci int channel, int32_t * arg) 510cabdff1aSopenharmony_ci{ 511cabdff1aSopenharmony_ci int32_t value = c->eff_masking_curve_cb[f] - spectrum1; 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_ci if (value < c->band_masking_cb[band1]) 514cabdff1aSopenharmony_ci c->band_masking_cb[band1] = value; 515cabdff1aSopenharmony_ci} 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_cistatic void calc_masking(DCAEncContext *c, const int32_t *input) 518cabdff1aSopenharmony_ci{ 519cabdff1aSopenharmony_ci int i, k, band, ch, ssf; 520cabdff1aSopenharmony_ci int32_t data[512]; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) 523cabdff1aSopenharmony_ci for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) 524cabdff1aSopenharmony_ci c->masking_curve_cb[ssf][i] = -2047; 525cabdff1aSopenharmony_ci 526cabdff1aSopenharmony_ci for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) 527cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 528cabdff1aSopenharmony_ci const int chi = c->channel_order_tab[ch]; 529cabdff1aSopenharmony_ci 530cabdff1aSopenharmony_ci for (i = 0, k = 128 + 256 * ssf; k < 512; i++, k++) 531cabdff1aSopenharmony_ci data[i] = c->history[ch][k]; 532cabdff1aSopenharmony_ci for (k -= 512; i < 512; i++, k++) 533cabdff1aSopenharmony_ci data[i] = input[k * c->channels + chi]; 534cabdff1aSopenharmony_ci adjust_jnd(c, data, c->masking_curve_cb[ssf]); 535cabdff1aSopenharmony_ci } 536cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) { 537cabdff1aSopenharmony_ci int32_t m = 2048; 538cabdff1aSopenharmony_ci 539cabdff1aSopenharmony_ci for (ssf = 0; ssf < SUBSUBFRAMES; ssf++) 540cabdff1aSopenharmony_ci if (c->masking_curve_cb[ssf][i] < m) 541cabdff1aSopenharmony_ci m = c->masking_curve_cb[ssf][i]; 542cabdff1aSopenharmony_ci c->eff_masking_curve_cb[i] = m; 543cabdff1aSopenharmony_ci } 544cabdff1aSopenharmony_ci 545cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 546cabdff1aSopenharmony_ci c->band_masking_cb[band] = 2048; 547cabdff1aSopenharmony_ci walk_band_low(c, band, 0, update_band_masking, NULL); 548cabdff1aSopenharmony_ci walk_band_high(c, band, 0, update_band_masking, NULL); 549cabdff1aSopenharmony_ci } 550cabdff1aSopenharmony_ci} 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_cistatic inline int32_t find_peak(DCAEncContext *c, const int32_t *in, int len) 553cabdff1aSopenharmony_ci{ 554cabdff1aSopenharmony_ci int sample; 555cabdff1aSopenharmony_ci int32_t m = 0; 556cabdff1aSopenharmony_ci for (sample = 0; sample < len; sample++) { 557cabdff1aSopenharmony_ci int32_t s = abs(in[sample]); 558cabdff1aSopenharmony_ci if (m < s) 559cabdff1aSopenharmony_ci m = s; 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci return get_cb(c, m); 562cabdff1aSopenharmony_ci} 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_cistatic void find_peaks(DCAEncContext *c) 565cabdff1aSopenharmony_ci{ 566cabdff1aSopenharmony_ci int band, ch; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 569cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) 570cabdff1aSopenharmony_ci c->peak_cb[ch][band] = find_peak(c, c->subband[ch][band], 571cabdff1aSopenharmony_ci SUBBAND_SAMPLES); 572cabdff1aSopenharmony_ci } 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci if (c->lfe_channel) 575cabdff1aSopenharmony_ci c->lfe_peak_cb = find_peak(c, c->downsampled_lfe, DCA_LFE_SAMPLES); 576cabdff1aSopenharmony_ci} 577cabdff1aSopenharmony_ci 578cabdff1aSopenharmony_cistatic void adpcm_analysis(DCAEncContext *c) 579cabdff1aSopenharmony_ci{ 580cabdff1aSopenharmony_ci int ch, band; 581cabdff1aSopenharmony_ci int pred_vq_id; 582cabdff1aSopenharmony_ci int32_t *samples; 583cabdff1aSopenharmony_ci int32_t estimated_diff[SUBBAND_SAMPLES]; 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci c->consumed_adpcm_bits = 0; 586cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 587cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 588cabdff1aSopenharmony_ci samples = c->subband[ch][band] - DCA_ADPCM_COEFFS; 589cabdff1aSopenharmony_ci pred_vq_id = ff_dcaadpcm_subband_analysis(&c->adpcm_ctx, samples, 590cabdff1aSopenharmony_ci SUBBAND_SAMPLES, estimated_diff); 591cabdff1aSopenharmony_ci if (pred_vq_id >= 0) { 592cabdff1aSopenharmony_ci c->prediction_mode[ch][band] = pred_vq_id; 593cabdff1aSopenharmony_ci c->consumed_adpcm_bits += 12; //12 bits to transmit prediction vq index 594cabdff1aSopenharmony_ci c->diff_peak_cb[ch][band] = find_peak(c, estimated_diff, 16); 595cabdff1aSopenharmony_ci } else { 596cabdff1aSopenharmony_ci c->prediction_mode[ch][band] = -1; 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci } 599cabdff1aSopenharmony_ci } 600cabdff1aSopenharmony_ci} 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_cistatic const int snr_fudge = 128; 603cabdff1aSopenharmony_ci#define USED_1ABITS 1 604cabdff1aSopenharmony_ci#define USED_26ABITS 4 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_cistatic inline int32_t get_step_size(DCAEncContext *c, int ch, int band) 607cabdff1aSopenharmony_ci{ 608cabdff1aSopenharmony_ci int32_t step_size; 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_ci if (c->bitrate_index == 3) 611cabdff1aSopenharmony_ci step_size = ff_dca_lossless_quant[c->abits[ch][band]]; 612cabdff1aSopenharmony_ci else 613cabdff1aSopenharmony_ci step_size = ff_dca_lossy_quant[c->abits[ch][band]]; 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ci return step_size; 616cabdff1aSopenharmony_ci} 617cabdff1aSopenharmony_ci 618cabdff1aSopenharmony_cistatic int calc_one_scale(DCAEncContext *c, int32_t peak_cb, int abits, 619cabdff1aSopenharmony_ci softfloat *quant) 620cabdff1aSopenharmony_ci{ 621cabdff1aSopenharmony_ci int32_t peak; 622cabdff1aSopenharmony_ci int our_nscale, try_remove; 623cabdff1aSopenharmony_ci softfloat our_quant; 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ci av_assert0(peak_cb <= 0); 626cabdff1aSopenharmony_ci av_assert0(peak_cb >= -2047); 627cabdff1aSopenharmony_ci 628cabdff1aSopenharmony_ci our_nscale = 127; 629cabdff1aSopenharmony_ci peak = c->cb_to_level[-peak_cb]; 630cabdff1aSopenharmony_ci 631cabdff1aSopenharmony_ci for (try_remove = 64; try_remove > 0; try_remove >>= 1) { 632cabdff1aSopenharmony_ci if (scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e <= 17) 633cabdff1aSopenharmony_ci continue; 634cabdff1aSopenharmony_ci our_quant.m = mul32(scalefactor_inv[our_nscale - try_remove].m, stepsize_inv[abits].m); 635cabdff1aSopenharmony_ci our_quant.e = scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e - 17; 636cabdff1aSopenharmony_ci if ((ff_dca_quant_levels[abits] - 1) / 2 < quantize_value(peak, our_quant)) 637cabdff1aSopenharmony_ci continue; 638cabdff1aSopenharmony_ci our_nscale -= try_remove; 639cabdff1aSopenharmony_ci } 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_ci if (our_nscale >= 125) 642cabdff1aSopenharmony_ci our_nscale = 124; 643cabdff1aSopenharmony_ci 644cabdff1aSopenharmony_ci quant->m = mul32(scalefactor_inv[our_nscale].m, stepsize_inv[abits].m); 645cabdff1aSopenharmony_ci quant->e = scalefactor_inv[our_nscale].e + stepsize_inv[abits].e - 17; 646cabdff1aSopenharmony_ci av_assert0((ff_dca_quant_levels[abits] - 1) / 2 >= quantize_value(peak, *quant)); 647cabdff1aSopenharmony_ci 648cabdff1aSopenharmony_ci return our_nscale; 649cabdff1aSopenharmony_ci} 650cabdff1aSopenharmony_ci 651cabdff1aSopenharmony_cistatic inline void quantize_adpcm_subband(DCAEncContext *c, int ch, int band) 652cabdff1aSopenharmony_ci{ 653cabdff1aSopenharmony_ci int32_t step_size; 654cabdff1aSopenharmony_ci int32_t diff_peak_cb = c->diff_peak_cb[ch][band]; 655cabdff1aSopenharmony_ci c->scale_factor[ch][band] = calc_one_scale(c, diff_peak_cb, 656cabdff1aSopenharmony_ci c->abits[ch][band], 657cabdff1aSopenharmony_ci &c->quant[ch][band]); 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci step_size = get_step_size(c, ch, band); 660cabdff1aSopenharmony_ci ff_dcaadpcm_do_real(c->prediction_mode[ch][band], 661cabdff1aSopenharmony_ci c->quant[ch][band], 662cabdff1aSopenharmony_ci ff_dca_scale_factor_quant7[c->scale_factor[ch][band]], 663cabdff1aSopenharmony_ci step_size, c->adpcm_history[ch][band], c->subband[ch][band], 664cabdff1aSopenharmony_ci c->adpcm_history[ch][band] + 4, c->quantized[ch][band], 665cabdff1aSopenharmony_ci SUBBAND_SAMPLES, c->cb_to_level[-diff_peak_cb]); 666cabdff1aSopenharmony_ci} 667cabdff1aSopenharmony_ci 668cabdff1aSopenharmony_cistatic void quantize_adpcm(DCAEncContext *c) 669cabdff1aSopenharmony_ci{ 670cabdff1aSopenharmony_ci int band, ch; 671cabdff1aSopenharmony_ci 672cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 673cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) 674cabdff1aSopenharmony_ci if (c->prediction_mode[ch][band] >= 0) 675cabdff1aSopenharmony_ci quantize_adpcm_subband(c, ch, band); 676cabdff1aSopenharmony_ci} 677cabdff1aSopenharmony_ci 678cabdff1aSopenharmony_cistatic void quantize_pcm(DCAEncContext *c) 679cabdff1aSopenharmony_ci{ 680cabdff1aSopenharmony_ci int sample, band, ch; 681cabdff1aSopenharmony_ci 682cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 683cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 684cabdff1aSopenharmony_ci if (c->prediction_mode[ch][band] == -1) { 685cabdff1aSopenharmony_ci for (sample = 0; sample < SUBBAND_SAMPLES; sample++) { 686cabdff1aSopenharmony_ci int32_t val = quantize_value(c->subband[ch][band][sample], 687cabdff1aSopenharmony_ci c->quant[ch][band]); 688cabdff1aSopenharmony_ci c->quantized[ch][band][sample] = val; 689cabdff1aSopenharmony_ci } 690cabdff1aSopenharmony_ci } 691cabdff1aSopenharmony_ci } 692cabdff1aSopenharmony_ci } 693cabdff1aSopenharmony_ci} 694cabdff1aSopenharmony_ci 695cabdff1aSopenharmony_cistatic void accumulate_huff_bit_consumption(int abits, int32_t *quantized, 696cabdff1aSopenharmony_ci uint32_t *result) 697cabdff1aSopenharmony_ci{ 698cabdff1aSopenharmony_ci uint8_t sel, id = abits - 1; 699cabdff1aSopenharmony_ci for (sel = 0; sel < ff_dca_quant_index_group_size[id]; sel++) 700cabdff1aSopenharmony_ci result[sel] += ff_dca_vlc_calc_quant_bits(quantized, SUBBAND_SAMPLES, 701cabdff1aSopenharmony_ci sel, id); 702cabdff1aSopenharmony_ci} 703cabdff1aSopenharmony_ci 704cabdff1aSopenharmony_cistatic uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], 705cabdff1aSopenharmony_ci uint32_t clc_bits[DCA_CODE_BOOKS], 706cabdff1aSopenharmony_ci int32_t res[DCA_CODE_BOOKS]) 707cabdff1aSopenharmony_ci{ 708cabdff1aSopenharmony_ci uint8_t i, sel; 709cabdff1aSopenharmony_ci uint32_t best_sel_bits[DCA_CODE_BOOKS]; 710cabdff1aSopenharmony_ci int32_t best_sel_id[DCA_CODE_BOOKS]; 711cabdff1aSopenharmony_ci uint32_t t, bits = 0; 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci for (i = 0; i < DCA_CODE_BOOKS; i++) { 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_ci av_assert0(!((!!vlc_bits[i][0]) ^ (!!clc_bits[i]))); 716cabdff1aSopenharmony_ci if (vlc_bits[i][0] == 0) { 717cabdff1aSopenharmony_ci /* do not transmit adjustment index for empty codebooks */ 718cabdff1aSopenharmony_ci res[i] = ff_dca_quant_index_group_size[i]; 719cabdff1aSopenharmony_ci /* and skip it */ 720cabdff1aSopenharmony_ci continue; 721cabdff1aSopenharmony_ci } 722cabdff1aSopenharmony_ci 723cabdff1aSopenharmony_ci best_sel_bits[i] = vlc_bits[i][0]; 724cabdff1aSopenharmony_ci best_sel_id[i] = 0; 725cabdff1aSopenharmony_ci for (sel = 0; sel < ff_dca_quant_index_group_size[i]; sel++) { 726cabdff1aSopenharmony_ci if (best_sel_bits[i] > vlc_bits[i][sel] && vlc_bits[i][sel]) { 727cabdff1aSopenharmony_ci best_sel_bits[i] = vlc_bits[i][sel]; 728cabdff1aSopenharmony_ci best_sel_id[i] = sel; 729cabdff1aSopenharmony_ci } 730cabdff1aSopenharmony_ci } 731cabdff1aSopenharmony_ci 732cabdff1aSopenharmony_ci /* 2 bits to transmit scale factor adjustment index */ 733cabdff1aSopenharmony_ci t = best_sel_bits[i] + 2; 734cabdff1aSopenharmony_ci if (t < clc_bits[i]) { 735cabdff1aSopenharmony_ci res[i] = best_sel_id[i]; 736cabdff1aSopenharmony_ci bits += t; 737cabdff1aSopenharmony_ci } else { 738cabdff1aSopenharmony_ci res[i] = ff_dca_quant_index_group_size[i]; 739cabdff1aSopenharmony_ci bits += clc_bits[i]; 740cabdff1aSopenharmony_ci } 741cabdff1aSopenharmony_ci } 742cabdff1aSopenharmony_ci return bits; 743cabdff1aSopenharmony_ci} 744cabdff1aSopenharmony_ci 745cabdff1aSopenharmony_cistatic uint32_t set_best_abits_code(int abits[DCAENC_SUBBANDS], int bands, 746cabdff1aSopenharmony_ci int32_t *res) 747cabdff1aSopenharmony_ci{ 748cabdff1aSopenharmony_ci uint8_t i; 749cabdff1aSopenharmony_ci uint32_t t; 750cabdff1aSopenharmony_ci int32_t best_sel = 6; 751cabdff1aSopenharmony_ci int32_t best_bits = bands * 5; 752cabdff1aSopenharmony_ci 753cabdff1aSopenharmony_ci /* Check do we have subband which cannot be encoded by Huffman tables */ 754cabdff1aSopenharmony_ci for (i = 0; i < bands; i++) { 755cabdff1aSopenharmony_ci if (abits[i] > 12 || abits[i] == 0) { 756cabdff1aSopenharmony_ci *res = best_sel; 757cabdff1aSopenharmony_ci return best_bits; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci } 760cabdff1aSopenharmony_ci 761cabdff1aSopenharmony_ci for (i = 0; i < DCA_BITALLOC_12_COUNT; i++) { 762cabdff1aSopenharmony_ci t = ff_dca_vlc_calc_alloc_bits(abits, bands, i); 763cabdff1aSopenharmony_ci if (t < best_bits) { 764cabdff1aSopenharmony_ci best_bits = t; 765cabdff1aSopenharmony_ci best_sel = i; 766cabdff1aSopenharmony_ci } 767cabdff1aSopenharmony_ci } 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci *res = best_sel; 770cabdff1aSopenharmony_ci return best_bits; 771cabdff1aSopenharmony_ci} 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_cistatic int init_quantization_noise(DCAEncContext *c, int noise, int forbid_zero) 774cabdff1aSopenharmony_ci{ 775cabdff1aSopenharmony_ci int ch, band, ret = USED_26ABITS | USED_1ABITS; 776cabdff1aSopenharmony_ci uint32_t huff_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS][7]; 777cabdff1aSopenharmony_ci uint32_t clc_bit_count_accum[MAX_CHANNELS][DCA_CODE_BOOKS]; 778cabdff1aSopenharmony_ci uint32_t bits_counter = 0; 779cabdff1aSopenharmony_ci 780cabdff1aSopenharmony_ci c->consumed_bits = 132 + 333 * c->fullband_channels; 781cabdff1aSopenharmony_ci c->consumed_bits += c->consumed_adpcm_bits; 782cabdff1aSopenharmony_ci if (c->lfe_channel) 783cabdff1aSopenharmony_ci c->consumed_bits += 72; 784cabdff1aSopenharmony_ci 785cabdff1aSopenharmony_ci /* attempt to guess the bit distribution based on the prevoius frame */ 786cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 787cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 788cabdff1aSopenharmony_ci int snr_cb = c->peak_cb[ch][band] - c->band_masking_cb[band] - noise; 789cabdff1aSopenharmony_ci 790cabdff1aSopenharmony_ci if (snr_cb >= 1312) { 791cabdff1aSopenharmony_ci c->abits[ch][band] = 26; 792cabdff1aSopenharmony_ci ret &= ~USED_1ABITS; 793cabdff1aSopenharmony_ci } else if (snr_cb >= 222) { 794cabdff1aSopenharmony_ci c->abits[ch][band] = 8 + mul32(snr_cb - 222, 69000000); 795cabdff1aSopenharmony_ci ret &= ~(USED_26ABITS | USED_1ABITS); 796cabdff1aSopenharmony_ci } else if (snr_cb >= 0) { 797cabdff1aSopenharmony_ci c->abits[ch][band] = 2 + mul32(snr_cb, 106000000); 798cabdff1aSopenharmony_ci ret &= ~(USED_26ABITS | USED_1ABITS); 799cabdff1aSopenharmony_ci } else if (forbid_zero || snr_cb >= -140) { 800cabdff1aSopenharmony_ci c->abits[ch][band] = 1; 801cabdff1aSopenharmony_ci ret &= ~USED_26ABITS; 802cabdff1aSopenharmony_ci } else { 803cabdff1aSopenharmony_ci c->abits[ch][band] = 0; 804cabdff1aSopenharmony_ci ret &= ~(USED_26ABITS | USED_1ABITS); 805cabdff1aSopenharmony_ci } 806cabdff1aSopenharmony_ci } 807cabdff1aSopenharmony_ci c->consumed_bits += set_best_abits_code(c->abits[ch], 32, 808cabdff1aSopenharmony_ci &c->bit_allocation_sel[ch]); 809cabdff1aSopenharmony_ci } 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci /* Recalc scale_factor each time to get bits consumption in case of Huffman coding. 812cabdff1aSopenharmony_ci It is suboptimal solution */ 813cabdff1aSopenharmony_ci /* TODO: May be cache scaled values */ 814cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 815cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 816cabdff1aSopenharmony_ci if (c->prediction_mode[ch][band] == -1) { 817cabdff1aSopenharmony_ci c->scale_factor[ch][band] = calc_one_scale(c, c->peak_cb[ch][band], 818cabdff1aSopenharmony_ci c->abits[ch][band], 819cabdff1aSopenharmony_ci &c->quant[ch][band]); 820cabdff1aSopenharmony_ci } 821cabdff1aSopenharmony_ci } 822cabdff1aSopenharmony_ci } 823cabdff1aSopenharmony_ci quantize_adpcm(c); 824cabdff1aSopenharmony_ci quantize_pcm(c); 825cabdff1aSopenharmony_ci 826cabdff1aSopenharmony_ci memset(huff_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * 7 * sizeof(uint32_t)); 827cabdff1aSopenharmony_ci memset(clc_bit_count_accum, 0, MAX_CHANNELS * DCA_CODE_BOOKS * sizeof(uint32_t)); 828cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 829cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 830cabdff1aSopenharmony_ci if (c->abits[ch][band] && c->abits[ch][band] <= DCA_CODE_BOOKS) { 831cabdff1aSopenharmony_ci accumulate_huff_bit_consumption(c->abits[ch][band], 832cabdff1aSopenharmony_ci c->quantized[ch][band], 833cabdff1aSopenharmony_ci huff_bit_count_accum[ch][c->abits[ch][band] - 1]); 834cabdff1aSopenharmony_ci clc_bit_count_accum[ch][c->abits[ch][band] - 1] += bit_consumption[c->abits[ch][band]]; 835cabdff1aSopenharmony_ci } else { 836cabdff1aSopenharmony_ci bits_counter += bit_consumption[c->abits[ch][band]]; 837cabdff1aSopenharmony_ci } 838cabdff1aSopenharmony_ci } 839cabdff1aSopenharmony_ci } 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 842cabdff1aSopenharmony_ci bits_counter += set_best_code(huff_bit_count_accum[ch], 843cabdff1aSopenharmony_ci clc_bit_count_accum[ch], 844cabdff1aSopenharmony_ci c->quant_index_sel[ch]); 845cabdff1aSopenharmony_ci } 846cabdff1aSopenharmony_ci 847cabdff1aSopenharmony_ci c->consumed_bits += bits_counter; 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci return ret; 850cabdff1aSopenharmony_ci} 851cabdff1aSopenharmony_ci 852cabdff1aSopenharmony_cistatic void assign_bits(DCAEncContext *c) 853cabdff1aSopenharmony_ci{ 854cabdff1aSopenharmony_ci /* Find the bounds where the binary search should work */ 855cabdff1aSopenharmony_ci int low, high, down; 856cabdff1aSopenharmony_ci int used_abits = 0; 857cabdff1aSopenharmony_ci int forbid_zero = 1; 858cabdff1aSopenharmony_cirestart: 859cabdff1aSopenharmony_ci init_quantization_noise(c, c->worst_quantization_noise, forbid_zero); 860cabdff1aSopenharmony_ci low = high = c->worst_quantization_noise; 861cabdff1aSopenharmony_ci if (c->consumed_bits > c->frame_bits) { 862cabdff1aSopenharmony_ci while (c->consumed_bits > c->frame_bits) { 863cabdff1aSopenharmony_ci if (used_abits == USED_1ABITS && forbid_zero) { 864cabdff1aSopenharmony_ci forbid_zero = 0; 865cabdff1aSopenharmony_ci goto restart; 866cabdff1aSopenharmony_ci } 867cabdff1aSopenharmony_ci low = high; 868cabdff1aSopenharmony_ci high += snr_fudge; 869cabdff1aSopenharmony_ci used_abits = init_quantization_noise(c, high, forbid_zero); 870cabdff1aSopenharmony_ci } 871cabdff1aSopenharmony_ci } else { 872cabdff1aSopenharmony_ci while (c->consumed_bits <= c->frame_bits) { 873cabdff1aSopenharmony_ci high = low; 874cabdff1aSopenharmony_ci if (used_abits == USED_26ABITS) 875cabdff1aSopenharmony_ci goto out; /* The requested bitrate is too high, pad with zeros */ 876cabdff1aSopenharmony_ci low -= snr_fudge; 877cabdff1aSopenharmony_ci used_abits = init_quantization_noise(c, low, forbid_zero); 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci } 880cabdff1aSopenharmony_ci 881cabdff1aSopenharmony_ci /* Now do a binary search between low and high to see what fits */ 882cabdff1aSopenharmony_ci for (down = snr_fudge >> 1; down; down >>= 1) { 883cabdff1aSopenharmony_ci init_quantization_noise(c, high - down, forbid_zero); 884cabdff1aSopenharmony_ci if (c->consumed_bits <= c->frame_bits) 885cabdff1aSopenharmony_ci high -= down; 886cabdff1aSopenharmony_ci } 887cabdff1aSopenharmony_ci init_quantization_noise(c, high, forbid_zero); 888cabdff1aSopenharmony_ciout: 889cabdff1aSopenharmony_ci c->worst_quantization_noise = high; 890cabdff1aSopenharmony_ci if (high > c->worst_noise_ever) 891cabdff1aSopenharmony_ci c->worst_noise_ever = high; 892cabdff1aSopenharmony_ci} 893cabdff1aSopenharmony_ci 894cabdff1aSopenharmony_cistatic void shift_history(DCAEncContext *c, const int32_t *input) 895cabdff1aSopenharmony_ci{ 896cabdff1aSopenharmony_ci int k, ch; 897cabdff1aSopenharmony_ci 898cabdff1aSopenharmony_ci for (k = 0; k < 512; k++) 899cabdff1aSopenharmony_ci for (ch = 0; ch < c->channels; ch++) { 900cabdff1aSopenharmony_ci const int chi = c->channel_order_tab[ch]; 901cabdff1aSopenharmony_ci 902cabdff1aSopenharmony_ci c->history[ch][k] = input[k * c->channels + chi]; 903cabdff1aSopenharmony_ci } 904cabdff1aSopenharmony_ci} 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_cistatic void fill_in_adpcm_bufer(DCAEncContext *c) 907cabdff1aSopenharmony_ci{ 908cabdff1aSopenharmony_ci int ch, band; 909cabdff1aSopenharmony_ci int32_t step_size; 910cabdff1aSopenharmony_ci /* We fill in ADPCM work buffer for subbands which hasn't been ADPCM coded 911cabdff1aSopenharmony_ci * in current frame - we need this data if subband of next frame is 912cabdff1aSopenharmony_ci * ADPCM 913cabdff1aSopenharmony_ci */ 914cabdff1aSopenharmony_ci for (ch = 0; ch < c->channels; ch++) { 915cabdff1aSopenharmony_ci for (band = 0; band < 32; band++) { 916cabdff1aSopenharmony_ci int32_t *samples = c->subband[ch][band] - DCA_ADPCM_COEFFS; 917cabdff1aSopenharmony_ci if (c->prediction_mode[ch][band] == -1) { 918cabdff1aSopenharmony_ci step_size = get_step_size(c, ch, band); 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci ff_dca_core_dequantize(c->adpcm_history[ch][band], 921cabdff1aSopenharmony_ci c->quantized[ch][band]+12, step_size, 922cabdff1aSopenharmony_ci ff_dca_scale_factor_quant7[c->scale_factor[ch][band]], 0, 4); 923cabdff1aSopenharmony_ci } else { 924cabdff1aSopenharmony_ci AV_COPY128U(c->adpcm_history[ch][band], c->adpcm_history[ch][band]+4); 925cabdff1aSopenharmony_ci } 926cabdff1aSopenharmony_ci /* Copy dequantized values for LPC analysis. 927cabdff1aSopenharmony_ci * It reduces artifacts in case of extreme quantization, 928cabdff1aSopenharmony_ci * example: in current frame abits is 1 and has no prediction flag, 929cabdff1aSopenharmony_ci * but end of this frame is sine like signal. In this case, if LPC analysis uses 930cabdff1aSopenharmony_ci * original values, likely LPC analysis returns good prediction gain, and sets prediction flag. 931cabdff1aSopenharmony_ci * But there are no proper value in decoder history, so likely result will be no good. 932cabdff1aSopenharmony_ci * Bitstream has "Predictor history flag switch", but this flag disables history for all subbands 933cabdff1aSopenharmony_ci */ 934cabdff1aSopenharmony_ci samples[0] = c->adpcm_history[ch][band][0] * (1 << 7); 935cabdff1aSopenharmony_ci samples[1] = c->adpcm_history[ch][band][1] * (1 << 7); 936cabdff1aSopenharmony_ci samples[2] = c->adpcm_history[ch][band][2] * (1 << 7); 937cabdff1aSopenharmony_ci samples[3] = c->adpcm_history[ch][band][3] * (1 << 7); 938cabdff1aSopenharmony_ci } 939cabdff1aSopenharmony_ci } 940cabdff1aSopenharmony_ci} 941cabdff1aSopenharmony_ci 942cabdff1aSopenharmony_cistatic void calc_lfe_scales(DCAEncContext *c) 943cabdff1aSopenharmony_ci{ 944cabdff1aSopenharmony_ci if (c->lfe_channel) 945cabdff1aSopenharmony_ci c->lfe_scale_factor = calc_one_scale(c, c->lfe_peak_cb, 11, &c->lfe_quant); 946cabdff1aSopenharmony_ci} 947cabdff1aSopenharmony_ci 948cabdff1aSopenharmony_cistatic void put_frame_header(DCAEncContext *c) 949cabdff1aSopenharmony_ci{ 950cabdff1aSopenharmony_ci /* SYNC */ 951cabdff1aSopenharmony_ci put_bits(&c->pb, 16, 0x7ffe); 952cabdff1aSopenharmony_ci put_bits(&c->pb, 16, 0x8001); 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_ci /* Frame type: normal */ 955cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 1); 956cabdff1aSopenharmony_ci 957cabdff1aSopenharmony_ci /* Deficit sample count: none */ 958cabdff1aSopenharmony_ci put_bits(&c->pb, 5, 31); 959cabdff1aSopenharmony_ci 960cabdff1aSopenharmony_ci /* CRC is not present */ 961cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 962cabdff1aSopenharmony_ci 963cabdff1aSopenharmony_ci /* Number of PCM sample blocks */ 964cabdff1aSopenharmony_ci put_bits(&c->pb, 7, SUBBAND_SAMPLES - 1); 965cabdff1aSopenharmony_ci 966cabdff1aSopenharmony_ci /* Primary frame byte size */ 967cabdff1aSopenharmony_ci put_bits(&c->pb, 14, c->frame_size - 1); 968cabdff1aSopenharmony_ci 969cabdff1aSopenharmony_ci /* Audio channel arrangement */ 970cabdff1aSopenharmony_ci put_bits(&c->pb, 6, c->channel_config); 971cabdff1aSopenharmony_ci 972cabdff1aSopenharmony_ci /* Core audio sampling frequency */ 973cabdff1aSopenharmony_ci put_bits(&c->pb, 4, bitstream_sfreq[c->samplerate_index]); 974cabdff1aSopenharmony_ci 975cabdff1aSopenharmony_ci /* Transmission bit rate */ 976cabdff1aSopenharmony_ci put_bits(&c->pb, 5, c->bitrate_index); 977cabdff1aSopenharmony_ci 978cabdff1aSopenharmony_ci /* Embedded down mix: disabled */ 979cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci /* Embedded dynamic range flag: not present */ 982cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 983cabdff1aSopenharmony_ci 984cabdff1aSopenharmony_ci /* Embedded time stamp flag: not present */ 985cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 986cabdff1aSopenharmony_ci 987cabdff1aSopenharmony_ci /* Auxiliary data flag: not present */ 988cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_ci /* HDCD source: no */ 991cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 992cabdff1aSopenharmony_ci 993cabdff1aSopenharmony_ci /* Extension audio ID: N/A */ 994cabdff1aSopenharmony_ci put_bits(&c->pb, 3, 0); 995cabdff1aSopenharmony_ci 996cabdff1aSopenharmony_ci /* Extended audio data: not present */ 997cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 998cabdff1aSopenharmony_ci 999cabdff1aSopenharmony_ci /* Audio sync word insertion flag: after each sub-frame */ 1000cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 1001cabdff1aSopenharmony_ci 1002cabdff1aSopenharmony_ci /* Low frequency effects flag: not present or 64x subsampling */ 1003cabdff1aSopenharmony_ci put_bits(&c->pb, 2, c->lfe_channel ? 2 : 0); 1004cabdff1aSopenharmony_ci 1005cabdff1aSopenharmony_ci /* Predictor history switch flag: on */ 1006cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 1); 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci /* No CRC */ 1009cabdff1aSopenharmony_ci /* Multirate interpolator switch: non-perfect reconstruction */ 1010cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 1011cabdff1aSopenharmony_ci 1012cabdff1aSopenharmony_ci /* Encoder software revision: 7 */ 1013cabdff1aSopenharmony_ci put_bits(&c->pb, 4, 7); 1014cabdff1aSopenharmony_ci 1015cabdff1aSopenharmony_ci /* Copy history: 0 */ 1016cabdff1aSopenharmony_ci put_bits(&c->pb, 2, 0); 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_ci /* Source PCM resolution: 16 bits, not DTS ES */ 1019cabdff1aSopenharmony_ci put_bits(&c->pb, 3, 0); 1020cabdff1aSopenharmony_ci 1021cabdff1aSopenharmony_ci /* Front sum/difference coding: no */ 1022cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 1023cabdff1aSopenharmony_ci 1024cabdff1aSopenharmony_ci /* Surrounds sum/difference coding: no */ 1025cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); 1026cabdff1aSopenharmony_ci 1027cabdff1aSopenharmony_ci /* Dialog normalization: 0 dB */ 1028cabdff1aSopenharmony_ci put_bits(&c->pb, 4, 0); 1029cabdff1aSopenharmony_ci} 1030cabdff1aSopenharmony_ci 1031cabdff1aSopenharmony_cistatic void put_primary_audio_header(DCAEncContext *c) 1032cabdff1aSopenharmony_ci{ 1033cabdff1aSopenharmony_ci int ch, i; 1034cabdff1aSopenharmony_ci /* Number of subframes */ 1035cabdff1aSopenharmony_ci put_bits(&c->pb, 4, SUBFRAMES - 1); 1036cabdff1aSopenharmony_ci 1037cabdff1aSopenharmony_ci /* Number of primary audio channels */ 1038cabdff1aSopenharmony_ci put_bits(&c->pb, 3, c->fullband_channels - 1); 1039cabdff1aSopenharmony_ci 1040cabdff1aSopenharmony_ci /* Subband activity count */ 1041cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1042cabdff1aSopenharmony_ci put_bits(&c->pb, 5, DCAENC_SUBBANDS - 2); 1043cabdff1aSopenharmony_ci 1044cabdff1aSopenharmony_ci /* High frequency VQ start subband */ 1045cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1046cabdff1aSopenharmony_ci put_bits(&c->pb, 5, DCAENC_SUBBANDS - 1); 1047cabdff1aSopenharmony_ci 1048cabdff1aSopenharmony_ci /* Joint intensity coding index: 0, 0 */ 1049cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1050cabdff1aSopenharmony_ci put_bits(&c->pb, 3, 0); 1051cabdff1aSopenharmony_ci 1052cabdff1aSopenharmony_ci /* Transient mode codebook: A4, A4 (arbitrary) */ 1053cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1054cabdff1aSopenharmony_ci put_bits(&c->pb, 2, 0); 1055cabdff1aSopenharmony_ci 1056cabdff1aSopenharmony_ci /* Scale factor code book: 7 bit linear, 7-bit sqrt table (for each channel) */ 1057cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1058cabdff1aSopenharmony_ci put_bits(&c->pb, 3, 6); 1059cabdff1aSopenharmony_ci 1060cabdff1aSopenharmony_ci /* Bit allocation quantizer select: linear 5-bit */ 1061cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1062cabdff1aSopenharmony_ci put_bits(&c->pb, 3, c->bit_allocation_sel[ch]); 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci /* Quantization index codebook select */ 1065cabdff1aSopenharmony_ci for (i = 0; i < DCA_CODE_BOOKS; i++) 1066cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1067cabdff1aSopenharmony_ci put_bits(&c->pb, ff_dca_quant_index_sel_nbits[i], c->quant_index_sel[ch][i]); 1068cabdff1aSopenharmony_ci 1069cabdff1aSopenharmony_ci /* Scale factor adjustment index: transmitted in case of Huffman coding */ 1070cabdff1aSopenharmony_ci for (i = 0; i < DCA_CODE_BOOKS; i++) 1071cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1072cabdff1aSopenharmony_ci if (c->quant_index_sel[ch][i] < ff_dca_quant_index_group_size[i]) 1073cabdff1aSopenharmony_ci put_bits(&c->pb, 2, 0); 1074cabdff1aSopenharmony_ci 1075cabdff1aSopenharmony_ci /* Audio header CRC check word: not transmitted */ 1076cabdff1aSopenharmony_ci} 1077cabdff1aSopenharmony_ci 1078cabdff1aSopenharmony_cistatic void put_subframe_samples(DCAEncContext *c, int ss, int band, int ch) 1079cabdff1aSopenharmony_ci{ 1080cabdff1aSopenharmony_ci int i, j, sum, bits, sel; 1081cabdff1aSopenharmony_ci if (c->abits[ch][band] <= DCA_CODE_BOOKS) { 1082cabdff1aSopenharmony_ci av_assert0(c->abits[ch][band] > 0); 1083cabdff1aSopenharmony_ci sel = c->quant_index_sel[ch][c->abits[ch][band] - 1]; 1084cabdff1aSopenharmony_ci // Huffman codes 1085cabdff1aSopenharmony_ci if (sel < ff_dca_quant_index_group_size[c->abits[ch][band] - 1]) { 1086cabdff1aSopenharmony_ci ff_dca_vlc_enc_quant(&c->pb, &c->quantized[ch][band][ss * 8], 8, 1087cabdff1aSopenharmony_ci sel, c->abits[ch][band] - 1); 1088cabdff1aSopenharmony_ci return; 1089cabdff1aSopenharmony_ci } 1090cabdff1aSopenharmony_ci 1091cabdff1aSopenharmony_ci // Block codes 1092cabdff1aSopenharmony_ci if (c->abits[ch][band] <= 7) { 1093cabdff1aSopenharmony_ci for (i = 0; i < 8; i += 4) { 1094cabdff1aSopenharmony_ci sum = 0; 1095cabdff1aSopenharmony_ci for (j = 3; j >= 0; j--) { 1096cabdff1aSopenharmony_ci sum *= ff_dca_quant_levels[c->abits[ch][band]]; 1097cabdff1aSopenharmony_ci sum += c->quantized[ch][band][ss * 8 + i + j]; 1098cabdff1aSopenharmony_ci sum += (ff_dca_quant_levels[c->abits[ch][band]] - 1) / 2; 1099cabdff1aSopenharmony_ci } 1100cabdff1aSopenharmony_ci put_bits(&c->pb, bit_consumption[c->abits[ch][band]] / 4, sum); 1101cabdff1aSopenharmony_ci } 1102cabdff1aSopenharmony_ci return; 1103cabdff1aSopenharmony_ci } 1104cabdff1aSopenharmony_ci } 1105cabdff1aSopenharmony_ci 1106cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) { 1107cabdff1aSopenharmony_ci bits = bit_consumption[c->abits[ch][band]] / 16; 1108cabdff1aSopenharmony_ci put_sbits(&c->pb, bits, c->quantized[ch][band][ss * 8 + i]); 1109cabdff1aSopenharmony_ci } 1110cabdff1aSopenharmony_ci} 1111cabdff1aSopenharmony_ci 1112cabdff1aSopenharmony_cistatic void put_subframe(DCAEncContext *c, int subframe) 1113cabdff1aSopenharmony_ci{ 1114cabdff1aSopenharmony_ci int i, band, ss, ch; 1115cabdff1aSopenharmony_ci 1116cabdff1aSopenharmony_ci /* Subsubframes count */ 1117cabdff1aSopenharmony_ci put_bits(&c->pb, 2, SUBSUBFRAMES -1); 1118cabdff1aSopenharmony_ci 1119cabdff1aSopenharmony_ci /* Partial subsubframe sample count: dummy */ 1120cabdff1aSopenharmony_ci put_bits(&c->pb, 3, 0); 1121cabdff1aSopenharmony_ci 1122cabdff1aSopenharmony_ci /* Prediction mode: no ADPCM, in each channel and subband */ 1123cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1124cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) 1125cabdff1aSopenharmony_ci put_bits(&c->pb, 1, !(c->prediction_mode[ch][band] == -1)); 1126cabdff1aSopenharmony_ci 1127cabdff1aSopenharmony_ci /* Prediction VQ address */ 1128cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1129cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) 1130cabdff1aSopenharmony_ci if (c->prediction_mode[ch][band] >= 0) 1131cabdff1aSopenharmony_ci put_bits(&c->pb, 12, c->prediction_mode[ch][band]); 1132cabdff1aSopenharmony_ci 1133cabdff1aSopenharmony_ci /* Bit allocation index */ 1134cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) { 1135cabdff1aSopenharmony_ci if (c->bit_allocation_sel[ch] == 6) { 1136cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) { 1137cabdff1aSopenharmony_ci put_bits(&c->pb, 5, c->abits[ch][band]); 1138cabdff1aSopenharmony_ci } 1139cabdff1aSopenharmony_ci } else { 1140cabdff1aSopenharmony_ci ff_dca_vlc_enc_alloc(&c->pb, c->abits[ch], DCAENC_SUBBANDS, 1141cabdff1aSopenharmony_ci c->bit_allocation_sel[ch]); 1142cabdff1aSopenharmony_ci } 1143cabdff1aSopenharmony_ci } 1144cabdff1aSopenharmony_ci 1145cabdff1aSopenharmony_ci if (SUBSUBFRAMES > 1) { 1146cabdff1aSopenharmony_ci /* Transition mode: none for each channel and subband */ 1147cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1148cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) 1149cabdff1aSopenharmony_ci if (c->abits[ch][band]) 1150cabdff1aSopenharmony_ci put_bits(&c->pb, 1, 0); /* codebook A4 */ 1151cabdff1aSopenharmony_ci } 1152cabdff1aSopenharmony_ci 1153cabdff1aSopenharmony_ci /* Scale factors */ 1154cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1155cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) 1156cabdff1aSopenharmony_ci if (c->abits[ch][band]) 1157cabdff1aSopenharmony_ci put_bits(&c->pb, 7, c->scale_factor[ch][band]); 1158cabdff1aSopenharmony_ci 1159cabdff1aSopenharmony_ci /* Joint subband scale factor codebook select: not transmitted */ 1160cabdff1aSopenharmony_ci /* Scale factors for joint subband coding: not transmitted */ 1161cabdff1aSopenharmony_ci /* Stereo down-mix coefficients: not transmitted */ 1162cabdff1aSopenharmony_ci /* Dynamic range coefficient: not transmitted */ 1163cabdff1aSopenharmony_ci /* Stde information CRC check word: not transmitted */ 1164cabdff1aSopenharmony_ci /* VQ encoded high frequency subbands: not transmitted */ 1165cabdff1aSopenharmony_ci 1166cabdff1aSopenharmony_ci /* LFE data: 8 samples and scalefactor */ 1167cabdff1aSopenharmony_ci if (c->lfe_channel) { 1168cabdff1aSopenharmony_ci for (i = 0; i < DCA_LFE_SAMPLES; i++) 1169cabdff1aSopenharmony_ci put_bits(&c->pb, 8, quantize_value(c->downsampled_lfe[i], c->lfe_quant) & 0xff); 1170cabdff1aSopenharmony_ci put_bits(&c->pb, 8, c->lfe_scale_factor); 1171cabdff1aSopenharmony_ci } 1172cabdff1aSopenharmony_ci 1173cabdff1aSopenharmony_ci /* Audio data (subsubframes) */ 1174cabdff1aSopenharmony_ci for (ss = 0; ss < SUBSUBFRAMES ; ss++) 1175cabdff1aSopenharmony_ci for (ch = 0; ch < c->fullband_channels; ch++) 1176cabdff1aSopenharmony_ci for (band = 0; band < DCAENC_SUBBANDS; band++) 1177cabdff1aSopenharmony_ci if (c->abits[ch][band]) 1178cabdff1aSopenharmony_ci put_subframe_samples(c, ss, band, ch); 1179cabdff1aSopenharmony_ci 1180cabdff1aSopenharmony_ci /* DSYNC */ 1181cabdff1aSopenharmony_ci put_bits(&c->pb, 16, 0xffff); 1182cabdff1aSopenharmony_ci} 1183cabdff1aSopenharmony_ci 1184cabdff1aSopenharmony_cistatic int encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 1185cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 1186cabdff1aSopenharmony_ci{ 1187cabdff1aSopenharmony_ci DCAEncContext *c = avctx->priv_data; 1188cabdff1aSopenharmony_ci const int32_t *samples; 1189cabdff1aSopenharmony_ci int ret, i; 1190cabdff1aSopenharmony_ci 1191cabdff1aSopenharmony_ci if ((ret = ff_get_encode_buffer(avctx, avpkt, c->frame_size, 0)) < 0) 1192cabdff1aSopenharmony_ci return ret; 1193cabdff1aSopenharmony_ci 1194cabdff1aSopenharmony_ci samples = (const int32_t *)frame->data[0]; 1195cabdff1aSopenharmony_ci 1196cabdff1aSopenharmony_ci subband_transform(c, samples); 1197cabdff1aSopenharmony_ci if (c->lfe_channel) 1198cabdff1aSopenharmony_ci lfe_downsample(c, samples); 1199cabdff1aSopenharmony_ci 1200cabdff1aSopenharmony_ci calc_masking(c, samples); 1201cabdff1aSopenharmony_ci if (c->options.adpcm_mode) 1202cabdff1aSopenharmony_ci adpcm_analysis(c); 1203cabdff1aSopenharmony_ci find_peaks(c); 1204cabdff1aSopenharmony_ci assign_bits(c); 1205cabdff1aSopenharmony_ci calc_lfe_scales(c); 1206cabdff1aSopenharmony_ci shift_history(c, samples); 1207cabdff1aSopenharmony_ci 1208cabdff1aSopenharmony_ci init_put_bits(&c->pb, avpkt->data, avpkt->size); 1209cabdff1aSopenharmony_ci fill_in_adpcm_bufer(c); 1210cabdff1aSopenharmony_ci put_frame_header(c); 1211cabdff1aSopenharmony_ci put_primary_audio_header(c); 1212cabdff1aSopenharmony_ci for (i = 0; i < SUBFRAMES; i++) 1213cabdff1aSopenharmony_ci put_subframe(c, i); 1214cabdff1aSopenharmony_ci 1215cabdff1aSopenharmony_ci flush_put_bits(&c->pb); 1216cabdff1aSopenharmony_ci memset(put_bits_ptr(&c->pb), 0, put_bytes_left(&c->pb, 0)); 1217cabdff1aSopenharmony_ci 1218cabdff1aSopenharmony_ci avpkt->pts = frame->pts; 1219cabdff1aSopenharmony_ci avpkt->duration = ff_samples_to_time_base(avctx, frame->nb_samples); 1220cabdff1aSopenharmony_ci *got_packet_ptr = 1; 1221cabdff1aSopenharmony_ci return 0; 1222cabdff1aSopenharmony_ci} 1223cabdff1aSopenharmony_ci 1224cabdff1aSopenharmony_ci#define DCAENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM 1225cabdff1aSopenharmony_ci 1226cabdff1aSopenharmony_cistatic const AVOption options[] = { 1227cabdff1aSopenharmony_ci { "dca_adpcm", "Use ADPCM encoding", offsetof(DCAEncContext, options.adpcm_mode), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, DCAENC_FLAGS }, 1228cabdff1aSopenharmony_ci { NULL }, 1229cabdff1aSopenharmony_ci}; 1230cabdff1aSopenharmony_ci 1231cabdff1aSopenharmony_cistatic const AVClass dcaenc_class = { 1232cabdff1aSopenharmony_ci .class_name = "DCA (DTS Coherent Acoustics)", 1233cabdff1aSopenharmony_ci .item_name = av_default_item_name, 1234cabdff1aSopenharmony_ci .option = options, 1235cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 1236cabdff1aSopenharmony_ci}; 1237cabdff1aSopenharmony_ci 1238cabdff1aSopenharmony_cistatic const FFCodecDefault defaults[] = { 1239cabdff1aSopenharmony_ci { "b", "1411200" }, 1240cabdff1aSopenharmony_ci { NULL }, 1241cabdff1aSopenharmony_ci}; 1242cabdff1aSopenharmony_ci 1243cabdff1aSopenharmony_ciconst FFCodec ff_dca_encoder = { 1244cabdff1aSopenharmony_ci .p.name = "dca", 1245cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), 1246cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1247cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_DTS, 1248cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_EXPERIMENTAL, 1249cabdff1aSopenharmony_ci .priv_data_size = sizeof(DCAEncContext), 1250cabdff1aSopenharmony_ci .init = encode_init, 1251cabdff1aSopenharmony_ci .close = encode_close, 1252cabdff1aSopenharmony_ci FF_CODEC_ENCODE_CB(encode_frame), 1253cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1254cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32, 1255cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1256cabdff1aSopenharmony_ci .p.supported_samplerates = sample_rates, 1257cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT 1258cabdff1aSopenharmony_ci .p.channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO, 1259cabdff1aSopenharmony_ci AV_CH_LAYOUT_STEREO, 1260cabdff1aSopenharmony_ci AV_CH_LAYOUT_2_2, 1261cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT0, 1262cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT1, 1263cabdff1aSopenharmony_ci 0 }, 1264cabdff1aSopenharmony_ci#endif 1265cabdff1aSopenharmony_ci .p.ch_layouts = (const AVChannelLayout[]){ 1266cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_MONO, 1267cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_STEREO, 1268cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_2_2, 1269cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT0, 1270cabdff1aSopenharmony_ci AV_CHANNEL_LAYOUT_5POINT1, 1271cabdff1aSopenharmony_ci { 0 }, 1272cabdff1aSopenharmony_ci }, 1273cabdff1aSopenharmony_ci .defaults = defaults, 1274cabdff1aSopenharmony_ci .p.priv_class = &dcaenc_class, 1275cabdff1aSopenharmony_ci}; 1276