Mercurial > libavcodec.hg
annotate wma.h @ 11352:6e0af2cfdcfe libavcodec
Do MC and IDCT in coding (hilbert) order
This increases the slice size to 64 pixels, due to having to decode an
entire chroma superblock row per slice.
This can be up to 6% slower depending on clip and CPU, but is necessary
for future optimizations that gain significantly more than was lost.
author | conrad |
---|---|
date | Wed, 03 Mar 2010 23:27:40 +0000 |
parents | 964d01b50f17 |
children | 98970e51365a |
rev | line source |
---|---|
4490 | 1 /* |
2 * WMA compatible codec | |
8629
04423b2f6e0b
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
7760
diff
changeset
|
3 * Copyright (c) 2002-2007 The FFmpeg Project |
4490 | 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 | |
7760 | 22 #ifndef AVCODEC_WMA_H |
23 #define AVCODEC_WMA_H | |
4490 | 24 |
9428 | 25 #include "get_bits.h" |
9411
4cb7c65fc775
Split bitstream.h, put the bitstream writer stuff in the new file
stefano
parents:
8629
diff
changeset
|
26 #include "put_bits.h" |
4490 | 27 #include "dsputil.h" |
28 | |
29 /* size of blocks */ | |
30 #define BLOCK_MIN_BITS 7 | |
31 #define BLOCK_MAX_BITS 11 | |
32 #define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS) | |
33 | |
34 #define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1) | |
35 | |
36 /* XXX: find exact max size */ | |
37 #define HIGH_BAND_MAX_SIZE 16 | |
38 | |
39 #define NB_LSP_COEFS 10 | |
40 | |
41 /* XXX: is it a suitable value ? */ | |
42 #define MAX_CODED_SUPERFRAME_SIZE 16384 | |
43 | |
44 #define MAX_CHANNELS 2 | |
45 | |
46 #define NOISE_TAB_SIZE 8192 | |
47 | |
48 #define LSP_POW_BITS 7 | |
49 | |
50 //FIXME should be in wmadec | |
51 #define VLCBITS 9 | |
52 #define VLCMAX ((22+VLCBITS-1)/VLCBITS) | |
53 | |
9868 | 54 typedef float WMACoef; ///< type for decoded coefficients, int16_t would be enough for wma 1/2 |
55 | |
4490 | 56 typedef struct CoefVLCTable { |
4497 | 57 int n; ///< total number of codes |
4490 | 58 int max_level; |
4497 | 59 const uint32_t *huffcodes; ///< VLC bit values |
60 const uint8_t *huffbits; ///< VLC bit size | |
61 const uint16_t *levels; ///< table to build run/level tables | |
4490 | 62 } CoefVLCTable; |
63 | |
4601 | 64 typedef struct WMACodecContext { |
4600 | 65 AVCodecContext* avctx; |
4490 | 66 GetBitContext gb; |
67 PutBitContext pb; | |
68 int sample_rate; | |
69 int nb_channels; | |
70 int bit_rate; | |
4497 | 71 int version; ///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2) |
4490 | 72 int block_align; |
73 int use_bit_reservoir; | |
74 int use_variable_block_len; | |
4497 | 75 int use_exp_vlc; ///< exponent coding: 0 = lsp, 1 = vlc + delta |
76 int use_noise_coding; ///< true if perceptual noise is added | |
4490 | 77 int byte_offset_bits; |
78 VLC exp_vlc; | |
79 int exponent_sizes[BLOCK_NB_SIZES]; | |
80 uint16_t exponent_bands[BLOCK_NB_SIZES][25]; | |
4497 | 81 int high_band_start[BLOCK_NB_SIZES]; ///< index of first coef in high band |
82 int coefs_start; ///< first coded coef | |
83 int coefs_end[BLOCK_NB_SIZES]; ///< max number of coded coefficients | |
4490 | 84 int exponent_high_sizes[BLOCK_NB_SIZES]; |
85 int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE]; | |
86 VLC hgain_vlc; | |
87 | |
88 /* coded values in high bands */ | |
89 int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE]; | |
90 int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE]; | |
91 | |
92 /* there are two possible tables for spectral coefficients */ | |
93 //FIXME the following 3 tables should be shared between decoders | |
94 VLC coef_vlc[2]; | |
95 uint16_t *run_table[2]; | |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10199
diff
changeset
|
96 float *level_table[2]; |
4490 | 97 uint16_t *int_table[2]; |
5258 | 98 const CoefVLCTable *coef_vlcs[2]; |
4490 | 99 /* frame info */ |
4497 | 100 int frame_len; ///< frame length in samples |
101 int frame_len_bits; ///< frame_len = 1 << frame_len_bits | |
102 int nb_block_sizes; ///< number of block sizes | |
4490 | 103 /* block info */ |
104 int reset_block_lengths; | |
4497 | 105 int block_len_bits; ///< log2 of current block length |
106 int next_block_len_bits; ///< log2 of next block length | |
107 int prev_block_len_bits; ///< log2 of prev block length | |
108 int block_len; ///< block length in samples | |
109 int block_num; ///< block number in current frame | |
110 int block_pos; ///< current position in frame | |
111 uint8_t ms_stereo; ///< true if mid/side stereo mode | |
112 uint8_t channel_coded[MAX_CHANNELS]; ///< true if channel is coded | |
4785
4ae9ab738aec
WMA decoder improvement, output closer to the dmo binary.
banan
parents:
4737
diff
changeset
|
113 int exponents_bsize[MAX_CHANNELS]; ///< log2 ratio frame/exp. length |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10314
diff
changeset
|
114 DECLARE_ALIGNED_16(float, exponents)[MAX_CHANNELS][BLOCK_MAX_SIZE]; |
4490 | 115 float max_exponent[MAX_CHANNELS]; |
9868 | 116 WMACoef coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE]; |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10314
diff
changeset
|
117 DECLARE_ALIGNED_16(float, coefs)[MAX_CHANNELS][BLOCK_MAX_SIZE]; |
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10314
diff
changeset
|
118 DECLARE_ALIGNED_16(FFTSample, output)[BLOCK_MAX_SIZE * 2]; |
10199 | 119 FFTContext mdct_ctx[BLOCK_NB_SIZES]; |
4490 | 120 float *windows[BLOCK_NB_SIZES]; |
121 /* output buffer for one frame and the last for IMDCT windowing */ | |
10961
34a65026fa06
Move array specifiers outside DECLARE_ALIGNED() invocations
mru
parents:
10314
diff
changeset
|
122 DECLARE_ALIGNED_16(float, frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE * 2]; |
4490 | 123 /* last frame info */ |
124 uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + 4]; /* padding added */ | |
125 int last_bitoffset; | |
126 int last_superframe_len; | |
127 float noise_table[NOISE_TAB_SIZE]; | |
128 int noise_index; | |
129 float noise_mult; /* XXX: suppress that and integrate it in the noise array */ | |
130 /* lsp_to_curve tables */ | |
131 float lsp_cos_table[BLOCK_MAX_SIZE]; | |
132 float lsp_pow_e_table[256]; | |
133 float lsp_pow_m_table1[(1 << LSP_POW_BITS)]; | |
134 float lsp_pow_m_table2[(1 << LSP_POW_BITS)]; | |
135 DSPContext dsp; | |
136 | |
137 #ifdef TRACE | |
138 int frame_count; | |
139 #endif | |
4601 | 140 } WMACodecContext; |
4490 | 141 |
10966
c29ee479e359
Export wma_critical_freqs as ff_wma_critical_freqs
daniel
parents:
10961
diff
changeset
|
142 extern const uint16_t ff_wma_critical_freqs[25]; |
4490 | 143 extern const uint16_t ff_wma_hgain_huffcodes[37]; |
144 extern const uint8_t ff_wma_hgain_huffbits[37]; | |
145 extern const float ff_wma_lsp_codebook[NB_LSP_COEFS][16]; | |
11215
964d01b50f17
remove a Huffman table from WMA which also exists in AAC
stefang
parents:
10966
diff
changeset
|
146 extern const uint32_t ff_aac_scalefactor_code[121]; |
964d01b50f17
remove a Huffman table from WMA which also exists in AAC
stefang
parents:
10966
diff
changeset
|
147 extern const uint8_t ff_aac_scalefactor_bits[121]; |
4490 | 148 |
9841
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9428
diff
changeset
|
149 int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version, |
39bb2646fe00
Move frame len bits calculation to ff_wma_get_frame_len_bits
faust3
parents:
9428
diff
changeset
|
150 unsigned int decode_flags); |
4490 | 151 int ff_wma_init(AVCodecContext * avctx, int flags2); |
152 int ff_wma_total_gain_to_bits(int total_gain); | |
153 int ff_wma_end(AVCodecContext *avctx); | |
9869
1f6b569bf958
Add support for escape coded wmapro run level coefficients
faust3
parents:
9868
diff
changeset
|
154 unsigned int ff_wma_get_large_val(GetBitContext* gb); |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9841
diff
changeset
|
155 int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb, |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9841
diff
changeset
|
156 VLC *vlc, |
10314
ab687351bfef
WMA: store level_table as floats, use type punning for sign flip in decode
mru
parents:
10199
diff
changeset
|
157 const float *level_table, const uint16_t *run_table, |
9868 | 158 int version, WMACoef *ptr, int offset, |
9844
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9841
diff
changeset
|
159 int num_coefs, int block_len, int frame_len_bits, |
eb5916527064
Move run level decode functionality to ff_wma_run_level_decode
faust3
parents:
9841
diff
changeset
|
160 int coef_nb_bits); |
4490 | 161 |
7760 | 162 #endif /* AVCODEC_WMA_H */ |