Go to the documentation of this file.
57 { 0, 1, 2, 4, 5, 3, },
58 { 0, 1, 2, 4, 5, 6, 3, },
59 { 0, 1, 2, 4, 5, 6, 7, 3, },
101 memset(
ctx->channel_blocks, 0,
sizeof(
ctx->channel_blocks));
107 ctx->num_channel_blocks = 1;
112 ctx->num_channel_blocks = 1;
117 ctx->num_channel_blocks = 2;
123 ctx->num_channel_blocks = 3;
130 ctx->num_channel_blocks = 4;
138 ctx->num_channel_blocks = 5;
147 ctx->num_channel_blocks = 5;
156 "Unsupported channel count: %d!\n",
channels);
184 scale = 32.0 / 32768.0;
204 if (!
ctx->ch_units || !
ctx->fdsp) {
208 for (
i = 0;
i <
ctx->num_channel_blocks;
i++) {
209 for (ch = 0; ch < 2; ch++) {
210 ctx->ch_units[
i].channels[ch].ch_num = ch;
211 ctx->ch_units[
i].channels[ch].wnd_shape = &
ctx->ch_units[
i].channels[ch].wnd_shape_hist[0][0];
212 ctx->ch_units[
i].channels[ch].wnd_shape_prev = &
ctx->ch_units[
i].channels[ch].wnd_shape_hist[1][0];
213 ctx->ch_units[
i].channels[ch].gain_data = &
ctx->ch_units[
i].channels[ch].gain_data_hist[0][0];
214 ctx->ch_units[
i].channels[ch].gain_data_prev = &
ctx->ch_units[
i].channels[ch].gain_data_hist[1][0];
215 ctx->ch_units[
i].channels[ch].tones_info = &
ctx->ch_units[
i].channels[ch].tones_info_hist[0][0];
216 ctx->ch_units[
i].channels[ch].tones_info_prev = &
ctx->ch_units[
i].channels[ch].tones_info_hist[1][0];
219 ctx->ch_units[
i].waves_info = &
ctx->ch_units[
i].wave_synth_hist[0];
220 ctx->ch_units[
i].waves_info_prev = &
ctx->ch_units[
i].wave_synth_hist[1];
235 int i, sb, ch,
qu, nspeclines, RNG_index;
242 for (ch = 0; ch < num_channels; ch++)
252 sb_RNG_index[sb] = RNG_index & 0x3FC;
255 for (ch = 0; ch < num_channels; ch++) {
268 for (
i = 0;
i < nspeclines;
i++)
275 sb_RNG_index[sb], sb);
299 for (ch = 0; ch < num_channels; ch++) {
337 &
ctx->time_buf[ch][sb * 128]);
344 &
ctx->outp_buf[ch][0]);
348 for (ch = 0; ch < num_channels; ch++) {
361 int *got_frame_ptr,
AVPacket *avpkt)
364 int i,
ret, ch_unit_id, ch_block = 0, out_ch_index = 0, channels_to_process;
385 if (ch_block >=
ctx->num_channel_blocks ||
386 ctx->channel_blocks[ch_block] != ch_unit_id) {
388 "Frame data doesn't match channel configuration!\n");
392 ctx->ch_units[ch_block].unit_type = ch_unit_id;
393 channels_to_process = ch_unit_id + 1;
396 &
ctx->ch_units[ch_block],
402 channels_to_process, avctx);
404 channels_to_process, avctx);
406 for (
i = 0;
i < channels_to_process;
i++)
407 memcpy(samples_p[
ctx->channel_map[out_ch_index +
i]],
ctx->outp_buf[
i],
411 out_ch_index += channels_to_process;
420 .
p.
name =
"atrac3plus",
433 .
p.
name =
"atrac3plusal",
434 CODEC_LONG_NAME(
"ATRAC3+ AL (Adaptive TRansform Acoustic Coding 3+ Advanced Lossless)"),
Atrac3pWaveSynthParams * waves_info
const uint8_t * channel_map
channel layout map
void ff_atrac3p_init_dsp_static(void)
Initialize sine waves synthesizer and ff_sine_* tables.
@ AV_SAMPLE_FMT_FLTP
float, planar
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
Atrac3pWavesData * tones_info_prev
#define AV_CHANNEL_LAYOUT_STEREO
int num_wavs
number of sine waves in the group
AtracGCContext gainc_ctx
gain compensation context
static av_cold int atrac3p_decode_close(AVCodecContext *avctx)
static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, int num_channels, AVCodecContext *avctx)
This structure describes decoded (raw) audio or video data.
Atrac3pIPQFChannelCtx ipqf_ctx[2]
void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *fdsp, int ch_num, int sb, float *out)
Synthesize sine waves for a particular subband.
Atrac3pChanUnitCtx * ch_units
global channel units
static av_cold void atrac3p_init_static(void)
void ff_atrac3p_power_compensation(Atrac3pChanUnitCtx *ctx, AVFloatDSPContext *fdsp, int ch_index, float *sp, int rng_index, int sb_num)
Perform power compensation aka noise dithering.
uint8_t negate_coeffs[ATRAC3P_SUBBANDS]
1 - subband-wise IMDCT coefficients negation
float mdct_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the IMDCT
int nb_channels
Number of channels in this layout.
static int atrac3p_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
av_cold int av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type, int inv, int len, const void *scale, uint64_t flags)
Initialize a transform context with the given configuration (i)MDCTs with an odd length are currently...
#define ATRAC3P_FRAME_SAMPLES
@ CH_UNIT_EXTENSION
unit containing extension information
uint8_t * wnd_shape
IMDCT window shape for current frame.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVCodec p
The public AVCodec.
static void decode_residual_spectrum(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, float out[2][ATRAC3P_FRAME_SAMPLES], int num_channels, AVCodecContext *avctx)
AVChannelLayout ch_layout
Audio channel layout.
static av_cold int set_channel_params(ATRAC3PContext *ctx, AVCodecContext *avctx)
int flags
AV_CODEC_FLAG_*.
static av_always_inline float scale(float x, float s)
av_cold void ff_atrac_init_gain_compensation(AtracGCContext *gctx, int id2exp_offset, int loc_scale)
Initialize gain compensation context.
#define AV_CHANNEL_LAYOUT_SURROUND
static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
const float ff_atrac3p_sf_tab[64]
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
float outp_buf[2][ATRAC3P_FRAME_SAMPLES]
int used_quant_units
number of quant units with coded spectrum
#define AV_CHANNEL_LAYOUT_4POINT0
@ AV_TX_FLOAT_MDCT
Standard MDCT with a sample data type of float, double or int32_t, respecively.
#define FF_CODEC_DECODE_CB(func)
#define AV_CHANNEL_LAYOUT_7POINT1
@ CH_UNIT_MONO
unit containing one coded channel
int num_coded_subbands
number of subbands with coded spectrum
int(* init)(AVBSFContext *ctx)
Gain compensation context structure.
static const uint8_t channel_map[8][8]
const uint16_t ff_atrac3p_qu_to_spec_pos[33]
Map quant unit number to its position in the spectrum.
Atrac3pWaveSynthParams * waves_info_prev
#define CODEC_LONG_NAME(str)
const float ff_atrac3p_mant_tab[8]
@ AV_TX_FULL_IMDCT
Performs a full inverse MDCT rather than leaving out samples that can be derived through symmetry.
@ CH_UNIT_TERMINATOR
unit sequence terminator
void ff_atrac3p_ipqf(AVTXContext *dct_ctx, av_tx_fn dct_fn, Atrac3pIPQFChannelCtx *hist, const float *in, float *out)
Subband synthesis filter based on the polyphase quadrature (pseudo-QMF) filter bank.
int num_channel_blocks
number of channel blocks
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static unsigned int get_bits1(GetBitContext *s)
AtracGainInfo * gain_data_prev
gain control data for previous frame
int16_t spectrum[2048]
decoded IMDCT spectrum
uint8_t channel_blocks[5]
channel configuration descriptor
Gain control parameters for one subband.
Atrac3pWavesData * tones_info
Atrac3pChanParams channels[2]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
AVTXContext * ipqf_dct_ctx
IDCT context used by IPQF.
An AVChannelLayout holds information about the channel layout of audio data.
#define DECLARE_ALIGNED(n, t, v)
const FFCodec ff_atrac3pal_decoder
av_cold void ff_atrac3p_init_vlcs(void)
Initialize VLC tables for bitstream parsing.
enum AVSampleFormat sample_fmt
audio sample format
int qu_sf_idx[32]
array of scale factor indexes for each quant unit
@ CH_UNIT_STEREO
unit containing two jointly-coded channels
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
float time_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the gain compensation
int ff_atrac3p_decode_channel_unit(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, int num_channels, AVCodecContext *avctx)
Decode bitstream data of a channel unit.
av_cold void av_tx_uninit(AVTXContext **ctx)
Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.
#define AV_CHANNEL_LAYOUT_6POINT1_BACK
int nb_samples
number of audio samples (per channel) described by this frame
#define i(width, name, range_min, range_max)
uint8_t ** extended_data
pointers to the data planes/channels.
int unit_type
unit type (mono/stereo)
const char * name
Name of the codec implementation.
void ff_atrac3p_imdct(AVFloatDSPContext *fdsp, AVTXContext *mdct_ctx, av_tx_fn mdct_fn, float *pIn, float *pOut, int wind_id, int sb)
Regular IMDCT and windowing without overlapping, with spectrum reversal in the odd subbands.
void * av_calloc(size_t nmemb, size_t size)
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs.
#define FFSWAP(type, a, b)
float prev_buf[2][ATRAC3P_FRAME_SAMPLES]
overlapping buffer
int tones_present
1 - tones info present
uint8_t swap_channels[ATRAC3P_SUBBANDS]
1 - perform subband-wise channel swapping
main external API structure.
void ff_atrac_gain_compensation(AtracGCContext *gctx, float *in, float *prev, AtracGainInfo *gc_now, AtracGainInfo *gc_next, int num_samples, float *out)
Apply gain compensation and perform the MDCT overlapping part.
Parameters of a group of sine waves.
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
uint8_t * wnd_shape_prev
IMDCT window shape for previous frame.
#define ATRAC3P_SUBBAND_SAMPLES
number of samples per subband
const FFCodec ff_atrac3p_decoder
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AV_CHANNEL_LAYOUT_MONO
This structure stores compressed data.
#define ATRAC3P_SUBBANDS
Global unit sizes.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
#define AV_CHANNEL_LAYOUT_5POINT1_BACK
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int qu_wordlen[32]
array of word lengths for each quant unit
AtracGainInfo * gain_data
gain control data for next frame
float samples[2][ATRAC3P_FRAME_SAMPLES]
quantized MDCT spectrum