FFmpeg
atrac3plusdec.c
Go to the documentation of this file.
1 /*
2  * ATRAC3+ compatible decoder
3  *
4  * Copyright (c) 2010-2013 Maxim Poliakovski
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Sony ATRAC3+ compatible decoder.
26  *
27  * Container formats used to store its data:
28  * RIFF WAV (.at3) and Sony OpenMG (.oma, .aa3).
29  *
30  * Technical description of this codec can be found here:
31  * http://wiki.multimedia.cx/index.php?title=ATRAC3plus
32  *
33  * Kudos to Benjamin Larsson and Michael Karcher
34  * for their precious technical help!
35  */
36 
37 #include <stdint.h>
38 #include <string.h>
39 
41 #include "libavutil/float_dsp.h"
42 #include "libavutil/mem_internal.h"
43 #include "libavutil/thread.h"
44 #include "avcodec.h"
45 #include "codec_internal.h"
46 #include "get_bits.h"
47 #include "internal.h"
48 #include "atrac.h"
49 #include "atrac3plus.h"
50 
51 typedef struct ATRAC3PContext {
54 
55  DECLARE_ALIGNED(32, float, samples)[2][ATRAC3P_FRAME_SAMPLES]; ///< quantized MDCT spectrum
56  DECLARE_ALIGNED(32, float, mdct_buf)[2][ATRAC3P_FRAME_SAMPLES]; ///< output of the IMDCT
57  DECLARE_ALIGNED(32, float, time_buf)[2][ATRAC3P_FRAME_SAMPLES]; ///< output of the gain compensation
59 
60  AtracGCContext gainc_ctx; ///< gain compensation context
62  FFTContext ipqf_dct_ctx; ///< IDCT context used by IPQF
63 
64  Atrac3pChanUnitCtx *ch_units; ///< global channel units
65 
66  int num_channel_blocks; ///< number of channel blocks
67  uint8_t channel_blocks[5]; ///< channel configuration descriptor
69 
71 {
72  ATRAC3PContext *ctx = avctx->priv_data;
73 
74  av_freep(&ctx->ch_units);
75  av_freep(&ctx->fdsp);
76 
77  ff_mdct_end(&ctx->mdct_ctx);
78  ff_mdct_end(&ctx->ipqf_dct_ctx);
79 
80  return 0;
81 }
82 
84  AVCodecContext *avctx)
85 {
86  int channels = avctx->ch_layout.nb_channels;
87  memset(ctx->channel_blocks, 0, sizeof(ctx->channel_blocks));
88 
90  switch (channels) {
91  case 1:
93  ctx->num_channel_blocks = 1;
94  ctx->channel_blocks[0] = CH_UNIT_MONO;
95  break;
96  case 2:
98  ctx->num_channel_blocks = 1;
99  ctx->channel_blocks[0] = CH_UNIT_STEREO;
100  break;
101  case 3:
103  ctx->num_channel_blocks = 2;
104  ctx->channel_blocks[0] = CH_UNIT_STEREO;
105  ctx->channel_blocks[1] = CH_UNIT_MONO;
106  break;
107  case 4:
109  ctx->num_channel_blocks = 3;
110  ctx->channel_blocks[0] = CH_UNIT_STEREO;
111  ctx->channel_blocks[1] = CH_UNIT_MONO;
112  ctx->channel_blocks[2] = CH_UNIT_MONO;
113  break;
114  case 6:
116  ctx->num_channel_blocks = 4;
117  ctx->channel_blocks[0] = CH_UNIT_STEREO;
118  ctx->channel_blocks[1] = CH_UNIT_MONO;
119  ctx->channel_blocks[2] = CH_UNIT_STEREO;
120  ctx->channel_blocks[3] = CH_UNIT_MONO;
121  break;
122  case 7:
124  ctx->num_channel_blocks = 5;
125  ctx->channel_blocks[0] = CH_UNIT_STEREO;
126  ctx->channel_blocks[1] = CH_UNIT_MONO;
127  ctx->channel_blocks[2] = CH_UNIT_STEREO;
128  ctx->channel_blocks[3] = CH_UNIT_MONO;
129  ctx->channel_blocks[4] = CH_UNIT_MONO;
130  break;
131  case 8:
133  ctx->num_channel_blocks = 5;
134  ctx->channel_blocks[0] = CH_UNIT_STEREO;
135  ctx->channel_blocks[1] = CH_UNIT_MONO;
136  ctx->channel_blocks[2] = CH_UNIT_STEREO;
137  ctx->channel_blocks[3] = CH_UNIT_STEREO;
138  ctx->channel_blocks[4] = CH_UNIT_MONO;
139  break;
140  default:
141  av_log(avctx, AV_LOG_ERROR,
142  "Unsupported channel count: %d!\n", channels);
143  return AVERROR_INVALIDDATA;
144  }
145 
146  return 0;
147 }
148 
149 static av_cold void atrac3p_init_static(void)
150 {
153 }
154 
156 {
157  static AVOnce init_static_once = AV_ONCE_INIT;
158  ATRAC3PContext *ctx = avctx->priv_data;
159  int i, ch, ret;
160 
161  if (!avctx->block_align) {
162  av_log(avctx, AV_LOG_ERROR, "block_align is not set\n");
163  return AVERROR(EINVAL);
164  }
165 
166  /* initialize IPQF */
167  ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0);
168 
169  ff_atrac3p_init_imdct(avctx, &ctx->mdct_ctx);
170 
171  ff_atrac_init_gain_compensation(&ctx->gainc_ctx, 6, 2);
172 
173  if ((ret = set_channel_params(ctx, avctx)) < 0)
174  return ret;
175 
176  ctx->ch_units = av_calloc(ctx->num_channel_blocks, sizeof(*ctx->ch_units));
178 
179  if (!ctx->ch_units || !ctx->fdsp) {
180  return AVERROR(ENOMEM);
181  }
182 
183  for (i = 0; i < ctx->num_channel_blocks; i++) {
184  for (ch = 0; ch < 2; ch++) {
185  ctx->ch_units[i].channels[ch].ch_num = ch;
186  ctx->ch_units[i].channels[ch].wnd_shape = &ctx->ch_units[i].channels[ch].wnd_shape_hist[0][0];
187  ctx->ch_units[i].channels[ch].wnd_shape_prev = &ctx->ch_units[i].channels[ch].wnd_shape_hist[1][0];
188  ctx->ch_units[i].channels[ch].gain_data = &ctx->ch_units[i].channels[ch].gain_data_hist[0][0];
189  ctx->ch_units[i].channels[ch].gain_data_prev = &ctx->ch_units[i].channels[ch].gain_data_hist[1][0];
190  ctx->ch_units[i].channels[ch].tones_info = &ctx->ch_units[i].channels[ch].tones_info_hist[0][0];
191  ctx->ch_units[i].channels[ch].tones_info_prev = &ctx->ch_units[i].channels[ch].tones_info_hist[1][0];
192  }
193 
194  ctx->ch_units[i].waves_info = &ctx->ch_units[i].wave_synth_hist[0];
195  ctx->ch_units[i].waves_info_prev = &ctx->ch_units[i].wave_synth_hist[1];
196  }
197 
199 
200  ff_thread_once(&init_static_once, atrac3p_init_static);
201 
202  return 0;
203 }
204 
206  float out[2][ATRAC3P_FRAME_SAMPLES],
207  int num_channels,
208  AVCodecContext *avctx)
209 {
210  int i, sb, ch, qu, nspeclines, RNG_index;
211  float *dst, q;
212  int16_t *src;
213  /* calculate RNG table index for each subband */
214  int sb_RNG_index[ATRAC3P_SUBBANDS] = { 0 };
215 
216  if (ch_unit->mute_flag) {
217  for (ch = 0; ch < num_channels; ch++)
218  memset(out[ch], 0, ATRAC3P_FRAME_SAMPLES * sizeof(*out[ch]));
219  return;
220  }
221 
222  for (qu = 0, RNG_index = 0; qu < ch_unit->used_quant_units; qu++)
223  RNG_index += ch_unit->channels[0].qu_sf_idx[qu] +
224  ch_unit->channels[1].qu_sf_idx[qu];
225 
226  for (sb = 0; sb < ch_unit->num_coded_subbands; sb++, RNG_index += 128)
227  sb_RNG_index[sb] = RNG_index & 0x3FC;
228 
229  /* inverse quant and power compensation */
230  for (ch = 0; ch < num_channels; ch++) {
231  /* clear channel's residual spectrum */
232  memset(out[ch], 0, ATRAC3P_FRAME_SAMPLES * sizeof(*out[ch]));
233 
234  for (qu = 0; qu < ch_unit->used_quant_units; qu++) {
236  dst = &out[ch][ff_atrac3p_qu_to_spec_pos[qu]];
237  nspeclines = ff_atrac3p_qu_to_spec_pos[qu + 1] -
239 
240  if (ch_unit->channels[ch].qu_wordlen[qu] > 0) {
241  q = ff_atrac3p_sf_tab[ch_unit->channels[ch].qu_sf_idx[qu]] *
242  ff_atrac3p_mant_tab[ch_unit->channels[ch].qu_wordlen[qu]];
243  for (i = 0; i < nspeclines; i++)
244  dst[i] = src[i] * q;
245  }
246  }
247 
248  for (sb = 0; sb < ch_unit->num_coded_subbands; sb++)
249  ff_atrac3p_power_compensation(ch_unit, ctx->fdsp, ch, &out[ch][0],
250  sb_RNG_index[sb], sb);
251  }
252 
253  if (ch_unit->unit_type == CH_UNIT_STEREO) {
254  for (sb = 0; sb < ch_unit->num_coded_subbands; sb++) {
255  if (ch_unit->swap_channels[sb]) {
256  for (i = 0; i < ATRAC3P_SUBBAND_SAMPLES; i++)
257  FFSWAP(float, out[0][sb * ATRAC3P_SUBBAND_SAMPLES + i],
258  out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i]);
259  }
260 
261  /* flip coefficients' sign if requested */
262  if (ch_unit->negate_coeffs[sb])
263  for (i = 0; i < ATRAC3P_SUBBAND_SAMPLES; i++)
264  out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i] = -(out[1][sb * ATRAC3P_SUBBAND_SAMPLES + i]);
265  }
266  }
267 }
268 
270  int num_channels, AVCodecContext *avctx)
271 {
272  int ch, sb;
273 
274  for (ch = 0; ch < num_channels; ch++) {
275  for (sb = 0; sb < ch_unit->num_subbands; sb++) {
276  /* inverse transform and windowing */
277  ff_atrac3p_imdct(ctx->fdsp, &ctx->mdct_ctx,
278  &ctx->samples[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
279  &ctx->mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
280  (ch_unit->channels[ch].wnd_shape_prev[sb] << 1) +
281  ch_unit->channels[ch].wnd_shape[sb], sb);
282 
283  /* gain compensation and overlapping */
284  ff_atrac_gain_compensation(&ctx->gainc_ctx,
285  &ctx->mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
286  &ch_unit->prev_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
287  &ch_unit->channels[ch].gain_data_prev[sb],
288  &ch_unit->channels[ch].gain_data[sb],
290  &ctx->time_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES]);
291  }
292 
293  /* zero unused subbands in both output and overlapping buffers */
294  memset(&ch_unit->prev_buf[ch][ch_unit->num_subbands * ATRAC3P_SUBBAND_SAMPLES],
295  0,
296  (ATRAC3P_SUBBANDS - ch_unit->num_subbands) *
298  sizeof(ch_unit->prev_buf[ch][ch_unit->num_subbands * ATRAC3P_SUBBAND_SAMPLES]));
299  memset(&ctx->time_buf[ch][ch_unit->num_subbands * ATRAC3P_SUBBAND_SAMPLES],
300  0,
301  (ATRAC3P_SUBBANDS - ch_unit->num_subbands) *
303  sizeof(ctx->time_buf[ch][ch_unit->num_subbands * ATRAC3P_SUBBAND_SAMPLES]));
304 
305  /* resynthesize and add tonal signal */
306  if (ch_unit->waves_info->tones_present ||
307  ch_unit->waves_info_prev->tones_present) {
308  for (sb = 0; sb < ch_unit->num_subbands; sb++)
309  if (ch_unit->channels[ch].tones_info[sb].num_wavs ||
310  ch_unit->channels[ch].tones_info_prev[sb].num_wavs) {
311  ff_atrac3p_generate_tones(ch_unit, ctx->fdsp, ch, sb,
312  &ctx->time_buf[ch][sb * 128]);
313  }
314  }
315 
316  /* subband synthesis and acoustic signal output */
317  ff_atrac3p_ipqf(&ctx->ipqf_dct_ctx, &ch_unit->ipqf_ctx[ch],
318  &ctx->time_buf[ch][0], &ctx->outp_buf[ch][0]);
319  }
320 
321  /* swap window shape and gain control buffers. */
322  for (ch = 0; ch < num_channels; ch++) {
323  FFSWAP(uint8_t *, ch_unit->channels[ch].wnd_shape,
324  ch_unit->channels[ch].wnd_shape_prev);
325  FFSWAP(AtracGainInfo *, ch_unit->channels[ch].gain_data,
326  ch_unit->channels[ch].gain_data_prev);
327  FFSWAP(Atrac3pWavesData *, ch_unit->channels[ch].tones_info,
328  ch_unit->channels[ch].tones_info_prev);
329  }
330 
332 }
333 
335  int *got_frame_ptr, AVPacket *avpkt)
336 {
337  ATRAC3PContext *ctx = avctx->priv_data;
338  int i, ret, ch_unit_id, ch_block = 0, out_ch_index = 0, channels_to_process;
339  float **samples_p = (float **)frame->extended_data;
340 
341  frame->nb_samples = ATRAC3P_FRAME_SAMPLES;
342  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
343  return ret;
344 
345  if ((ret = init_get_bits8(&ctx->gb, avpkt->data, avpkt->size)) < 0)
346  return ret;
347 
348  if (get_bits1(&ctx->gb)) {
349  av_log(avctx, AV_LOG_ERROR, "Invalid start bit!\n");
350  return AVERROR_INVALIDDATA;
351  }
352 
353  while (get_bits_left(&ctx->gb) >= 2 &&
354  (ch_unit_id = get_bits(&ctx->gb, 2)) != CH_UNIT_TERMINATOR) {
355  if (ch_unit_id == CH_UNIT_EXTENSION) {
356  avpriv_report_missing_feature(avctx, "Channel unit extension");
357  return AVERROR_PATCHWELCOME;
358  }
359  if (ch_block >= ctx->num_channel_blocks ||
360  ctx->channel_blocks[ch_block] != ch_unit_id) {
361  av_log(avctx, AV_LOG_ERROR,
362  "Frame data doesn't match channel configuration!\n");
363  return AVERROR_INVALIDDATA;
364  }
365 
366  ctx->ch_units[ch_block].unit_type = ch_unit_id;
367  channels_to_process = ch_unit_id + 1;
368 
370  &ctx->ch_units[ch_block],
371  channels_to_process,
372  avctx)) < 0)
373  return ret;
374 
375  decode_residual_spectrum(ctx, &ctx->ch_units[ch_block], ctx->samples,
376  channels_to_process, avctx);
377  reconstruct_frame(ctx, &ctx->ch_units[ch_block],
378  channels_to_process, avctx);
379 
380  for (i = 0; i < channels_to_process; i++)
381  memcpy(samples_p[out_ch_index + i], ctx->outp_buf[i],
382  ATRAC3P_FRAME_SAMPLES * sizeof(**samples_p));
383 
384  ch_block++;
385  out_ch_index += channels_to_process;
386  }
387 
388  *got_frame_ptr = 1;
389 
390  return avctx->codec_id == AV_CODEC_ID_ATRAC3P ? FFMIN(avctx->block_align, avpkt->size) : avpkt->size;
391 }
392 
394  .p.name = "atrac3plus",
395  .p.long_name = NULL_IF_CONFIG_SMALL("ATRAC3+ (Adaptive TRansform Acoustic Coding 3+)"),
396  .p.type = AVMEDIA_TYPE_AUDIO,
397  .p.id = AV_CODEC_ID_ATRAC3P,
398  .p.capabilities = AV_CODEC_CAP_DR1,
399  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
400  .priv_data_size = sizeof(ATRAC3PContext),
402  .close = atrac3p_decode_close,
404 };
405 
407  .p.name = "atrac3plusal",
408  .p.long_name = NULL_IF_CONFIG_SMALL("ATRAC3+ AL (Adaptive TRansform Acoustic Coding 3+ Advanced Lossless)"),
409  .p.type = AVMEDIA_TYPE_AUDIO,
410  .p.id = AV_CODEC_ID_ATRAC3PAL,
411  .p.capabilities = AV_CODEC_CAP_DR1,
412  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
413  .priv_data_size = sizeof(ATRAC3PContext),
415  .close = atrac3p_decode_close,
417 };
Atrac3pChanUnitCtx::waves_info
Atrac3pWaveSynthParams * waves_info
Definition: atrac3plus.h:151
ff_atrac3p_init_dsp_static
void ff_atrac3p_init_dsp_static(void)
Initialize sine waves synthesizer and ff_sine_* tables.
Definition: atrac3plusdsp.c:96
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:41
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:839
AVERROR
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
Atrac3pChanParams::tones_info_prev
Atrac3pWavesData * tones_info_prev
Definition: atrac3plus.h:117
mem_internal.h
out
FILE * out
Definition: movenc.c:54
thread.h
Atrac3pWavesData::num_wavs
int num_wavs
number of sine waves in the group
Definition: atrac3plus.h:78
ATRAC3PContext::gainc_ctx
AtracGCContext gainc_ctx
gain compensation context
Definition: atrac3plusdec.c:60
atrac3p_decode_close
static av_cold int atrac3p_decode_close(AVCodecContext *avctx)
Definition: atrac3plusdec.c:70
reconstruct_frame
static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, int num_channels, AVCodecContext *avctx)
Definition: atrac3plusdec.c:269
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:374
AV_CHANNEL_LAYOUT_4POINT0
#define AV_CHANNEL_LAYOUT_4POINT0
Definition: channel_layout.h:359
ff_mdct_init
#define ff_mdct_init
Definition: fft.h:153
Atrac3pChanUnitCtx::ipqf_ctx
Atrac3pIPQFChannelCtx ipqf_ctx[2]
Definition: atrac3plus.h:154
ff_atrac3p_generate_tones
void ff_atrac3p_generate_tones(Atrac3pChanUnitCtx *ch_unit, AVFloatDSPContext *fdsp, int ch_num, int sb, float *out)
Synthesize sine waves for a particular subband.
Definition: atrac3plusdsp.c:186
AV_CHANNEL_LAYOUT_MONO
#define AV_CHANNEL_LAYOUT_MONO
Definition: channel_layout.h:353
ATRAC3PContext::ch_units
Atrac3pChanUnitCtx * ch_units
global channel units
Definition: atrac3plusdec.c:64
atrac3p_init_static
static av_cold void atrac3p_init_static(void)
Definition: atrac3plusdec.c:149
FFCodec
Definition: codec_internal.h:118
ff_atrac3p_power_compensation
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.
Definition: atrac3plusdsp.c:420
ATRAC3PContext
Definition: atrac3plusdec.c:51
ff_atrac3p_ipqf
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.
Definition: atrac3plusdsp.c:607
AV_CODEC_ID_ATRAC3PAL
@ AV_CODEC_ID_ATRAC3PAL
Definition: codec_id.h:512
AV_CHANNEL_LAYOUT_STEREO
#define AV_CHANNEL_LAYOUT_STEREO
Definition: channel_layout.h:354
Atrac3pChanUnitCtx::negate_coeffs
uint8_t negate_coeffs[ATRAC3P_SUBBANDS]
1 - subband-wise IMDCT coefficients negation
Definition: atrac3plus.h:146
ATRAC3PContext::mdct_buf
float mdct_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the IMDCT
Definition: atrac3plusdec.c:56
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:300
atrac3p_decode_frame
static int atrac3p_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: atrac3plusdec.c:334
ATRAC3P_FRAME_SAMPLES
#define ATRAC3P_FRAME_SAMPLES
Definition: atrac3plus.h:44
init
static int init
Definition: av_tx.c:47
CH_UNIT_EXTENSION
@ CH_UNIT_EXTENSION
unit containing extension information
Definition: atrac3plus.h:55
Atrac3pChanParams::wnd_shape
uint8_t * wnd_shape
IMDCT window shape for current frame.
Definition: atrac3plus.h:105
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
ATRAC3PContext::gb
GetBitContext gb
Definition: atrac3plusdec.c:52
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:122
decode_residual_spectrum
static void decode_residual_spectrum(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit, float out[2][ATRAC3P_FRAME_SAMPLES], int num_channels, AVCodecContext *avctx)
Definition: atrac3plusdec.c:205
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:2065
GetBitContext
Definition: get_bits.h:61
set_channel_params
static av_cold int set_channel_params(ATRAC3PContext *ctx, AVCodecContext *avctx)
Definition: atrac3plusdec.c:83
AV_CHANNEL_LAYOUT_SURROUND
#define AV_CHANNEL_LAYOUT_SURROUND
Definition: channel_layout.h:357
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:478
ff_atrac_init_gain_compensation
av_cold void ff_atrac_init_gain_compensation(AtracGCContext *gctx, int id2exp_offset, int loc_scale)
Initialize gain compensation context.
Definition: atrac.c:67
Atrac3pWaveSynthParams
Definition: atrac3plus.h:121
atrac3p_decode_init
static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
Definition: atrac3plusdec.c:155
ff_atrac3p_sf_tab
const float ff_atrac3p_sf_tab[64]
Definition: atrac3plusdsp.c:54
ff_thread_once
static int ff_thread_once(char *control, void(*routine)(void))
Definition: thread.h:179
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
AV_CODEC_ID_ATRAC3P
@ AV_CODEC_ID_ATRAC3P
Definition: codec_id.h:468
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:667
ATRAC3PContext::outp_buf
float outp_buf[2][ATRAC3P_FRAME_SAMPLES]
Definition: atrac3plusdec.c:58
Atrac3pChanUnitCtx::used_quant_units
int used_quant_units
number of quant units with coded spectrum
Definition: atrac3plus.h:138
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:260
CH_UNIT_MONO
@ CH_UNIT_MONO
unit containing one coded channel
Definition: atrac3plus.h:53
Atrac3pChanUnitCtx::num_coded_subbands
int num_coded_subbands
number of subbands with coded spectrum
Definition: atrac3plus.h:139
atrac.h
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
ctx
AVFormatContext * ctx
Definition: movenc.c:48
AtracGCContext
Gain compensation context structure.
Definition: atrac.h:44
channels
channels
Definition: aptx.h:32
get_bits.h
ff_atrac3p_qu_to_spec_pos
const uint16_t ff_atrac3p_qu_to_spec_pos[33]
Map quant unit number to its position in the spectrum.
Definition: atrac3plusdsp.c:44
Atrac3pChanUnitCtx::waves_info_prev
Atrac3pWaveSynthParams * waves_info_prev
Definition: atrac3plus.h:152
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:408
ff_atrac3p_mant_tab
const float ff_atrac3p_mant_tab[8]
Definition: atrac3plusdsp.c:69
if
if(ret)
Definition: filter_design.txt:179
CH_UNIT_TERMINATOR
@ CH_UNIT_TERMINATOR
unit sequence terminator
Definition: atrac3plus.h:56
AV_ONCE_INIT
#define AV_ONCE_INIT
Definition: thread.h:177
ATRAC3PContext::num_channel_blocks
int num_channel_blocks
number of channel blocks
Definition: atrac3plusdec.c:66
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
Atrac3pChanParams::gain_data_prev
AtracGainInfo * gain_data_prev
gain control data for previous frame
Definition: atrac3plus.h:111
Atrac3pChanParams::spectrum
int16_t spectrum[2048]
decoded IMDCT spectrum
Definition: atrac3plus.h:100
ATRAC3PContext::channel_blocks
uint8_t channel_blocks[5]
channel configuration descriptor
Definition: atrac3plusdec.c:67
AV_CHANNEL_LAYOUT_7POINT1
#define AV_CHANNEL_LAYOUT_7POINT1
Definition: channel_layout.h:375
AtracGainInfo
Gain control parameters for one subband.
Definition: atrac.h:35
Atrac3pChanParams::tones_info
Atrac3pWavesData * tones_info
Definition: atrac3plus.h:116
atrac3plus.h
ATRAC3PContext::fdsp
AVFloatDSPContext * fdsp
Definition: atrac3plusdec.c:53
AVOnce
#define AVOnce
Definition: thread.h:176
float_dsp.h
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:630
Atrac3pChanUnitCtx::channels
Atrac3pChanParams channels[2]
Definition: atrac3plus.h:147
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1462
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:375
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:290
codec_internal.h
ff_atrac3pal_decoder
const FFCodec ff_atrac3pal_decoder
Definition: atrac3plusdec.c:406
ff_atrac3p_init_vlcs
av_cold void ff_atrac3p_init_vlcs(void)
Initialize VLC tables for bitstream parsing.
Definition: atrac3plus.c:76
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1023
Atrac3pChanParams::qu_sf_idx
int qu_sf_idx[32]
array of scale factor indexes for each quant unit
Definition: atrac3plus.h:98
CH_UNIT_STEREO
@ CH_UNIT_STEREO
unit containing two jointly-coded channels
Definition: atrac3plus.h:54
ff_mdct_end
#define ff_mdct_end
Definition: fft.h:154
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
AVFloatDSPContext
Definition: float_dsp.h:24
ATRAC3PContext::time_buf
float time_buf[2][ATRAC3P_FRAME_SAMPLES]
output of the gain compensation
Definition: atrac3plusdec.c:57
ATRAC3PContext::ipqf_dct_ctx
FFTContext ipqf_dct_ctx
IDCT context used by IPQF.
Definition: atrac3plusdec.c:62
ff_atrac3p_decode_channel_unit
int ff_atrac3p_decode_channel_unit(GetBitContext *gb, Atrac3pChanUnitCtx *ctx, int num_channels, AVCodecContext *avctx)
Decode bitstream data of a channel unit.
Definition: atrac3plus.c:1662
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:116
FFTContext
Definition: fft.h:75
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
ff_atrac3p_imdct
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.
Definition: atrac3plusdsp.c:466
ATRAC3PContext::mdct_ctx
FFTContext mdct_ctx
Definition: atrac3plusdec.c:61
Atrac3pChanUnitCtx::unit_type
int unit_type
unit type (mono/stereo)
Definition: atrac3plus.h:135
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_atrac3p_init_imdct
void ff_atrac3p_init_imdct(AVCodecContext *avctx, FFTContext *mdct_ctx)
Initialize IMDCT transform.
Definition: atrac3plusdsp.c:82
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:211
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:272
avcodec.h
ret
ret
Definition: filter_design.txt:187
Atrac3pChanUnitCtx
Channel unit parameters.
Definition: atrac3plus.h:133
AVCodecContext::block_align
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs.
Definition: avcodec.h:1052
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
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
Definition: filter_design.txt:264
Atrac3pChanUnitCtx::prev_buf
float prev_buf[2][ATRAC3P_FRAME_SAMPLES]
overlapping buffer
Definition: atrac3plus.h:155
Atrac3pChanUnitCtx::mute_flag
int mute_flag
mute flag
Definition: atrac3plus.h:140
AV_CHANNEL_LAYOUT_6POINT1_BACK
#define AV_CHANNEL_LAYOUT_6POINT1_BACK
Definition: channel_layout.h:371
Atrac3pWaveSynthParams::tones_present
int tones_present
1 - tones info present
Definition: atrac3plus.h:122
Atrac3pChanUnitCtx::swap_channels
uint8_t swap_channels[ATRAC3P_SUBBANDS]
1 - perform subband-wise channel swapping
Definition: atrac3plus.h:145
AVCodecContext
main external API structure.
Definition: avcodec.h:398
ff_atrac_gain_compensation
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.
Definition: atrac.c:85
channel_layout.h
Atrac3pWavesData
Parameters of a group of sine waves.
Definition: atrac3plus.h:75
Atrac3pChanUnitCtx::num_subbands
int num_subbands
Definition: atrac3plus.h:137
Atrac3pChanParams::wnd_shape_prev
uint8_t * wnd_shape_prev
IMDCT window shape for previous frame.
Definition: atrac3plus.h:106
qu
static const float qu[2]
Definition: sipr16kdata.h:28
ATRAC3P_SUBBAND_SAMPLES
#define ATRAC3P_SUBBAND_SAMPLES
number of samples per subband
Definition: atrac3plus.h:43
ff_atrac3p_decoder
const FFCodec ff_atrac3p_decoder
Definition: atrac3plusdec.c:393
AV_CODEC_FLAG_BITEXACT
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
Definition: avcodec.h:288
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:425
ATRAC3P_SUBBANDS
#define ATRAC3P_SUBBANDS
Global unit sizes.
Definition: atrac3plus.h:42
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
avpriv_float_dsp_alloc
av_cold AVFloatDSPContext * avpriv_float_dsp_alloc(int bit_exact)
Allocate a float DSP context.
Definition: float_dsp.c:135
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
Atrac3pChanParams::qu_wordlen
int qu_wordlen[32]
array of word lengths for each quant unit
Definition: atrac3plus.h:97
Atrac3pChanParams::gain_data
AtracGainInfo * gain_data
gain control data for next frame
Definition: atrac3plus.h:110
AV_CHANNEL_LAYOUT_5POINT1_BACK
#define AV_CHANNEL_LAYOUT_5POINT1_BACK
Definition: channel_layout.h:366
ATRAC3PContext::samples
float samples[2][ATRAC3P_FRAME_SAMPLES]
quantized MDCT spectrum
Definition: atrac3plusdec.c:55