|
|
|
@ -93,7 +93,8 @@ typedef struct MPADecodeContext { |
|
|
|
|
# define MULH3(x, y, s) ((s)*(y)*(x)) |
|
|
|
|
# define MULLx(x, y, s) ((y)*(x)) |
|
|
|
|
# define RENAME(a) a ## _float |
|
|
|
|
# define OUT_FMT AV_SAMPLE_FMT_FLT |
|
|
|
|
# define OUT_FMT AV_SAMPLE_FMT_FLT |
|
|
|
|
# define OUT_FMT_P AV_SAMPLE_FMT_FLTP |
|
|
|
|
#else |
|
|
|
|
# define SHR(a,b) ((a)>>(b)) |
|
|
|
|
/* WARNING: only correct for positive numbers */ |
|
|
|
@ -103,7 +104,8 @@ typedef struct MPADecodeContext { |
|
|
|
|
# define MULH3(x, y, s) MULH((s)*(x), y) |
|
|
|
|
# define MULLx(x, y, s) MULL(x,y,s) |
|
|
|
|
# define RENAME(a) a ## _fixed |
|
|
|
|
# define OUT_FMT AV_SAMPLE_FMT_S16 |
|
|
|
|
# define OUT_FMT AV_SAMPLE_FMT_S16 |
|
|
|
|
# define OUT_FMT_P AV_SAMPLE_FMT_S16P |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/****************/ |
|
|
|
@ -434,7 +436,11 @@ static av_cold int decode_init(AVCodecContext * avctx) |
|
|
|
|
ff_mpadsp_init(&s->mpadsp); |
|
|
|
|
ff_dsputil_init(&s->dsp, avctx); |
|
|
|
|
|
|
|
|
|
avctx->sample_fmt= OUT_FMT; |
|
|
|
|
if (avctx->request_sample_fmt == OUT_FMT && |
|
|
|
|
avctx->codec_id != AV_CODEC_ID_MP3ON4) |
|
|
|
|
avctx->sample_fmt = OUT_FMT; |
|
|
|
|
else |
|
|
|
|
avctx->sample_fmt = OUT_FMT_P; |
|
|
|
|
s->err_recognition = avctx->err_recognition; |
|
|
|
|
|
|
|
|
|
if (avctx->codec_id == AV_CODEC_ID_MP3ADU) |
|
|
|
@ -1546,7 +1552,7 @@ static int mp_decode_layer3(MPADecodeContext *s) |
|
|
|
|
return nb_granules * 18; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mp_decode_frame(MPADecodeContext *s, OUT_INT *samples, |
|
|
|
|
static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples, |
|
|
|
|
const uint8_t *buf, int buf_size) |
|
|
|
|
{ |
|
|
|
|
int i, nb_frames, ch, ret; |
|
|
|
@ -1609,20 +1615,26 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT *samples, |
|
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
samples = (OUT_INT *)s->frame.data[0]; |
|
|
|
|
samples = (OUT_INT **)s->frame.extended_data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* apply the synthesis filter */ |
|
|
|
|
for (ch = 0; ch < s->nb_channels; ch++) { |
|
|
|
|
samples_ptr = samples + ch; |
|
|
|
|
int sample_stride; |
|
|
|
|
if (s->avctx->sample_fmt == OUT_FMT_P) { |
|
|
|
|
samples_ptr = samples[ch]; |
|
|
|
|
sample_stride = 1; |
|
|
|
|
} else { |
|
|
|
|
samples_ptr = samples[0] + ch; |
|
|
|
|
sample_stride = s->nb_channels; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < nb_frames; i++) { |
|
|
|
|
RENAME(ff_mpa_synth_filter)( |
|
|
|
|
&s->mpadsp, |
|
|
|
|
s->synth_buf[ch], &(s->synth_buf_offset[ch]), |
|
|
|
|
RENAME(ff_mpa_synth_window), &s->dither_state, |
|
|
|
|
samples_ptr, s->nb_channels, |
|
|
|
|
s->sb_samples[ch][i]); |
|
|
|
|
samples_ptr += 32 * s->nb_channels; |
|
|
|
|
RENAME(ff_mpa_synth_filter)(&s->mpadsp, s->synth_buf[ch], |
|
|
|
|
&(s->synth_buf_offset[ch]), |
|
|
|
|
RENAME(ff_mpa_synth_window), |
|
|
|
|
&s->dither_state, samples_ptr, |
|
|
|
|
sample_stride, s->sb_samples[ch][i]); |
|
|
|
|
samples_ptr += 32 * sample_stride; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1760,7 +1772,6 @@ typedef struct MP3On4DecodeContext { |
|
|
|
|
int syncword; ///< syncword patch
|
|
|
|
|
const uint8_t *coff; ///< channel offsets in output buffer
|
|
|
|
|
MPADecodeContext *mp3decctx[5]; ///< MPADecodeContext for every decoder instance
|
|
|
|
|
OUT_INT *decoded_buf; ///< output buffer for decoded samples
|
|
|
|
|
} MP3On4DecodeContext; |
|
|
|
|
|
|
|
|
|
#include "mpeg4audio.h" |
|
|
|
@ -1802,8 +1813,6 @@ static av_cold int decode_close_mp3on4(AVCodecContext * avctx) |
|
|
|
|
for (i = 0; i < s->frames; i++) |
|
|
|
|
av_free(s->mp3decctx[i]); |
|
|
|
|
|
|
|
|
|
av_freep(&s->decoded_buf); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1864,14 +1873,6 @@ static int decode_init_mp3on4(AVCodecContext * avctx) |
|
|
|
|
s->mp3decctx[i]->mpadsp = s->mp3decctx[0]->mpadsp; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Allocate buffer for multi-channel output if needed */ |
|
|
|
|
if (s->frames > 1) { |
|
|
|
|
s->decoded_buf = av_malloc(MPA_FRAME_SIZE * MPA_MAX_CHANNELS * |
|
|
|
|
sizeof(*s->decoded_buf)); |
|
|
|
|
if (!s->decoded_buf) |
|
|
|
|
goto alloc_fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
alloc_fail: |
|
|
|
|
decode_close_mp3on4(avctx); |
|
|
|
@ -1898,9 +1899,9 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, |
|
|
|
|
MPADecodeContext *m; |
|
|
|
|
int fsize, len = buf_size, out_size = 0; |
|
|
|
|
uint32_t header; |
|
|
|
|
OUT_INT *out_samples; |
|
|
|
|
OUT_INT *outptr, *bp; |
|
|
|
|
int fr, j, n, ch, ret; |
|
|
|
|
OUT_INT **out_samples; |
|
|
|
|
OUT_INT *outptr[2]; |
|
|
|
|
int fr, ch, ret; |
|
|
|
|
|
|
|
|
|
/* get output buffer */ |
|
|
|
|
s->frame->nb_samples = MPA_FRAME_SIZE; |
|
|
|
@ -1908,15 +1909,12 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
out_samples = (OUT_INT *)s->frame->data[0]; |
|
|
|
|
out_samples = (OUT_INT **)s->frame->extended_data; |
|
|
|
|
|
|
|
|
|
// Discard too short frames
|
|
|
|
|
if (buf_size < HEADER_SIZE) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
|
|
// If only one decoder interleave is not needed
|
|
|
|
|
outptr = s->frames == 1 ? out_samples : s->decoded_buf; |
|
|
|
|
|
|
|
|
|
avctx->bit_rate = 0; |
|
|
|
|
|
|
|
|
|
ch = 0; |
|
|
|
@ -1944,6 +1942,10 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, |
|
|
|
|
} |
|
|
|
|
ch += m->nb_channels; |
|
|
|
|
|
|
|
|
|
outptr[0] = out_samples[s->coff[fr]]; |
|
|
|
|
if (m->nb_channels > 1) |
|
|
|
|
outptr[1] = out_samples[s->coff[fr] + 1]; |
|
|
|
|
|
|
|
|
|
if ((ret = mp_decode_frame(m, outptr, buf, fsize)) < 0) |
|
|
|
|
return ret; |
|
|
|
|
|
|
|
|
@ -1951,23 +1953,6 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, |
|
|
|
|
buf += fsize; |
|
|
|
|
len -= fsize; |
|
|
|
|
|
|
|
|
|
if (s->frames > 1) { |
|
|
|
|
n = m->avctx->frame_size*m->nb_channels; |
|
|
|
|
/* interleave output data */ |
|
|
|
|
bp = out_samples + s->coff[fr]; |
|
|
|
|
if (m->nb_channels == 1) { |
|
|
|
|
for (j = 0; j < n; j++) { |
|
|
|
|
*bp = s->decoded_buf[j]; |
|
|
|
|
bp += avctx->channels; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (j = 0; j < n; j++) { |
|
|
|
|
bp[0] = s->decoded_buf[j++]; |
|
|
|
|
bp[1] = s->decoded_buf[j]; |
|
|
|
|
bp += avctx->channels; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
avctx->bit_rate += m->bit_rate; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1994,6 +1979,9 @@ AVCodec ff_mp1_decoder = { |
|
|
|
|
.capabilities = CODEC_CAP_DR1, |
|
|
|
|
.flush = flush, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("MP1 (MPEG audio layer 1)"), |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, |
|
|
|
|
AV_SAMPLE_FMT_S16, |
|
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
#if CONFIG_MP2_DECODER |
|
|
|
@ -2007,6 +1995,9 @@ AVCodec ff_mp2_decoder = { |
|
|
|
|
.capabilities = CODEC_CAP_DR1, |
|
|
|
|
.flush = flush, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("MP2 (MPEG audio layer 2)"), |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, |
|
|
|
|
AV_SAMPLE_FMT_S16, |
|
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
#if CONFIG_MP3_DECODER |
|
|
|
@ -2020,6 +2011,9 @@ AVCodec ff_mp3_decoder = { |
|
|
|
|
.capabilities = CODEC_CAP_DR1, |
|
|
|
|
.flush = flush, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("MP3 (MPEG audio layer 3)"), |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, |
|
|
|
|
AV_SAMPLE_FMT_S16, |
|
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
#if CONFIG_MP3ADU_DECODER |
|
|
|
@ -2033,6 +2027,9 @@ AVCodec ff_mp3adu_decoder = { |
|
|
|
|
.capabilities = CODEC_CAP_DR1, |
|
|
|
|
.flush = flush, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("ADU (Application Data Unit) MP3 (MPEG audio layer 3)"), |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, |
|
|
|
|
AV_SAMPLE_FMT_S16, |
|
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
#if CONFIG_MP3ON4_DECODER |
|
|
|
@ -2047,6 +2044,8 @@ AVCodec ff_mp3on4_decoder = { |
|
|
|
|
.capabilities = CODEC_CAP_DR1, |
|
|
|
|
.flush = flush_mp3on4, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("MP3onMP4"), |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, |
|
|
|
|
AV_SAMPLE_FMT_NONE }, |
|
|
|
|
}; |
|
|
|
|
#endif |
|
|
|
|
#endif |
|
|
|
|