annotate wmadec.c @ 2504:f12657081093 libavcodec

INTRA PCM macroblocks support patch by (Loic )lll+ffmpeg m4x org) This patch adds the support for INTRA PCM macroblocks in CAVLC and CABAC mode, the deblocking needed a small modification and so did the intra4x4_pred_mode prediction. With this patch, the 5 streams of the conformance suite containing INTRA PCM macroblocks now decode entirely, 4 are completely corrects, 1 is incorrect since the first B slice because of deblocking in B slice not yet implemented. The code is not optimized for speed, it is not necessary IPCM macroblocks are rare, but it could be optimized for code size, if someone want to do this, feel free.
author michael
date Mon, 07 Feb 2005 00:10:28 +0000
parents 582e635cfa08
children f3cdd51c9e16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1 /*
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
2 * WMA compatible decoder
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
3 * Copyright (c) 2002 The FFmpeg Project.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
4 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
9 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
14 *
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
18 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 * @file wmadec.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
22 * WMA compatible decoder.
1967
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
23 * This decoder handles Microsoft Windows Media Audio data, versions 1 & 2.
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
24 * WMA v1 is identified by audio format 0x160 in Microsoft media files
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
25 * (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
26 *
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
27 * To use this decoder, a calling application must supply the extra data
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
28 * bytes provided with the WMA data. These are the extra, codec-specific
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
29 * bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
30 * to the decoder using the extradata[_size] fields in AVCodecContext. There
2b0fc6b25ab8 add the minimal documentation to make this decoder useful
melanson
parents: 1750
diff changeset
31 * should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
32 */
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
33
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
34 #include "avcodec.h"
2398
582e635cfa08 common.c -> bitstream.c (and the single non bitstream func -> utils.c)
michael
parents: 2370
diff changeset
35 #include "bitstream.h"
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
36 #include "dsputil.h"
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
37
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
38 /* size of blocks */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
39 #define BLOCK_MIN_BITS 7
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
40 #define BLOCK_MAX_BITS 11
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
41 #define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
42
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
43 #define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
44
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
45 /* XXX: find exact max size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
46 #define HIGH_BAND_MAX_SIZE 16
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
47
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
48 #define NB_LSP_COEFS 10
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
49
817
97b71a72f087 reverse first hunk
nickols_k
parents: 816
diff changeset
50 /* XXX: is it a suitable value ? */
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
51 #define MAX_CODED_SUPERFRAME_SIZE 4096
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
52
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
53 #define MAX_CHANNELS 2
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
54
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
55 #define NOISE_TAB_SIZE 8192
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
56
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
57 #define LSP_POW_BITS 7
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
58
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
59 typedef struct WMADecodeContext {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
60 GetBitContext gb;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
61 int sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
62 int nb_channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
63 int bit_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
64 int version; /* 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
65 int block_align;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
66 int use_bit_reservoir;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
67 int use_variable_block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
68 int use_exp_vlc; /* exponent coding: 0 = lsp, 1 = vlc + delta */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
69 int use_noise_coding; /* true if perceptual noise is added */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
70 int byte_offset_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
71 VLC exp_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
72 int exponent_sizes[BLOCK_NB_SIZES];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
73 uint16_t exponent_bands[BLOCK_NB_SIZES][25];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
74 int high_band_start[BLOCK_NB_SIZES]; /* index of first coef in high band */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
75 int coefs_start; /* first coded coef */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
76 int coefs_end[BLOCK_NB_SIZES]; /* max number of coded coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
77 int exponent_high_sizes[BLOCK_NB_SIZES];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
78 int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
79 VLC hgain_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
80
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
81 /* coded values in high bands */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
82 int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
83 int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
84
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
85 /* there are two possible tables for spectral coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
86 VLC coef_vlc[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
87 uint16_t *run_table[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
88 uint16_t *level_table[2];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
89 /* frame info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
90 int frame_len; /* frame length in samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
91 int frame_len_bits; /* frame_len = 1 << frame_len_bits */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
92 int nb_block_sizes; /* number of block sizes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
93 /* block info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
94 int reset_block_lengths;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
95 int block_len_bits; /* log2 of current block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
96 int next_block_len_bits; /* log2 of next block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
97 int prev_block_len_bits; /* log2 of prev block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
98 int block_len; /* block length in samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
99 int block_num; /* block number in current frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
100 int block_pos; /* current position in frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
101 uint8_t ms_stereo; /* true if mid/side stereo mode */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
102 uint8_t channel_coded[MAX_CHANNELS]; /* true if channel is coded */
972
19419cb268fe align fixes for sse/altivec
bellard
parents: 964
diff changeset
103 float exponents[MAX_CHANNELS][BLOCK_MAX_SIZE] __attribute__((aligned(16)));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
104 float max_exponent[MAX_CHANNELS];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
105 int16_t coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE];
972
19419cb268fe align fixes for sse/altivec
bellard
parents: 964
diff changeset
106 float coefs[MAX_CHANNELS][BLOCK_MAX_SIZE] __attribute__((aligned(16)));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
107 MDCTContext mdct_ctx[BLOCK_NB_SIZES];
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
108 float *windows[BLOCK_NB_SIZES];
972
19419cb268fe align fixes for sse/altivec
bellard
parents: 964
diff changeset
109 FFTSample mdct_tmp[BLOCK_MAX_SIZE] __attribute__((aligned(16))); /* temporary storage for imdct */
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
110 /* output buffer for one frame and the last for IMDCT windowing */
972
19419cb268fe align fixes for sse/altivec
bellard
parents: 964
diff changeset
111 float frame_out[MAX_CHANNELS][BLOCK_MAX_SIZE * 2] __attribute__((aligned(16)));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
112 /* last frame info */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
113 uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
114 int last_bitoffset;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
115 int last_superframe_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
116 float noise_table[NOISE_TAB_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
117 int noise_index;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
118 float noise_mult; /* XXX: suppress that and integrate it in the noise array */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
119 /* lsp_to_curve tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
120 float lsp_cos_table[BLOCK_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
121 float lsp_pow_e_table[256];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
122 float lsp_pow_m_table1[(1 << LSP_POW_BITS)];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
123 float lsp_pow_m_table2[(1 << LSP_POW_BITS)];
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
124
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
125 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
126 int frame_count;
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
127 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
128 } WMADecodeContext;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
129
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
130 typedef struct CoefVLCTable {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
131 int n; /* total number of codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
132 const uint32_t *huffcodes; /* VLC bit values */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
133 const uint8_t *huffbits; /* VLC bit size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
134 const uint16_t *levels; /* table to build run/level tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
135 } CoefVLCTable;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
136
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
137 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
138
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
139 #include "wmadata.h"
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
140
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
141 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
142 static void dump_shorts(const char *name, const short *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
143 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
144 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
145
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
146 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
147 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
148 if ((i & 7) == 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
149 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
150 tprintf(" %5d.0", tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
151 if ((i & 7) == 7)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
152 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
153 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
154 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
155
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
156 static void dump_floats(const char *name, int prec, const float *tab, int n)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
157 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
158 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
159
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
160 tprintf("%s[%d]:\n", name, n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
161 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
162 if ((i & 7) == 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
163 tprintf("%4d: ", i);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
164 tprintf(" %8.*f", prec, tab[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
165 if ((i & 7) == 7)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
166 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
167 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
168 if ((i & 7) != 0)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
169 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
170 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
171 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
172
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
173 /* XXX: use same run/length optimization as mpeg decoders */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
174 static void init_coef_vlc(VLC *vlc,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
175 uint16_t **prun_table, uint16_t **plevel_table,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
176 const CoefVLCTable *vlc_table)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
177 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
178 int n = vlc_table->n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
179 const uint8_t *table_bits = vlc_table->huffbits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
180 const uint32_t *table_codes = vlc_table->huffcodes;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
181 const uint16_t *levels_table = vlc_table->levels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
182 uint16_t *run_table, *level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
183 const uint16_t *p;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
184 int i, l, j, level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
185
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2180
diff changeset
186 init_vlc(vlc, 9, n, table_bits, 1, 1, table_codes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
187
1031
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
188 run_table = av_malloc(n * sizeof(uint16_t));
19de1445beb2 use av_malloc() functions - added av_strdup and av_realloc()
bellard
parents: 1025
diff changeset
189 level_table = av_malloc(n * sizeof(uint16_t));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
190 p = levels_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
191 i = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
192 level = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
193 while (i < n) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
194 l = *p++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
195 for(j=0;j<l;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
196 run_table[i] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
197 level_table[i] = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
198 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
199 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
200 level++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
201 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
202 *prun_table = run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
203 *plevel_table = level_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
204 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
205
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
206 static int wma_decode_init(AVCodecContext * avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
207 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
208 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
209 int i, flags1, flags2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
210 float *window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
211 uint8_t *extradata;
2180
7524cda1604e k6 pop fix patch by (Diego Biurrun <diego at biurrun dot de>)
michael
parents: 2101
diff changeset
212 float bps1, high_freq;
7524cda1604e k6 pop fix patch by (Diego Biurrun <diego at biurrun dot de>)
michael
parents: 2101
diff changeset
213 volatile float bps;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
214 int sample_rate1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
215 int coef_vlc_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
216
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
217 s->sample_rate = avctx->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
218 s->nb_channels = avctx->channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
219 s->bit_rate = avctx->bit_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
220 s->block_align = avctx->block_align;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
221
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
222 if (avctx->codec->id == CODEC_ID_WMAV1) {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
223 s->version = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
224 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
225 s->version = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
226 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
227
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
228 /* extract flag infos */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
229 flags1 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
230 flags2 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
231 extradata = avctx->extradata;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
232 if (s->version == 1 && avctx->extradata_size >= 4) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
233 flags1 = extradata[0] | (extradata[1] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
234 flags2 = extradata[2] | (extradata[3] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
235 } else if (s->version == 2 && avctx->extradata_size >= 6) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
236 flags1 = extradata[0] | (extradata[1] << 8) |
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
237 (extradata[2] << 16) | (extradata[3] << 24);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
238 flags2 = extradata[4] | (extradata[5] << 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
239 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
240 s->use_exp_vlc = flags2 & 0x0001;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
241 s->use_bit_reservoir = flags2 & 0x0002;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
242 s->use_variable_block_len = flags2 & 0x0004;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
243
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
244 /* compute MDCT block size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
245 if (s->sample_rate <= 16000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
246 s->frame_len_bits = 9;
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
247 } else if (s->sample_rate <= 22050 ||
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
248 (s->sample_rate <= 32000 && s->version == 1)) {
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
249 s->frame_len_bits = 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
250 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
251 s->frame_len_bits = 11;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
252 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
253 s->frame_len = 1 << s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
254 if (s->use_variable_block_len) {
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
255 int nb_max, nb;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
256 nb = ((flags2 >> 3) & 3) + 1;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
257 if ((s->bit_rate / s->nb_channels) >= 32000)
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
258 nb += 2;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
259 nb_max = s->frame_len_bits - BLOCK_MIN_BITS;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
260 if (nb > nb_max)
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
261 nb = nb_max;
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
262 s->nb_block_sizes = nb + 1;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
263 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
264 s->nb_block_sizes = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
265 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
266
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
267 /* init rate dependant parameters */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
268 s->use_noise_coding = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
269 high_freq = s->sample_rate * 0.5;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
270
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
271 /* if version 2, then the rates are normalized */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
272 sample_rate1 = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
273 if (s->version == 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
274 if (sample_rate1 >= 44100)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
275 sample_rate1 = 44100;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
276 else if (sample_rate1 >= 22050)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
277 sample_rate1 = 22050;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
278 else if (sample_rate1 >= 16000)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
279 sample_rate1 = 16000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
280 else if (sample_rate1 >= 11025)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
281 sample_rate1 = 11025;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
282 else if (sample_rate1 >= 8000)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
283 sample_rate1 = 8000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
284 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
285
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
286 bps = (float)s->bit_rate / (float)(s->nb_channels * s->sample_rate);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
287 s->byte_offset_bits = av_log2((int)(bps * s->frame_len / 8.0)) + 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
288
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
289 /* compute high frequency value and choose if noise coding should
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
290 be activated */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
291 bps1 = bps;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
292 if (s->nb_channels == 2)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
293 bps1 = bps * 1.6;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
294 if (sample_rate1 == 44100) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
295 if (bps1 >= 0.61)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
296 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
297 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
298 high_freq = high_freq * 0.4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
299 } else if (sample_rate1 == 22050) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
300 if (bps1 >= 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
301 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
302 else if (bps1 >= 0.72)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
303 high_freq = high_freq * 0.7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
304 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
305 high_freq = high_freq * 0.6;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
306 } else if (sample_rate1 == 16000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
307 if (bps > 0.5)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
308 high_freq = high_freq * 0.5;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
309 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
310 high_freq = high_freq * 0.3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
311 } else if (sample_rate1 == 11025) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
312 high_freq = high_freq * 0.7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
313 } else if (sample_rate1 == 8000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
314 if (bps <= 0.625) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
315 high_freq = high_freq * 0.5;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
316 } else if (bps > 0.75) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
317 s->use_noise_coding = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
318 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
319 high_freq = high_freq * 0.65;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
320 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
321 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
322 if (bps >= 0.8) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
323 high_freq = high_freq * 0.75;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
324 } else if (bps >= 0.6) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
325 high_freq = high_freq * 0.6;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
326 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
327 high_freq = high_freq * 0.5;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
328 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
329 }
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
330 dprintf("flags1=0x%x flags2=0x%x\n", flags1, flags2);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
331 dprintf("version=%d channels=%d sample_rate=%d bitrate=%d block_align=%d\n",
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
332 s->version, s->nb_channels, s->sample_rate, s->bit_rate,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
333 s->block_align);
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
334 dprintf("bps=%f bps1=%f high_freq=%f bitoffset=%d\n",
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
335 bps, bps1, high_freq, s->byte_offset_bits);
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
336 dprintf("use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n",
808
e9bfaabcf07d fixed nb_block_sizes detection - fixed codec_id test (avctx->codec_id does not need to be initialized)
bellard
parents: 797
diff changeset
337 s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
338
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
339 /* compute the scale factor band sizes for each MDCT block size */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
340 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
341 int a, b, pos, lpos, k, block_len, i, j, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
342 const uint8_t *table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
343
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
344 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
345 s->coefs_start = 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
346 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
347 s->coefs_start = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
348 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
349 for(k = 0; k < s->nb_block_sizes; k++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
350 block_len = s->frame_len >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
351
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
352 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
353 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
354 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
355 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
356 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
357 pos = ((block_len * 2 * a) + (b >> 1)) / b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
358 if (pos > block_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
359 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
360 s->exponent_bands[0][i] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
361 if (pos >= block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
362 i++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
363 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
364 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
365 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
366 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
367 s->exponent_sizes[0] = i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
368 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
369 /* hardcoded tables */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
370 table = NULL;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
371 a = s->frame_len_bits - BLOCK_MIN_BITS - k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
372 if (a < 3) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
373 if (s->sample_rate >= 44100)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
374 table = exponent_band_44100[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
375 else if (s->sample_rate >= 32000)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
376 table = exponent_band_32000[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
377 else if (s->sample_rate >= 22050)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
378 table = exponent_band_22050[a];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
379 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
380 if (table) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
381 n = *table++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
382 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
383 s->exponent_bands[k][i] = table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
384 s->exponent_sizes[k] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
385 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
386 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
387 lpos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
388 for(i=0;i<25;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
389 a = wma_critical_freqs[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
390 b = s->sample_rate;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
391 pos = ((block_len * 2 * a) + (b << 1)) / (4 * b);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
392 pos <<= 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
393 if (pos > block_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
394 pos = block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
395 if (pos > lpos)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
396 s->exponent_bands[k][j++] = pos - lpos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
397 if (pos >= block_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
398 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
399 lpos = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
400 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
401 s->exponent_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
402 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
403 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
404
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
405 /* max number of coefs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
406 s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
407 /* high freq computation */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
408 s->high_band_start[k] = (int)((block_len * 2 * high_freq) /
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
409 s->sample_rate + 0.5);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
410 n = s->exponent_sizes[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
411 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
412 pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
413 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
414 int start, end;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
415 start = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
416 pos += s->exponent_bands[k][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
417 end = pos;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
418 if (start < s->high_band_start[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
419 start = s->high_band_start[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
420 if (end > s->coefs_end[k])
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
421 end = s->coefs_end[k];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
422 if (end > start)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
423 s->exponent_high_bands[k][j++] = end - start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
424 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
425 s->exponent_high_sizes[k] = j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
426 #if 0
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
427 tprintf("%5d: coefs_end=%d high_band_start=%d nb_high_bands=%d: ",
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
428 s->frame_len >> k,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
429 s->coefs_end[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
430 s->high_band_start[k],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
431 s->exponent_high_sizes[k]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
432 for(j=0;j<s->exponent_high_sizes[k];j++)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
433 tprintf(" %d", s->exponent_high_bands[k][j]);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
434 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
435 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
436 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
437 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
438
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
439 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
440 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
441 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
442 for(i = 0; i < s->nb_block_sizes; i++) {
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
443 tprintf("%5d: n=%2d:",
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
444 s->frame_len >> i,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
445 s->exponent_sizes[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
446 for(j=0;j<s->exponent_sizes[i];j++)
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
447 tprintf(" %d", s->exponent_bands[i][j]);
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
448 tprintf("\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
449 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
450 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
451 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
452
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
453 /* init MDCT */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
454 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
455 ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 1);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
456
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
457 /* init MDCT windows : simple sinus window */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
458 for(i = 0; i < s->nb_block_sizes; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
459 int n, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
460 float alpha;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
461 n = 1 << (s->frame_len_bits - i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
462 window = av_malloc(sizeof(float) * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
463 alpha = M_PI / (2.0 * n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
464 for(j=0;j<n;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
465 window[n - j - 1] = sin((j + 0.5) * alpha);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
466 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
467 s->windows[i] = window;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
468 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
469
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
470 s->reset_block_lengths = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
471
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
472 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
473
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
474 /* init the noise generator */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
475 if (s->use_exp_vlc)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
476 s->noise_mult = 0.02;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
477 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
478 s->noise_mult = 0.04;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
479
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
480 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
481 for(i=0;i<NOISE_TAB_SIZE;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
482 s->noise_table[i] = 1.0 * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
483 #else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
484 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
485 unsigned int seed;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
486 float norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
487 seed = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
488 norm = (1.0 / (float)(1LL << 31)) * sqrt(3) * s->noise_mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
489 for(i=0;i<NOISE_TAB_SIZE;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
490 seed = seed * 314159 + 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
491 s->noise_table[i] = (float)((int)seed) * norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
492 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
493 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
494 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
495 init_vlc(&s->hgain_vlc, 9, sizeof(hgain_huffbits),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
496 hgain_huffbits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2180
diff changeset
497 hgain_huffcodes, 2, 2, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
498 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
499
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
500 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
501 init_vlc(&s->exp_vlc, 9, sizeof(scale_huffbits),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
502 scale_huffbits, 1, 1,
2370
26560d4fdb1f Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents: 2180
diff changeset
503 scale_huffcodes, 4, 4, 0);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
504 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
505 wma_lsp_to_curve_init(s, s->frame_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
506 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
507
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
508 /* choose the VLC tables for the coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
509 coef_vlc_table = 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
510 if (s->sample_rate >= 32000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
511 if (bps1 < 0.72)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
512 coef_vlc_table = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
513 else if (bps1 < 1.16)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
514 coef_vlc_table = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
515 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
516
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
517 init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
518 &coef_vlcs[coef_vlc_table * 2]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
519 init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
520 &coef_vlcs[coef_vlc_table * 2 + 1]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
521 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
522 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
523
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
524 /* interpolate values for a bigger or smaller block. The block must
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
525 have multiple sizes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
526 static void interpolate_array(float *scale, int old_size, int new_size)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
527 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
528 int i, j, jincr, k;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
529 float v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
530
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
531 if (new_size > old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
532 jincr = new_size / old_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
533 j = new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
534 for(i = old_size - 1; i >=0; i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
535 v = scale[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
536 k = jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
537 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
538 scale[--j] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
539 } while (--k);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
540 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
541 } else if (new_size < old_size) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
542 j = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
543 jincr = old_size / new_size;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
544 for(i = 0; i < new_size; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
545 scale[i] = scale[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
546 j += jincr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
547 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
548 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
549 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
550
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
551 /* compute x^-0.25 with an exponent and mantissa table. We use linear
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
552 interpolation to reduce the mantissa table size at a small speed
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
553 expense (linear interpolation approximately doubles the number of
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
554 bits of precision). */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
555 static inline float pow_m1_4(WMADecodeContext *s, float x)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
556 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
557 union {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
558 float f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
559 unsigned int v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
560 } u, t;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
561 unsigned int e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
562 float a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
563
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
564 u.f = x;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
565 e = u.v >> 23;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
566 m = (u.v >> (23 - LSP_POW_BITS)) & ((1 << LSP_POW_BITS) - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
567 /* build interpolation scale: 1 <= t < 2. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
568 t.v = ((u.v << LSP_POW_BITS) & ((1 << 23) - 1)) | (127 << 23);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
569 a = s->lsp_pow_m_table1[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
570 b = s->lsp_pow_m_table2[m];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
571 return s->lsp_pow_e_table[e] * (a + b * t.f);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
572 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
573
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
574 static void wma_lsp_to_curve_init(WMADecodeContext *s, int frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
575 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
576 float wdel, a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
577 int i, e, m;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
578
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
579 wdel = M_PI / frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
580 for(i=0;i<frame_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
581 s->lsp_cos_table[i] = 2.0f * cos(wdel * i);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
582
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
583 /* tables for x^-0.25 computation */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
584 for(i=0;i<256;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
585 e = i - 126;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
586 s->lsp_pow_e_table[i] = pow(2.0, e * -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
587 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
588
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
589 /* NOTE: these two tables are needed to avoid two operations in
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
590 pow_m1_4 */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
591 b = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
592 for(i=(1 << LSP_POW_BITS) - 1;i>=0;i--) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
593 m = (1 << LSP_POW_BITS) + i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
594 a = (float)m * (0.5 / (1 << LSP_POW_BITS));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
595 a = pow(a, -0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
596 s->lsp_pow_m_table1[i] = 2 * a - b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
597 s->lsp_pow_m_table2[i] = b - a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
598 b = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
599 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
600 #if 0
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
601 for(i=1;i<20;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
602 float v, r1, r2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
603 v = 5.0 / i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
604 r1 = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
605 r2 = pow(v,-0.25);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
606 printf("%f^-0.25=%f e=%f\n", v, r1, r2 - r1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
607 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
608 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
609 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
610
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
611 /* NOTE: We use the same code as Vorbis here */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
612 /* XXX: optimize it further with SSE/3Dnow */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
613 static void wma_lsp_to_curve(WMADecodeContext *s,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
614 float *out, float *val_max_ptr,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
615 int n, float *lsp)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
616 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
617 int i, j;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
618 float p, q, w, v, val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
619
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
620 val_max = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
621 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
622 p = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
623 q = 0.5f;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
624 w = s->lsp_cos_table[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
625 for(j=1;j<NB_LSP_COEFS;j+=2){
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
626 q *= w - lsp[j - 1];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
627 p *= w - lsp[j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
628 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
629 p *= p * (2.0f - w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
630 q *= q * (2.0f + w);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
631 v = p + q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
632 v = pow_m1_4(s, v);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
633 if (v > val_max)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
634 val_max = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
635 out[i] = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
636 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
637 *val_max_ptr = val_max;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
638 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
639
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
640 /* decode exponents coded with LSP coefficients (same idea as Vorbis) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
641 static void decode_exp_lsp(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
642 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
643 float lsp_coefs[NB_LSP_COEFS];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
644 int val, i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
645
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
646 for(i = 0; i < NB_LSP_COEFS; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
647 if (i == 0 || i >= 8)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
648 val = get_bits(&s->gb, 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
649 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
650 val = get_bits(&s->gb, 4);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
651 lsp_coefs[i] = lsp_codebook[i][val];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
652 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
653
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
654 wma_lsp_to_curve(s, s->exponents[ch], &s->max_exponent[ch],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
655 s->block_len, lsp_coefs);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
656 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
657
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
658 /* decode exponents coded with VLC codes */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
659 static int decode_exp_vlc(WMADecodeContext *s, int ch)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
660 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
661 int last_exp, n, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
662 const uint16_t *ptr, *band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
663 float v, *q, max_scale, *q_end;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
664
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
665 band_ptr = s->exponent_bands[s->frame_len_bits - s->block_len_bits];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
666 ptr = band_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
667 q = s->exponents[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
668 q_end = q + s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
669 max_scale = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
670 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
671 last_exp = get_bits(&s->gb, 5) + 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
672 /* XXX: use a table */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
673 v = pow(10, last_exp * (1.0 / 16.0));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
674 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
675 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
676 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
677 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
678 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
679 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
680 last_exp = 36;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
681 while (q < q_end) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
682 code = get_vlc(&s->gb, &s->exp_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
683 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
684 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
685 /* NOTE: this offset is the same as MPEG4 AAC ! */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
686 last_exp += code - 60;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
687 /* XXX: use a table */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
688 v = pow(10, last_exp * (1.0 / 16.0));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
689 if (v > max_scale)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
690 max_scale = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
691 n = *ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
692 do {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
693 *q++ = v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
694 } while (--n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
695 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
696 s->max_exponent[ch] = max_scale;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
697 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
698 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
699
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
700 /* return 0 if OK. return 1 if last block of frame. return -1 if
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
701 unrecorrable error. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
702 static int wma_decode_block(WMADecodeContext *s)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
703 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
704 int n, v, a, ch, code, bsize;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
705 int coef_nb_bits, total_gain, parse_exponents;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
706 float window[BLOCK_MAX_SIZE * 2];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
707 // XXX: FIXME!! there's a bug somewhere which makes this mandatory under altivec
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
708 #ifdef HAVE_ALTIVEC
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
709 volatile int nb_coefs[MAX_CHANNELS] __attribute__((aligned(16)));
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
710 #else
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
711 int nb_coefs[MAX_CHANNELS];
2101
770743eb4329 altivec workaround
alex
parents: 1967
diff changeset
712 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
713 float mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
714
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
715 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
716 tprintf("***decode_block: %d:%d\n", s->frame_count - 1, s->block_num);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
717 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
718
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
719 /* compute current block length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
720 if (s->use_variable_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
721 n = av_log2(s->nb_block_sizes - 1) + 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
722
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
723 if (s->reset_block_lengths) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
724 s->reset_block_lengths = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
725 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
726 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
727 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
728 s->prev_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
729 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
730 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
731 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
732 s->block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
733 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
734 /* update block lengths */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
735 s->prev_block_len_bits = s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
736 s->block_len_bits = s->next_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
737 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
738 v = get_bits(&s->gb, n);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
739 if (v >= s->nb_block_sizes)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
740 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
741 s->next_block_len_bits = s->frame_len_bits - v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
742 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
743 /* fixed block len */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
744 s->next_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
745 s->prev_block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
746 s->block_len_bits = s->frame_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
747 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
748
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
749 /* now check if the block length is coherent with the frame length */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
750 s->block_len = 1 << s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
751 if ((s->block_pos + s->block_len) > s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
752 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
753
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
754 if (s->nb_channels == 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
755 s->ms_stereo = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
756 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
757 v = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
758 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
759 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
760 s->channel_coded[ch] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
761 v |= a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
762 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
763 /* if no channel coded, no need to go further */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
764 /* XXX: fix potential framing problems */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
765 if (!v)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
766 goto next;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
767
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
768 bsize = s->frame_len_bits - s->block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
769
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
770 /* read total gain and extract corresponding number of bits for
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
771 coef escape coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
772 total_gain = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
773 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
774 a = get_bits(&s->gb, 7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
775 total_gain += a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
776 if (a != 127)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
777 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
778 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
779
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
780 if (total_gain < 15)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
781 coef_nb_bits = 13;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
782 else if (total_gain < 32)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
783 coef_nb_bits = 12;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
784 else if (total_gain < 40)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
785 coef_nb_bits = 11;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
786 else if (total_gain < 45)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
787 coef_nb_bits = 10;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
788 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
789 coef_nb_bits = 9;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
790
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
791 /* compute number of coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
792 n = s->coefs_end[bsize] - s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
793 for(ch = 0; ch < s->nb_channels; ch++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
794 nb_coefs[ch] = n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
795
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
796 /* complex coding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
797 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
798
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
799 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
800 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
801 int i, n, a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
802 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
803 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
804 a = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
805 s->high_band_coded[ch][i] = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
806 /* if noise coding, the coefficients are not transmitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
807 if (a)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
808 nb_coefs[ch] -= s->exponent_high_bands[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
809 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
810 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
811 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
812 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
813 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
814 int i, n, val, code;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
815
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
816 n = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
817 val = (int)0x80000000;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
818 for(i=0;i<n;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
819 if (s->high_band_coded[ch][i]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
820 if (val == (int)0x80000000) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
821 val = get_bits(&s->gb, 7) - 19;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
822 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
823 code = get_vlc(&s->gb, &s->hgain_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
824 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
825 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
826 val += code - 18;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
827 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
828 s->high_band_values[ch][i] = val;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
829 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
830 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
831 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
832 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
833 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
834
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
835 /* exposant can be interpolated in short blocks. */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
836 parse_exponents = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
837 if (s->block_len_bits != s->frame_len_bits) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
838 parse_exponents = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
839 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
840
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
841 if (parse_exponents) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
842 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
843 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
844 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
845 if (decode_exp_vlc(s, ch) < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
846 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
847 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
848 decode_exp_lsp(s, ch);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
849 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
850 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
851 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
852 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
853 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
854 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
855 interpolate_array(s->exponents[ch], 1 << s->prev_block_len_bits,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
856 s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
857 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
858 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
859 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
860
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
861 /* parse spectral coefficients : just RLE encoding */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
862 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
863 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
864 VLC *coef_vlc;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
865 int level, run, sign, tindex;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
866 int16_t *ptr, *eptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
867 const int16_t *level_table, *run_table;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
868
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
869 /* special VLC tables are used for ms stereo because
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
870 there is potentially less energy there */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
871 tindex = (ch == 1 && s->ms_stereo);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
872 coef_vlc = &s->coef_vlc[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
873 run_table = s->run_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
874 level_table = s->level_table[tindex];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
875 /* XXX: optimize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
876 ptr = &s->coefs1[ch][0];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
877 eptr = ptr + nb_coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
878 memset(ptr, 0, s->block_len * sizeof(int16_t));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
879 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
880 code = get_vlc(&s->gb, coef_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
881 if (code < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
882 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
883 if (code == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
884 /* EOB */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
885 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
886 } else if (code == 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
887 /* escape */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
888 level = get_bits(&s->gb, coef_nb_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
889 /* NOTE: this is rather suboptimal. reading
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
890 block_len_bits would be better */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
891 run = get_bits(&s->gb, s->frame_len_bits);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
892 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
893 /* normal code */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
894 run = run_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
895 level = level_table[code];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
896 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
897 sign = get_bits(&s->gb, 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
898 if (!sign)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
899 level = -level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
900 ptr += run;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
901 if (ptr >= eptr)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
902 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
903 *ptr++ = level;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
904 /* NOTE: EOB can be omitted */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
905 if (ptr >= eptr)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
906 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
907 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
908 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
909 if (s->version == 1 && s->nb_channels >= 2) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
910 align_get_bits(&s->gb);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
911 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
912 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
913
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
914 /* normalize */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
915 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
916 int n4 = s->block_len / 2;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
917 mdct_norm = 1.0 / (float)n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
918 if (s->version == 1) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
919 mdct_norm *= sqrt(n4);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
920 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
921 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
922
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
923 /* finally compute the MDCT coefficients */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
924 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
925 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
926 int16_t *coefs1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
927 float *coefs, *exponents, mult, mult1, noise, *exp_ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
928 int i, j, n, n1, last_high_band;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
929 float exp_power[HIGH_BAND_MAX_SIZE];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
930
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
931 coefs1 = s->coefs1[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
932 exponents = s->exponents[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
933 mult = pow(10, total_gain * 0.05) / s->max_exponent[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
934 mult *= mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
935 coefs = s->coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
936 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
937 mult1 = mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
938 /* very low freqs : noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
939 for(i = 0;i < s->coefs_start; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
940 *coefs++ = s->noise_table[s->noise_index] * (*exponents++) * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
941 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
942 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
943
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
944 n1 = s->exponent_high_sizes[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
945
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
946 /* compute power of high bands */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
947 exp_ptr = exponents +
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
948 s->high_band_start[bsize] -
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
949 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
950 last_high_band = 0; /* avoid warning */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
951 for(j=0;j<n1;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
952 n = s->exponent_high_bands[s->frame_len_bits -
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
953 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
954 if (s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
955 float e2, v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
956 e2 = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
957 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
958 v = exp_ptr[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
959 e2 += v * v;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
960 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
961 exp_power[j] = e2 / n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
962 last_high_band = j;
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
963 tprintf("%d: power=%f (%d)\n", j, exp_power[j], n);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
964 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
965 exp_ptr += n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
966 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
967
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
968 /* main freqs and high freqs */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
969 for(j=-1;j<n1;j++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
970 if (j < 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
971 n = s->high_band_start[bsize] -
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
972 s->coefs_start;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
973 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
974 n = s->exponent_high_bands[s->frame_len_bits -
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
975 s->block_len_bits][j];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
976 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
977 if (j >= 0 && s->high_band_coded[ch][j]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
978 /* use noise with specified power */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
979 mult1 = sqrt(exp_power[j] / exp_power[last_high_band]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
980 /* XXX: use a table */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
981 mult1 = mult1 * pow(10, s->high_band_values[ch][j] * 0.05);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
982 mult1 = mult1 / (s->max_exponent[ch] * s->noise_mult);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
983 mult1 *= mdct_norm;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
984 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
985 noise = s->noise_table[s->noise_index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
986 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
987 *coefs++ = (*exponents++) * noise * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
988 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
989 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
990 /* coded values + small noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
991 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
992 noise = s->noise_table[s->noise_index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
993 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
994 *coefs++ = ((*coefs1++) + noise) * (*exponents++) * mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
995 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
996 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
997 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
998
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
999 /* very high freqs : noise */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1000 n = s->block_len - s->coefs_end[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1001 mult1 = mult * exponents[-1];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1002 for(i = 0; i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1003 *coefs++ = s->noise_table[s->noise_index] * mult1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1004 s->noise_index = (s->noise_index + 1) & (NOISE_TAB_SIZE - 1);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1005 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1006 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1007 /* XXX: optimize more */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1008 for(i = 0;i < s->coefs_start; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1009 *coefs++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1010 n = nb_coefs[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1011 for(i = 0;i < n; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1012 *coefs++ = coefs1[i] * exponents[i] * mult;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1013 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1014 n = s->block_len - s->coefs_end[bsize];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1015 for(i = 0;i < n; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1016 *coefs++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1017 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1018 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1019 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1020
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1021 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1022 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1023 if (s->channel_coded[ch]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1024 dump_floats("exponents", 3, s->exponents[ch], s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1025 dump_floats("coefs", 1, s->coefs[ch], s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1026 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1027 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1028 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1029
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1030 if (s->ms_stereo && s->channel_coded[1]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1031 float a, b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1032 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1033
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1034 /* nominal case for ms stereo: we do it before mdct */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1035 /* no need to optimize this case because it should almost
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1036 never happen */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1037 if (!s->channel_coded[0]) {
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1038 tprintf("rare ms-stereo case happened\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1039 memset(s->coefs[0], 0, sizeof(float) * s->block_len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1040 s->channel_coded[0] = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1041 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1042
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1043 for(i = 0; i < s->block_len; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1044 a = s->coefs[0][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1045 b = s->coefs[1][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1046 s->coefs[0][i] = a + b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1047 s->coefs[1][i] = a - b;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1048 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1049 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1050
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1051 /* build the window : we ensure that when the windows overlap
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1052 their squared sum is always 1 (MDCT reconstruction rule) */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1053 /* XXX: merge with output */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1054 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1055 int i, next_block_len, block_len, prev_block_len, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1056 float *wptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1057
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1058 block_len = s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1059 prev_block_len = 1 << s->prev_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1060 next_block_len = 1 << s->next_block_len_bits;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1061
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1062 /* right part */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1063 wptr = window + block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1064 if (block_len <= next_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1065 for(i=0;i<block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1066 *wptr++ = s->windows[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1067 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1068 /* overlap */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1069 n = (block_len / 2) - (next_block_len / 2);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1070 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1071 *wptr++ = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1072 for(i=0;i<next_block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1073 *wptr++ = s->windows[s->frame_len_bits - s->next_block_len_bits][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1074 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1075 *wptr++ = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1076 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1077
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1078 /* left part */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1079 wptr = window + block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1080 if (block_len <= prev_block_len) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1081 for(i=0;i<block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1082 *--wptr = s->windows[bsize][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1083 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1084 /* overlap */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1085 n = (block_len / 2) - (prev_block_len / 2);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1086 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1087 *--wptr = 1.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1088 for(i=0;i<prev_block_len;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1089 *--wptr = s->windows[s->frame_len_bits - s->prev_block_len_bits][i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1090 for(i=0;i<n;i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1091 *--wptr = 0.0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1092 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1093 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1094
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1095
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1096 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1097 if (s->channel_coded[ch]) {
972
19419cb268fe align fixes for sse/altivec
bellard
parents: 964
diff changeset
1098 FFTSample output[BLOCK_MAX_SIZE * 2] __attribute__((aligned(16)));
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1099 float *ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1100 int i, n4, index, n;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1101
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1102 n = s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1103 n4 = s->block_len / 2;
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1104 ff_imdct_calc(&s->mdct_ctx[bsize],
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1105 output, s->coefs[ch], s->mdct_tmp);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1106
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1107 /* XXX: optimize all that by build the window and
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1108 multipying/adding at the same time */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1109 /* multiply by the window */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1110 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1111 output[i] *= window[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1112 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1113
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1114 /* add in the frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1115 index = (s->frame_len / 2) + s->block_pos - n4;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1116 ptr = &s->frame_out[ch][index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1117 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1118 *ptr += output[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1119 ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1120 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1121
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1122 /* specific fast case for ms-stereo : add to second
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1123 channel if it is not coded */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1124 if (s->ms_stereo && !s->channel_coded[1]) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1125 ptr = &s->frame_out[1][index];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1126 for(i=0;i<n * 2;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1127 *ptr += output[i];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1128 ptr++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1129 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1130 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1131 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1132 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1133 next:
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1134 /* update block number */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1135 s->block_num++;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1136 s->block_pos += s->block_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1137 if (s->block_pos >= s->frame_len)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1138 return 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1139 else
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1140 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1141 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1142
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1143 /* decode a frame of frame_len samples */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1144 static int wma_decode_frame(WMADecodeContext *s, int16_t *samples)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1145 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1146 int ret, i, n, a, ch, incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1147 int16_t *ptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1148 float *iptr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1149
1343
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1150 #ifdef TRACE
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1151 tprintf("***decode_frame: %d size=%d\n", s->frame_count++, s->frame_len);
1fd083c620d6 moved frame_count to wmadeccontext
al3x
parents: 1342
diff changeset
1152 #endif
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1153
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1154 /* read each block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1155 s->block_num = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1156 s->block_pos = 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1157 for(;;) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1158 ret = wma_decode_block(s);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1159 if (ret < 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1160 return -1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1161 if (ret)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1162 break;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1163 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1164
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1165 /* convert frame to integer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1166 n = s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1167 incr = s->nb_channels;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1168 for(ch = 0; ch < s->nb_channels; ch++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1169 ptr = samples + ch;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1170 iptr = s->frame_out[ch];
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1171
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1172 for(i=0;i<n;i++) {
797
308e973c3fda use lrintf to avoid double conversion
bellard
parents: 795
diff changeset
1173 a = lrintf(*iptr++);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1174 if (a > 32767)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1175 a = 32767;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1176 else if (a < -32768)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1177 a = -32768;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1178 *ptr = a;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1179 ptr += incr;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1180 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1181 /* prepare for next block */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1182 memmove(&s->frame_out[ch][0], &s->frame_out[ch][s->frame_len],
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1183 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1184 /* XXX: suppress this */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1185 memset(&s->frame_out[ch][s->frame_len], 0,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1186 s->frame_len * sizeof(float));
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1187 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1188
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1189 #ifdef TRACE
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1190 dump_shorts("samples", samples, n * s->nb_channels);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1191 #endif
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1192 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1193 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1194
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1195 static int wma_decode_superframe(AVCodecContext *avctx,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1196 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 1031
diff changeset
1197 uint8_t *buf, int buf_size)
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1198 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1199 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1200 int nb_frames, bit_offset, i, pos, len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1201 uint8_t *q;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1202 int16_t *samples;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1203
1342
f574934c4219 uniformization (now it uses the same trace functions as h264, defined in common.h)
al3x
parents: 1303
diff changeset
1204 tprintf("***decode_superframe:\n");
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1205
1750
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1206 if(buf_size==0){
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1207 s->last_superframe_len = 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1208 return 0;
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1209 }
610617f1dbd0 segfault fix
michael
parents: 1343
diff changeset
1210
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1211 samples = data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1212
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1213 init_get_bits(&s->gb, buf, buf_size*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1214
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1215 if (s->use_bit_reservoir) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1216 /* read super frame header */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1217 get_bits(&s->gb, 4); /* super frame index */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1218 nb_frames = get_bits(&s->gb, 4) - 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1219
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1220 bit_offset = get_bits(&s->gb, s->byte_offset_bits + 3);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1221
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1222 if (s->last_superframe_len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1223 // printf("skip=%d\n", s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1224 /* add bit_offset bits to last frame */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1225 if ((s->last_superframe_len + ((bit_offset + 7) >> 3)) >
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1226 MAX_CODED_SUPERFRAME_SIZE)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1227 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1228 q = s->last_superframe + s->last_superframe_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1229 len = bit_offset;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1230 while (len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1231 *q++ = (get_bits)(&s->gb, 8);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1232 len -= 8;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1233 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1234 if (len > 0) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1235 *q++ = (get_bits)(&s->gb, len) << (8 - len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1236 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1237
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1238 /* XXX: bit_offset bits into last frame */
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1239 init_get_bits(&s->gb, s->last_superframe, MAX_CODED_SUPERFRAME_SIZE*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1240 /* skip unused bits */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1241 if (s->last_bitoffset > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1242 skip_bits(&s->gb, s->last_bitoffset);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1243 /* this frame is stored in the last superframe and in the
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1244 current one */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1245 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1246 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1247 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1248 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1249
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1250 /* read each frame starting from bit_offset */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1251 pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
1025
1f9afd8b9131 GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents: 972
diff changeset
1252 init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1253 len = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1254 if (len > 0)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1255 skip_bits(&s->gb, len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1256
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1257 s->reset_block_lengths = 1;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1258 for(i=0;i<nb_frames;i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1259 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1260 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1261 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1262 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1263
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1264 /* we copy the end of the frame in the last frame buffer */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1265 pos = get_bits_count(&s->gb) + ((bit_offset + 4 + 4 + s->byte_offset_bits + 3) & ~7);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1266 s->last_bitoffset = pos & 7;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1267 pos >>= 3;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1268 len = buf_size - pos;
819
ae89deb3a97d * avoid negative numbers as well
kabi
parents: 818
diff changeset
1269 if (len > MAX_CODED_SUPERFRAME_SIZE || len < 0) {
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1270 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1271 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1272 s->last_superframe_len = len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1273 memcpy(s->last_superframe, buf + pos, len);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1274 } else {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1275 /* single frame decode */
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1276 if (wma_decode_frame(s, samples) < 0)
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1277 goto fail;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1278 samples += s->nb_channels * s->frame_len;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1279 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1280 *data_size = (int8_t *)samples - (int8_t *)data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1281 return s->block_align;
964
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1282 fail:
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1283 /* when error, we reset the bit reservoir */
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1284 s->last_superframe_len = 0;
6e6773512288 oops : better error resilience - should fix most wma decoding problems
bellard
parents: 819
diff changeset
1285 return -1;
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1286 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1287
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1288 static int wma_decode_end(AVCodecContext *avctx)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1289 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1290 WMADecodeContext *s = avctx->priv_data;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1291 int i;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1292
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1293 for(i = 0; i < s->nb_block_sizes; i++)
795
55add0e7eafb avoid name clash - fixed again block size selection
bellard
parents: 785
diff changeset
1294 ff_mdct_end(&s->mdct_ctx[i]);
783
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1295 for(i = 0; i < s->nb_block_sizes; i++)
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1296 av_free(s->windows[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1297
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1298 if (s->use_exp_vlc) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1299 free_vlc(&s->exp_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1300 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1301 if (s->use_noise_coding) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1302 free_vlc(&s->hgain_vlc);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1303 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1304 for(i = 0;i < 2; i++) {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1305 free_vlc(&s->coef_vlc[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1306 av_free(s->run_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1307 av_free(s->level_table[i]);
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1308 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1309
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1310 return 0;
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1311 }
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1312
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1313 AVCodec wmav1_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1314 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1315 "wmav1",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1316 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1317 CODEC_ID_WMAV1,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1318 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1319 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1320 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1321 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1322 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1323 };
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1324
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1325 AVCodec wmav2_decoder =
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1326 {
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1327 "wmav2",
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1328 CODEC_TYPE_AUDIO,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1329 CODEC_ID_WMAV2,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1330 sizeof(WMADecodeContext),
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1331 wma_decode_init,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1332 NULL,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1333 wma_decode_end,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1334 wma_decode_superframe,
b6eefd714bf3 added wma decoder
bellard
parents:
diff changeset
1335 };