wma.h 6.17 KB
Newer Older
Michael Niedermayer's avatar
Michael Niedermayer committed
1 2
/*
 * WMA compatible codec
3
 * Copyright (c) 2002-2007 The FFmpeg Project
Michael Niedermayer's avatar
Michael Niedermayer committed
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22 23
#ifndef AVCODEC_WMA_H
#define AVCODEC_WMA_H
Michael Niedermayer's avatar
Michael Niedermayer committed
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"
Michael Niedermayer's avatar
Michael Niedermayer committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

/* size of blocks */
#define BLOCK_MIN_BITS 7
#define BLOCK_MAX_BITS 11
#define BLOCK_MAX_SIZE (1 << BLOCK_MAX_BITS)

#define BLOCK_NB_SIZES (BLOCK_MAX_BITS - BLOCK_MIN_BITS + 1)

/* XXX: find exact max size */
#define HIGH_BAND_MAX_SIZE 16

#define NB_LSP_COEFS 10

/* XXX: is it a suitable value ? */
#define MAX_CODED_SUPERFRAME_SIZE 16384

#define MAX_CHANNELS 2

#define NOISE_TAB_SIZE 8192

#define LSP_POW_BITS 7

//FIXME should be in wmadec
#define VLCBITS 9
#define VLCMAX ((22+VLCBITS-1)/VLCBITS)

56 57
typedef float WMACoef;          ///< type for decoded coefficients, int16_t would be enough for wma 1/2

Michael Niedermayer's avatar
Michael Niedermayer committed
58
typedef struct CoefVLCTable {
Michael Niedermayer's avatar
Michael Niedermayer committed
59
    int n;                      ///< total number of codes
Michael Niedermayer's avatar
Michael Niedermayer committed
60
    int max_level;
Michael Niedermayer's avatar
Michael Niedermayer committed
61 62 63
    const uint32_t *huffcodes;  ///< VLC bit values
    const uint8_t *huffbits;    ///< VLC bit size
    const uint16_t *levels;     ///< table to build run/level tables
Michael Niedermayer's avatar
Michael Niedermayer committed
64 65
} CoefVLCTable;

66
typedef struct WMACodecContext {
67
    AVCodecContext* avctx;
Michael Niedermayer's avatar
Michael Niedermayer committed
68 69
    GetBitContext gb;
    PutBitContext pb;
Michael Niedermayer's avatar
Michael Niedermayer committed
70
    int version;                            ///< 1 = 0x160 (WMAV1), 2 = 0x161 (WMAV2)
Michael Niedermayer's avatar
Michael Niedermayer committed
71 72
    int use_bit_reservoir;
    int use_variable_block_len;
Michael Niedermayer's avatar
Michael Niedermayer committed
73 74
    int use_exp_vlc;                        ///< exponent coding: 0 = lsp, 1 = vlc + delta
    int use_noise_coding;                   ///< true if perceptual noise is added
Michael Niedermayer's avatar
Michael Niedermayer committed
75 76 77 78
    int byte_offset_bits;
    VLC exp_vlc;
    int exponent_sizes[BLOCK_NB_SIZES];
    uint16_t exponent_bands[BLOCK_NB_SIZES][25];
Michael Niedermayer's avatar
Michael Niedermayer committed
79 80 81
    int high_band_start[BLOCK_NB_SIZES];    ///< index of first coef in high band
    int coefs_start;                        ///< first coded coef
    int coefs_end[BLOCK_NB_SIZES];          ///< max number of coded coefficients
Michael Niedermayer's avatar
Michael Niedermayer committed
82 83 84 85 86 87 88 89 90 91 92 93
    int exponent_high_sizes[BLOCK_NB_SIZES];
    int exponent_high_bands[BLOCK_NB_SIZES][HIGH_BAND_MAX_SIZE];
    VLC hgain_vlc;

    /* coded values in high bands */
    int high_band_coded[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];
    int high_band_values[MAX_CHANNELS][HIGH_BAND_MAX_SIZE];

    /* there are two possible tables for spectral coefficients */
//FIXME the following 3 tables should be shared between decoders
    VLC coef_vlc[2];
    uint16_t *run_table[2];
94
    float *level_table[2];
Michael Niedermayer's avatar
Michael Niedermayer committed
95
    uint16_t *int_table[2];
Måns Rullgård's avatar
Måns Rullgård committed
96
    const CoefVLCTable *coef_vlcs[2];
Michael Niedermayer's avatar
Michael Niedermayer committed
97
    /* frame info */
Michael Niedermayer's avatar
Michael Niedermayer committed
98 99 100
    int frame_len;                          ///< frame length in samples
    int frame_len_bits;                     ///< frame_len = 1 << frame_len_bits
    int nb_block_sizes;                     ///< number of block sizes
Michael Niedermayer's avatar
Michael Niedermayer committed
101 102
    /* block info */
    int reset_block_lengths;
Michael Niedermayer's avatar
Michael Niedermayer committed
103 104 105 106 107 108 109 110
    int block_len_bits;                     ///< log2 of current block length
    int next_block_len_bits;                ///< log2 of next block length
    int prev_block_len_bits;                ///< log2 of prev block length
    int block_len;                          ///< block length in samples
    int block_num;                          ///< block number in current frame
    int block_pos;                          ///< current position in frame
    uint8_t ms_stereo;                      ///< true if mid/side stereo mode
    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];
