45 #define AT1_MAX_BFU 52
46 #define AT1_SU_SIZE 212
47 #define AT1_SU_SAMPLES 512
48 #define AT1_FRAME_SIZE AT1_SU_SIZE * 2
49 #define AT1_SU_MAX_BITS AT1_SU_SIZE * 8
50 #define AT1_MAX_CHANNELS 2
52 #define AT1_QMF_BANDS 3
53 #define IDX_LOW_BAND 0
54 #define IDX_MID_BAND 1
55 #define IDX_HIGH_BAND 2
95 int transf_size = 1 << nbits;
99 for (i = 0; i < transf_size / 2; i++)
100 FFSWAP(
float, spec[i], spec[transf_size - 1 - i]);
102 mdct_context->
imdct_half(mdct_context, out, spec);
108 int band_num, band_samples, log2_block_count, nbits, num_blocks, block_size;
109 unsigned int start_pos, ref_pos = 0, pos = 0;
120 num_blocks = 1 << log2_block_count;
122 if (num_blocks == 1) {
125 block_size = band_samples >> log2_block_count;
130 if (nbits != 5 && nbits != 7 && nbits != 8)
138 prev_buf = &su->
spectrum[1][ref_pos + band_samples - 16];
139 for (j=0; j < num_blocks; j++) {
144 &su->
spectrum[0][ref_pos + start_pos], ff_sine_32, 16);
146 prev_buf = &su->
spectrum[0][ref_pos+start_pos + 16];
147 start_pos += block_size;
152 memcpy(q->
bands[band_num] + 32, &su->
spectrum[0][ref_pos + 16], 240 *
sizeof(
float));
154 ref_pos += band_samples;
169 int log2_block_count_tmp, i;
171 for (i = 0; i < 2; i++) {
173 log2_block_count_tmp =
get_bits(gb, 2);
174 if (log2_block_count_tmp & 1)
176 log2_block_cnt[i] = 2 - log2_block_count_tmp;
180 log2_block_count_tmp =
get_bits(gb, 2);
181 if (log2_block_count_tmp != 0 && log2_block_count_tmp != 3)
193 int bits_used, band_num, bfu_num, i;
203 bits_used = su->
num_bfus * 10 + 32 +
217 idwls[i] = idsfs[i] = 0;
225 int word_len = !!idwls[bfu_num] + idwls[bfu_num];
227 bits_used += word_len * num_specs;
237 float max_quant = 1.0 / (float)((1 << (word_len - 1)) - 1);
239 for (i = 0; i < num_specs; i++) {
243 spec[pos+i] =
get_sbits(gb, word_len) * scale_factor * max_quant;
246 memset(&spec[pos], 0, num_specs *
sizeof(
float));
258 float iqmf_temp[512 + 46];
273 int *got_frame_ptr,
AVPacket *avpkt)
277 int buf_size = avpkt->
size;
283 if (buf_size < 212 * avctx->channels) {
293 for (ch = 0; ch < avctx->
channels; ch++) {
385 .priv_data_size =
sizeof(
AT1Ctx),
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
float snd_qmf_delay[46]
delay line for the 2nd stacked QMF filter
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
AVCodec ff_atrac1_decoder
Sound unit struct, one unit is used per channel.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int at1_unpack_dequant(GetBitContext *gb, AT1SUCtx *su, float spec[AT1_SU_SAMPLES])
AT1SUCtx SUs[AT1_MAX_CHANNELS]
channel sound unit
static av_cold int init(AVCodecContext *avctx)
static av_cold int atrac1_decode_init(AVCodecContext *avctx)
static av_cold int atrac1_decode_end(AVCodecContext *avctx)
static const uint8_t bfu_amount_tab2[4]
void ff_atrac_iqmf(float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
Quadrature mirror synthesis filter.
#define DECLARE_ALIGNED(n, t, v)
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static int get_sbits(GetBitContext *s, int n)
static void at1_subband_synthesis(AT1Ctx *q, AT1SUCtx *su, float *pOut)
static const uint8_t specs_per_bfu[52]
number of spectral lines in each BFU block floating unit = group of spectral frequencies having the s...
float ff_atrac_sf_table[64]
void(* vector_fmul_window)(float *dst, const float *src0, const float *src1, const float *win, int len)
Overlap/add with window function.
enum AVSampleFormat sample_fmt
audio sample format
static const uint16_t samples_per_band[3]
size of the transform in samples in the long mode for each QMF band
The atrac1 context, holds all needed parameters for decoding.
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
float spec2[AT1_SU_SAMPLES]
mdct buffer
#define AT1_SU_SAMPLES
number of samples in a sound unit
bitstream reader API header.
#define CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
static int at1_parse_bsm(GetBitContext *gb, int log2_block_cnt[AT1_QMF_BANDS])
Parse the block size mode byte.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static void at1_imdct(AT1Ctx *q, float *spec, float *out, int nbits, int rev_spec)
static const uint16_t bfu_start_short[52]
start position of each BFU in the MDCT spectrum for the short mode
static const uint8_t bfu_amount_tab1[8]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
const char * name
Name of the codec implementation.
Libavcodec external API header.
float spec1[AT1_SU_SAMPLES]
mdct buffer
int log2_block_count[AT1_QMF_BANDS]
log2 number of blocks in a band
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
AVSampleFormat
Audio sample formats.
float fst_qmf_delay[46]
delay line for the 1st stacked QMF filter
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
void(* imdct_half)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
static int atrac1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
static const uint8_t mdct_long_nbits[3]
#define AT1_MAX_BFU
max number of block floating units in a sound unit
static const uint8_t bfu_bands_t[4]
number of BFUs in each QMF band
float last_qmf_delay[256+23]
delay line for the last stacked QMF filter
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
float spec[AT1_SU_SAMPLES]
the mdct spectrum buffer
common internal api header.
ATRAC1 compatible decoder data.
int channels
number of audio channels
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> out
av_cold void ff_atrac_generate_tables(void)
Generate common tables.
static enum AVSampleFormat sample_fmts[]
#define FFSWAP(type, a, b)
uint8_t ** extended_data
pointers to the data planes/channels.
This structure stores compressed data.
static const uint8_t bfu_amount_tab3[8]
int nb_samples
number of audio samples (per channel) described by this frame
int num_bfus
number of Block Floating Units
void ff_init_ff_sine_windows(int index)
initialize the specified entry of ff_sine_windows
static int at1_imdct_block(AT1SUCtx *su, AT1Ctx *q)
static const uint16_t bfu_start_long[52]
start position of each BFU in the MDCT spectrum for the long mode