FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions | Variables
atrac3.c File Reference

ATRAC3 compatible decoder. More...

#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "libavutil/attributes.h"
#include "libavutil/float_dsp.h"
#include "libavutil/libm.h"
#include "avcodec.h"
#include "bytestream.h"
#include "fft.h"
#include "get_bits.h"
#include "internal.h"
#include "atrac.h"
#include "atrac3data.h"

Go to the source code of this file.

Data Structures

struct  GainBlock
 
struct  TonalComponent
 
struct  ChannelUnit
 
struct  ATRAC3Context
 

Macros

#define JOINT_STEREO   0x12
 
#define STEREO   0x2
 
#define SAMPLES_PER_FRAME   1024
 
#define MDCT_SIZE   512
 
#define INTERPOLATE(old, new, nsample)   ((old) + (nsample) * 0.125 * ((new) - (old)))
 

Functions

static void imlt (ATRAC3Context *q, float *input, float *output, int odd_band)
 Regular 512 points IMDCT without overlapping, with the exception of the swapping of odd bands caused by the reverse spectra of the QMF. More...
 
static int decode_bytes (const uint8_t *input, uint8_t *out, int bytes)
 
static av_cold void init_imdct_window (void)
 
static av_cold int atrac3_decode_close (AVCodecContext *avctx)
 
static void read_quant_spectral_coeffs (GetBitContext *gb, int selector, int coding_flag, int *mantissas, int num_codes)
 Mantissa decoding. More...
 
static int decode_spectrum (GetBitContext *gb, float *output)
 Restore the quantized band spectrum coefficients. More...
 
static int decode_tonal_components (GetBitContext *gb, TonalComponent *components, int num_bands)
 Restore the quantized tonal components. More...
 
static int decode_gain_control (GetBitContext *gb, GainBlock *block, int num_bands)
 Decode gain parameters for the coded bands. More...
 
static int add_tonal_components (float *spectrum, int num_components, TonalComponent *components)
 Combine the tonal band spectrum and regular band spectrum. More...
 
static void reverse_matrixing (float *su1, float *su2, int *prev_code, int *curr_code)
 
static void get_channel_weights (int index, int flag, float ch[2])
 
static void channel_weighting (float *su1, float *su2, int *p3)
 
static int decode_channel_sound_unit (ATRAC3Context *q, GetBitContext *gb, ChannelUnit *snd, float *output, int channel_num, int coding_mode)
 Decode a Sound Unit. More...
 
static int decode_frame (AVCodecContext *avctx, const uint8_t *databuf, float **out_samples)
 
static int atrac3_decode_frame (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
 
static av_cold void atrac3_init_static_data (void)
 
static av_cold int atrac3_decode_init (AVCodecContext *avctx)
 

Variables

static float mdct_window [MDCT_SIZE]
 
static VLC_TYPE atrac3_vlc_table [4096][2]
 
static VLC spectral_coeff_tab [7]
 
AVCodec ff_atrac3_decoder
 

Detailed Description

ATRAC3 compatible decoder.

This decoder handles Sony's ATRAC3 data.

Container formats used to store ATRAC3 data: RealMedia (.rm), RIFF WAV (.wav, .at3), Sony OpenMG (.oma, .aa3).

To use this decoder, a calling application must supply the extradata bytes provided in the containers above.

Definition in file atrac3.c.

Macro Definition Documentation

#define JOINT_STEREO   0x12
#define STEREO   0x2

Definition at line 52 of file atrac3.c.

Referenced by atrac3_decode_init(), libshine_encode_init(), and mp3lame_encode_init().

#define SAMPLES_PER_FRAME   1024
#define MDCT_SIZE   512

Definition at line 55 of file atrac3.c.

Referenced by imlt().

#define INTERPOLATE (   old,
  new,
  nsample 
)    ((old) + (nsample) * 0.125 * ((new) - (old)))

Definition at line 463 of file atrac3.c.

Referenced by channel_weighting(), and reverse_matrixing().

Function Documentation

static void imlt ( ATRAC3Context q,
float *  input,
float *  output,
int  odd_band 
)
static

Regular 512 points IMDCT without overlapping, with the exception of the swapping of odd bands caused by the reverse spectra of the QMF.

Parameters
odd_band1 if the band is an odd band

Reverse the odd bands before IMDCT, this is an effect of the QMF transform or it gives better compression to do it this way. FIXME: It should be possible to handle this in imdct_calc for that to happen a modification of the prerotation step of all SIMD code and C code is needed. Or fix the functions before so they generate a pre reversed spectrum.

Definition at line 123 of file atrac3.c.

Referenced by decode_channel_sound_unit().

static int decode_bytes ( const uint8_t input,
uint8_t out,
int  bytes 
)
static

Definition at line 149 of file atrac3.c.

Referenced by atrac3_decode_frame().

