FFmpeg  4.0
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 MIN_CHANNELS   1
 
#define MAX_CHANNELS   8
 
#define MAX_JS_PAIRS   8 / 2
 
#define JOINT_STEREO   0x12
 
#define SINGLE   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 al_decode_frame (AVCodecContext *avctx, const uint8_t *databuf, int size, float **out_samples)
 
static int atrac3_decode_frame (AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
 
static int atrac3al_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
 
AVCodec ff_atrac3al_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

◆ MIN_CHANNELS

#define MIN_CHANNELS   1

Definition at line 51 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ MAX_CHANNELS

#define MAX_CHANNELS   8

Definition at line 52 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ MAX_JS_PAIRS

#define MAX_JS_PAIRS   8 / 2

Definition at line 53 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ JOINT_STEREO

#define JOINT_STEREO   0x12

◆ SINGLE

#define SINGLE   0x2

Definition at line 56 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ SAMPLES_PER_FRAME

#define SAMPLES_PER_FRAME   1024

◆ MDCT_SIZE

#define MDCT_SIZE   512

Definition at line 59 of file atrac3.c.

Referenced by imlt().

◆ INTERPOLATE

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

Definition at line 467 of file atrac3.c.

Referenced by channel_weighting(), and reverse_matrixing().

Function Documentation

◆ imlt()

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 127 of file atrac3.c.

Referenced by decode_channel_sound_unit().

◆ decode_bytes()

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

Definition at line 153 of file atrac3.c.

Referenced by atrac3_decode_frame().

◆ init_imdct_window()

static av_cold void init_imdct_window ( void  )
static

Definition at line 176 of file atrac3.c.

Referenced by atrac3_init_static_data().

◆ atrac3_decode_close()

static av_cold int atrac3_decode_close ( AVCodecContext avctx)
static

Definition at line 191 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ read_quant_spectral_coeffs()

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 212 of file atrac3.c.

Referenced by decode_spectrum(), and decode_tonal_components().

◆ decode_spectrum()

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 271 of file atrac3.c.

Referenced by decode_channel_sound_unit().

◆ decode_tonal_components()

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 329 of file atrac3.c.

Referenced by decode_channel_sound_unit().

◆ decode_gain_control()

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 413 of file atrac3.c.

Referenced by decode_channel_sound_unit().

◆ add_tonal_components()

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 449 of file atrac3.c.

Referenced by decode_channel_sound_unit().

◆ reverse_matrixing()

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

Definition at line 470 of file atrac3.c.

Referenced by decode_frame().

◆ get_channel_weights()

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

Definition at line 532 of file atrac3.c.

Referenced by channel_weighting().

◆ channel_weighting()

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

Definition at line 545 of file atrac3.c.

Referenced by decode_frame().

◆ decode_channel_sound_unit()

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 single channels)

Definition at line 576 of file atrac3.c.

Referenced by al_decode_frame(), and decode_frame().

◆ decode_frame()

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

Definition at line 643 of file atrac3.c.

Referenced by atrac3_decode_frame().

◆ al_decode_frame()

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

Definition at line 756 of file atrac3.c.

Referenced by atrac3al_decode_frame().

◆ atrac3_decode_frame()

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

Definition at line 790 of file atrac3.c.

◆ atrac3al_decode_frame()

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

Definition at line 830 of file atrac3.c.

◆ atrac3_init_static_data()

static av_cold void atrac3_init_static_data ( void  )
static

Definition at line 852 of file atrac3.c.

Referenced by atrac3_decode_init().

◆ atrac3_decode_init()

static av_cold int atrac3_decode_init ( AVCodecContext avctx)
static

Definition at line 870 of file atrac3.c.

Variable Documentation

◆ mdct_window

float mdct_window[MDCT_SIZE]
static

Definition at line 117 of file atrac3.c.

Referenced by imlt(), and init_imdct_window().

◆ atrac3_vlc_table

VLC_TYPE atrac3_vlc_table[4096][2]
static

Definition at line 118 of file atrac3.c.

Referenced by atrac3_init_static_data().

◆ spectral_coeff_tab

VLC spectral_coeff_tab[7]
static

Definition at line 119 of file atrac3.c.

◆ ff_atrac3_decoder

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 void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
static int atrac3_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: atrac3.c:790
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
static av_cold int atrac3_decode_close(AVCodecContext *avctx)
Definition: atrac3.c:191
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
Definition: avcodec.h:1002
static av_cold int atrac3_decode_init(AVCodecContext *avctx)
Definition: atrac3.c:870
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:959

Definition at line 1012 of file atrac3.c.

◆ ff_atrac3al_decoder

AVCodec ff_atrac3al_decoder
Initial value:
= {
.name = "atrac3al",
.long_name = NULL_IF_CONFIG_SMALL("ATRAC3 AL (Adaptive TRansform Acoustic Coding 3 Advanced Lossless)"),
.priv_data_size = sizeof(ATRAC3Context),
}
float, planar
Definition: samplefmt.h:69
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
static av_cold int atrac3_decode_close(AVCodecContext *avctx)
Definition: atrac3.c:191
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
Definition: avcodec.h:1002
static av_cold int atrac3_decode_init(AVCodecContext *avctx)
Definition: atrac3.c:870
static int atrac3al_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: atrac3.c:830
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:959

Definition at line 1026 of file atrac3.c.