1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * The simplest mpeg audio layer 2 encoder 3cabdff1aSopenharmony_ci * Copyright (c) 2000, 2001 Fabrice Bellard 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * The simplest mpeg audio layer 2 encoder. 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "avcodec.h" 30cabdff1aSopenharmony_ci#include "encode.h" 31cabdff1aSopenharmony_ci#include "internal.h" 32cabdff1aSopenharmony_ci#include "put_bits.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define FRAC_BITS 15 /* fractional bits for sb_samples and dct */ 35cabdff1aSopenharmony_ci#define WFRAC_BITS 14 /* fractional bits for window */ 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#include "mpegaudio.h" 38cabdff1aSopenharmony_ci#include "mpegaudiodsp.h" 39cabdff1aSopenharmony_ci#include "mpegaudiodata.h" 40cabdff1aSopenharmony_ci#include "mpegaudiotab.h" 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci/* currently, cannot change these constants (need to modify 43cabdff1aSopenharmony_ci quantization stage) */ 44cabdff1aSopenharmony_ci#define MUL(a,b) (((int64_t)(a) * (int64_t)(b)) >> FRAC_BITS) 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define SAMPLES_BUF_SIZE 4096 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_citypedef struct MpegAudioContext { 49cabdff1aSopenharmony_ci PutBitContext pb; 50cabdff1aSopenharmony_ci int nb_channels; 51cabdff1aSopenharmony_ci int lsf; /* 1 if mpeg2 low bitrate selected */ 52cabdff1aSopenharmony_ci int bitrate_index; /* bit rate */ 53cabdff1aSopenharmony_ci int freq_index; 54cabdff1aSopenharmony_ci int frame_size; /* frame size, in bits, without padding */ 55cabdff1aSopenharmony_ci /* padding computation */ 56cabdff1aSopenharmony_ci int frame_frac, frame_frac_incr, do_padding; 57cabdff1aSopenharmony_ci short samples_buf[MPA_MAX_CHANNELS][SAMPLES_BUF_SIZE]; /* buffer for filter */ 58cabdff1aSopenharmony_ci int samples_offset[MPA_MAX_CHANNELS]; /* offset in samples_buf */ 59cabdff1aSopenharmony_ci int sb_samples[MPA_MAX_CHANNELS][3][12][SBLIMIT]; 60cabdff1aSopenharmony_ci unsigned char scale_factors[MPA_MAX_CHANNELS][SBLIMIT][3]; /* scale factors */ 61cabdff1aSopenharmony_ci /* code to group 3 scale factors */ 62cabdff1aSopenharmony_ci unsigned char scale_code[MPA_MAX_CHANNELS][SBLIMIT]; 63cabdff1aSopenharmony_ci int sblimit; /* number of used subbands */ 64cabdff1aSopenharmony_ci const unsigned char *alloc_table; 65cabdff1aSopenharmony_ci int16_t filter_bank[512]; 66cabdff1aSopenharmony_ci int scale_factor_table[64]; 67cabdff1aSopenharmony_ci unsigned char scale_diff_table[128]; 68cabdff1aSopenharmony_ci#if USE_FLOATS 69cabdff1aSopenharmony_ci float scale_factor_inv_table[64]; 70cabdff1aSopenharmony_ci#else 71cabdff1aSopenharmony_ci int8_t scale_factor_shift[64]; 72cabdff1aSopenharmony_ci unsigned short scale_factor_mult[64]; 73cabdff1aSopenharmony_ci#endif 74cabdff1aSopenharmony_ci unsigned short total_quant_bits[17]; /* total number of bits per allocation group */ 75cabdff1aSopenharmony_ci} MpegAudioContext; 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_cistatic av_cold int MPA_encode_init(AVCodecContext *avctx) 78cabdff1aSopenharmony_ci{ 79cabdff1aSopenharmony_ci MpegAudioContext *s = avctx->priv_data; 80cabdff1aSopenharmony_ci int freq = avctx->sample_rate; 81cabdff1aSopenharmony_ci int bitrate = avctx->bit_rate; 82cabdff1aSopenharmony_ci int channels = avctx->ch_layout.nb_channels; 83cabdff1aSopenharmony_ci int i, v, table; 84cabdff1aSopenharmony_ci float a; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci if (channels <= 0 || channels > 2){ 87cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "encoding %d channel(s) is not allowed in mp2\n", channels); 88cabdff1aSopenharmony_ci return AVERROR(EINVAL); 89cabdff1aSopenharmony_ci } 90cabdff1aSopenharmony_ci bitrate = bitrate / 1000; 91cabdff1aSopenharmony_ci s->nb_channels = channels; 92cabdff1aSopenharmony_ci avctx->frame_size = MPA_FRAME_SIZE; 93cabdff1aSopenharmony_ci avctx->initial_padding = 512 - 32 + 1; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci /* encoding freq */ 96cabdff1aSopenharmony_ci s->lsf = 0; 97cabdff1aSopenharmony_ci for(i=0;i<3;i++) { 98cabdff1aSopenharmony_ci if (ff_mpa_freq_tab[i] == freq) 99cabdff1aSopenharmony_ci break; 100cabdff1aSopenharmony_ci if ((ff_mpa_freq_tab[i] / 2) == freq) { 101cabdff1aSopenharmony_ci s->lsf = 1; 102cabdff1aSopenharmony_ci break; 103cabdff1aSopenharmony_ci } 104cabdff1aSopenharmony_ci } 105cabdff1aSopenharmony_ci if (i == 3){ 106cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Sampling rate %d is not allowed in mp2\n", freq); 107cabdff1aSopenharmony_ci return AVERROR(EINVAL); 108cabdff1aSopenharmony_ci } 109cabdff1aSopenharmony_ci s->freq_index = i; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci /* encoding bitrate & frequency */ 112cabdff1aSopenharmony_ci for(i=1;i<15;i++) { 113cabdff1aSopenharmony_ci if (ff_mpa_bitrate_tab[s->lsf][1][i] == bitrate) 114cabdff1aSopenharmony_ci break; 115cabdff1aSopenharmony_ci } 116cabdff1aSopenharmony_ci if (i == 15 && !avctx->bit_rate) { 117cabdff1aSopenharmony_ci i = 14; 118cabdff1aSopenharmony_ci bitrate = ff_mpa_bitrate_tab[s->lsf][1][i]; 119cabdff1aSopenharmony_ci avctx->bit_rate = bitrate * 1000; 120cabdff1aSopenharmony_ci } 121cabdff1aSopenharmony_ci if (i == 15){ 122cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "bitrate %d is not allowed in mp2\n", bitrate); 123cabdff1aSopenharmony_ci return AVERROR(EINVAL); 124cabdff1aSopenharmony_ci } 125cabdff1aSopenharmony_ci s->bitrate_index = i; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci /* compute total header size & pad bit */ 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci a = (float)(bitrate * 1000 * MPA_FRAME_SIZE) / (freq * 8.0); 130cabdff1aSopenharmony_ci s->frame_size = ((int)a) * 8; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ci /* frame fractional size to compute padding */ 133cabdff1aSopenharmony_ci s->frame_frac = 0; 134cabdff1aSopenharmony_ci s->frame_frac_incr = (int)((a - floor(a)) * 65536.0); 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci /* select the right allocation table */ 137cabdff1aSopenharmony_ci table = ff_mpa_l2_select_table(bitrate, s->nb_channels, freq, s->lsf); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci /* number of used subbands */ 140cabdff1aSopenharmony_ci s->sblimit = ff_mpa_sblimit_table[table]; 141cabdff1aSopenharmony_ci s->alloc_table = ff_mpa_alloc_tables[table]; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci ff_dlog(avctx, "%d kb/s, %d Hz, frame_size=%d bits, table=%d, padincr=%x\n", 144cabdff1aSopenharmony_ci bitrate, freq, s->frame_size, table, s->frame_frac_incr); 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci for(i=0;i<s->nb_channels;i++) 147cabdff1aSopenharmony_ci s->samples_offset[i] = 0; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci for(i=0;i<257;i++) { 150cabdff1aSopenharmony_ci int v; 151cabdff1aSopenharmony_ci v = ff_mpa_enwindow[i]; 152cabdff1aSopenharmony_ci#if WFRAC_BITS != 16 153cabdff1aSopenharmony_ci v = (v + (1 << (16 - WFRAC_BITS - 1))) >> (16 - WFRAC_BITS); 154cabdff1aSopenharmony_ci#endif 155cabdff1aSopenharmony_ci s->filter_bank[i] = v; 156cabdff1aSopenharmony_ci if ((i & 63) != 0) 157cabdff1aSopenharmony_ci v = -v; 158cabdff1aSopenharmony_ci if (i != 0) 159cabdff1aSopenharmony_ci s->filter_bank[512 - i] = v; 160cabdff1aSopenharmony_ci } 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci for(i=0;i<64;i++) { 163cabdff1aSopenharmony_ci v = (int)(exp2((3 - i) / 3.0) * (1 << 20)); 164cabdff1aSopenharmony_ci if (v <= 0) 165cabdff1aSopenharmony_ci v = 1; 166cabdff1aSopenharmony_ci s->scale_factor_table[i] = v; 167cabdff1aSopenharmony_ci#if USE_FLOATS 168cabdff1aSopenharmony_ci s->scale_factor_inv_table[i] = exp2(-(3 - i) / 3.0) / (float)(1 << 20); 169cabdff1aSopenharmony_ci#else 170cabdff1aSopenharmony_ci#define P 15 171cabdff1aSopenharmony_ci s->scale_factor_shift[i] = 21 - P - (i / 3); 172cabdff1aSopenharmony_ci s->scale_factor_mult[i] = (1 << P) * exp2((i % 3) / 3.0); 173cabdff1aSopenharmony_ci#endif 174cabdff1aSopenharmony_ci } 175cabdff1aSopenharmony_ci for(i=0;i<128;i++) { 176cabdff1aSopenharmony_ci v = i - 64; 177cabdff1aSopenharmony_ci if (v <= -3) 178cabdff1aSopenharmony_ci v = 0; 179cabdff1aSopenharmony_ci else if (v < 0) 180cabdff1aSopenharmony_ci v = 1; 181cabdff1aSopenharmony_ci else if (v == 0) 182cabdff1aSopenharmony_ci v = 2; 183cabdff1aSopenharmony_ci else if (v < 3) 184cabdff1aSopenharmony_ci v = 3; 185cabdff1aSopenharmony_ci else 186cabdff1aSopenharmony_ci v = 4; 187cabdff1aSopenharmony_ci s->scale_diff_table[i] = v; 188cabdff1aSopenharmony_ci } 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci for(i=0;i<17;i++) { 191cabdff1aSopenharmony_ci v = ff_mpa_quant_bits[i]; 192cabdff1aSopenharmony_ci if (v < 0) 193cabdff1aSopenharmony_ci v = -v; 194cabdff1aSopenharmony_ci else 195cabdff1aSopenharmony_ci v = v * 3; 196cabdff1aSopenharmony_ci s->total_quant_bits[i] = 12 * v; 197cabdff1aSopenharmony_ci } 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci return 0; 200cabdff1aSopenharmony_ci} 201cabdff1aSopenharmony_ci 202cabdff1aSopenharmony_ci/* 32 point floating point IDCT without 1/sqrt(2) coef zero scaling */ 203cabdff1aSopenharmony_cistatic void idct32(int *out, int *tab) 204cabdff1aSopenharmony_ci{ 205cabdff1aSopenharmony_ci int i, j; 206cabdff1aSopenharmony_ci int *t, *t1, xr; 207cabdff1aSopenharmony_ci const int *xp = costab32; 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci for(j=31;j>=3;j-=2) tab[j] += tab[j - 2]; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci t = tab + 30; 212cabdff1aSopenharmony_ci t1 = tab + 2; 213cabdff1aSopenharmony_ci do { 214cabdff1aSopenharmony_ci t[0] += t[-4]; 215cabdff1aSopenharmony_ci t[1] += t[1 - 4]; 216cabdff1aSopenharmony_ci t -= 4; 217cabdff1aSopenharmony_ci } while (t != t1); 218cabdff1aSopenharmony_ci 219cabdff1aSopenharmony_ci t = tab + 28; 220cabdff1aSopenharmony_ci t1 = tab + 4; 221cabdff1aSopenharmony_ci do { 222cabdff1aSopenharmony_ci t[0] += t[-8]; 223cabdff1aSopenharmony_ci t[1] += t[1-8]; 224cabdff1aSopenharmony_ci t[2] += t[2-8]; 225cabdff1aSopenharmony_ci t[3] += t[3-8]; 226cabdff1aSopenharmony_ci t -= 8; 227cabdff1aSopenharmony_ci } while (t != t1); 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci t = tab; 230cabdff1aSopenharmony_ci t1 = tab + 32; 231cabdff1aSopenharmony_ci do { 232cabdff1aSopenharmony_ci t[ 3] = -t[ 3]; 233cabdff1aSopenharmony_ci t[ 6] = -t[ 6]; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci t[11] = -t[11]; 236cabdff1aSopenharmony_ci t[12] = -t[12]; 237cabdff1aSopenharmony_ci t[13] = -t[13]; 238cabdff1aSopenharmony_ci t[15] = -t[15]; 239cabdff1aSopenharmony_ci t += 16; 240cabdff1aSopenharmony_ci } while (t != t1); 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci t = tab; 244cabdff1aSopenharmony_ci t1 = tab + 8; 245cabdff1aSopenharmony_ci do { 246cabdff1aSopenharmony_ci int x1, x2, x3, x4; 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci x3 = MUL(t[16], FIX(M_SQRT2*0.5)); 249cabdff1aSopenharmony_ci x4 = t[0] - x3; 250cabdff1aSopenharmony_ci x3 = t[0] + x3; 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci x2 = MUL(-(t[24] + t[8]), FIX(M_SQRT2*0.5)); 253cabdff1aSopenharmony_ci x1 = MUL((t[8] - x2), xp[0]); 254cabdff1aSopenharmony_ci x2 = MUL((t[8] + x2), xp[1]); 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci t[ 0] = x3 + x1; 257cabdff1aSopenharmony_ci t[ 8] = x4 - x2; 258cabdff1aSopenharmony_ci t[16] = x4 + x2; 259cabdff1aSopenharmony_ci t[24] = x3 - x1; 260cabdff1aSopenharmony_ci t++; 261cabdff1aSopenharmony_ci } while (t != t1); 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci xp += 2; 264cabdff1aSopenharmony_ci t = tab; 265cabdff1aSopenharmony_ci t1 = tab + 4; 266cabdff1aSopenharmony_ci do { 267cabdff1aSopenharmony_ci xr = MUL(t[28],xp[0]); 268cabdff1aSopenharmony_ci t[28] = (t[0] - xr); 269cabdff1aSopenharmony_ci t[0] = (t[0] + xr); 270cabdff1aSopenharmony_ci 271cabdff1aSopenharmony_ci xr = MUL(t[4],xp[1]); 272cabdff1aSopenharmony_ci t[ 4] = (t[24] - xr); 273cabdff1aSopenharmony_ci t[24] = (t[24] + xr); 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci xr = MUL(t[20],xp[2]); 276cabdff1aSopenharmony_ci t[20] = (t[8] - xr); 277cabdff1aSopenharmony_ci t[ 8] = (t[8] + xr); 278cabdff1aSopenharmony_ci 279cabdff1aSopenharmony_ci xr = MUL(t[12],xp[3]); 280cabdff1aSopenharmony_ci t[12] = (t[16] - xr); 281cabdff1aSopenharmony_ci t[16] = (t[16] + xr); 282cabdff1aSopenharmony_ci t++; 283cabdff1aSopenharmony_ci } while (t != t1); 284cabdff1aSopenharmony_ci xp += 4; 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 287cabdff1aSopenharmony_ci xr = MUL(tab[30-i*4],xp[0]); 288cabdff1aSopenharmony_ci tab[30-i*4] = (tab[i*4] - xr); 289cabdff1aSopenharmony_ci tab[ i*4] = (tab[i*4] + xr); 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_ci xr = MUL(tab[ 2+i*4],xp[1]); 292cabdff1aSopenharmony_ci tab[ 2+i*4] = (tab[28-i*4] - xr); 293cabdff1aSopenharmony_ci tab[28-i*4] = (tab[28-i*4] + xr); 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci xr = MUL(tab[31-i*4],xp[0]); 296cabdff1aSopenharmony_ci tab[31-i*4] = (tab[1+i*4] - xr); 297cabdff1aSopenharmony_ci tab[ 1+i*4] = (tab[1+i*4] + xr); 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci xr = MUL(tab[ 3+i*4],xp[1]); 300cabdff1aSopenharmony_ci tab[ 3+i*4] = (tab[29-i*4] - xr); 301cabdff1aSopenharmony_ci tab[29-i*4] = (tab[29-i*4] + xr); 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci xp += 2; 304cabdff1aSopenharmony_ci } 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci t = tab + 30; 307cabdff1aSopenharmony_ci t1 = tab + 1; 308cabdff1aSopenharmony_ci do { 309cabdff1aSopenharmony_ci xr = MUL(t1[0], *xp); 310cabdff1aSopenharmony_ci t1[0] = (t[0] - xr); 311cabdff1aSopenharmony_ci t[0] = (t[0] + xr); 312cabdff1aSopenharmony_ci t -= 2; 313cabdff1aSopenharmony_ci t1 += 2; 314cabdff1aSopenharmony_ci xp++; 315cabdff1aSopenharmony_ci } while (t >= tab); 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci for(i=0;i<32;i++) { 318cabdff1aSopenharmony_ci out[i] = tab[bitinv32[i]]; 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci} 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci#define WSHIFT (WFRAC_BITS + 15 - FRAC_BITS) 323cabdff1aSopenharmony_ci 324cabdff1aSopenharmony_cistatic void filter(MpegAudioContext *s, int ch, const short *samples, int incr) 325cabdff1aSopenharmony_ci{ 326cabdff1aSopenharmony_ci short *p, *q; 327cabdff1aSopenharmony_ci int sum, offset, i, j; 328cabdff1aSopenharmony_ci int tmp[64]; 329cabdff1aSopenharmony_ci int tmp1[32]; 330cabdff1aSopenharmony_ci int *out; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci offset = s->samples_offset[ch]; 333cabdff1aSopenharmony_ci out = &s->sb_samples[ch][0][0][0]; 334cabdff1aSopenharmony_ci for(j=0;j<36;j++) { 335cabdff1aSopenharmony_ci /* 32 samples at once */ 336cabdff1aSopenharmony_ci for(i=0;i<32;i++) { 337cabdff1aSopenharmony_ci s->samples_buf[ch][offset + (31 - i)] = samples[0]; 338cabdff1aSopenharmony_ci samples += incr; 339cabdff1aSopenharmony_ci } 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci /* filter */ 342cabdff1aSopenharmony_ci p = s->samples_buf[ch] + offset; 343cabdff1aSopenharmony_ci q = s->filter_bank; 344cabdff1aSopenharmony_ci /* maxsum = 23169 */ 345cabdff1aSopenharmony_ci for(i=0;i<64;i++) { 346cabdff1aSopenharmony_ci sum = p[0*64] * q[0*64]; 347cabdff1aSopenharmony_ci sum += p[1*64] * q[1*64]; 348cabdff1aSopenharmony_ci sum += p[2*64] * q[2*64]; 349cabdff1aSopenharmony_ci sum += p[3*64] * q[3*64]; 350cabdff1aSopenharmony_ci sum += p[4*64] * q[4*64]; 351cabdff1aSopenharmony_ci sum += p[5*64] * q[5*64]; 352cabdff1aSopenharmony_ci sum += p[6*64] * q[6*64]; 353cabdff1aSopenharmony_ci sum += p[7*64] * q[7*64]; 354cabdff1aSopenharmony_ci tmp[i] = sum; 355cabdff1aSopenharmony_ci p++; 356cabdff1aSopenharmony_ci q++; 357cabdff1aSopenharmony_ci } 358cabdff1aSopenharmony_ci tmp1[0] = tmp[16] >> WSHIFT; 359cabdff1aSopenharmony_ci for( i=1; i<=16; i++ ) tmp1[i] = (tmp[i+16]+tmp[16-i]) >> WSHIFT; 360cabdff1aSopenharmony_ci for( i=17; i<=31; i++ ) tmp1[i] = (tmp[i+16]-tmp[80-i]) >> WSHIFT; 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci idct32(out, tmp1); 363cabdff1aSopenharmony_ci 364cabdff1aSopenharmony_ci /* advance of 32 samples */ 365cabdff1aSopenharmony_ci offset -= 32; 366cabdff1aSopenharmony_ci out += 32; 367cabdff1aSopenharmony_ci /* handle the wrap around */ 368cabdff1aSopenharmony_ci if (offset < 0) { 369cabdff1aSopenharmony_ci memmove(s->samples_buf[ch] + SAMPLES_BUF_SIZE - (512 - 32), 370cabdff1aSopenharmony_ci s->samples_buf[ch], (512 - 32) * 2); 371cabdff1aSopenharmony_ci offset = SAMPLES_BUF_SIZE - 512; 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci } 374cabdff1aSopenharmony_ci s->samples_offset[ch] = offset; 375cabdff1aSopenharmony_ci} 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_cistatic void compute_scale_factors(MpegAudioContext *s, 378cabdff1aSopenharmony_ci unsigned char scale_code[SBLIMIT], 379cabdff1aSopenharmony_ci unsigned char scale_factors[SBLIMIT][3], 380cabdff1aSopenharmony_ci int sb_samples[3][12][SBLIMIT], 381cabdff1aSopenharmony_ci int sblimit) 382cabdff1aSopenharmony_ci{ 383cabdff1aSopenharmony_ci int *p, vmax, v, n, i, j, k, code; 384cabdff1aSopenharmony_ci int index, d1, d2; 385cabdff1aSopenharmony_ci unsigned char *sf = &scale_factors[0][0]; 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci for(j=0;j<sblimit;j++) { 388cabdff1aSopenharmony_ci for(i=0;i<3;i++) { 389cabdff1aSopenharmony_ci /* find the max absolute value */ 390cabdff1aSopenharmony_ci p = &sb_samples[i][0][j]; 391cabdff1aSopenharmony_ci vmax = abs(*p); 392cabdff1aSopenharmony_ci for(k=1;k<12;k++) { 393cabdff1aSopenharmony_ci p += SBLIMIT; 394cabdff1aSopenharmony_ci v = abs(*p); 395cabdff1aSopenharmony_ci if (v > vmax) 396cabdff1aSopenharmony_ci vmax = v; 397cabdff1aSopenharmony_ci } 398cabdff1aSopenharmony_ci /* compute the scale factor index using log 2 computations */ 399cabdff1aSopenharmony_ci if (vmax > 1) { 400cabdff1aSopenharmony_ci n = av_log2(vmax); 401cabdff1aSopenharmony_ci /* n is the position of the MSB of vmax. now 402cabdff1aSopenharmony_ci use at most 2 compares to find the index */ 403cabdff1aSopenharmony_ci index = (21 - n) * 3 - 3; 404cabdff1aSopenharmony_ci if (index >= 0) { 405cabdff1aSopenharmony_ci while (vmax <= s->scale_factor_table[index+1]) 406cabdff1aSopenharmony_ci index++; 407cabdff1aSopenharmony_ci } else { 408cabdff1aSopenharmony_ci index = 0; /* very unlikely case of overflow */ 409cabdff1aSopenharmony_ci } 410cabdff1aSopenharmony_ci } else { 411cabdff1aSopenharmony_ci index = 62; /* value 63 is not allowed */ 412cabdff1aSopenharmony_ci } 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci ff_dlog(NULL, "%2d:%d in=%x %x %d\n", 415cabdff1aSopenharmony_ci j, i, vmax, s->scale_factor_table[index], index); 416cabdff1aSopenharmony_ci /* store the scale factor */ 417cabdff1aSopenharmony_ci av_assert2(index >=0 && index <= 63); 418cabdff1aSopenharmony_ci sf[i] = index; 419cabdff1aSopenharmony_ci } 420cabdff1aSopenharmony_ci 421cabdff1aSopenharmony_ci /* compute the transmission factor : look if the scale factors 422cabdff1aSopenharmony_ci are close enough to each other */ 423cabdff1aSopenharmony_ci d1 = s->scale_diff_table[sf[0] - sf[1] + 64]; 424cabdff1aSopenharmony_ci d2 = s->scale_diff_table[sf[1] - sf[2] + 64]; 425cabdff1aSopenharmony_ci 426cabdff1aSopenharmony_ci /* handle the 25 cases */ 427cabdff1aSopenharmony_ci switch(d1 * 5 + d2) { 428cabdff1aSopenharmony_ci case 0*5+0: 429cabdff1aSopenharmony_ci case 0*5+4: 430cabdff1aSopenharmony_ci case 3*5+4: 431cabdff1aSopenharmony_ci case 4*5+0: 432cabdff1aSopenharmony_ci case 4*5+4: 433cabdff1aSopenharmony_ci code = 0; 434cabdff1aSopenharmony_ci break; 435cabdff1aSopenharmony_ci case 0*5+1: 436cabdff1aSopenharmony_ci case 0*5+2: 437cabdff1aSopenharmony_ci case 4*5+1: 438cabdff1aSopenharmony_ci case 4*5+2: 439cabdff1aSopenharmony_ci code = 3; 440cabdff1aSopenharmony_ci sf[2] = sf[1]; 441cabdff1aSopenharmony_ci break; 442cabdff1aSopenharmony_ci case 0*5+3: 443cabdff1aSopenharmony_ci case 4*5+3: 444cabdff1aSopenharmony_ci code = 3; 445cabdff1aSopenharmony_ci sf[1] = sf[2]; 446cabdff1aSopenharmony_ci break; 447cabdff1aSopenharmony_ci case 1*5+0: 448cabdff1aSopenharmony_ci case 1*5+4: 449cabdff1aSopenharmony_ci case 2*5+4: 450cabdff1aSopenharmony_ci code = 1; 451cabdff1aSopenharmony_ci sf[1] = sf[0]; 452cabdff1aSopenharmony_ci break; 453cabdff1aSopenharmony_ci case 1*5+1: 454cabdff1aSopenharmony_ci case 1*5+2: 455cabdff1aSopenharmony_ci case 2*5+0: 456cabdff1aSopenharmony_ci case 2*5+1: 457cabdff1aSopenharmony_ci case 2*5+2: 458cabdff1aSopenharmony_ci code = 2; 459cabdff1aSopenharmony_ci sf[1] = sf[2] = sf[0]; 460cabdff1aSopenharmony_ci break; 461cabdff1aSopenharmony_ci case 2*5+3: 462cabdff1aSopenharmony_ci case 3*5+3: 463cabdff1aSopenharmony_ci code = 2; 464cabdff1aSopenharmony_ci sf[0] = sf[1] = sf[2]; 465cabdff1aSopenharmony_ci break; 466cabdff1aSopenharmony_ci case 3*5+0: 467cabdff1aSopenharmony_ci case 3*5+1: 468cabdff1aSopenharmony_ci case 3*5+2: 469cabdff1aSopenharmony_ci code = 2; 470cabdff1aSopenharmony_ci sf[0] = sf[2] = sf[1]; 471cabdff1aSopenharmony_ci break; 472cabdff1aSopenharmony_ci case 1*5+3: 473cabdff1aSopenharmony_ci code = 2; 474cabdff1aSopenharmony_ci if (sf[0] > sf[2]) 475cabdff1aSopenharmony_ci sf[0] = sf[2]; 476cabdff1aSopenharmony_ci sf[1] = sf[2] = sf[0]; 477cabdff1aSopenharmony_ci break; 478cabdff1aSopenharmony_ci default: 479cabdff1aSopenharmony_ci av_assert2(0); //cannot happen 480cabdff1aSopenharmony_ci code = 0; /* kill warning */ 481cabdff1aSopenharmony_ci } 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci ff_dlog(NULL, "%d: %2d %2d %2d %d %d -> %d\n", j, 484cabdff1aSopenharmony_ci sf[0], sf[1], sf[2], d1, d2, code); 485cabdff1aSopenharmony_ci scale_code[j] = code; 486cabdff1aSopenharmony_ci sf += 3; 487cabdff1aSopenharmony_ci } 488cabdff1aSopenharmony_ci} 489cabdff1aSopenharmony_ci 490cabdff1aSopenharmony_ci/* The most important function : psycho acoustic module. In this 491cabdff1aSopenharmony_ci encoder there is basically none, so this is the worst you can do, 492cabdff1aSopenharmony_ci but also this is the simpler. */ 493cabdff1aSopenharmony_cistatic void psycho_acoustic_model(MpegAudioContext *s, short smr[SBLIMIT]) 494cabdff1aSopenharmony_ci{ 495cabdff1aSopenharmony_ci int i; 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 498cabdff1aSopenharmony_ci smr[i] = (int)(fixed_smr[i] * 10); 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci} 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci#define SB_NOTALLOCATED 0 504cabdff1aSopenharmony_ci#define SB_ALLOCATED 1 505cabdff1aSopenharmony_ci#define SB_NOMORE 2 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ci/* Try to maximize the smr while using a number of bits inferior to 508cabdff1aSopenharmony_ci the frame size. I tried to make the code simpler, faster and 509cabdff1aSopenharmony_ci smaller than other encoders :-) */ 510cabdff1aSopenharmony_cistatic void compute_bit_allocation(MpegAudioContext *s, 511cabdff1aSopenharmony_ci short smr1[MPA_MAX_CHANNELS][SBLIMIT], 512cabdff1aSopenharmony_ci unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT], 513cabdff1aSopenharmony_ci int *padding) 514cabdff1aSopenharmony_ci{ 515cabdff1aSopenharmony_ci int i, ch, b, max_smr, max_ch, max_sb, current_frame_size, max_frame_size; 516cabdff1aSopenharmony_ci int incr; 517cabdff1aSopenharmony_ci short smr[MPA_MAX_CHANNELS][SBLIMIT]; 518cabdff1aSopenharmony_ci unsigned char subband_status[MPA_MAX_CHANNELS][SBLIMIT]; 519cabdff1aSopenharmony_ci const unsigned char *alloc; 520cabdff1aSopenharmony_ci 521cabdff1aSopenharmony_ci memcpy(smr, smr1, s->nb_channels * sizeof(short) * SBLIMIT); 522cabdff1aSopenharmony_ci memset(subband_status, SB_NOTALLOCATED, s->nb_channels * SBLIMIT); 523cabdff1aSopenharmony_ci memset(bit_alloc, 0, s->nb_channels * SBLIMIT); 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_ci /* compute frame size and padding */ 526cabdff1aSopenharmony_ci max_frame_size = s->frame_size; 527cabdff1aSopenharmony_ci s->frame_frac += s->frame_frac_incr; 528cabdff1aSopenharmony_ci if (s->frame_frac >= 65536) { 529cabdff1aSopenharmony_ci s->frame_frac -= 65536; 530cabdff1aSopenharmony_ci s->do_padding = 1; 531cabdff1aSopenharmony_ci max_frame_size += 8; 532cabdff1aSopenharmony_ci } else { 533cabdff1aSopenharmony_ci s->do_padding = 0; 534cabdff1aSopenharmony_ci } 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci /* compute the header + bit alloc size */ 537cabdff1aSopenharmony_ci current_frame_size = 32; 538cabdff1aSopenharmony_ci alloc = s->alloc_table; 539cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 540cabdff1aSopenharmony_ci incr = alloc[0]; 541cabdff1aSopenharmony_ci current_frame_size += incr * s->nb_channels; 542cabdff1aSopenharmony_ci alloc += 1 << incr; 543cabdff1aSopenharmony_ci } 544cabdff1aSopenharmony_ci for(;;) { 545cabdff1aSopenharmony_ci /* look for the subband with the largest signal to mask ratio */ 546cabdff1aSopenharmony_ci max_sb = -1; 547cabdff1aSopenharmony_ci max_ch = -1; 548cabdff1aSopenharmony_ci max_smr = INT_MIN; 549cabdff1aSopenharmony_ci for(ch=0;ch<s->nb_channels;ch++) { 550cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 551cabdff1aSopenharmony_ci if (smr[ch][i] > max_smr && subband_status[ch][i] != SB_NOMORE) { 552cabdff1aSopenharmony_ci max_smr = smr[ch][i]; 553cabdff1aSopenharmony_ci max_sb = i; 554cabdff1aSopenharmony_ci max_ch = ch; 555cabdff1aSopenharmony_ci } 556cabdff1aSopenharmony_ci } 557cabdff1aSopenharmony_ci } 558cabdff1aSopenharmony_ci if (max_sb < 0) 559cabdff1aSopenharmony_ci break; 560cabdff1aSopenharmony_ci ff_dlog(NULL, "current=%d max=%d max_sb=%d max_ch=%d alloc=%d\n", 561cabdff1aSopenharmony_ci current_frame_size, max_frame_size, max_sb, max_ch, 562cabdff1aSopenharmony_ci bit_alloc[max_ch][max_sb]); 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_ci /* find alloc table entry (XXX: not optimal, should use 565cabdff1aSopenharmony_ci pointer table) */ 566cabdff1aSopenharmony_ci alloc = s->alloc_table; 567cabdff1aSopenharmony_ci for(i=0;i<max_sb;i++) { 568cabdff1aSopenharmony_ci alloc += 1 << alloc[0]; 569cabdff1aSopenharmony_ci } 570cabdff1aSopenharmony_ci 571cabdff1aSopenharmony_ci if (subband_status[max_ch][max_sb] == SB_NOTALLOCATED) { 572cabdff1aSopenharmony_ci /* nothing was coded for this band: add the necessary bits */ 573cabdff1aSopenharmony_ci incr = 2 + nb_scale_factors[s->scale_code[max_ch][max_sb]] * 6; 574cabdff1aSopenharmony_ci incr += s->total_quant_bits[alloc[1]]; 575cabdff1aSopenharmony_ci } else { 576cabdff1aSopenharmony_ci /* increments bit allocation */ 577cabdff1aSopenharmony_ci b = bit_alloc[max_ch][max_sb]; 578cabdff1aSopenharmony_ci incr = s->total_quant_bits[alloc[b + 1]] - 579cabdff1aSopenharmony_ci s->total_quant_bits[alloc[b]]; 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci if (current_frame_size + incr <= max_frame_size) { 583cabdff1aSopenharmony_ci /* can increase size */ 584cabdff1aSopenharmony_ci b = ++bit_alloc[max_ch][max_sb]; 585cabdff1aSopenharmony_ci current_frame_size += incr; 586cabdff1aSopenharmony_ci /* decrease smr by the resolution we added */ 587cabdff1aSopenharmony_ci smr[max_ch][max_sb] = smr1[max_ch][max_sb] - quant_snr[alloc[b]]; 588cabdff1aSopenharmony_ci /* max allocation size reached ? */ 589cabdff1aSopenharmony_ci if (b == ((1 << alloc[0]) - 1)) 590cabdff1aSopenharmony_ci subband_status[max_ch][max_sb] = SB_NOMORE; 591cabdff1aSopenharmony_ci else 592cabdff1aSopenharmony_ci subband_status[max_ch][max_sb] = SB_ALLOCATED; 593cabdff1aSopenharmony_ci } else { 594cabdff1aSopenharmony_ci /* cannot increase the size of this subband */ 595cabdff1aSopenharmony_ci subband_status[max_ch][max_sb] = SB_NOMORE; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci *padding = max_frame_size - current_frame_size; 599cabdff1aSopenharmony_ci av_assert0(*padding >= 0); 600cabdff1aSopenharmony_ci} 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_ci/* 603cabdff1aSopenharmony_ci * Output the MPEG audio layer 2 frame. Note how the code is small 604cabdff1aSopenharmony_ci * compared to other encoders :-) 605cabdff1aSopenharmony_ci */ 606cabdff1aSopenharmony_cistatic void encode_frame(MpegAudioContext *s, 607cabdff1aSopenharmony_ci unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT], 608cabdff1aSopenharmony_ci int padding) 609cabdff1aSopenharmony_ci{ 610cabdff1aSopenharmony_ci int i, j, k, l, bit_alloc_bits, b, ch; 611cabdff1aSopenharmony_ci unsigned char *sf; 612cabdff1aSopenharmony_ci int q[3]; 613cabdff1aSopenharmony_ci PutBitContext *p = &s->pb; 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_ci /* header */ 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci put_bits(p, 12, 0xfff); 618cabdff1aSopenharmony_ci put_bits(p, 1, 1 - s->lsf); /* 1 = MPEG-1 ID, 0 = MPEG-2 lsf ID */ 619cabdff1aSopenharmony_ci put_bits(p, 2, 4-2); /* layer 2 */ 620cabdff1aSopenharmony_ci put_bits(p, 1, 1); /* no error protection */ 621cabdff1aSopenharmony_ci put_bits(p, 4, s->bitrate_index); 622cabdff1aSopenharmony_ci put_bits(p, 2, s->freq_index); 623cabdff1aSopenharmony_ci put_bits(p, 1, s->do_padding); /* use padding */ 624cabdff1aSopenharmony_ci put_bits(p, 1, 0); /* private_bit */ 625cabdff1aSopenharmony_ci put_bits(p, 2, s->nb_channels == 2 ? MPA_STEREO : MPA_MONO); 626cabdff1aSopenharmony_ci put_bits(p, 2, 0); /* mode_ext */ 627cabdff1aSopenharmony_ci put_bits(p, 1, 0); /* no copyright */ 628cabdff1aSopenharmony_ci put_bits(p, 1, 1); /* original */ 629cabdff1aSopenharmony_ci put_bits(p, 2, 0); /* no emphasis */ 630cabdff1aSopenharmony_ci 631cabdff1aSopenharmony_ci /* bit allocation */ 632cabdff1aSopenharmony_ci j = 0; 633cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 634cabdff1aSopenharmony_ci bit_alloc_bits = s->alloc_table[j]; 635cabdff1aSopenharmony_ci for(ch=0;ch<s->nb_channels;ch++) { 636cabdff1aSopenharmony_ci put_bits(p, bit_alloc_bits, bit_alloc[ch][i]); 637cabdff1aSopenharmony_ci } 638cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 639cabdff1aSopenharmony_ci } 640cabdff1aSopenharmony_ci 641cabdff1aSopenharmony_ci /* scale codes */ 642cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 643cabdff1aSopenharmony_ci for(ch=0;ch<s->nb_channels;ch++) { 644cabdff1aSopenharmony_ci if (bit_alloc[ch][i]) 645cabdff1aSopenharmony_ci put_bits(p, 2, s->scale_code[ch][i]); 646cabdff1aSopenharmony_ci } 647cabdff1aSopenharmony_ci } 648cabdff1aSopenharmony_ci 649cabdff1aSopenharmony_ci /* scale factors */ 650cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 651cabdff1aSopenharmony_ci for(ch=0;ch<s->nb_channels;ch++) { 652cabdff1aSopenharmony_ci if (bit_alloc[ch][i]) { 653cabdff1aSopenharmony_ci sf = &s->scale_factors[ch][i][0]; 654cabdff1aSopenharmony_ci switch(s->scale_code[ch][i]) { 655cabdff1aSopenharmony_ci case 0: 656cabdff1aSopenharmony_ci put_bits(p, 6, sf[0]); 657cabdff1aSopenharmony_ci put_bits(p, 6, sf[1]); 658cabdff1aSopenharmony_ci put_bits(p, 6, sf[2]); 659cabdff1aSopenharmony_ci break; 660cabdff1aSopenharmony_ci case 3: 661cabdff1aSopenharmony_ci case 1: 662cabdff1aSopenharmony_ci put_bits(p, 6, sf[0]); 663cabdff1aSopenharmony_ci put_bits(p, 6, sf[2]); 664cabdff1aSopenharmony_ci break; 665cabdff1aSopenharmony_ci case 2: 666cabdff1aSopenharmony_ci put_bits(p, 6, sf[0]); 667cabdff1aSopenharmony_ci break; 668cabdff1aSopenharmony_ci } 669cabdff1aSopenharmony_ci } 670cabdff1aSopenharmony_ci } 671cabdff1aSopenharmony_ci } 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci /* quantization & write sub band samples */ 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_ci for(k=0;k<3;k++) { 676cabdff1aSopenharmony_ci for(l=0;l<12;l+=3) { 677cabdff1aSopenharmony_ci j = 0; 678cabdff1aSopenharmony_ci for(i=0;i<s->sblimit;i++) { 679cabdff1aSopenharmony_ci bit_alloc_bits = s->alloc_table[j]; 680cabdff1aSopenharmony_ci for(ch=0;ch<s->nb_channels;ch++) { 681cabdff1aSopenharmony_ci b = bit_alloc[ch][i]; 682cabdff1aSopenharmony_ci if (b) { 683cabdff1aSopenharmony_ci int qindex, steps, m, sample, bits; 684cabdff1aSopenharmony_ci /* we encode 3 sub band samples of the same sub band at a time */ 685cabdff1aSopenharmony_ci qindex = s->alloc_table[j+b]; 686cabdff1aSopenharmony_ci steps = ff_mpa_quant_steps[qindex]; 687cabdff1aSopenharmony_ci for(m=0;m<3;m++) { 688cabdff1aSopenharmony_ci sample = s->sb_samples[ch][k][l + m][i]; 689cabdff1aSopenharmony_ci /* divide by scale factor */ 690cabdff1aSopenharmony_ci#if USE_FLOATS 691cabdff1aSopenharmony_ci { 692cabdff1aSopenharmony_ci float a; 693cabdff1aSopenharmony_ci a = (float)sample * s->scale_factor_inv_table[s->scale_factors[ch][i][k]]; 694cabdff1aSopenharmony_ci q[m] = (int)((a + 1.0) * steps * 0.5); 695cabdff1aSopenharmony_ci } 696cabdff1aSopenharmony_ci#else 697cabdff1aSopenharmony_ci { 698cabdff1aSopenharmony_ci int q1, e, shift, mult; 699cabdff1aSopenharmony_ci e = s->scale_factors[ch][i][k]; 700cabdff1aSopenharmony_ci shift = s->scale_factor_shift[e]; 701cabdff1aSopenharmony_ci mult = s->scale_factor_mult[e]; 702cabdff1aSopenharmony_ci 703cabdff1aSopenharmony_ci /* normalize to P bits */ 704cabdff1aSopenharmony_ci if (shift < 0) 705cabdff1aSopenharmony_ci q1 = sample * (1 << -shift); 706cabdff1aSopenharmony_ci else 707cabdff1aSopenharmony_ci q1 = sample >> shift; 708cabdff1aSopenharmony_ci q1 = (q1 * mult) >> P; 709cabdff1aSopenharmony_ci q1 += 1 << P; 710cabdff1aSopenharmony_ci if (q1 < 0) 711cabdff1aSopenharmony_ci q1 = 0; 712cabdff1aSopenharmony_ci q[m] = (q1 * (unsigned)steps) >> (P + 1); 713cabdff1aSopenharmony_ci } 714cabdff1aSopenharmony_ci#endif 715cabdff1aSopenharmony_ci if (q[m] >= steps) 716cabdff1aSopenharmony_ci q[m] = steps - 1; 717cabdff1aSopenharmony_ci av_assert2(q[m] >= 0 && q[m] < steps); 718cabdff1aSopenharmony_ci } 719cabdff1aSopenharmony_ci bits = ff_mpa_quant_bits[qindex]; 720cabdff1aSopenharmony_ci if (bits < 0) { 721cabdff1aSopenharmony_ci /* group the 3 values to save bits */ 722cabdff1aSopenharmony_ci put_bits(p, -bits, 723cabdff1aSopenharmony_ci q[0] + steps * (q[1] + steps * q[2])); 724cabdff1aSopenharmony_ci } else { 725cabdff1aSopenharmony_ci put_bits(p, bits, q[0]); 726cabdff1aSopenharmony_ci put_bits(p, bits, q[1]); 727cabdff1aSopenharmony_ci put_bits(p, bits, q[2]); 728cabdff1aSopenharmony_ci } 729cabdff1aSopenharmony_ci } 730cabdff1aSopenharmony_ci } 731cabdff1aSopenharmony_ci /* next subband in alloc table */ 732cabdff1aSopenharmony_ci j += 1 << bit_alloc_bits; 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci } 735cabdff1aSopenharmony_ci } 736cabdff1aSopenharmony_ci 737cabdff1aSopenharmony_ci /* padding */ 738cabdff1aSopenharmony_ci for(i=0;i<padding;i++) 739cabdff1aSopenharmony_ci put_bits(p, 1, 0); 740cabdff1aSopenharmony_ci} 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_cistatic int MPA_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 743cabdff1aSopenharmony_ci const AVFrame *frame, int *got_packet_ptr) 744cabdff1aSopenharmony_ci{ 745cabdff1aSopenharmony_ci MpegAudioContext *s = avctx->priv_data; 746cabdff1aSopenharmony_ci const int16_t *samples = (const int16_t *)frame->data[0]; 747cabdff1aSopenharmony_ci short smr[MPA_MAX_CHANNELS][SBLIMIT]; 748cabdff1aSopenharmony_ci unsigned char bit_alloc[MPA_MAX_CHANNELS][SBLIMIT]; 749cabdff1aSopenharmony_ci int padding, i, ret; 750cabdff1aSopenharmony_ci 751cabdff1aSopenharmony_ci for(i=0;i<s->nb_channels;i++) { 752cabdff1aSopenharmony_ci filter(s, i, samples + i, s->nb_channels); 753cabdff1aSopenharmony_ci } 754cabdff1aSopenharmony_ci 755cabdff1aSopenharmony_ci for(i=0;i<s->nb_channels;i++) { 756cabdff1aSopenharmony_ci compute_scale_factors(s, s->scale_code[i], s->scale_factors[i], 757cabdff1aSopenharmony_ci s->sb_samples[i], s->sblimit); 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci for(i=0;i<s->nb_channels;i++) { 760cabdff1aSopenharmony_ci psycho_acoustic_model(s, smr[i]); 761cabdff1aSopenharmony_ci } 762cabdff1aSopenharmony_ci compute_bit_allocation(s, smr, bit_alloc, &padding); 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci if ((ret = ff_alloc_packet(avctx, avpkt, MPA_MAX_CODED_FRAME_SIZE)) < 0) 765cabdff1aSopenharmony_ci return ret; 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci init_put_bits(&s->pb, avpkt->data, avpkt->size); 768cabdff1aSopenharmony_ci 769cabdff1aSopenharmony_ci encode_frame(s, bit_alloc, padding); 770cabdff1aSopenharmony_ci 771cabdff1aSopenharmony_ci /* flush */ 772cabdff1aSopenharmony_ci flush_put_bits(&s->pb); 773cabdff1aSopenharmony_ci avpkt->size = put_bytes_output(&s->pb); 774cabdff1aSopenharmony_ci 775cabdff1aSopenharmony_ci if (frame->pts != AV_NOPTS_VALUE) 776cabdff1aSopenharmony_ci avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding); 777cabdff1aSopenharmony_ci 778cabdff1aSopenharmony_ci *got_packet_ptr = 1; 779cabdff1aSopenharmony_ci return 0; 780cabdff1aSopenharmony_ci} 781cabdff1aSopenharmony_ci 782cabdff1aSopenharmony_cistatic const FFCodecDefault mp2_defaults[] = { 783cabdff1aSopenharmony_ci { "b", "0" }, 784cabdff1aSopenharmony_ci { NULL }, 785cabdff1aSopenharmony_ci}; 786cabdff1aSopenharmony_ci 787