1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * WMA compatible codec 3cabdff1aSopenharmony_ci * Copyright (c) 2002-2007 The FFmpeg Project 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#include "libavutil/attributes.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "avcodec.h" 25cabdff1aSopenharmony_ci#include "sinewin.h" 26cabdff1aSopenharmony_ci#include "wma.h" 27cabdff1aSopenharmony_ci#include "wma_common.h" 28cabdff1aSopenharmony_ci#include "wma_freqs.h" 29cabdff1aSopenharmony_ci#include "wmadata.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ci/* XXX: use same run/length optimization as mpeg decoders */ 32cabdff1aSopenharmony_ci// FIXME maybe split decode / encode or pass flag 33cabdff1aSopenharmony_cistatic av_cold int init_coef_vlc(VLC *vlc, uint16_t **prun_table, 34cabdff1aSopenharmony_ci float **plevel_table, uint16_t **pint_table, 35cabdff1aSopenharmony_ci const CoefVLCTable *vlc_table) 36cabdff1aSopenharmony_ci{ 37cabdff1aSopenharmony_ci int n = vlc_table->n; 38cabdff1aSopenharmony_ci const uint8_t *table_bits = vlc_table->huffbits; 39cabdff1aSopenharmony_ci const uint32_t *table_codes = vlc_table->huffcodes; 40cabdff1aSopenharmony_ci const uint16_t *levels_table = vlc_table->levels; 41cabdff1aSopenharmony_ci uint16_t *run_table, *int_table; 42cabdff1aSopenharmony_ci float *flevel_table; 43cabdff1aSopenharmony_ci int i, l, j, k, level, ret; 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci ret = init_vlc(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); 46cabdff1aSopenharmony_ci if (ret < 0) 47cabdff1aSopenharmony_ci return ret; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci run_table = av_malloc_array(n, sizeof(uint16_t)); 50cabdff1aSopenharmony_ci flevel_table = av_malloc_array(n, sizeof(*flevel_table)); 51cabdff1aSopenharmony_ci int_table = av_malloc_array(n, sizeof(uint16_t)); 52cabdff1aSopenharmony_ci if (!run_table || !flevel_table || !int_table) { 53cabdff1aSopenharmony_ci av_freep(&run_table); 54cabdff1aSopenharmony_ci av_freep(&flevel_table); 55cabdff1aSopenharmony_ci av_freep(&int_table); 56cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 57cabdff1aSopenharmony_ci } 58cabdff1aSopenharmony_ci i = 2; 59cabdff1aSopenharmony_ci level = 1; 60cabdff1aSopenharmony_ci k = 0; 61cabdff1aSopenharmony_ci while (i < n) { 62cabdff1aSopenharmony_ci int_table[k] = i; 63cabdff1aSopenharmony_ci l = levels_table[k++]; 64cabdff1aSopenharmony_ci for (j = 0; j < l; j++) { 65cabdff1aSopenharmony_ci run_table[i] = j; 66cabdff1aSopenharmony_ci flevel_table[i] = level; 67cabdff1aSopenharmony_ci i++; 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci level++; 70cabdff1aSopenharmony_ci } 71cabdff1aSopenharmony_ci *prun_table = run_table; 72cabdff1aSopenharmony_ci *plevel_table = flevel_table; 73cabdff1aSopenharmony_ci *pint_table = int_table; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci return 0; 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ciav_cold int ff_wma_init(AVCodecContext *avctx, int flags2) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci WMACodecContext *s = avctx->priv_data; 81cabdff1aSopenharmony_ci int channels = avctx->ch_layout.nb_channels; 82cabdff1aSopenharmony_ci int i, ret; 83cabdff1aSopenharmony_ci float bps1, high_freq; 84cabdff1aSopenharmony_ci float bps; 85cabdff1aSopenharmony_ci int sample_rate1; 86cabdff1aSopenharmony_ci int coef_vlc_table; 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci if (avctx->sample_rate <= 0 || avctx->sample_rate > 50000 || 89cabdff1aSopenharmony_ci channels <= 0 || channels > 2 || 90cabdff1aSopenharmony_ci avctx->bit_rate <= 0) 91cabdff1aSopenharmony_ci return -1; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci if (avctx->codec->id == AV_CODEC_ID_WMAV1) 95cabdff1aSopenharmony_ci s->version = 1; 96cabdff1aSopenharmony_ci else 97cabdff1aSopenharmony_ci s->version = 2; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci /* compute MDCT block size */ 100cabdff1aSopenharmony_ci s->frame_len_bits = ff_wma_get_frame_len_bits(avctx->sample_rate, 101cabdff1aSopenharmony_ci s->version, 0); 102cabdff1aSopenharmony_ci s->next_block_len_bits = s->frame_len_bits; 103cabdff1aSopenharmony_ci s->prev_block_len_bits = s->frame_len_bits; 104cabdff1aSopenharmony_ci s->block_len_bits = s->frame_len_bits; 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci s->frame_len = 1 << s->frame_len_bits; 107cabdff1aSopenharmony_ci if (s->use_variable_block_len) { 108cabdff1aSopenharmony_ci int nb_max, nb; 109cabdff1aSopenharmony_ci nb = ((flags2 >> 3) & 3) + 1; 110cabdff1aSopenharmony_ci if ((avctx->bit_rate / channels) >= 32000) 111cabdff1aSopenharmony_ci nb += 2; 112cabdff1aSopenharmony_ci nb_max = s->frame_len_bits - BLOCK_MIN_BITS; 113cabdff1aSopenharmony_ci if (nb > nb_max) 114cabdff1aSopenharmony_ci nb = nb_max; 115cabdff1aSopenharmony_ci s->nb_block_sizes = nb + 1; 116cabdff1aSopenharmony_ci } else 117cabdff1aSopenharmony_ci s->nb_block_sizes = 1; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci /* init rate dependent parameters */ 120cabdff1aSopenharmony_ci s->use_noise_coding = 1; 121cabdff1aSopenharmony_ci high_freq = avctx->sample_rate * 0.5; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci /* if version 2, then the rates are normalized */ 124cabdff1aSopenharmony_ci sample_rate1 = avctx->sample_rate; 125cabdff1aSopenharmony_ci if (s->version == 2) { 126cabdff1aSopenharmony_ci if (sample_rate1 >= 44100) 127cabdff1aSopenharmony_ci sample_rate1 = 44100; 128cabdff1aSopenharmony_ci else if (sample_rate1 >= 22050) 129cabdff1aSopenharmony_ci sample_rate1 = 22050; 130cabdff1aSopenharmony_ci else if (sample_rate1 >= 16000) 131cabdff1aSopenharmony_ci sample_rate1 = 16000; 132cabdff1aSopenharmony_ci else if (sample_rate1 >= 11025) 133cabdff1aSopenharmony_ci sample_rate1 = 11025; 134cabdff1aSopenharmony_ci else if (sample_rate1 >= 8000) 135cabdff1aSopenharmony_ci sample_rate1 = 8000; 136cabdff1aSopenharmony_ci } 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci bps = (float) avctx->bit_rate / 139cabdff1aSopenharmony_ci (float) (channels * avctx->sample_rate); 140cabdff1aSopenharmony_ci s->byte_offset_bits = av_log2((int) (bps * s->frame_len / 8.0 + 0.5)) + 2; 141cabdff1aSopenharmony_ci if (s->byte_offset_bits + 3 > MIN_CACHE_BITS) { 142cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "byte_offset_bits %d is too large\n", s->byte_offset_bits); 143cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 144cabdff1aSopenharmony_ci } 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci /* compute high frequency value and choose if noise coding should 147cabdff1aSopenharmony_ci * be activated */ 148cabdff1aSopenharmony_ci bps1 = bps; 149cabdff1aSopenharmony_ci if (channels == 2) 150cabdff1aSopenharmony_ci bps1 = bps * 1.6; 151cabdff1aSopenharmony_ci if (sample_rate1 == 44100) { 152cabdff1aSopenharmony_ci if (bps1 >= 0.61) 153cabdff1aSopenharmony_ci s->use_noise_coding = 0; 154cabdff1aSopenharmony_ci else 155cabdff1aSopenharmony_ci high_freq = high_freq * 0.4; 156cabdff1aSopenharmony_ci } else if (sample_rate1 == 22050) { 157cabdff1aSopenharmony_ci if (bps1 >= 1.16) 158cabdff1aSopenharmony_ci s->use_noise_coding = 0; 159cabdff1aSopenharmony_ci else if (bps1 >= 0.72) 160cabdff1aSopenharmony_ci high_freq = high_freq * 0.7; 161cabdff1aSopenharmony_ci else 162cabdff1aSopenharmony_ci high_freq = high_freq * 0.6; 163cabdff1aSopenharmony_ci } else if (sample_rate1 == 16000) { 164cabdff1aSopenharmony_ci if (bps > 0.5) 165cabdff1aSopenharmony_ci high_freq = high_freq * 0.5; 166cabdff1aSopenharmony_ci else 167cabdff1aSopenharmony_ci high_freq = high_freq * 0.3; 168cabdff1aSopenharmony_ci } else if (sample_rate1 == 11025) 169cabdff1aSopenharmony_ci high_freq = high_freq * 0.7; 170cabdff1aSopenharmony_ci else if (sample_rate1 == 8000) { 171cabdff1aSopenharmony_ci if (bps <= 0.625) 172cabdff1aSopenharmony_ci high_freq = high_freq * 0.5; 173cabdff1aSopenharmony_ci else if (bps > 0.75) 174cabdff1aSopenharmony_ci s->use_noise_coding = 0; 175cabdff1aSopenharmony_ci else 176cabdff1aSopenharmony_ci high_freq = high_freq * 0.65; 177cabdff1aSopenharmony_ci } else { 178cabdff1aSopenharmony_ci if (bps >= 0.8) 179cabdff1aSopenharmony_ci high_freq = high_freq * 0.75; 180cabdff1aSopenharmony_ci else if (bps >= 0.6) 181cabdff1aSopenharmony_ci high_freq = high_freq * 0.6; 182cabdff1aSopenharmony_ci else 183cabdff1aSopenharmony_ci high_freq = high_freq * 0.5; 184cabdff1aSopenharmony_ci } 185cabdff1aSopenharmony_ci ff_dlog(s->avctx, "flags2=0x%x\n", flags2); 186cabdff1aSopenharmony_ci ff_dlog(s->avctx, "version=%d channels=%d sample_rate=%d bitrate=%"PRId64" block_align=%d\n", 187cabdff1aSopenharmony_ci s->version, channels, avctx->sample_rate, avctx->bit_rate, 188cabdff1aSopenharmony_ci avctx->block_align); 189cabdff1aSopenharmony_ci ff_dlog(s->avctx, "bps=%f bps1=%f high_freq=%f bitoffset=%d\n", 190cabdff1aSopenharmony_ci bps, bps1, high_freq, s->byte_offset_bits); 191cabdff1aSopenharmony_ci ff_dlog(s->avctx, "use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", 192cabdff1aSopenharmony_ci s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci /* compute the scale factor band sizes for each MDCT block size */ 195cabdff1aSopenharmony_ci { 196cabdff1aSopenharmony_ci int a, b, pos, lpos, k, block_len, i, j, n; 197cabdff1aSopenharmony_ci const uint8_t *table; 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci if (s->version == 1) 200cabdff1aSopenharmony_ci s->coefs_start = 3; 201cabdff1aSopenharmony_ci else 202cabdff1aSopenharmony_ci s->coefs_start = 0; 203cabdff1aSopenharmony_ci for (k = 0; k < s->nb_block_sizes; k++) { 204cabdff1aSopenharmony_ci block_len = s->frame_len >> k; 205cabdff1aSopenharmony_ci 206cabdff1aSopenharmony_ci if (s->version == 1) { 207cabdff1aSopenharmony_ci lpos = 0; 208cabdff1aSopenharmony_ci for (i = 0; i < 25; i++) { 209cabdff1aSopenharmony_ci a = ff_wma_critical_freqs[i]; 210cabdff1aSopenharmony_ci b = avctx->sample_rate; 211cabdff1aSopenharmony_ci pos = ((block_len * 2 * a) + (b >> 1)) / b; 212cabdff1aSopenharmony_ci if (pos > block_len) 213cabdff1aSopenharmony_ci pos = block_len; 214cabdff1aSopenharmony_ci s->exponent_bands[0][i] = pos - lpos; 215cabdff1aSopenharmony_ci if (pos >= block_len) { 216cabdff1aSopenharmony_ci i++; 217cabdff1aSopenharmony_ci break; 218cabdff1aSopenharmony_ci } 219cabdff1aSopenharmony_ci lpos = pos; 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci s->exponent_sizes[0] = i; 222cabdff1aSopenharmony_ci } else { 223cabdff1aSopenharmony_ci /* hardcoded tables */ 224cabdff1aSopenharmony_ci table = NULL; 225cabdff1aSopenharmony_ci a = s->frame_len_bits - BLOCK_MIN_BITS - k; 226cabdff1aSopenharmony_ci if (a < 3) { 227cabdff1aSopenharmony_ci if (avctx->sample_rate >= 44100) 228cabdff1aSopenharmony_ci table = exponent_band_44100[a]; 229cabdff1aSopenharmony_ci else if (avctx->sample_rate >= 32000) 230cabdff1aSopenharmony_ci table = exponent_band_32000[a]; 231cabdff1aSopenharmony_ci else if (avctx->sample_rate >= 22050) 232cabdff1aSopenharmony_ci table = exponent_band_22050[a]; 233cabdff1aSopenharmony_ci } 234cabdff1aSopenharmony_ci if (table) { 235cabdff1aSopenharmony_ci n = *table++; 236cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 237cabdff1aSopenharmony_ci s->exponent_bands[k][i] = table[i]; 238cabdff1aSopenharmony_ci s->exponent_sizes[k] = n; 239cabdff1aSopenharmony_ci } else { 240cabdff1aSopenharmony_ci j = 0; 241cabdff1aSopenharmony_ci lpos = 0; 242cabdff1aSopenharmony_ci for (i = 0; i < 25; i++) { 243cabdff1aSopenharmony_ci a = ff_wma_critical_freqs[i]; 244cabdff1aSopenharmony_ci b = avctx->sample_rate; 245cabdff1aSopenharmony_ci pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); 246cabdff1aSopenharmony_ci pos <<= 2; 247cabdff1aSopenharmony_ci if (pos > block_len) 248cabdff1aSopenharmony_ci pos = block_len; 249cabdff1aSopenharmony_ci if (pos > lpos) 250cabdff1aSopenharmony_ci s->exponent_bands[k][j++] = pos - lpos; 251cabdff1aSopenharmony_ci if (pos >= block_len) 252cabdff1aSopenharmony_ci break; 253cabdff1aSopenharmony_ci lpos = pos; 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci s->exponent_sizes[k] = j; 256cabdff1aSopenharmony_ci } 257cabdff1aSopenharmony_ci } 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci /* max number of coefs */ 260cabdff1aSopenharmony_ci s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; 261cabdff1aSopenharmony_ci /* high freq computation */ 262cabdff1aSopenharmony_ci s->high_band_start[k] = (int) ((block_len * 2 * high_freq) / 263cabdff1aSopenharmony_ci avctx->sample_rate + 0.5); 264cabdff1aSopenharmony_ci n = s->exponent_sizes[k]; 265cabdff1aSopenharmony_ci j = 0; 266cabdff1aSopenharmony_ci pos = 0; 267cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 268cabdff1aSopenharmony_ci int start, end; 269cabdff1aSopenharmony_ci start = pos; 270cabdff1aSopenharmony_ci pos += s->exponent_bands[k][i]; 271cabdff1aSopenharmony_ci end = pos; 272cabdff1aSopenharmony_ci if (start < s->high_band_start[k]) 273cabdff1aSopenharmony_ci start = s->high_band_start[k]; 274cabdff1aSopenharmony_ci if (end > s->coefs_end[k]) 275cabdff1aSopenharmony_ci end = s->coefs_end[k]; 276cabdff1aSopenharmony_ci if (end > start) 277cabdff1aSopenharmony_ci s->exponent_high_bands[k][j++] = end - start; 278cabdff1aSopenharmony_ci } 279cabdff1aSopenharmony_ci s->exponent_high_sizes[k] = j; 280cabdff1aSopenharmony_ci } 281cabdff1aSopenharmony_ci } 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci#ifdef TRACE 284cabdff1aSopenharmony_ci { 285cabdff1aSopenharmony_ci int i, j; 286cabdff1aSopenharmony_ci for (i = 0; i < s->nb_block_sizes; i++) { 287cabdff1aSopenharmony_ci ff_tlog(s->avctx, "%5d: n=%2d:", 288cabdff1aSopenharmony_ci s->frame_len >> i, 289cabdff1aSopenharmony_ci s->exponent_sizes[i]); 290cabdff1aSopenharmony_ci for (j = 0; j < s->exponent_sizes[i]; j++) 291cabdff1aSopenharmony_ci ff_tlog(s->avctx, " %d", s->exponent_bands[i][j]); 292cabdff1aSopenharmony_ci ff_tlog(s->avctx, "\n"); 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci } 295cabdff1aSopenharmony_ci#endif /* TRACE */ 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci /* init MDCT windows : simple sine window */ 298cabdff1aSopenharmony_ci for (i = 0; i < s->nb_block_sizes; i++) { 299cabdff1aSopenharmony_ci ff_init_ff_sine_windows(s->frame_len_bits - i); 300cabdff1aSopenharmony_ci s->windows[i] = ff_sine_windows[s->frame_len_bits - i]; 301cabdff1aSopenharmony_ci } 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci s->reset_block_lengths = 1; 304cabdff1aSopenharmony_ci 305cabdff1aSopenharmony_ci if (s->use_noise_coding) { 306cabdff1aSopenharmony_ci /* init the noise generator */ 307cabdff1aSopenharmony_ci if (s->use_exp_vlc) 308cabdff1aSopenharmony_ci s->noise_mult = 0.02; 309cabdff1aSopenharmony_ci else 310cabdff1aSopenharmony_ci s->noise_mult = 0.04; 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci#ifdef TRACE 313cabdff1aSopenharmony_ci for (i = 0; i < NOISE_TAB_SIZE; i++) 314cabdff1aSopenharmony_ci s->noise_table[i] = 1.0 * s->noise_mult; 315cabdff1aSopenharmony_ci#else 316cabdff1aSopenharmony_ci { 317cabdff1aSopenharmony_ci unsigned int seed; 318cabdff1aSopenharmony_ci float norm; 319cabdff1aSopenharmony_ci seed = 1; 320cabdff1aSopenharmony_ci norm = (1.0 / (float) (1LL << 31)) * sqrt(3) * s->noise_mult; 321cabdff1aSopenharmony_ci for (i = 0; i < NOISE_TAB_SIZE; i++) { 322cabdff1aSopenharmony_ci seed = seed * 314159 + 1; 323cabdff1aSopenharmony_ci s->noise_table[i] = (float) ((int) seed) * norm; 324cabdff1aSopenharmony_ci } 325cabdff1aSopenharmony_ci } 326cabdff1aSopenharmony_ci#endif /* TRACE */ 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci 329cabdff1aSopenharmony_ci s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 330cabdff1aSopenharmony_ci if (!s->fdsp) 331cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci /* choose the VLC tables for the coefficients */ 334cabdff1aSopenharmony_ci coef_vlc_table = 2; 335cabdff1aSopenharmony_ci if (avctx->sample_rate >= 32000) { 336cabdff1aSopenharmony_ci if (bps1 < 0.72) 337cabdff1aSopenharmony_ci coef_vlc_table = 0; 338cabdff1aSopenharmony_ci else if (bps1 < 1.16) 339cabdff1aSopenharmony_ci coef_vlc_table = 1; 340cabdff1aSopenharmony_ci } 341cabdff1aSopenharmony_ci s->coef_vlcs[0] = &coef_vlcs[coef_vlc_table * 2]; 342cabdff1aSopenharmony_ci s->coef_vlcs[1] = &coef_vlcs[coef_vlc_table * 2 + 1]; 343cabdff1aSopenharmony_ci ret = init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], 344cabdff1aSopenharmony_ci &s->int_table[0], s->coef_vlcs[0]); 345cabdff1aSopenharmony_ci if (ret < 0) 346cabdff1aSopenharmony_ci return ret; 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci return init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], 349cabdff1aSopenharmony_ci &s->int_table[1], s->coef_vlcs[1]); 350cabdff1aSopenharmony_ci} 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ciint ff_wma_total_gain_to_bits(int total_gain) 353cabdff1aSopenharmony_ci{ 354cabdff1aSopenharmony_ci if (total_gain < 15) 355cabdff1aSopenharmony_ci return 13; 356cabdff1aSopenharmony_ci else if (total_gain < 32) 357cabdff1aSopenharmony_ci return 12; 358cabdff1aSopenharmony_ci else if (total_gain < 40) 359cabdff1aSopenharmony_ci return 11; 360cabdff1aSopenharmony_ci else if (total_gain < 45) 361cabdff1aSopenharmony_ci return 10; 362cabdff1aSopenharmony_ci else 363cabdff1aSopenharmony_ci return 9; 364cabdff1aSopenharmony_ci} 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ciint ff_wma_end(AVCodecContext *avctx) 367cabdff1aSopenharmony_ci{ 368cabdff1aSopenharmony_ci WMACodecContext *s = avctx->priv_data; 369cabdff1aSopenharmony_ci int i; 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci for (i = 0; i < s->nb_block_sizes; i++) 372cabdff1aSopenharmony_ci ff_mdct_end(&s->mdct_ctx[i]); 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci if (s->use_exp_vlc) 375cabdff1aSopenharmony_ci ff_free_vlc(&s->exp_vlc); 376cabdff1aSopenharmony_ci if (s->use_noise_coding) 377cabdff1aSopenharmony_ci ff_free_vlc(&s->hgain_vlc); 378cabdff1aSopenharmony_ci for (i = 0; i < 2; i++) { 379cabdff1aSopenharmony_ci ff_free_vlc(&s->coef_vlc[i]); 380cabdff1aSopenharmony_ci av_freep(&s->run_table[i]); 381cabdff1aSopenharmony_ci av_freep(&s->level_table[i]); 382cabdff1aSopenharmony_ci av_freep(&s->int_table[i]); 383cabdff1aSopenharmony_ci } 384cabdff1aSopenharmony_ci av_freep(&s->fdsp); 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci return 0; 387cabdff1aSopenharmony_ci} 388cabdff1aSopenharmony_ci 389cabdff1aSopenharmony_ci/** 390cabdff1aSopenharmony_ci * Decode an uncompressed coefficient. 391cabdff1aSopenharmony_ci * @param gb GetBitContext 392cabdff1aSopenharmony_ci * @return the decoded coefficient 393cabdff1aSopenharmony_ci */ 394cabdff1aSopenharmony_ciunsigned int ff_wma_get_large_val(GetBitContext *gb) 395cabdff1aSopenharmony_ci{ 396cabdff1aSopenharmony_ci /** consumes up to 34 bits */ 397cabdff1aSopenharmony_ci int n_bits = 8; 398cabdff1aSopenharmony_ci /** decode length */ 399cabdff1aSopenharmony_ci if (get_bits1(gb)) { 400cabdff1aSopenharmony_ci n_bits += 8; 401cabdff1aSopenharmony_ci if (get_bits1(gb)) { 402cabdff1aSopenharmony_ci n_bits += 8; 403cabdff1aSopenharmony_ci if (get_bits1(gb)) 404cabdff1aSopenharmony_ci n_bits += 7; 405cabdff1aSopenharmony_ci } 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci return get_bits_long(gb, n_bits); 408cabdff1aSopenharmony_ci} 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci/** 411cabdff1aSopenharmony_ci * Decode run level compressed coefficients. 412cabdff1aSopenharmony_ci * @param avctx codec context 413cabdff1aSopenharmony_ci * @param gb bitstream reader context 414cabdff1aSopenharmony_ci * @param vlc vlc table for get_vlc2 415cabdff1aSopenharmony_ci * @param level_table level codes 416cabdff1aSopenharmony_ci * @param run_table run codes 417cabdff1aSopenharmony_ci * @param version 0 for wma1,2 1 for wmapro 418cabdff1aSopenharmony_ci * @param ptr output buffer 419cabdff1aSopenharmony_ci * @param offset offset in the output buffer 420cabdff1aSopenharmony_ci * @param num_coefs number of input coefficients 421cabdff1aSopenharmony_ci * @param block_len input buffer length (2^n) 422cabdff1aSopenharmony_ci * @param frame_len_bits number of bits for escaped run codes 423cabdff1aSopenharmony_ci * @param coef_nb_bits number of bits for escaped level codes 424cabdff1aSopenharmony_ci * @return 0 on success, -1 otherwise 425cabdff1aSopenharmony_ci */ 426cabdff1aSopenharmony_ciint ff_wma_run_level_decode(AVCodecContext *avctx, GetBitContext *gb, 427cabdff1aSopenharmony_ci VLC *vlc, const float *level_table, 428cabdff1aSopenharmony_ci const uint16_t *run_table, int version, 429cabdff1aSopenharmony_ci WMACoef *ptr, int offset, int num_coefs, 430cabdff1aSopenharmony_ci int block_len, int frame_len_bits, 431cabdff1aSopenharmony_ci int coef_nb_bits) 432cabdff1aSopenharmony_ci{ 433cabdff1aSopenharmony_ci int code, level, sign; 434cabdff1aSopenharmony_ci const uint32_t *ilvl = (const uint32_t *) level_table; 435cabdff1aSopenharmony_ci uint32_t *iptr = (uint32_t *) ptr; 436cabdff1aSopenharmony_ci const unsigned int coef_mask = block_len - 1; 437cabdff1aSopenharmony_ci for (; offset < num_coefs; offset++) { 438cabdff1aSopenharmony_ci code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX); 439cabdff1aSopenharmony_ci if (code > 1) { 440cabdff1aSopenharmony_ci /** normal code */ 441cabdff1aSopenharmony_ci offset += run_table[code]; 442cabdff1aSopenharmony_ci sign = get_bits1(gb) - 1; 443cabdff1aSopenharmony_ci iptr[offset & coef_mask] = ilvl[code] ^ (sign & 0x80000000); 444cabdff1aSopenharmony_ci } else if (code == 1) { 445cabdff1aSopenharmony_ci /** EOB */ 446cabdff1aSopenharmony_ci break; 447cabdff1aSopenharmony_ci } else { 448cabdff1aSopenharmony_ci /** escape */ 449cabdff1aSopenharmony_ci if (!version) { 450cabdff1aSopenharmony_ci level = get_bits(gb, coef_nb_bits); 451cabdff1aSopenharmony_ci /** NOTE: this is rather suboptimal. reading 452cabdff1aSopenharmony_ci * block_len_bits would be better */ 453cabdff1aSopenharmony_ci offset += get_bits(gb, frame_len_bits); 454cabdff1aSopenharmony_ci } else { 455cabdff1aSopenharmony_ci level = ff_wma_get_large_val(gb); 456cabdff1aSopenharmony_ci /** escape decode */ 457cabdff1aSopenharmony_ci if (get_bits1(gb)) { 458cabdff1aSopenharmony_ci if (get_bits1(gb)) { 459cabdff1aSopenharmony_ci if (get_bits1(gb)) { 460cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 461cabdff1aSopenharmony_ci "broken escape sequence\n"); 462cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 463cabdff1aSopenharmony_ci } else 464cabdff1aSopenharmony_ci offset += get_bits(gb, frame_len_bits) + 4; 465cabdff1aSopenharmony_ci } else 466cabdff1aSopenharmony_ci offset += get_bits(gb, 2) + 1; 467cabdff1aSopenharmony_ci } 468cabdff1aSopenharmony_ci } 469cabdff1aSopenharmony_ci sign = get_bits1(gb) - 1; 470cabdff1aSopenharmony_ci ptr[offset & coef_mask] = (level ^ sign) - sign; 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci } 473cabdff1aSopenharmony_ci /** NOTE: EOB can be omitted */ 474cabdff1aSopenharmony_ci if (offset > num_coefs) { 475cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 476cabdff1aSopenharmony_ci "overflow (%d > %d) in spectral RLE, ignoring\n", 477cabdff1aSopenharmony_ci offset, 478cabdff1aSopenharmony_ci num_coefs 479cabdff1aSopenharmony_ci ); 480cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 481cabdff1aSopenharmony_ci } 482cabdff1aSopenharmony_ci 483cabdff1aSopenharmony_ci return 0; 484cabdff1aSopenharmony_ci} 485