wma.h
Go to the documentation of this file.
1 /*
2  * WMA compatible codec
3  * Copyright (c) 2002-2007 The FFmpeg Project
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 #ifndef AVCODEC_WMA_H
23 #define AVCODEC_WMA_H
24 
25 #include "libavutil/float_dsp.h"
26 #include "get_bits.h"
27 #include "put_bits.h"
28 #include "fft.h"
29 #include "fmtconvert.h"
30 
31 /* size of blocks */
32 #define BLOCK_MIN_BITS 7
33 #define BLOCK_MAX_BITS 11
34 #define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS)
35 
36 #define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1)
37 
38 /* XXX: find exact max size */
39 #define HIGH_BAND_MAX_SIZE 16
40 
41 #define NB_LSP_COEFS 10
42 
43 /* XXX: is it a suitable value ? */
44 #define MAX_CODED_SUPERFRAME_SIZE 16384
45 
46 #define MAX_CHANNELS 2
47 
48 #define NOISE_TAB_SIZE 8192
49 
50 #define LSP_POW_BITS 7
51 
52 //FIXME should be in wmadec
53 #define VLCBITS 9
54 #define VLCMAX ((22+VLCBITS-1)/VLCBITS)
55 
56 typedef float WMACoef; ///< type for decoded coefficients, int16_t would be enough for wma 1/2
57 
58 typedef struct CoefVLCTable {
59  int n; ///< total number of codes
60  int max_level;
61  const uint32_t *huffcodes; ///< VLC bit values
62  const uint8_t *huffbits; ///< VLC bit size
63  const uint16_t *levels; ///< table to build run/level tables
64 } CoefVLCTable;
65 
66 typedef struct WMACodecContext {
70  int version; ///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2)
73  int use_exp_vlc; ///< exponent coding: 0 = lsp, 1 = vlc + delta
74  int use_noise_coding; ///< true if perceptual noise is added
77  int exponent_sizes[BLOCK_NB_SIZES];
78  uint16_t exponent_bands[BLOCK_NB_SIZES][25];
79  int high_band_start[BLOCK_NB_SIZES]; ///< index of first coef in high band
80  int coefs_start; ///< first coded coef
81  int coefs_end[BLOCK_NB_SIZES]; ///< max number of coded coefficients
82  int exponent_high_sizes[BLOCK_NB_SIZES];
83  int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE];
85 
86  /* coded values in high bands */
87  int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
88  int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
89 
90  /* there are two possible tables for spectral coefficients */
91 //FIXME the following 3 tables should be shared between decoders
93  uint16_t *run_table[2];
94  float *level_table[2];
95  uint16_t *int_table[2];
97  /* frame info */
98  int frame_len; ///< frame length in samples
99  int frame_len_bits; ///< frame_len = 1 << frame_len_bits
100  int nb_block_sizes; ///< number of block sizes
101  /* block info */
103  int block_len_bits; ///< log2 of current block length
104  int next_block_len_bits; ///< log2 of next block length
105  int prev_block_len_bits; ///< log2 of prev block length
106  int block_len; ///< block length in samples
107  int block_num; ///< block number in current frame
108  int block_pos; ///< current position in frame
109  uint8_t ms_stereo; ///< true if mid/side stereo mode
110  uint8_t channel_coded[MAX_CHANNELS]; ///< true if channel is coded
111  int exponents_bsize[MAX_CHANNELS]; ///< log2 ratio frame/exp. length
112  DECLARE_ALIGNED(32, float, exponents)[MAX_CHANNELS][BLOCK_MAX_SIZE];
113  float max_exponent[MAX_CHANNELS];
115  DECLARE_ALIGNED(32, float, coefs)[MAX_CHANNELS][BLOCK_MAX_SIZE];
118  float *windows[BLOCK_NB_SIZES];
119  /* output buffer for one frame and the last for IMDCT windowing */
120  DECLARE_ALIGNED(32, float, frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE * 2];
121  /* last frame info */
122  uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; /* padding added */
127  float noise_mult; /* XXX: suppress that and integrate it in the noise array */
128  /* lsp_to_curve tables */
129  float lsp_cos_table[BLOCK_MAX_SIZE];
130  float lsp_pow_e_table[256];
131  float lsp_pow_m_table1[(1 << LSP_POW_BITS)];
132  float lsp_pow_m_table2[(1 << LSP_POW_BITS)];
135 
136 #ifdef TRACE
137  int frame_count;
138 #endif
140 
141 extern const uint16_t ff_wma_critical_freqs[25];
142 extern const uint16_t ff_wma_hgain_huffcodes[37];
143 extern const uint8_t ff_wma_hgain_huffbits[37];
144 extern const float ff_wma_lsp_codebook[NB_LSP_COEFS][16];
145 extern const uint32_t ff_aac_scalefactor_code[121];
146 extern const uint8_t ff_aac_scalefactor_bits[121];
147 
148 int ff_wma_init(AVCodecContext * avctx, int flags2);
149 int ff_wma_total_gain_to_bits(int total_gain);
150 int ff_wma_end(AVCodecContext *avctx);
151 unsigned int ff_wma_get_large_val(GetBitContext* gb);
153  VLC *vlc,
154  const float *level_table, const uint16_t *run_table,
155  int version, WMACoef *ptr, int offset,
156  int num_coefs, int block_len, int frame_len_bits,
157  int coef_nb_bits);
158 
159 #endif /* AVCODEC_WMA_H */
int next_block_len_bits
log2 of next block length
Definition: wma.h:104
#define BLOCK_MAX_SIZE
Definition: wma.h:34
unsigned int ff_wma_get_large_val(GetBitContext *gb)
Decode an uncompressed coefficient.
Definition: wma.c:401
GetBitContext gb
Definition: wma.h:68
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:59
int block_len
block length in samples
Definition: wma.h:106
int ff_wma_run_level_decode(AVCodecContext *avctx, GetBitContext *gb, VLC *vlc, const float *level_table, const uint16_t *run_table, int version, WMACoef *ptr, int offset, int num_coefs, int block_len, int frame_len_bits, int coef_nb_bits)
Decode run level compressed coefficients.
Definition: wma.c:434
const uint8_t * huffbits
VLC bit size.
Definition: wma.h:62
const uint16_t ff_wma_critical_freqs[25]
Definition: wmadata.h:33
int version
Definition: avisynth_c.h:666
int n
total number of codes
Definition: wma.h:59
#define NOISE_TAB_SIZE
Definition: wma.h:48
#define BLOCK_NB_SIZES
Definition: wma.h:36
uint8_t
float WMACoef
type for decoded coefficients, int16_t would be enough for wma 1/2
Definition: wma.h:56
int block_pos
current position in frame
Definition: wma.h:108
const uint32_t * huffcodes
VLC bit values.
Definition: wma.h:61
bitstream reader API header.
int max_level
Definition: wma.h:60
int reset_block_lengths
Definition: wma.h:102
int nb_block_sizes
number of block sizes
Definition: wma.h:100
AVFloatDSPContext fdsp
Definition: wma.h:134
int last_superframe_len
Definition: wma.h:124
int ff_wma_total_gain_to_bits(int total_gain)
Definition: wma.c:363
const uint8_t ff_wma_hgain_huffbits[37]
Definition: wmadata.h:67
int noise_index
Definition: wma.h:126
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
float FFTSample
Definition: avfft.h:35
Definition: get_bits.h:63
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
Definition: fft.h:62
int use_bit_reservoir
Definition: wma.h:71
#define MAX_CODED_SUPERFRAME_SIZE
Definition: wma.h:44
const uint16_t ff_wma_hgain_huffcodes[37]
Definition: wmadata.h:59
int version
1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2)
Definition: wma.h:70
struct CoefVLCTable CoefVLCTable
int frame_len
frame length in samples
Definition: wma.h:98
#define MAX_CHANNELS
Definition: wma.h:46
int last_bitoffset
Definition: wma.h:123
int frame_len_bits
frame_len = 1 << frame_len_bits
Definition: wma.h:99
#define HIGH_BAND_MAX_SIZE
Definition: wma.h:39
int use_exp_vlc
exponent coding: 0 = lsp, 1 = vlc + delta
Definition: wma.h:73
#define NB_LSP_COEFS
Definition: wma.h:41
main external API structure.
AVCodecContext * avctx
Definition: wma.h:67
static VLC coef_vlc[2]
coefficient run length vlc codes
Definition: wmaprodec.c:126
int block_num
block number in current frame
Definition: wma.h:107
int use_noise_coding
true if perceptual noise is added
Definition: wma.h:74
static const int8_t noise_table[256]
Data table used for TrueHD noise generation function.
Definition: mlpdec.c:892
#define LSP_POW_BITS
Definition: wma.h:50
int use_variable_block_len
Definition: wma.h:72
uint8_t ms_stereo
true if mid/side stereo mode
Definition: wma.h:109
VLC exp_vlc
Definition: wma.h:76
int prev_block_len_bits
log2 of prev block length
Definition: wma.h:105
struct WMACodecContext WMACodecContext
static int frame_count
Definition: muxing.c:234
const float ff_wma_lsp_codebook[NB_LSP_COEFS][16]
Definition: wmadata.h:75
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
FmtConvertContext fmt_conv
Definition: wma.h:133
int ff_wma_init(AVCodecContext *avctx, int flags2)
Definition: wma.c:71
const uint8_t ff_aac_scalefactor_bits[121]
Definition: aactab.c:70
static const CoefVLCTable coef_vlcs[6]
Definition: wmadata.h:1382
const uint32_t ff_aac_scalefactor_code[121]
Definition: aactab.c:51
int ff_wma_end(AVCodecContext *avctx)
Definition: wma.c:372
VLC hgain_vlc
Definition: wma.h:84
int coefs_start
first coded coef
Definition: wma.h:80
int block_len_bits
log2 of current block length
Definition: wma.h:103
int byte_offset_bits
Definition: wma.h:75
PutBitContext pb
Definition: wma.h:69
const uint16_t * levels
table to build run/level tables
Definition: wma.h:63
float noise_mult
Definition: wma.h:127
bitstream writer API