1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * WMA compatible decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2002 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/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * WMA compatible decoder. 25cabdff1aSopenharmony_ci * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2. 26cabdff1aSopenharmony_ci * WMA v1 is identified by audio format 0x160 in Microsoft media files 27cabdff1aSopenharmony_ci * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161. 28cabdff1aSopenharmony_ci * 29cabdff1aSopenharmony_ci * To use this decoder, a calling application must supply the extra data 30cabdff1aSopenharmony_ci * bytes provided with the WMA data. These are the extra, codec-specific 31cabdff1aSopenharmony_ci * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes 32cabdff1aSopenharmony_ci * to the decoder using the extradata[_size] fields in AVCodecContext. There 33cabdff1aSopenharmony_ci * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data. 34cabdff1aSopenharmony_ci */ 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci#include "config_components.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "libavutil/attributes.h" 39cabdff1aSopenharmony_ci#include "libavutil/ffmath.h" 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#include "avcodec.h" 42cabdff1aSopenharmony_ci#include "codec_internal.h" 43cabdff1aSopenharmony_ci#include "internal.h" 44cabdff1aSopenharmony_ci#include "wma.h" 45cabdff1aSopenharmony_ci 46cabdff1aSopenharmony_ci#define EXPVLCBITS 8 47cabdff1aSopenharmony_ci#define EXPMAX ((19 + EXPVLCBITS - 1) / EXPVLCBITS) 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#define HGAINVLCBITS 9 50cabdff1aSopenharmony_ci#define HGAINMAX ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS) 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len); 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci#ifdef TRACE 55cabdff1aSopenharmony_cistatic void dump_floats(WMACodecContext *s, const char *name, 56cabdff1aSopenharmony_ci int prec, const float *tab, int n) 57cabdff1aSopenharmony_ci{ 58cabdff1aSopenharmony_ci int i; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci ff_tlog(s->avctx, "%s[%d]:\n", name, n); 61cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 62cabdff1aSopenharmony_ci if ((i & 7) == 0) 63cabdff1aSopenharmony_ci ff_tlog(s->avctx, "%4d: ", i); 64cabdff1aSopenharmony_ci ff_tlog(s->avctx, " %8.*f", prec, tab[i]); 65cabdff1aSopenharmony_ci if ((i & 7) == 7) 66cabdff1aSopenharmony_ci ff_tlog(s->avctx, "\n"); 67cabdff1aSopenharmony_ci } 68cabdff1aSopenharmony_ci if ((i & 7) != 0) 69cabdff1aSopenharmony_ci ff_tlog(s->avctx, "\n"); 70cabdff1aSopenharmony_ci} 71cabdff1aSopenharmony_ci#endif /* TRACE */ 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_cistatic av_cold int wma_decode_init(AVCodecContext *avctx) 74cabdff1aSopenharmony_ci{ 75cabdff1aSopenharmony_ci WMACodecContext *s = avctx->priv_data; 76cabdff1aSopenharmony_ci int i, flags2, ret; 77cabdff1aSopenharmony_ci uint8_t *extradata; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci if (!avctx->block_align) { 80cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "block_align is not set\n"); 81cabdff1aSopenharmony_ci return AVERROR(EINVAL); 82cabdff1aSopenharmony_ci } 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci s->avctx = avctx; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci /* extract flag info */ 87cabdff1aSopenharmony_ci flags2 = 0; 88cabdff1aSopenharmony_ci extradata = avctx->extradata; 89cabdff1aSopenharmony_ci if (avctx->codec->id == AV_CODEC_ID_WMAV1 && avctx->extradata_size >= 4) 90cabdff1aSopenharmony_ci flags2 = AV_RL16(extradata + 2); 91cabdff1aSopenharmony_ci else if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 6) 92cabdff1aSopenharmony_ci flags2 = AV_RL16(extradata + 4); 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci s->use_exp_vlc = flags2 & 0x0001; 95cabdff1aSopenharmony_ci s->use_bit_reservoir = flags2 & 0x0002; 96cabdff1aSopenharmony_ci s->use_variable_block_len = flags2 & 0x0004; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci if (avctx->codec->id == AV_CODEC_ID_WMAV2 && avctx->extradata_size >= 8){ 99cabdff1aSopenharmony_ci if (AV_RL16(extradata+4)==0xd && s->use_variable_block_len){ 100cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, "Disabling use_variable_block_len, if this fails contact the ffmpeg developers and send us the file\n"); 101cabdff1aSopenharmony_ci s->use_variable_block_len= 0; // this fixes issue1503 102cabdff1aSopenharmony_ci } 103cabdff1aSopenharmony_ci } 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci for (i=0; i<MAX_CHANNELS; i++) 106cabdff1aSopenharmony_ci s->max_exponent[i] = 1.0; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci if ((ret = ff_wma_init(avctx, flags2)) < 0) 109cabdff1aSopenharmony_ci return ret; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci /* init MDCT */ 112cabdff1aSopenharmony_ci for (i = 0; i < s->nb_block_sizes; i++) { 113cabdff1aSopenharmony_ci ret = ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 114cabdff1aSopenharmony_ci 1, 1.0 / 32768.0); 115cabdff1aSopenharmony_ci if (ret < 0) 116cabdff1aSopenharmony_ci return ret; 117cabdff1aSopenharmony_ci } 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci if (s->use_noise_coding) { 120cabdff1aSopenharmony_ci ret = ff_init_vlc_from_lengths(&s->hgain_vlc, HGAINVLCBITS, 121cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(ff_wma_hgain_hufftab), 122cabdff1aSopenharmony_ci &ff_wma_hgain_hufftab[0][1], 2, 123cabdff1aSopenharmony_ci &ff_wma_hgain_hufftab[0][0], 2, 1, 124cabdff1aSopenharmony_ci -18, 0, avctx); 125cabdff1aSopenharmony_ci if (ret < 0) 126cabdff1aSopenharmony_ci return ret; 127cabdff1aSopenharmony_ci } 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci if (s->use_exp_vlc) { 130cabdff1aSopenharmony_ci // FIXME move out of context 131cabdff1aSopenharmony_ci ret = init_vlc(&s->exp_vlc, EXPVLCBITS, sizeof(ff_aac_scalefactor_bits), 132cabdff1aSopenharmony_ci ff_aac_scalefactor_bits, 1, 1, 133cabdff1aSopenharmony_ci ff_aac_scalefactor_code, 4, 4, 0); 134cabdff1aSopenharmony_ci if (ret < 0) 135cabdff1aSopenharmony_ci return ret; 136cabdff1aSopenharmony_ci } else 137cabdff1aSopenharmony_ci wma_lsp_to_curve_init(s, s->frame_len); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci avctx->internal->skip_samples = s->frame_len * 2; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci return 0; 144cabdff1aSopenharmony_ci} 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci/** 147cabdff1aSopenharmony_ci * compute x^-0.25 with an exponent and mantissa table. We use linear 148cabdff1aSopenharmony_ci * interpolation to reduce the mantissa table size at a small speed 149cabdff1aSopenharmony_ci * expense (linear interpolation approximately doubles the number of 150cabdff1aSopenharmony_ci * bits of precision). 151cabdff1aSopenharmony_ci */ 152cabdff1aSopenharmony_cistatic inline float pow_m1_4(WMACodecContext *s, float x) 153cabdff1aSopenharmony_ci{ 154cabdff1aSopenharmony_ci union { 155cabdff1aSopenharmony_ci float f; 156cabdff1aSopenharmony_ci unsigned int v; 157cabdff1aSopenharmony_ci } u, t; 158cabdff1aSopenharmony_ci unsigned int e, m; 159cabdff1aSopenharmony_ci float a, b; 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci u.f = x; 162cabdff1aSopenharmony_ci e = u.v >> 23; 163cabdff1aSopenharmony_ci m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1); 164cabdff1aSopenharmony_ci /* build interpolation scale: 1 <= t < 2. */ 165cabdff1aSopenharmony_ci t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23); 166cabdff1aSopenharmony_ci a = s->lsp_pow_m_table1[m]; 167cabdff1aSopenharmony_ci b = s->lsp_pow_m_table2[m]; 168cabdff1aSopenharmony_ci return s->lsp_pow_e_table[e] * (a + b * t.f); 169cabdff1aSopenharmony_ci} 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_cistatic av_cold void wma_lsp_to_curve_init(WMACodecContext *s, int frame_len) 172cabdff1aSopenharmony_ci{ 173cabdff1aSopenharmony_ci float wdel, a, b; 174cabdff1aSopenharmony_ci int i, e, m; 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci wdel = M_PI / frame_len; 177cabdff1aSopenharmony_ci for (i = 0; i < frame_len; i++) 178cabdff1aSopenharmony_ci s->lsp_cos_table[i] = 2.0f * cos(wdel * i); 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci /* tables for x^-0.25 computation */ 181cabdff1aSopenharmony_ci for (i = 0; i < 256; i++) { 182cabdff1aSopenharmony_ci e = i - 126; 183cabdff1aSopenharmony_ci s->lsp_pow_e_table[i] = exp2f(e * -0.25); 184cabdff1aSopenharmony_ci } 185cabdff1aSopenharmony_ci 186cabdff1aSopenharmony_ci /* NOTE: these two tables are needed to avoid two operations in 187cabdff1aSopenharmony_ci * pow_m1_4 */ 188cabdff1aSopenharmony_ci b = 1.0; 189cabdff1aSopenharmony_ci for (i = (1 << LSP_POW_BITS) - 1; i >= 0; i--) { 190cabdff1aSopenharmony_ci m = (1 << LSP_POW_BITS) + i; 191cabdff1aSopenharmony_ci a = (float) m * (0.5 / (1 << LSP_POW_BITS)); 192cabdff1aSopenharmony_ci a = 1/sqrt(sqrt(a)); 193cabdff1aSopenharmony_ci s->lsp_pow_m_table1[i] = 2 * a - b; 194cabdff1aSopenharmony_ci s->lsp_pow_m_table2[i] = b - a; 195cabdff1aSopenharmony_ci b = a; 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci} 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci/** 200cabdff1aSopenharmony_ci * NOTE: We use the same code as Vorbis here 201cabdff1aSopenharmony_ci * @todo optimize it further with SSE/3Dnow 202cabdff1aSopenharmony_ci */ 203cabdff1aSopenharmony_cistatic void wma_lsp_to_curve(WMACodecContext *s, float *out, float *val_max_ptr, 204cabdff1aSopenharmony_ci int n, float *lsp) 205cabdff1aSopenharmony_ci{ 206cabdff1aSopenharmony_ci int i, j; 207cabdff1aSopenharmony_ci float p, q, w, v, val_max; 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci val_max = 0; 210cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 211cabdff1aSopenharmony_ci p = 0.5f; 212cabdff1aSopenharmony_ci q = 0.5f; 213cabdff1aSopenharmony_ci w = s->lsp_cos_table[i]; 214cabdff1aSopenharmony_ci for (j = 1; j < NB_LSP_COEFS; j += 2) { 215cabdff1aSopenharmony_ci q *= w - lsp[j - 1]; 216cabdff1aSopenharmony_ci p *= w - lsp[j]; 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci p *= p * (2.0f - w); 219cabdff1aSopenharmony_ci q *= q * (2.0f + w); 220cabdff1aSopenharmony_ci v = p + q; 221cabdff1aSopenharmony_ci v = pow_m1_4(s, v); 222cabdff1aSopenharmony_ci if (v > val_max) 223cabdff1aSopenharmony_ci val_max = v; 224cabdff1aSopenharmony_ci out[i] = v; 225cabdff1aSopenharmony_ci } 226cabdff1aSopenharmony_ci *val_max_ptr = val_max; 227cabdff1aSopenharmony_ci} 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_ci/** 230cabdff1aSopenharmony_ci * decode exponents coded with LSP coefficients (same idea as Vorbis) 231cabdff1aSopenharmony_ci */ 232cabdff1aSopenharmony_cistatic void decode_exp_lsp(WMACodecContext *s, int ch) 233cabdff1aSopenharmony_ci{ 234cabdff1aSopenharmony_ci float lsp_coefs[NB_LSP_COEFS]; 235cabdff1aSopenharmony_ci int val, i; 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci for (i = 0; i < NB_LSP_COEFS; i++) { 238cabdff1aSopenharmony_ci if (i == 0 || i >= 8) 239cabdff1aSopenharmony_ci val = get_bits(&s->gb, 3); 240cabdff1aSopenharmony_ci else 241cabdff1aSopenharmony_ci val = get_bits(&s->gb, 4); 242cabdff1aSopenharmony_ci lsp_coefs[i] = ff_wma_lsp_codebook[i][val]; 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch], 246cabdff1aSopenharmony_ci s->block_len, lsp_coefs); 247cabdff1aSopenharmony_ci} 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_ci/** pow(10, i / 16.0) for i in -60..95 */ 250cabdff1aSopenharmony_cistatic const float pow_tab[] = { 251cabdff1aSopenharmony_ci 1.7782794100389e-04, 2.0535250264571e-04, 252cabdff1aSopenharmony_ci 2.3713737056617e-04, 2.7384196342644e-04, 253cabdff1aSopenharmony_ci 3.1622776601684e-04, 3.6517412725484e-04, 254cabdff1aSopenharmony_ci 4.2169650342858e-04, 4.8696752516586e-04, 255cabdff1aSopenharmony_ci 5.6234132519035e-04, 6.4938163157621e-04, 256cabdff1aSopenharmony_ci 7.4989420933246e-04, 8.6596432336006e-04, 257cabdff1aSopenharmony_ci 1.0000000000000e-03, 1.1547819846895e-03, 258cabdff1aSopenharmony_ci 1.3335214321633e-03, 1.5399265260595e-03, 259cabdff1aSopenharmony_ci 1.7782794100389e-03, 2.0535250264571e-03, 260cabdff1aSopenharmony_ci 2.3713737056617e-03, 2.7384196342644e-03, 261cabdff1aSopenharmony_ci 3.1622776601684e-03, 3.6517412725484e-03, 262cabdff1aSopenharmony_ci 4.2169650342858e-03, 4.8696752516586e-03, 263cabdff1aSopenharmony_ci 5.6234132519035e-03, 6.4938163157621e-03, 264cabdff1aSopenharmony_ci 7.4989420933246e-03, 8.6596432336006e-03, 265cabdff1aSopenharmony_ci 1.0000000000000e-02, 1.1547819846895e-02, 266cabdff1aSopenharmony_ci 1.3335214321633e-02, 1.5399265260595e-02, 267cabdff1aSopenharmony_ci 1.7782794100389e-02, 2.0535250264571e-02, 268cabdff1aSopenharmony_ci 2.3713737056617e-02, 2.7384196342644e-02, 269cabdff1aSopenharmony_ci 3.1622776601684e-02, 3.6517412725484e-02, 270cabdff1aSopenharmony_ci 4.2169650342858e-02, 4.8696752516586e-02, 271cabdff1aSopenharmony_ci 5.6234132519035e-02, 6.4938163157621e-02, 272cabdff1aSopenharmony_ci 7.4989420933246e-02, 8.6596432336007e-02, 273cabdff1aSopenharmony_ci 1.0000000000000e-01, 1.1547819846895e-01, 274cabdff1aSopenharmony_ci 1.3335214321633e-01, 1.5399265260595e-01, 275cabdff1aSopenharmony_ci 1.7782794100389e-01, 2.0535250264571e-01, 276cabdff1aSopenharmony_ci 2.3713737056617e-01, 2.7384196342644e-01, 277cabdff1aSopenharmony_ci 3.1622776601684e-01, 3.6517412725484e-01, 278cabdff1aSopenharmony_ci 4.2169650342858e-01, 4.8696752516586e-01, 279cabdff1aSopenharmony_ci 5.6234132519035e-01, 6.4938163157621e-01, 280cabdff1aSopenharmony_ci 7.4989420933246e-01, 8.6596432336007e-01, 281cabdff1aSopenharmony_ci 1.0000000000000e+00, 1.1547819846895e+00, 282cabdff1aSopenharmony_ci 1.3335214321633e+00, 1.5399265260595e+00, 283cabdff1aSopenharmony_ci 1.7782794100389e+00, 2.0535250264571e+00, 284cabdff1aSopenharmony_ci 2.3713737056617e+00, 2.7384196342644e+00, 285cabdff1aSopenharmony_ci 3.1622776601684e+00, 3.6517412725484e+00, 286cabdff1aSopenharmony_ci 4.2169650342858e+00, 4.8696752516586e+00, 287cabdff1aSopenharmony_ci 5.6234132519035e+00, 6.4938163157621e+00, 288cabdff1aSopenharmony_ci 7.4989420933246e+00, 8.6596432336007e+00, 289cabdff1aSopenharmony_ci 1.0000000000000e+01, 1.1547819846895e+01, 290cabdff1aSopenharmony_ci 1.3335214321633e+01, 1.5399265260595e+01, 291cabdff1aSopenharmony_ci 1.7782794100389e+01, 2.0535250264571e+01, 292cabdff1aSopenharmony_ci 2.3713737056617e+01, 2.7384196342644e+01, 293cabdff1aSopenharmony_ci 3.1622776601684e+01, 3.6517412725484e+01, 294cabdff1aSopenharmony_ci 4.2169650342858e+01, 4.8696752516586e+01, 295cabdff1aSopenharmony_ci 5.6234132519035e+01, 6.4938163157621e+01, 296cabdff1aSopenharmony_ci 7.4989420933246e+01, 8.6596432336007e+01, 297cabdff1aSopenharmony_ci 1.0000000000000e+02, 1.1547819846895e+02, 298cabdff1aSopenharmony_ci 1.3335214321633e+02, 1.5399265260595e+02, 299cabdff1aSopenharmony_ci 1.7782794100389e+02, 2.0535250264571e+02, 300cabdff1aSopenharmony_ci 2.3713737056617e+02, 2.7384196342644e+02, 301cabdff1aSopenharmony_ci 3.1622776601684e+02, 3.6517412725484e+02, 302cabdff1aSopenharmony_ci 4.2169650342858e+02, 4.8696752516586e+02, 303cabdff1aSopenharmony_ci 5.6234132519035e+02, 6.4938163157621e+02, 304cabdff1aSopenharmony_ci 7.4989420933246e+02, 8.6596432336007e+02, 305cabdff1aSopenharmony_ci 1.0000000000000e+03, 1.1547819846895e+03, 306cabdff1aSopenharmony_ci 1.3335214321633e+03, 1.5399265260595e+03, 307cabdff1aSopenharmony_ci 1.7782794100389e+03, 2.0535250264571e+03, 308cabdff1aSopenharmony_ci 2.3713737056617e+03, 2.7384196342644e+03, 309cabdff1aSopenharmony_ci 3.1622776601684e+03, 3.6517412725484e+03, 310cabdff1aSopenharmony_ci 4.2169650342858e+03, 4.8696752516586e+03, 311cabdff1aSopenharmony_ci 5.6234132519035e+03, 6.4938163157621e+03, 312cabdff1aSopenharmony_ci 7.4989420933246e+03, 8.6596432336007e+03, 313cabdff1aSopenharmony_ci 1.0000000000000e+04, 1.1547819846895e+04, 314cabdff1aSopenharmony_ci 1.3335214321633e+04, 1.5399265260595e+04, 315cabdff1aSopenharmony_ci 1.7782794100389e+04, 2.0535250264571e+04, 316cabdff1aSopenharmony_ci 2.3713737056617e+04, 2.7384196342644e+04, 317cabdff1aSopenharmony_ci 3.1622776601684e+04, 3.6517412725484e+04, 318cabdff1aSopenharmony_ci 4.2169650342858e+04, 4.8696752516586e+04, 319cabdff1aSopenharmony_ci 5.6234132519035e+04, 6.4938163157621e+04, 320cabdff1aSopenharmony_ci 7.4989420933246e+04, 8.6596432336007e+04, 321cabdff1aSopenharmony_ci 1.0000000000000e+05, 1.1547819846895e+05, 322cabdff1aSopenharmony_ci 1.3335214321633e+05, 1.5399265260595e+05, 323cabdff1aSopenharmony_ci 1.7782794100389e+05, 2.0535250264571e+05, 324cabdff1aSopenharmony_ci 2.3713737056617e+05, 2.7384196342644e+05, 325cabdff1aSopenharmony_ci 3.1622776601684e+05, 3.6517412725484e+05, 326cabdff1aSopenharmony_ci 4.2169650342858e+05, 4.8696752516586e+05, 327cabdff1aSopenharmony_ci 5.6234132519035e+05, 6.4938163157621e+05, 328cabdff1aSopenharmony_ci 7.4989420933246e+05, 8.6596432336007e+05, 329cabdff1aSopenharmony_ci}; 330cabdff1aSopenharmony_ci 331cabdff1aSopenharmony_ci/** 332cabdff1aSopenharmony_ci * decode exponents coded with VLC codes 333cabdff1aSopenharmony_ci */ 334cabdff1aSopenharmony_cistatic int decode_exp_vlc(WMACodecContext *s, int ch) 335cabdff1aSopenharmony_ci{ 336cabdff1aSopenharmony_ci int last_exp, n, code; 337cabdff1aSopenharmony_ci const uint16_t *ptr; 338cabdff1aSopenharmony_ci float v, max_scale; 339cabdff1aSopenharmony_ci uint32_t *q, *q_end, iv; 340cabdff1aSopenharmony_ci const float *ptab = pow_tab + 60; 341cabdff1aSopenharmony_ci const uint32_t *iptab = (const uint32_t *) ptab; 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits]; 344cabdff1aSopenharmony_ci q = (uint32_t *) s->exponents[ch]; 345cabdff1aSopenharmony_ci q_end = q + s->block_len; 346cabdff1aSopenharmony_ci max_scale = 0; 347cabdff1aSopenharmony_ci if (s->version == 1) { 348cabdff1aSopenharmony_ci last_exp = get_bits(&s->gb, 5) + 10; 349cabdff1aSopenharmony_ci v = ptab[last_exp]; 350cabdff1aSopenharmony_ci iv = iptab[last_exp]; 351cabdff1aSopenharmony_ci max_scale = v; 352cabdff1aSopenharmony_ci n = *ptr++; 353cabdff1aSopenharmony_ci switch (n & 3) do { 354cabdff1aSopenharmony_ci case 0: *q++ = iv; 355cabdff1aSopenharmony_ci case 3: *q++ = iv; 356cabdff1aSopenharmony_ci case 2: *q++ = iv; 357cabdff1aSopenharmony_ci case 1: *q++ = iv; 358cabdff1aSopenharmony_ci } while ((n -= 4) > 0); 359cabdff1aSopenharmony_ci } else 360cabdff1aSopenharmony_ci last_exp = 36; 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_ci while (q < q_end) { 363cabdff1aSopenharmony_ci code = get_vlc2(&s->gb, s->exp_vlc.table, EXPVLCBITS, EXPMAX); 364cabdff1aSopenharmony_ci /* NOTE: this offset is the same as MPEG-4 AAC! */ 365cabdff1aSopenharmony_ci last_exp += code - 60; 366cabdff1aSopenharmony_ci if ((unsigned) last_exp + 60 >= FF_ARRAY_ELEMS(pow_tab)) { 367cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Exponent out of range: %d\n", 368cabdff1aSopenharmony_ci last_exp); 369cabdff1aSopenharmony_ci return -1; 370cabdff1aSopenharmony_ci } 371cabdff1aSopenharmony_ci v = ptab[last_exp]; 372cabdff1aSopenharmony_ci iv = iptab[last_exp]; 373cabdff1aSopenharmony_ci if (v > max_scale) 374cabdff1aSopenharmony_ci max_scale = v; 375cabdff1aSopenharmony_ci n = *ptr++; 376cabdff1aSopenharmony_ci switch (n & 3) do { 377cabdff1aSopenharmony_ci case 0: *q++ = iv; 378cabdff1aSopenharmony_ci case 3: *q++ = iv; 379cabdff1aSopenharmony_ci case 2: *q++ = iv; 380cabdff1aSopenharmony_ci case 1: *q++ = iv; 381cabdff1aSopenharmony_ci } while ((n -= 4) > 0); 382cabdff1aSopenharmony_ci } 383cabdff1aSopenharmony_ci s->max_exponent[ch] = max_scale; 384cabdff1aSopenharmony_ci return 0; 385cabdff1aSopenharmony_ci} 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci/** 388cabdff1aSopenharmony_ci * Apply MDCT window and add into output. 389cabdff1aSopenharmony_ci * 390cabdff1aSopenharmony_ci * We ensure that when the windows overlap their squared sum 391cabdff1aSopenharmony_ci * is always 1 (MDCT reconstruction rule). 392cabdff1aSopenharmony_ci */ 393cabdff1aSopenharmony_cistatic void wma_window(WMACodecContext *s, float *out) 394cabdff1aSopenharmony_ci{ 395cabdff1aSopenharmony_ci float *in = s->output; 396cabdff1aSopenharmony_ci int block_len, bsize, n; 397cabdff1aSopenharmony_ci 398cabdff1aSopenharmony_ci /* left part */ 399cabdff1aSopenharmony_ci if (s->block_len_bits <= s->prev_block_len_bits) { 400cabdff1aSopenharmony_ci block_len = s->block_len; 401cabdff1aSopenharmony_ci bsize = s->frame_len_bits - s->block_len_bits; 402cabdff1aSopenharmony_ci 403cabdff1aSopenharmony_ci s->fdsp->vector_fmul_add(out, in, s->windows[bsize], 404cabdff1aSopenharmony_ci out, block_len); 405cabdff1aSopenharmony_ci } else { 406cabdff1aSopenharmony_ci block_len = 1 << s->prev_block_len_bits; 407cabdff1aSopenharmony_ci n = (s->block_len - block_len) / 2; 408cabdff1aSopenharmony_ci bsize = s->frame_len_bits - s->prev_block_len_bits; 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci s->fdsp->vector_fmul_add(out + n, in + n, s->windows[bsize], 411cabdff1aSopenharmony_ci out + n, block_len); 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci memcpy(out + n + block_len, in + n + block_len, n * sizeof(float)); 414cabdff1aSopenharmony_ci } 415cabdff1aSopenharmony_ci 416cabdff1aSopenharmony_ci out += s->block_len; 417cabdff1aSopenharmony_ci in += s->block_len; 418cabdff1aSopenharmony_ci 419cabdff1aSopenharmony_ci /* right part */ 420cabdff1aSopenharmony_ci if (s->block_len_bits <= s->next_block_len_bits) { 421cabdff1aSopenharmony_ci block_len = s->block_len; 422cabdff1aSopenharmony_ci bsize = s->frame_len_bits - s->block_len_bits; 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci s->fdsp->vector_fmul_reverse(out, in, s->windows[bsize], block_len); 425cabdff1aSopenharmony_ci } else { 426cabdff1aSopenharmony_ci block_len = 1 << s->next_block_len_bits; 427cabdff1aSopenharmony_ci n = (s->block_len - block_len) / 2; 428cabdff1aSopenharmony_ci bsize = s->frame_len_bits - s->next_block_len_bits; 429cabdff1aSopenharmony_ci 430cabdff1aSopenharmony_ci memcpy(out, in, n * sizeof(float)); 431cabdff1aSopenharmony_ci 432cabdff1aSopenharmony_ci s->fdsp->vector_fmul_reverse(out + n, in + n, s->windows[bsize], 433cabdff1aSopenharmony_ci block_len); 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci memset(out + n + block_len, 0, n * sizeof(float)); 436cabdff1aSopenharmony_ci } 437cabdff1aSopenharmony_ci} 438cabdff1aSopenharmony_ci 439cabdff1aSopenharmony_ci/** 440cabdff1aSopenharmony_ci * @return 0 if OK. 1 if last block of frame. return -1 if 441cabdff1aSopenharmony_ci * unrecoverable error. 442cabdff1aSopenharmony_ci */ 443cabdff1aSopenharmony_cistatic int wma_decode_block(WMACodecContext *s) 444cabdff1aSopenharmony_ci{ 445cabdff1aSopenharmony_ci int channels = s->avctx->ch_layout.nb_channels; 446cabdff1aSopenharmony_ci int n, v, a, ch, bsize; 447cabdff1aSopenharmony_ci int coef_nb_bits, total_gain; 448cabdff1aSopenharmony_ci int nb_coefs[MAX_CHANNELS]; 449cabdff1aSopenharmony_ci float mdct_norm; 450cabdff1aSopenharmony_ci FFTContext *mdct; 451cabdff1aSopenharmony_ci 452cabdff1aSopenharmony_ci#ifdef TRACE 453cabdff1aSopenharmony_ci ff_tlog(s->avctx, "***decode_block: %d:%d\n", 454cabdff1aSopenharmony_ci s->frame_count - 1, s->block_num); 455cabdff1aSopenharmony_ci#endif /* TRACE */ 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_ci /* compute current block length */ 458cabdff1aSopenharmony_ci if (s->use_variable_block_len) { 459cabdff1aSopenharmony_ci n = av_log2(s->nb_block_sizes - 1) + 1; 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ci if (s->reset_block_lengths) { 462cabdff1aSopenharmony_ci s->reset_block_lengths = 0; 463cabdff1aSopenharmony_ci v = get_bits(&s->gb, n); 464cabdff1aSopenharmony_ci if (v >= s->nb_block_sizes) { 465cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 466cabdff1aSopenharmony_ci "prev_block_len_bits %d out of range\n", 467cabdff1aSopenharmony_ci s->frame_len_bits - v); 468cabdff1aSopenharmony_ci return -1; 469cabdff1aSopenharmony_ci } 470cabdff1aSopenharmony_ci s->prev_block_len_bits = s->frame_len_bits - v; 471cabdff1aSopenharmony_ci v = get_bits(&s->gb, n); 472cabdff1aSopenharmony_ci if (v >= s->nb_block_sizes) { 473cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 474cabdff1aSopenharmony_ci "block_len_bits %d out of range\n", 475cabdff1aSopenharmony_ci s->frame_len_bits - v); 476cabdff1aSopenharmony_ci return -1; 477cabdff1aSopenharmony_ci } 478cabdff1aSopenharmony_ci s->block_len_bits = s->frame_len_bits - v; 479cabdff1aSopenharmony_ci } else { 480cabdff1aSopenharmony_ci /* update block lengths */ 481cabdff1aSopenharmony_ci s->prev_block_len_bits = s->block_len_bits; 482cabdff1aSopenharmony_ci s->block_len_bits = s->next_block_len_bits; 483cabdff1aSopenharmony_ci } 484cabdff1aSopenharmony_ci v = get_bits(&s->gb, n); 485cabdff1aSopenharmony_ci if (v >= s->nb_block_sizes) { 486cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 487cabdff1aSopenharmony_ci "next_block_len_bits %d out of range\n", 488cabdff1aSopenharmony_ci s->frame_len_bits - v); 489cabdff1aSopenharmony_ci return -1; 490cabdff1aSopenharmony_ci } 491cabdff1aSopenharmony_ci s->next_block_len_bits = s->frame_len_bits - v; 492cabdff1aSopenharmony_ci } else { 493cabdff1aSopenharmony_ci /* fixed block len */ 494cabdff1aSopenharmony_ci s->next_block_len_bits = s->frame_len_bits; 495cabdff1aSopenharmony_ci s->prev_block_len_bits = s->frame_len_bits; 496cabdff1aSopenharmony_ci s->block_len_bits = s->frame_len_bits; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci 499cabdff1aSopenharmony_ci if (s->frame_len_bits - s->block_len_bits >= s->nb_block_sizes){ 500cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "block_len_bits not initialized to a valid value\n"); 501cabdff1aSopenharmony_ci return -1; 502cabdff1aSopenharmony_ci } 503cabdff1aSopenharmony_ci 504cabdff1aSopenharmony_ci /* now check if the block length is coherent with the frame length */ 505cabdff1aSopenharmony_ci s->block_len = 1 << s->block_len_bits; 506cabdff1aSopenharmony_ci if ((s->block_pos + s->block_len) > s->frame_len) { 507cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "frame_len overflow\n"); 508cabdff1aSopenharmony_ci return -1; 509cabdff1aSopenharmony_ci } 510cabdff1aSopenharmony_ci 511cabdff1aSopenharmony_ci if (channels == 2) 512cabdff1aSopenharmony_ci s->ms_stereo = get_bits1(&s->gb); 513cabdff1aSopenharmony_ci v = 0; 514cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 515cabdff1aSopenharmony_ci a = get_bits1(&s->gb); 516cabdff1aSopenharmony_ci s->channel_coded[ch] = a; 517cabdff1aSopenharmony_ci v |= a; 518cabdff1aSopenharmony_ci } 519cabdff1aSopenharmony_ci 520cabdff1aSopenharmony_ci bsize = s->frame_len_bits - s->block_len_bits; 521cabdff1aSopenharmony_ci 522cabdff1aSopenharmony_ci /* if no channel coded, no need to go further */ 523cabdff1aSopenharmony_ci /* XXX: fix potential framing problems */ 524cabdff1aSopenharmony_ci if (!v) 525cabdff1aSopenharmony_ci goto next; 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci /* read total gain and extract corresponding number of bits for 528cabdff1aSopenharmony_ci * coef escape coding */ 529cabdff1aSopenharmony_ci total_gain = 1; 530cabdff1aSopenharmony_ci for (;;) { 531cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 7) { 532cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "total_gain overread\n"); 533cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 534cabdff1aSopenharmony_ci } 535cabdff1aSopenharmony_ci a = get_bits(&s->gb, 7); 536cabdff1aSopenharmony_ci total_gain += a; 537cabdff1aSopenharmony_ci if (a != 127) 538cabdff1aSopenharmony_ci break; 539cabdff1aSopenharmony_ci } 540cabdff1aSopenharmony_ci 541cabdff1aSopenharmony_ci coef_nb_bits = ff_wma_total_gain_to_bits(total_gain); 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci /* compute number of coefficients */ 544cabdff1aSopenharmony_ci n = s->coefs_end[bsize] - s->coefs_start; 545cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 546cabdff1aSopenharmony_ci nb_coefs[ch] = n; 547cabdff1aSopenharmony_ci 548cabdff1aSopenharmony_ci /* complex coding */ 549cabdff1aSopenharmony_ci if (s->use_noise_coding) { 550cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 551cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 552cabdff1aSopenharmony_ci int i, n, a; 553cabdff1aSopenharmony_ci n = s->exponent_high_sizes[bsize]; 554cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 555cabdff1aSopenharmony_ci a = get_bits1(&s->gb); 556cabdff1aSopenharmony_ci s->high_band_coded[ch][i] = a; 557cabdff1aSopenharmony_ci /* if noise coding, the coefficients are not transmitted */ 558cabdff1aSopenharmony_ci if (a) 559cabdff1aSopenharmony_ci nb_coefs[ch] -= s->exponent_high_bands[bsize][i]; 560cabdff1aSopenharmony_ci } 561cabdff1aSopenharmony_ci } 562cabdff1aSopenharmony_ci } 563cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 564cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 565cabdff1aSopenharmony_ci int i, n, val; 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci n = s->exponent_high_sizes[bsize]; 568cabdff1aSopenharmony_ci val = (int) 0x80000000; 569cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 570cabdff1aSopenharmony_ci if (s->high_band_coded[ch][i]) { 571cabdff1aSopenharmony_ci if (val == (int) 0x80000000) { 572cabdff1aSopenharmony_ci val = get_bits(&s->gb, 7) - 19; 573cabdff1aSopenharmony_ci } else { 574cabdff1aSopenharmony_ci val += get_vlc2(&s->gb, s->hgain_vlc.table, 575cabdff1aSopenharmony_ci HGAINVLCBITS, HGAINMAX); 576cabdff1aSopenharmony_ci } 577cabdff1aSopenharmony_ci s->high_band_values[ch][i] = val; 578cabdff1aSopenharmony_ci } 579cabdff1aSopenharmony_ci } 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci } 582cabdff1aSopenharmony_ci } 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ci /* exponents can be reused in short blocks. */ 585cabdff1aSopenharmony_ci if ((s->block_len_bits == s->frame_len_bits) || get_bits1(&s->gb)) { 586cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 587cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 588cabdff1aSopenharmony_ci if (s->use_exp_vlc) { 589cabdff1aSopenharmony_ci if (decode_exp_vlc(s, ch) < 0) 590cabdff1aSopenharmony_ci return -1; 591cabdff1aSopenharmony_ci } else { 592cabdff1aSopenharmony_ci decode_exp_lsp(s, ch); 593cabdff1aSopenharmony_ci } 594cabdff1aSopenharmony_ci s->exponents_bsize[ch] = bsize; 595cabdff1aSopenharmony_ci s->exponents_initialized[ch] = 1; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci } 599cabdff1aSopenharmony_ci 600cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 601cabdff1aSopenharmony_ci if (s->channel_coded[ch] && !s->exponents_initialized[ch]) 602cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 603cabdff1aSopenharmony_ci } 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_ci /* parse spectral coefficients : just RLE encoding */ 606cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 607cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 608cabdff1aSopenharmony_ci int tindex; 609cabdff1aSopenharmony_ci WMACoef *ptr = &s->coefs1[ch][0]; 610cabdff1aSopenharmony_ci int ret; 611cabdff1aSopenharmony_ci 612cabdff1aSopenharmony_ci /* special VLC tables are used for ms stereo because 613cabdff1aSopenharmony_ci * there is potentially less energy there */ 614cabdff1aSopenharmony_ci tindex = (ch == 1 && s->ms_stereo); 615cabdff1aSopenharmony_ci memset(ptr, 0, s->block_len * sizeof(WMACoef)); 616cabdff1aSopenharmony_ci ret = ff_wma_run_level_decode(s->avctx, &s->gb, &s->coef_vlc[tindex], 617cabdff1aSopenharmony_ci s->level_table[tindex], s->run_table[tindex], 618cabdff1aSopenharmony_ci 0, ptr, 0, nb_coefs[ch], 619cabdff1aSopenharmony_ci s->block_len, s->frame_len_bits, coef_nb_bits); 620cabdff1aSopenharmony_ci if (ret < 0) 621cabdff1aSopenharmony_ci return ret; 622cabdff1aSopenharmony_ci } 623cabdff1aSopenharmony_ci if (s->version == 1 && channels >= 2) 624cabdff1aSopenharmony_ci align_get_bits(&s->gb); 625cabdff1aSopenharmony_ci } 626cabdff1aSopenharmony_ci 627cabdff1aSopenharmony_ci /* normalize */ 628cabdff1aSopenharmony_ci { 629cabdff1aSopenharmony_ci int n4 = s->block_len / 2; 630cabdff1aSopenharmony_ci mdct_norm = 1.0 / (float) n4; 631cabdff1aSopenharmony_ci if (s->version == 1) 632cabdff1aSopenharmony_ci mdct_norm *= sqrt(n4); 633cabdff1aSopenharmony_ci } 634cabdff1aSopenharmony_ci 635cabdff1aSopenharmony_ci /* finally compute the MDCT coefficients */ 636cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 637cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 638cabdff1aSopenharmony_ci WMACoef *coefs1; 639cabdff1aSopenharmony_ci float *coefs, *exponents, mult, mult1, noise; 640cabdff1aSopenharmony_ci int i, j, n, n1, last_high_band, esize; 641cabdff1aSopenharmony_ci float exp_power[HIGH_BAND_MAX_SIZE]; 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_ci coefs1 = s->coefs1[ch]; 644cabdff1aSopenharmony_ci exponents = s->exponents[ch]; 645cabdff1aSopenharmony_ci esize = s->exponents_bsize[ch]; 646cabdff1aSopenharmony_ci mult = ff_exp10(total_gain * 0.05) / s->max_exponent[ch]; 647cabdff1aSopenharmony_ci mult *= mdct_norm; 648cabdff1aSopenharmony_ci coefs = s->coefs[ch]; 649cabdff1aSopenharmony_ci if (s->use_noise_coding) { 650cabdff1aSopenharmony_ci mult1 = mult; 651cabdff1aSopenharmony_ci /* very low freqs : noise */ 652cabdff1aSopenharmony_ci for (i = 0; i < s->coefs_start; i++) { 653cabdff1aSopenharmony_ci *coefs++ = s->noise_table[s->noise_index] * 654cabdff1aSopenharmony_ci exponents[i << bsize >> esize] * mult1; 655cabdff1aSopenharmony_ci s->noise_index = (s->noise_index + 1) & 656cabdff1aSopenharmony_ci (NOISE_TAB_SIZE - 1); 657cabdff1aSopenharmony_ci } 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci n1 = s->exponent_high_sizes[bsize]; 660cabdff1aSopenharmony_ci 661cabdff1aSopenharmony_ci /* compute power of high bands */ 662cabdff1aSopenharmony_ci exponents = s->exponents[ch] + 663cabdff1aSopenharmony_ci (s->high_band_start[bsize] << bsize >> esize); 664cabdff1aSopenharmony_ci last_high_band = 0; /* avoid warning */ 665cabdff1aSopenharmony_ci for (j = 0; j < n1; j++) { 666cabdff1aSopenharmony_ci n = s->exponent_high_bands[s->frame_len_bits - 667cabdff1aSopenharmony_ci s->block_len_bits][j]; 668cabdff1aSopenharmony_ci if (s->high_band_coded[ch][j]) { 669cabdff1aSopenharmony_ci float e2, v; 670cabdff1aSopenharmony_ci e2 = 0; 671cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 672cabdff1aSopenharmony_ci v = exponents[i << bsize >> esize]; 673cabdff1aSopenharmony_ci e2 += v * v; 674cabdff1aSopenharmony_ci } 675cabdff1aSopenharmony_ci exp_power[j] = e2 / n; 676cabdff1aSopenharmony_ci last_high_band = j; 677cabdff1aSopenharmony_ci ff_tlog(s->avctx, "%d: power=%f (%d)\n", j, exp_power[j], n); 678cabdff1aSopenharmony_ci } 679cabdff1aSopenharmony_ci exponents += n << bsize >> esize; 680cabdff1aSopenharmony_ci } 681cabdff1aSopenharmony_ci 682cabdff1aSopenharmony_ci /* main freqs and high freqs */ 683cabdff1aSopenharmony_ci exponents = s->exponents[ch] + (s->coefs_start << bsize >> esize); 684cabdff1aSopenharmony_ci for (j = -1; j < n1; j++) { 685cabdff1aSopenharmony_ci if (j < 0) 686cabdff1aSopenharmony_ci n = s->high_band_start[bsize] - s->coefs_start; 687cabdff1aSopenharmony_ci else 688cabdff1aSopenharmony_ci n = s->exponent_high_bands[s->frame_len_bits - 689cabdff1aSopenharmony_ci s->block_len_bits][j]; 690cabdff1aSopenharmony_ci if (j >= 0 && s->high_band_coded[ch][j]) { 691cabdff1aSopenharmony_ci /* use noise with specified power */ 692cabdff1aSopenharmony_ci mult1 = sqrt(exp_power[j] / exp_power[last_high_band]); 693cabdff1aSopenharmony_ci /* XXX: use a table */ 694cabdff1aSopenharmony_ci mult1 = mult1 * ff_exp10(s->high_band_values[ch][j] * 0.05); 695cabdff1aSopenharmony_ci mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult); 696cabdff1aSopenharmony_ci mult1 *= mdct_norm; 697cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 698cabdff1aSopenharmony_ci noise = s->noise_table[s->noise_index]; 699cabdff1aSopenharmony_ci s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); 700cabdff1aSopenharmony_ci *coefs++ = noise * exponents[i << bsize >> esize] * mult1; 701cabdff1aSopenharmony_ci } 702cabdff1aSopenharmony_ci exponents += n << bsize >> esize; 703cabdff1aSopenharmony_ci } else { 704cabdff1aSopenharmony_ci /* coded values + small noise */ 705cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 706cabdff1aSopenharmony_ci noise = s->noise_table[s->noise_index]; 707cabdff1aSopenharmony_ci s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); 708cabdff1aSopenharmony_ci *coefs++ = ((*coefs1++) + noise) * 709cabdff1aSopenharmony_ci exponents[i << bsize >> esize] * mult; 710cabdff1aSopenharmony_ci } 711cabdff1aSopenharmony_ci exponents += n << bsize >> esize; 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci } 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_ci /* very high freqs : noise */ 716cabdff1aSopenharmony_ci n = s->block_len - s->coefs_end[bsize]; 717cabdff1aSopenharmony_ci mult1 = mult * exponents[(-(1 << bsize)) >> esize]; 718cabdff1aSopenharmony_ci for (i = 0; i < n; i++) { 719cabdff1aSopenharmony_ci *coefs++ = s->noise_table[s->noise_index] * mult1; 720cabdff1aSopenharmony_ci s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1); 721cabdff1aSopenharmony_ci } 722cabdff1aSopenharmony_ci } else { 723cabdff1aSopenharmony_ci /* XXX: optimize more */ 724cabdff1aSopenharmony_ci for (i = 0; i < s->coefs_start; i++) 725cabdff1aSopenharmony_ci *coefs++ = 0.0; 726cabdff1aSopenharmony_ci n = nb_coefs[ch]; 727cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 728cabdff1aSopenharmony_ci *coefs++ = coefs1[i] * exponents[i << bsize >> esize] * mult; 729cabdff1aSopenharmony_ci n = s->block_len - s->coefs_end[bsize]; 730cabdff1aSopenharmony_ci for (i = 0; i < n; i++) 731cabdff1aSopenharmony_ci *coefs++ = 0.0; 732cabdff1aSopenharmony_ci } 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci } 735cabdff1aSopenharmony_ci 736cabdff1aSopenharmony_ci#ifdef TRACE 737cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 738cabdff1aSopenharmony_ci if (s->channel_coded[ch]) { 739cabdff1aSopenharmony_ci dump_floats(s, "exponents", 3, s->exponents[ch], s->block_len); 740cabdff1aSopenharmony_ci dump_floats(s, "coefs", 1, s->coefs[ch], s->block_len); 741cabdff1aSopenharmony_ci } 742cabdff1aSopenharmony_ci } 743cabdff1aSopenharmony_ci#endif /* TRACE */ 744cabdff1aSopenharmony_ci 745cabdff1aSopenharmony_ci if (s->ms_stereo && s->channel_coded[1]) { 746cabdff1aSopenharmony_ci /* nominal case for ms stereo: we do it before mdct */ 747cabdff1aSopenharmony_ci /* no need to optimize this case because it should almost 748cabdff1aSopenharmony_ci * never happen */ 749cabdff1aSopenharmony_ci if (!s->channel_coded[0]) { 750cabdff1aSopenharmony_ci ff_tlog(s->avctx, "rare ms-stereo case happened\n"); 751cabdff1aSopenharmony_ci memset(s->coefs[0], 0, sizeof(float) * s->block_len); 752cabdff1aSopenharmony_ci s->channel_coded[0] = 1; 753cabdff1aSopenharmony_ci } 754cabdff1aSopenharmony_ci 755cabdff1aSopenharmony_ci s->fdsp->butterflies_float(s->coefs[0], s->coefs[1], s->block_len); 756cabdff1aSopenharmony_ci } 757cabdff1aSopenharmony_ci 758cabdff1aSopenharmony_cinext: 759cabdff1aSopenharmony_ci mdct = &s->mdct_ctx[bsize]; 760cabdff1aSopenharmony_ci 761cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 762cabdff1aSopenharmony_ci int n4, index; 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci n4 = s->block_len / 2; 765cabdff1aSopenharmony_ci if (s->channel_coded[ch]) 766cabdff1aSopenharmony_ci mdct->imdct_calc(mdct, s->output, s->coefs[ch]); 767cabdff1aSopenharmony_ci else if (!(s->ms_stereo && ch == 1)) 768cabdff1aSopenharmony_ci memset(s->output, 0, sizeof(s->output)); 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci /* multiply by the window and add in the frame */ 771cabdff1aSopenharmony_ci index = (s->frame_len / 2) + s->block_pos - n4; 772cabdff1aSopenharmony_ci wma_window(s, &s->frame_out[ch][index]); 773cabdff1aSopenharmony_ci } 774cabdff1aSopenharmony_ci 775cabdff1aSopenharmony_ci /* update block number */ 776cabdff1aSopenharmony_ci s->block_num++; 777cabdff1aSopenharmony_ci s->block_pos += s->block_len; 778cabdff1aSopenharmony_ci if (s->block_pos >= s->frame_len) 779cabdff1aSopenharmony_ci return 1; 780cabdff1aSopenharmony_ci else 781cabdff1aSopenharmony_ci return 0; 782cabdff1aSopenharmony_ci} 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci/* decode a frame of frame_len samples */ 785cabdff1aSopenharmony_cistatic int wma_decode_frame(WMACodecContext *s, float **samples, 786cabdff1aSopenharmony_ci int samples_offset) 787cabdff1aSopenharmony_ci{ 788cabdff1aSopenharmony_ci int ret, ch; 789cabdff1aSopenharmony_ci 790cabdff1aSopenharmony_ci#ifdef TRACE 791cabdff1aSopenharmony_ci ff_tlog(s->avctx, "***decode_frame: %d size=%d\n", 792cabdff1aSopenharmony_ci s->frame_count++, s->frame_len); 793cabdff1aSopenharmony_ci#endif /* TRACE */ 794cabdff1aSopenharmony_ci 795cabdff1aSopenharmony_ci /* read each block */ 796cabdff1aSopenharmony_ci s->block_num = 0; 797cabdff1aSopenharmony_ci s->block_pos = 0; 798cabdff1aSopenharmony_ci for (;;) { 799cabdff1aSopenharmony_ci ret = wma_decode_block(s); 800cabdff1aSopenharmony_ci if (ret < 0) 801cabdff1aSopenharmony_ci return -1; 802cabdff1aSopenharmony_ci if (ret) 803cabdff1aSopenharmony_ci break; 804cabdff1aSopenharmony_ci } 805cabdff1aSopenharmony_ci 806cabdff1aSopenharmony_ci for (ch = 0; ch < s->avctx->ch_layout.nb_channels; ch++) { 807cabdff1aSopenharmony_ci /* copy current block to output */ 808cabdff1aSopenharmony_ci memcpy(samples[ch] + samples_offset, s->frame_out[ch], 809cabdff1aSopenharmony_ci s->frame_len * sizeof(*s->frame_out[ch])); 810cabdff1aSopenharmony_ci /* prepare for next block */ 811cabdff1aSopenharmony_ci memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len], 812cabdff1aSopenharmony_ci s->frame_len * sizeof(*s->frame_out[ch])); 813cabdff1aSopenharmony_ci 814cabdff1aSopenharmony_ci#ifdef TRACE 815cabdff1aSopenharmony_ci dump_floats(s, "samples", 6, samples[ch] + samples_offset, 816cabdff1aSopenharmony_ci s->frame_len); 817cabdff1aSopenharmony_ci#endif /* TRACE */ 818cabdff1aSopenharmony_ci } 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci return 0; 821cabdff1aSopenharmony_ci} 822cabdff1aSopenharmony_ci 823cabdff1aSopenharmony_cistatic int wma_decode_superframe(AVCodecContext *avctx, AVFrame *frame, 824cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 825cabdff1aSopenharmony_ci{ 826cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 827cabdff1aSopenharmony_ci int buf_size = avpkt->size; 828cabdff1aSopenharmony_ci WMACodecContext *s = avctx->priv_data; 829cabdff1aSopenharmony_ci int nb_frames, bit_offset, i, pos, len, ret; 830cabdff1aSopenharmony_ci uint8_t *q; 831cabdff1aSopenharmony_ci float **samples; 832cabdff1aSopenharmony_ci int samples_offset; 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_ci ff_tlog(avctx, "***decode_superframe:\n"); 835cabdff1aSopenharmony_ci 836cabdff1aSopenharmony_ci if (buf_size == 0) { 837cabdff1aSopenharmony_ci if (s->eof_done) 838cabdff1aSopenharmony_ci return 0; 839cabdff1aSopenharmony_ci 840cabdff1aSopenharmony_ci frame->nb_samples = s->frame_len; 841cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 842cabdff1aSopenharmony_ci return ret; 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci for (i = 0; i < s->avctx->ch_layout.nb_channels; i++) 845cabdff1aSopenharmony_ci memcpy(frame->extended_data[i], &s->frame_out[i][0], 846cabdff1aSopenharmony_ci frame->nb_samples * sizeof(s->frame_out[i][0])); 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci s->last_superframe_len = 0; 849cabdff1aSopenharmony_ci s->eof_done = 1; 850cabdff1aSopenharmony_ci *got_frame_ptr = 1; 851cabdff1aSopenharmony_ci return 0; 852cabdff1aSopenharmony_ci } 853cabdff1aSopenharmony_ci if (buf_size < avctx->block_align) { 854cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 855cabdff1aSopenharmony_ci "Input packet size too small (%d < %d)\n", 856cabdff1aSopenharmony_ci buf_size, avctx->block_align); 857cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 858cabdff1aSopenharmony_ci } 859cabdff1aSopenharmony_ci if (avctx->block_align) 860cabdff1aSopenharmony_ci buf_size = avctx->block_align; 861cabdff1aSopenharmony_ci 862cabdff1aSopenharmony_ci init_get_bits(&s->gb, buf, buf_size * 8); 863cabdff1aSopenharmony_ci 864cabdff1aSopenharmony_ci if (s->use_bit_reservoir) { 865cabdff1aSopenharmony_ci /* read super frame header */ 866cabdff1aSopenharmony_ci skip_bits(&s->gb, 4); /* super frame index */ 867cabdff1aSopenharmony_ci nb_frames = get_bits(&s->gb, 4) - (s->last_superframe_len <= 0); 868cabdff1aSopenharmony_ci if (nb_frames <= 0) { 869cabdff1aSopenharmony_ci int is_error = nb_frames < 0 || get_bits_left(&s->gb) <= 8; 870cabdff1aSopenharmony_ci av_log(avctx, is_error ? AV_LOG_ERROR : AV_LOG_WARNING, 871cabdff1aSopenharmony_ci "nb_frames is %d bits left %d\n", 872cabdff1aSopenharmony_ci nb_frames, get_bits_left(&s->gb)); 873cabdff1aSopenharmony_ci if (is_error) 874cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 875cabdff1aSopenharmony_ci 876cabdff1aSopenharmony_ci if ((s->last_superframe_len + buf_size - 1) > 877cabdff1aSopenharmony_ci MAX_CODED_SUPERFRAME_SIZE) 878cabdff1aSopenharmony_ci goto fail; 879cabdff1aSopenharmony_ci 880cabdff1aSopenharmony_ci q = s->last_superframe + s->last_superframe_len; 881cabdff1aSopenharmony_ci len = buf_size - 1; 882cabdff1aSopenharmony_ci while (len > 0) { 883cabdff1aSopenharmony_ci *q++ = get_bits (&s->gb, 8); 884cabdff1aSopenharmony_ci len --; 885cabdff1aSopenharmony_ci } 886cabdff1aSopenharmony_ci memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE); 887cabdff1aSopenharmony_ci 888cabdff1aSopenharmony_ci s->last_superframe_len += 8*buf_size - 8; 889cabdff1aSopenharmony_ci// s->reset_block_lengths = 1; //XXX is this needed ? 890cabdff1aSopenharmony_ci *got_frame_ptr = 0; 891cabdff1aSopenharmony_ci return buf_size; 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci } else 894cabdff1aSopenharmony_ci nb_frames = 1; 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci /* get output buffer */ 897cabdff1aSopenharmony_ci frame->nb_samples = nb_frames * s->frame_len; 898cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 899cabdff1aSopenharmony_ci return ret; 900cabdff1aSopenharmony_ci samples = (float **) frame->extended_data; 901cabdff1aSopenharmony_ci samples_offset = 0; 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ci if (s->use_bit_reservoir) { 904cabdff1aSopenharmony_ci bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3); 905cabdff1aSopenharmony_ci if (bit_offset > get_bits_left(&s->gb)) { 906cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 907cabdff1aSopenharmony_ci "Invalid last frame bit offset %d > buf size %d (%d)\n", 908cabdff1aSopenharmony_ci bit_offset, get_bits_left(&s->gb), buf_size); 909cabdff1aSopenharmony_ci goto fail; 910cabdff1aSopenharmony_ci } 911cabdff1aSopenharmony_ci 912cabdff1aSopenharmony_ci if (s->last_superframe_len > 0) { 913cabdff1aSopenharmony_ci /* add bit_offset bits to last frame */ 914cabdff1aSopenharmony_ci if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) > 915cabdff1aSopenharmony_ci MAX_CODED_SUPERFRAME_SIZE) 916cabdff1aSopenharmony_ci goto fail; 917cabdff1aSopenharmony_ci q = s->last_superframe + s->last_superframe_len; 918cabdff1aSopenharmony_ci len = bit_offset; 919cabdff1aSopenharmony_ci while (len > 7) { 920cabdff1aSopenharmony_ci *q++ = get_bits(&s->gb, 8); 921cabdff1aSopenharmony_ci len -= 8; 922cabdff1aSopenharmony_ci } 923cabdff1aSopenharmony_ci if (len > 0) 924cabdff1aSopenharmony_ci *q++ = get_bits(&s->gb, len) << (8 - len); 925cabdff1aSopenharmony_ci memset(q, 0, AV_INPUT_BUFFER_PADDING_SIZE); 926cabdff1aSopenharmony_ci 927cabdff1aSopenharmony_ci /* XXX: bit_offset bits into last frame */ 928cabdff1aSopenharmony_ci init_get_bits(&s->gb, s->last_superframe, 929cabdff1aSopenharmony_ci s->last_superframe_len * 8 + bit_offset); 930cabdff1aSopenharmony_ci /* skip unused bits */ 931cabdff1aSopenharmony_ci if (s->last_bitoffset > 0) 932cabdff1aSopenharmony_ci skip_bits(&s->gb, s->last_bitoffset); 933cabdff1aSopenharmony_ci /* this frame is stored in the last superframe and in the 934cabdff1aSopenharmony_ci * current one */ 935cabdff1aSopenharmony_ci if (wma_decode_frame(s, samples, samples_offset) < 0) 936cabdff1aSopenharmony_ci goto fail; 937cabdff1aSopenharmony_ci samples_offset += s->frame_len; 938cabdff1aSopenharmony_ci nb_frames--; 939cabdff1aSopenharmony_ci } 940cabdff1aSopenharmony_ci 941cabdff1aSopenharmony_ci /* read each frame starting from bit_offset */ 942cabdff1aSopenharmony_ci pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3; 943cabdff1aSopenharmony_ci if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8 || pos > buf_size * 8) 944cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 945cabdff1aSopenharmony_ci init_get_bits(&s->gb, buf + (pos >> 3), (buf_size - (pos >> 3)) * 8); 946cabdff1aSopenharmony_ci len = pos & 7; 947cabdff1aSopenharmony_ci if (len > 0) 948cabdff1aSopenharmony_ci skip_bits(&s->gb, len); 949cabdff1aSopenharmony_ci 950cabdff1aSopenharmony_ci s->reset_block_lengths = 1; 951cabdff1aSopenharmony_ci for (i = 0; i < nb_frames; i++) { 952cabdff1aSopenharmony_ci if (wma_decode_frame(s, samples, samples_offset) < 0) 953cabdff1aSopenharmony_ci goto fail; 954cabdff1aSopenharmony_ci samples_offset += s->frame_len; 955cabdff1aSopenharmony_ci } 956cabdff1aSopenharmony_ci 957cabdff1aSopenharmony_ci /* we copy the end of the frame in the last frame buffer */ 958cabdff1aSopenharmony_ci pos = get_bits_count(&s->gb) + 959cabdff1aSopenharmony_ci ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7); 960cabdff1aSopenharmony_ci s->last_bitoffset = pos & 7; 961cabdff1aSopenharmony_ci pos >>= 3; 962cabdff1aSopenharmony_ci len = buf_size - pos; 963cabdff1aSopenharmony_ci if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) { 964cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "len %d invalid\n", len); 965cabdff1aSopenharmony_ci goto fail; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci s->last_superframe_len = len; 968cabdff1aSopenharmony_ci memcpy(s->last_superframe, buf + pos, len); 969cabdff1aSopenharmony_ci } else { 970cabdff1aSopenharmony_ci /* single frame decode */ 971cabdff1aSopenharmony_ci if (wma_decode_frame(s, samples, samples_offset) < 0) 972cabdff1aSopenharmony_ci goto fail; 973cabdff1aSopenharmony_ci samples_offset += s->frame_len; 974cabdff1aSopenharmony_ci } 975cabdff1aSopenharmony_ci 976cabdff1aSopenharmony_ci ff_dlog(s->avctx, "%d %d %d %d eaten:%d\n", 977cabdff1aSopenharmony_ci s->frame_len_bits, s->block_len_bits, s->frame_len, s->block_len, 978cabdff1aSopenharmony_ci avctx->block_align); 979cabdff1aSopenharmony_ci 980cabdff1aSopenharmony_ci *got_frame_ptr = 1; 981cabdff1aSopenharmony_ci 982cabdff1aSopenharmony_ci return buf_size; 983cabdff1aSopenharmony_ci 984cabdff1aSopenharmony_cifail: 985cabdff1aSopenharmony_ci /* when error, we reset the bit reservoir */ 986cabdff1aSopenharmony_ci s->last_superframe_len = 0; 987cabdff1aSopenharmony_ci return -1; 988cabdff1aSopenharmony_ci} 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_cistatic av_cold void flush(AVCodecContext *avctx) 991cabdff1aSopenharmony_ci{ 992cabdff1aSopenharmony_ci WMACodecContext *s = avctx->priv_data; 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci s->last_bitoffset = 995cabdff1aSopenharmony_ci s->last_superframe_len = 0; 996cabdff1aSopenharmony_ci 997cabdff1aSopenharmony_ci s->eof_done = 0; 998cabdff1aSopenharmony_ci avctx->internal->skip_samples = s->frame_len * 2; 999cabdff1aSopenharmony_ci} 1000cabdff1aSopenharmony_ci 1001cabdff1aSopenharmony_ci#if CONFIG_WMAV1_DECODER 1002cabdff1aSopenharmony_ciconst FFCodec ff_wmav1_decoder = { 1003cabdff1aSopenharmony_ci .p.name = "wmav1", 1004cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 1"), 1005cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1006cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_WMAV1, 1007cabdff1aSopenharmony_ci .priv_data_size = sizeof(WMACodecContext), 1008cabdff1aSopenharmony_ci .init = wma_decode_init, 1009cabdff1aSopenharmony_ci .close = ff_wma_end, 1010cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(wma_decode_superframe), 1011cabdff1aSopenharmony_ci .flush = flush, 1012cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, 1013cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 1014cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1015cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1016cabdff1aSopenharmony_ci}; 1017cabdff1aSopenharmony_ci#endif 1018cabdff1aSopenharmony_ci#if CONFIG_WMAV2_DECODER 1019cabdff1aSopenharmony_ciconst FFCodec ff_wmav2_decoder = { 1020cabdff1aSopenharmony_ci .p.name = "wmav2", 1021cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 2"), 1022cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1023cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_WMAV2, 1024cabdff1aSopenharmony_ci .priv_data_size = sizeof(WMACodecContext), 1025cabdff1aSopenharmony_ci .init = wma_decode_init, 1026cabdff1aSopenharmony_ci .close = ff_wma_end, 1027cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(wma_decode_superframe), 1028cabdff1aSopenharmony_ci .flush = flush, 1029cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, 1030cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 1031cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1032cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1033cabdff1aSopenharmony_ci}; 1034cabdff1aSopenharmony_ci#endif 1035