3 * Copyright (c) 2002-2007 The FFmpeg Project
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "codeclib.h" /* needed for av_log2() */
26 *@brief Get the samples per frame for this stream.
27 *@param sample_rate output sample_rate
28 *@param version wma version
29 *@param decode_flags codec compression features
30 *@return log2 of the number of output samples per frame
32 int ff_wma_get_frame_len_bits(int sample_rate
, int version
,
33 unsigned int decode_flags
)
38 if (sample_rate
<= 16000) {
40 } else if (sample_rate
<= 22050 ||
41 (sample_rate
<= 32000 && version
== 1)) {
43 } else if (sample_rate
<= 48000) {
45 } else if (sample_rate
<= 96000) {
52 int tmp
= decode_flags
& 0x6;
55 } else if (tmp
== 0x4) {
57 } else if (tmp
== 0x6) {
62 return frame_len_bits
;
66 * Decode an uncompressed coefficient.
67 * @param s codec context
68 * @return the decoded coefficient
70 unsigned int ff_wma_get_large_val(GetBitContext
* gb
)
72 /** consumes up to 34 bits */
84 return get_bits_long(gb
, n_bits
);
88 * Decode run level compressed coefficients.
89 * @param avctx codec context
90 * @param gb bitstream reader context
91 * @param vlc vlc table for get_vlc2
92 * @param level_table level codes
93 * @param run_table run codes
94 * @param version 0 for wma1,2 1 for wmapro
95 * @param ptr output buffer
96 * @param offset offset in the output buffer
97 * @param num_coefs number of input coefficents
98 * @param block_len input buffer length (2^n)
99 * @param frame_len_bits number of bits for escaped run codes
100 * @param coef_nb_bits number of bits for escaped level codes
101 * @return 0 on success, -1 otherwise
104 int ff_wma_run_level_decode(GetBitContext
* gb
,
106 const int32_t *level_table
, const uint16_t *run_table
,
107 int version
, int32_t *ptr
, int offset
,
108 int num_coefs
, int block_len
, int frame_len_bits
,
111 int32_t code
, level
, sign
;
112 const unsigned int coef_mask
= block_len
- 1;
113 /* Rockbox: To be able to use rockbox' optimized mdct we need to pre-shift
114 * the values by >>(nbits-3). */
115 const int nbits
= av_log2(block_len
)+1;
116 const int shift
= WMAPRO_FRACT
-(nbits
-3);
117 for (; offset
< num_coefs
; offset
++) {
118 code
= get_vlc2(gb
, vlc
->table
, VLCBITS
, VLCMAX
);
121 offset
+= run_table
[code
];
122 sign
= !get_bits1(gb
);
123 /* Rockbox: To be able to use rockbox' optimized mdct we need
124 * invert the sign. */
125 ptr
[offset
& coef_mask
] = sign
? level_table
[code
] : -level_table
[code
];
126 ptr
[offset
& coef_mask
] <<= shift
;
127 } else if (code
== 1) {
133 level
= get_bits(gb
, coef_nb_bits
);
134 /** NOTE: this is rather suboptimal. reading
135 block_len_bits would be better */
136 offset
+= get_bits(gb
, frame_len_bits
);
138 level
= ff_wma_get_large_val(gb
);
143 av_log(avctx
,AV_LOG_ERROR
,
144 "broken escape sequence\n");
147 offset
+= get_bits(gb
, frame_len_bits
) + 4;
149 offset
+= get_bits(gb
, 2) + 1;
152 sign
= !get_bits1(gb
);
153 ptr
[offset
& coef_mask
] = sign
? level
: -level
;
154 ptr
[offset
& coef_mask
] <<= shift
;
157 /** NOTE: EOB can be omitted */
158 if (offset
> num_coefs
) {
159 av_log(avctx
, AV_LOG_ERROR
, "overflow in spectral RLE, ignoring\n");