142 "Unsupported channel count: %d!\n", avctx->
channels);
186 for (ch = 0; ch < 2; ch++) {
212 int i, sb, ch,
qu, nspeclines, RNG_index;
219 for (ch = 0; ch < num_channels; ch++)
220 memset(
out[ch], 0, ATRAC3P_FRAME_SAMPLES *
sizeof(*
out[ch]));
229 sb_RNG_index[sb] = RNG_index & 0x3FC;
232 for (ch = 0; ch < num_channels; ch++) {
234 memset(
out[ch], 0, ATRAC3P_FRAME_SAMPLES *
sizeof(*
out[ch]));
239 nspeclines = ff_atrac3p_qu_to_spec_pos[qu + 1] -
240 ff_atrac3p_qu_to_spec_pos[
qu];
245 for (i = 0; i < nspeclines; i++)
252 sb_RNG_index[sb], sb);
259 FFSWAP(
float,
out[0][sb * ATRAC3P_SUBBAND_SAMPLES + i],
260 out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i]);
266 out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i] = -(
out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i]);
276 for (ch = 0; ch < num_channels; ch++) {
281 &ctx->
mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
287 &ctx->
mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
288 &ch_unit->
prev_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
291 ATRAC3P_SUBBAND_SAMPLES,
292 &ctx->
time_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES]);
299 ATRAC3P_SUBBAND_SAMPLES *
304 ATRAC3P_SUBBAND_SAMPLES *
324 for (ch = 0; ch < num_channels; ch++) {
337 int *got_frame_ptr,
AVPacket *avpkt)
341 int i,
ret, ch_unit_id, ch_block = 0, out_ch_index = 0, channels_to_process;
365 "Frame data doesn't match channel configuration!\n");
370 channels_to_process = ch_unit_id + 1;
379 channels_to_process, avctx);
381 channels_to_process, avctx);
383 for (i = 0; i < channels_to_process; i++)
384 memcpy(samples_p[out_ch_index + i], ctx->
outp_buf[i],
388 out_ch_index += channels_to_process;
397 .
name =
"atrac3plus",
410 .
name =
"atrac3plusal",
411 .long_name =
NULL_IF_CONFIG_SMALL(
"ATRAC3+ AL (Adaptive TRansform Acoustic Coding 3+ Advanced Lossless)"),
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
float prev_buf[2][ATRAC3P_FRAME_SAMPLES]
overlapping buffer
const float ff_atrac3p_sf_tab[64]
#define AV_CH_LAYOUT_7POINT1
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
Atrac3pWaveSynthParams wave_synth_hist[2]
waves synth history for two frames
const uint16_t ff_atrac3p_qu_to_spec_pos[33]
Map quant unit number to its position in the spectrum.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Atrac3pChanUnitCtx * ch_units
global channel units
#define AV_CH_LAYOUT_SURROUND
static av_cold int init(AVCodecContext *avctx)
static av_cold void atrac3p_init_static(void)
Atrac3pWavesData * tones_info_prev
int num_coded_subbands
number of subbands with coded spectrum
#define AV_CH_LAYOUT_4POINT0
static av_cold int atrac3p_decode_close(AVCodecContext *avctx)
int num_wavs
number of sine waves in the group
#define AV_CH_LAYOUT_STEREO
int used_quant_units
number of quant units with coded spectrum
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static void decode_residual_spectrum(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, float out[2][ATRAC3P_FRAME_SAMPLES], int num_channels, AVCodecContext *avctx)
uint8_t negate_coeffs[ATRAC3P_SUBBANDS]
1 - subband-wise IMDCT coefficients negation
#define ATRAC3P_SUBBANDS
Global unit sizes.
AtracGCContext gainc_ctx
gain compensation context
AtracGainInfo * gain_data_prev
gain control data for previous frame
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
enum AVSampleFormat sample_fmt
audio sample format
int16_t spectrum[2048]
decoded IMDCT spectrum
float mdct_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the IMDCT
static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, int num_channels, AVCodecContext *avctx)
#define ATRAC3P_FRAME_SAMPLES
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
int ff_atrac3p_decode_channel_unit(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, int num_channels, AVCodecContext *avctx)
Decode bitstream data of a channel unit.
int qu_sf_idx[32]
array of scale factor indexes for each quant unit
bitstream reader API header.
uint8_t * wnd_shape
IMDCT window shape for current frame.
void ff_atrac3p_imdct(AVFloatDSPContext *fdsp, FFTContext *mdct_ctx, float *pIn, float *pOut, int wind_id, int sb)
Regular IMDCT and windowing without overlapping, with spectrum reversal in the odd subbands...
static int get_bits_left(GetBitContext *gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int num_channel_blocks
number of channel blocks
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
uint8_t * wnd_shape_prev
IMDCT window shape for previous frame.
void ff_atrac3p_ipqf(FFTContext *dct_ctx, Atrac3pIPQFChannelCtx *hist, const float *in, float *out)
Subband synthesis filter based on the polyphase quadrature (pseudo-QMF) filter bank.
Parameters of a group of sine waves.
static av_cold int set_channel_params(ATRAC3PContext *ctx, AVCodecContext *avctx)
void ff_atrac3p_init_dsp_static(void)
Initialize sine waves synthesizer and ff_sine_* tables.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
Gain compensation context structure.
int qu_wordlen[32]
array of word lengths for each quant unit
av_cold void ff_atrac_init_gain_compensation(AtracGCContext *gctx, int id2exp_offset, int loc_scale)
Initialize gain compensation context.
uint64_t channel_layout
Audio channel layout.
#define ATRAC3P_SUBBAND_SAMPLES
number of samples per subband
float samples[2][ATRAC3P_FRAME_SAMPLES]
quantized MDCT spectrum
unit containing one coded channel
audio channel layout utility functions
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
float time_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the gain compensation
Atrac3pWavesData * tones_info
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
int unit_type
unit type (mono/stereo)
uint8_t swap_channels[ATRAC3P_SUBBANDS]
1 - perform subband-wise channel swapping
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.
av_cold void ff_atrac3p_init_vlcs(void)
Initialize VLC tables for bitstream parsing.
#define AV_CH_LAYOUT_5POINT1_BACK
#define AV_CH_LAYOUT_6POINT1_BACK
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
uint8_t channel_blocks[5]
channel configuration descriptor
void ff_atrac3p_init_imdct(AVCodecContext *avctx, FFTContext *mdct_ctx)
Initialize IMDCT transform.
Gain control parameters for one subband.
Libavcodec external API header.
void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *fdsp, int ch_num, int sb, float *out)
Synthesize sine waves for a particular subband.
float outp_buf[2][ATRAC3P_FRAME_SAMPLES]
AVCodec ff_atrac3p_decoder
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static int atrac3p_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
main external API structure.
Atrac3pIPQFChannelCtx ipqf_ctx[2]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static unsigned int get_bits1(GetBitContext *s)
AVCodec ff_atrac3pal_decoder
const float ff_atrac3p_mant_tab[8]
Atrac3pWaveSynthParams * waves_info_prev
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
uint8_t wnd_shape_hist[2][ATRAC3P_SUBBANDS]
IMDCT window shape, 0=sine/1=steep.
common internal api header.
AtracGainInfo * gain_data
gain control data for next frame
unit containing two jointly-coded channels
Atrac3pWaveSynthParams * waves_info
int channels
number of audio channels
static int ff_thread_once(char *control, void(*routine)(void))
Atrac3pChanParams channels[2]
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.
uint64_t my_channel_layout
current channel layout
#define FFSWAP(type, a, b)
int tones_present
1 - tones info present
FFTContext ipqf_dct_ctx
IDCT context used by IPQF.
unit containing extension information
Atrac3pWavesData tones_info_hist[2][ATRAC3P_SUBBANDS]
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
uint8_t ** extended_data
pointers to the data planes/channels.
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Global structures, constants and data for ATRAC3+ decoder.
AtracGainInfo gain_data_hist[2][ATRAC3P_SUBBANDS]
gain control data for all subbands
void * av_mallocz_array(size_t nmemb, size_t size)