Michael Niedermayer's avatar
Michael Niedermayer committed
113
    float max_exponent[MAX_CHANNELS];
114
    WMACoef coefs1[MAX_CHANNELS][BLOCK_MAX_SIZE];
115 116
    DECLARE_ALIGNED(32, float, coefs)[MAX_CHANNELS][BLOCK_MAX_SIZE];
    DECLARE_ALIGNED(32, FFTSample, output)[BLOCK_MAX_SIZE * 2];
117
    FFTContext mdct_ctx[BLOCK_NB_SIZES];
Michael Niedermayer's avatar
Michael Niedermayer committed
118 119
    float *windows[BLOCK_NB_SIZES];
    /* output buffer for one frame and the last for IMDCT windowing */
120
    DECLARE_ALIGNED(32, float, frame_out)[MAX_CHANNELS][BLOCK_MAX_SIZE * 2];
Michael Niedermayer's avatar
Michael Niedermayer committed
121
    /* last frame info */
122
    uint8_t last_superframe[MAX_CODED_SUPERFRAME_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; /* padding added */
Michael Niedermayer's avatar
Michael Niedermayer committed
123 124 125 126 127 128 129 130 131 132
    int last_bitoffset;
    int last_superframe_len;
    float noise_table[NOISE_TAB_SIZE];
    int noise_index;
    float noise_mult; /* XXX: suppress that and integrate it in the noise array */
    /* lsp_to_curve tables */
    float lsp_cos_table[BLOCK_MAX_SIZE];
    float lsp_pow_e_table[256];
    float lsp_pow_m_table1[(1 << LSP_POW_BITS)];
    float lsp_pow_m_table2[(1 << LSP_POW_BITS)];
133
    FmtConvertContext fmt_conv;
134
    AVFloatDSPContext fdsp;
Michael Niedermayer's avatar
Michael Niedermayer committed
135 136 137 138

#ifdef TRACE
    int frame_count;
#endif
139
} WMACodecContext;
Michael Niedermayer's avatar
Michael Niedermayer committed
140

141
extern const uint16_t ff_wma_critical_freqs[25];
Michael Niedermayer's avatar
Michael Niedermayer committed
142 143 144
extern const uint16_t ff_wma_hgain_huffcodes[37];
extern const uint8_t ff_wma_hgain_huffbits[37];
extern const float ff_wma_lsp_codebook[NB_LSP_COEFS][16];
145 146
extern const uint32_t ff_aac_scalefactor_code[121];
extern const uint8_t  ff_aac_scalefactor_bits[121];
Michael Niedermayer's avatar
Michael Niedermayer committed
147 148 149 150

int ff_wma_init(AVCodecContext * avctx, int flags2);
int ff_wma_total_gain_to_bits(int total_gain);
int ff_wma_end(AVCodecContext *avctx);
151
unsigned int ff_wma_get_large_val(GetBitContext* gb);
152 153
int ff_wma_run_level_decode(AVCodecContext* avctx, GetBitContext* gb,
                            VLC *vlc,
154
                            const float *level_table, const uint16_t *run_table,
155
                            int version, WMACoef *ptr, int offset,
156 157
                            int num_coefs, int block_len, int frame_len_bits,
                            int coef_nb_bits);
Michael Niedermayer's avatar
Michael Niedermayer committed
158

159
#endif /* AVCODEC_WMA_H */