static av_cold void init_imdct_window ( void  )
static

Definition at line 172 of file atrac3.c.

Referenced by atrac3_init_static_data().

static av_cold int atrac3_decode_close ( AVCodecContext avctx)
static

Definition at line 187 of file atrac3.c.

Referenced by atrac3_decode_init().

static void read_quant_spectral_coeffs ( GetBitContext gb,
int  selector,
int  coding_flag,
int *  mantissas,
int  num_codes 
)
static

Mantissa decoding.

Parameters
selectorwhich table the output values are coded with
coding_flagconstant length coding or variable length coding
mantissasmantissa output table
num_codesnumber of values to get

Definition at line 208 of file atrac3.c.

Referenced by decode_spectrum(), and decode_tonal_components().

static int decode_spectrum ( GetBitContext gb,
float *  output 
)
static

Restore the quantized band spectrum coefficients.

Returns
subband count, fix for broken specification/files

Definition at line 267 of file atrac3.c.

Referenced by decode_channel_sound_unit().

static int decode_tonal_components ( GetBitContext gb,
TonalComponent components,
int  num_bands 
)
static

Restore the quantized tonal components.

Parameters
componentstonal components
num_bandsnumber of coded bands

Definition at line 325 of file atrac3.c.

Referenced by decode_channel_sound_unit().

static int decode_gain_control ( GetBitContext gb,
GainBlock block,
int  num_bands 
)
static

Decode gain parameters for the coded bands.

Parameters
blockthe gainblock for the current band
num_bandsamount of coded bands

Definition at line 409 of file atrac3.c.

Referenced by decode_channel_sound_unit().

static int add_tonal_components ( float *  spectrum,
int  num_components,
TonalComponent components 
)
static

Combine the tonal band spectrum and regular band spectrum.

Parameters
spectrumoutput spectrum buffer
num_componentsnumber of tonal components
componentstonal components for this band
Returns
position of the last tonal coefficient

Definition at line 445 of file atrac3.c.

Referenced by decode_channel_sound_unit().

static void reverse_matrixing ( float *  su1,
float *  su2,
int *  prev_code,
int *  curr_code 
)
static

Definition at line 466 of file atrac3.c.

Referenced by decode_frame().

static void get_channel_weights ( int  index,
int  flag,
float  ch[2] 
)
static

Definition at line 528 of file atrac3.c.

Referenced by channel_weighting().

static void channel_weighting ( float *  su1,
float *  su2,
int *  p3 
)
static

Definition at line 541 of file atrac3.c.

Referenced by decode_frame().

static int decode_channel_sound_unit ( ATRAC3Context q,
GetBitContext gb,
ChannelUnit snd,
float *  output,
int  channel_num,
int  coding_mode 
)
static

Decode a Sound Unit.

Parameters
sndthe channel unit to be used
outputthe decoded samples before IQMF in float representation
channel_numchannel number
coding_modethe coding mode (JOINT_STEREO or regular stereo/mono)

Definition at line 572 of file atrac3.c.

Referenced by decode_frame().

static int decode_frame ( AVCodecContext avctx,
const uint8_t databuf,
float **  out_samples 
)
static

Definition at line 639 of file atrac3.c.

Referenced by atrac3_decode_frame().

static int atrac3_decode_frame ( AVCodecContext avctx,
void data,
int *  got_frame_ptr,
AVPacket avpkt 
)
static

Definition at line 734 of file atrac3.c.

static av_cold void atrac3_init_static_data ( void  )
static

Definition at line 774 of file atrac3.c.

Referenced by atrac3_decode_init().

static av_cold int atrac3_decode_init ( AVCodecContext avctx)
static

Definition at line 792 of file atrac3.c.

Variable Documentation

float mdct_window[MDCT_SIZE]
static

Definition at line 113 of file atrac3.c.

Referenced by imlt(), and init_imdct_window().

VLC_TYPE atrac3_vlc_table[4096][2]
static

Definition at line 114 of file atrac3.c.

Referenced by atrac3_init_static_data().

VLC spectral_coeff_tab[7]
static

Definition at line 115 of file atrac3.c.

AVCodec ff_atrac3_decoder
Initial value:
= {
.name = "atrac3",
.long_name = NULL_IF_CONFIG_SMALL("ATRAC3 (Adaptive TRansform Acoustic Coding 3)"),
.priv_data_size = sizeof(ATRAC3Context),
}
float, planar
Definition: samplefmt.h:69
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int atrac3_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: atrac3.c:734
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:176
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
static av_cold int atrac3_decode_close(AVCodecContext *avctx)
Definition: atrac3.c:187
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
Definition: avcodec.h:1006
static av_cold int atrac3_decode_init(AVCodecContext *avctx)
Definition: atrac3.c:792
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
Definition: ccaption_dec.c:722
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:701
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:956

Definition at line 928 of file atrac3.c.