summaryrefslogtreecommitdiff
path: root/libavcodec/mpegaudiodec.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-11-26 14:24:14 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-11-26 14:24:19 +0100
commita13148f63351db5f8283a23de9a22e940d29d8cd (patch)
tree7a9a10399626bebfc3f63f6b30087f06ae178e2f /libavcodec/mpegaudiodec.c
parent86270236d5ef97263858a576fab2c366fb2aa76a (diff)
parent8e134e5104e99a69cd4cea10540a7ce9c3682a2c (diff)
downloadffmpeg-a13148f63351db5f8283a23de9a22e940d29d8cd.tar.gz
Merge commit '8e134e5104e99a69cd4cea10540a7ce9c3682a2c'
* commit '8e134e5104e99a69cd4cea10540a7ce9c3682a2c': lavc: clarify get_buffer() documentation mpegaudiodec: use planar sample format for output unless packed is requested x86: h264 qpel: use the correct number of utilized xmm regs in cglobal Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mpegaudiodec.c')
-rw-r--r--libavcodec/mpegaudiodec.c95
1 files changed, 47 insertions, 48 deletions
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index dcd2f159b7..e33c643b17 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -95,7 +95,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 */
@@ -105,7 +106,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
/****************/
@@ -441,7 +443,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)
@@ -1564,7 +1570,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;
@@ -1627,20 +1633,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;
}
}
@@ -1789,7 +1801,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"
@@ -1831,8 +1842,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;
}
@@ -1893,14 +1902,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);
@@ -1927,9 +1928,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 = s->frames * MPA_FRAME_SIZE;
@@ -1937,15 +1938,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;
@@ -1973,6 +1971,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;
@@ -1980,23 +1982,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;
}
@@ -2023,6 +2008,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
@@ -2036,6 +2024,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
@@ -2049,6 +2040,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
@@ -2062,6 +2056,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
@@ -2076,6 +2073,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