FFmpeg
Loading...
Searching...
No Matches
wmadec.c File Reference

WMA compatible decoder. More...

#include "config_components.h"
#include "libavutil/attributes.h"
#include "libavutil/avassert.h"
#include "libavutil/ffmath.h"
#include "avcodec.h"
#include "codec_internal.h"
#include "decode.h"
#include "internal.h"
#include "wma.h"

Go to the source code of this file.

Macros

#define EXPVLCBITS   8
 
#define EXPMAX   ((19 + EXPVLCBITS - 1) / EXPVLCBITS)
 
#define HGAINVLCBITS   9
 
#define HGAINMAX   ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS)
 

Functions

static void wma_lsp_to_curve_init (WMACodecContext *s, int frame_len)
 
static av_cold int wma_decode_init (AVCodecContext *avctx)
 
static float pow_m1_4 (WMACodecContext *s, float x)
 compute x^-0.25 with an exponent and mantissa table.
 
static void wma_lsp_to_curve (WMACodecContext *s, float *out, float *val_max_ptr, int n, float *lsp)
 NOTE: We use the same code as Vorbis here.
 
static void decode_exp_lsp (WMACodecContext *s, int ch)
 decode exponents coded with LSP coefficients (same idea as Vorbis)
 
static int decode_exp_vlc (WMACodecContext *s, int ch)
 decode exponents coded with VLC codes
 
static void wma_window (WMACodecContext *s, float *out)
 Apply MDCT window and add into output.
 
static int wma_decode_block (WMACodecContext *s)
 
static int wma_decode_frame (WMACodecContext *s, float **samples, int samples_offset)
 
static int wma_decode_superframe (AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
 
static av_cold void flush (AVCodecContext *avctx)
 

Variables

static const float pow_tab []
 pow(10, i / 16.0) for i in -60..95
 

Detailed Description

WMA compatible decoder.

This decoder handles Microsoft Windows Media Audio data, versions 1 & 2. WMA v1 is identified by audio format 0x160 in Microsoft media files (ASF/AVI/WAV). WMA v2 is identified by audio format 0x161.

To use this decoder, a calling application must supply the extra data bytes provided with the WMA data. These are the extra, codec-specific bytes at the end of a WAVEFORMATEX data structure. Transmit these bytes to the decoder using the extradata[_size] fields in AVCodecContext. There should be 4 extra bytes for v1 data and 6 extra bytes for v2 data.

Definition in file wmadec.c.

Macro Definition Documentation

◆ EXPVLCBITS

#define EXPVLCBITS   8

Definition at line 48 of file wmadec.c.

Referenced by decode_exp_vlc(), and wma_decode_init().

◆ EXPMAX

#define EXPMAX   ((19 + EXPVLCBITS - 1) / EXPVLCBITS)

Definition at line 49 of file wmadec.c.

Referenced by decode_exp_vlc().

◆ HGAINVLCBITS

#define HGAINVLCBITS   9

Definition at line 51 of file wmadec.c.

Referenced by wma_decode_block(), and wma_decode_init().

◆ HGAINMAX

#define HGAINMAX   ((13 + HGAINVLCBITS - 1) / HGAINVLCBITS)

Definition at line 52 of file wmadec.c.

Referenced by wma_decode_block().

Function Documentation

◆ wma_lsp_to_curve_init()

static av_cold void wma_lsp_to_curve_init ( WMACodecContext * s,
int frame_len )
static

Definition at line 174 of file wmadec.c.

Referenced by wma_decode_init().

◆ wma_decode_init()

static av_cold int wma_decode_init ( AVCodecContext * avctx)
static

Definition at line 75 of file wmadec.c.

◆ pow_m1_4()

static float pow_m1_4 ( WMACodecContext * s,
float x )
inlinestatic

compute x^-0.25 with an exponent and mantissa table.

We use linear interpolation to reduce the mantissa table size at a small speed expense (linear interpolation approximately doubles the number of bits of precision).

Definition at line 155 of file wmadec.c.

Referenced by wma_lsp_to_curve().

◆ wma_lsp_to_curve()

static void wma_lsp_to_curve ( WMACodecContext * s,
float * out,
float * val_max_ptr,
int n,
float * lsp )
static

NOTE: We use the same code as Vorbis here.

Todo
optimize it further with SSE/3Dnow

Definition at line 206 of file wmadec.c.

Referenced by decode_exp_lsp().

◆ decode_exp_lsp()

static void decode_exp_lsp ( WMACodecContext * s,
int ch )
static

decode exponents coded with LSP coefficients (same idea as Vorbis)

Definition at line 235 of file wmadec.c.

Referenced by wma_decode_block().

◆ decode_exp_vlc()

static int decode_exp_vlc ( WMACodecContext * s,
int ch )
static

decode exponents coded with VLC codes

Definition at line 337 of file wmadec.c.

Referenced by wma_decode_block().

◆ wma_window()

static void wma_window ( WMACodecContext * s,
float * out )
static

Apply MDCT window and add into output.

We ensure that when the windows overlap their squared sum is always 1 (MDCT reconstruction rule).

Definition at line 398 of file wmadec.c.

Referenced by wma_decode_block().

◆ wma_decode_block()

static int wma_decode_block ( WMACodecContext * s)
static
Returns
0 if OK. 1 if last block of frame. AVERROR if unrecoverable error.

Definition at line 450 of file wmadec.c.

Referenced by wma_decode_frame().

◆ wma_decode_frame()

static int wma_decode_frame ( WMACodecContext * s,
float ** samples,
int samples_offset )
static

Definition at line 796 of file wmadec.c.

Referenced by wma_decode_superframe().

◆ wma_decode_superframe()

static int wma_decode_superframe ( AVCodecContext * avctx,
AVFrame * frame,
int * got_frame_ptr,
AVPacket * avpkt )
static

Definition at line 832 of file wmadec.c.

◆ flush()

static av_cold void flush ( AVCodecContext * avctx)
static

Definition at line 1006 of file wmadec.c.

Variable Documentation

◆ pow_tab

const float pow_tab[]
static

pow(10, i / 16.0) for i in -60..95

Definition at line 253 of file wmadec.c.

Referenced by decode_exp_vlc().