From ded3e9f054cb6114419cbcacd8d474aef221cde3 Mon Sep 17 00:00:00 2001 From: Daniel Kang Date: Wed, 26 Oct 2011 09:25:48 -0400 Subject: [PATCH 01/35] H.264: Cometics to dsputil_mmx.c Add whitespace. Signed-off-by: Ronald S. Bultje --- libavcodec/x86/dsputil_mmx.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index 58620d628c..959a2c2e7e 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -2764,18 +2764,18 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) } if(mm_flags & AV_CPU_FLAG_SSE2){ if (!high_bit_depth) { - H264_QPEL_FUNCS(0, 1, sse2); - H264_QPEL_FUNCS(0, 2, sse2); - H264_QPEL_FUNCS(0, 3, sse2); - H264_QPEL_FUNCS(1, 1, sse2); - H264_QPEL_FUNCS(1, 2, sse2); - H264_QPEL_FUNCS(1, 3, sse2); - H264_QPEL_FUNCS(2, 1, sse2); - H264_QPEL_FUNCS(2, 2, sse2); - H264_QPEL_FUNCS(2, 3, sse2); - H264_QPEL_FUNCS(3, 1, sse2); - H264_QPEL_FUNCS(3, 2, sse2); - H264_QPEL_FUNCS(3, 3, sse2); + H264_QPEL_FUNCS(0, 1, sse2); + H264_QPEL_FUNCS(0, 2, sse2); + H264_QPEL_FUNCS(0, 3, sse2); + H264_QPEL_FUNCS(1, 1, sse2); + H264_QPEL_FUNCS(1, 2, sse2); + H264_QPEL_FUNCS(1, 3, sse2); + H264_QPEL_FUNCS(2, 1, sse2); + H264_QPEL_FUNCS(2, 2, sse2); + H264_QPEL_FUNCS(2, 3, sse2); + H264_QPEL_FUNCS(3, 1, sse2); + H264_QPEL_FUNCS(3, 2, sse2); + H264_QPEL_FUNCS(3, 3, sse2); } #if HAVE_YASM #define H264_QPEL_FUNCS_10(x, y, CPU)\ From d6174bfe5f7f9b4f9dbb580080e55e71705689f7 Mon Sep 17 00:00:00 2001 From: Janne Grunau Date: Wed, 26 Oct 2011 15:28:29 +0200 Subject: [PATCH 02/35] threads: restore has_b_frames in frame_thread_free Otherwise the delay expressed in has_b_frames increases with every avcodec_close/avcodec_open. Fixes fate-ea-dct with more than 1 thread. --- libavcodec/pthread.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index d5129dcc3e..7557e68c65 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -681,6 +681,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count) av_freep(&fctx->threads); pthread_mutex_destroy(&fctx->buffer_mutex); av_freep(&avctx->thread_opaque); + avctx->has_b_frames -= avctx->thread_count - 1; } static int frame_thread_init(AVCodecContext *avctx) From aec8383348de1b7d38fc2b0c7a31a9da5c79ce0d Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 19:42:26 -0400 Subject: [PATCH 03/35] alacdec: set bytespersample using av_get_bytes_per_sample() --- libavcodec/alac.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 3580b5096c..cb90f128ea 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -493,15 +493,14 @@ static int alac_decode_frame(AVCodecContext *avctx, switch (alac->setinfo_sample_size) { case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16; - alac->bytespersample = channels << 1; break; case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32; - alac->bytespersample = channels << 2; break; default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n", alac->setinfo_sample_size); return -1; } + alac->bytespersample = channels * av_get_bytes_per_sample(avctx->sample_fmt); if(outputsamples > *outputsize / alac->bytespersample){ av_log(avctx, AV_LOG_ERROR, "sample buffer too small\n"); From 0f26f3d5c45fa13cd5b2a8bd40d781decdec0272 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 19:43:49 -0400 Subject: [PATCH 04/35] alacdec: set sample_fmt in alac_decode_init() --- libavcodec/alac.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index cb90f128ea..8930abd57e 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -491,15 +491,6 @@ static int alac_decode_frame(AVCodecContext *avctx, } else outputsamples = alac->setinfo_max_samples_per_frame; - switch (alac->setinfo_sample_size) { - case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16; - break; - case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32; - break; - default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n", - alac->setinfo_sample_size); - return -1; - } alac->bytespersample = channels * av_get_bytes_per_sample(avctx->sample_fmt); if(outputsamples > *outputsize / alac->bytespersample){ @@ -660,6 +651,16 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) return -1; } + switch (alac->setinfo_sample_size) { + case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16; + break; + case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32; + break; + default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n", + alac->setinfo_sample_size); + return -1; + } + return 0; } From 47e9c75b36aa533f1c06c063f80cdf6b7f026b03 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 19:46:46 -0400 Subject: [PATCH 05/35] alacdec: remove unneeded validation of setinfo_sample_size. It is already done when using it to set sample_fmt. --- libavcodec/alac.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 8930abd57e..5e376ac030 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -116,10 +116,6 @@ static int alac_set_info(ALACContext *alac) alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); ptr++; /* ??? */ alac->setinfo_sample_size = *ptr++; - if (alac->setinfo_sample_size > 32) { - av_log(alac->avctx, AV_LOG_ERROR, "setinfo_sample_size too large\n"); - return -1; - } alac->setinfo_rice_historymult = *ptr++; alac->setinfo_rice_initialhistory = *ptr++; alac->setinfo_rice_kmodifier = *ptr++; From dcaa83a0fccb3bd63eb71c48d70c1adfc97e4102 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 20:07:29 -0400 Subject: [PATCH 06/35] alacdec: read/validate number of channels from the extradata. check frame header channel count against header/container channel count. --- libavcodec/alac.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 5e376ac030..d4926e848f 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -119,7 +119,7 @@ static int alac_set_info(ALACContext *alac) alac->setinfo_rice_historymult = *ptr++; alac->setinfo_rice_initialhistory = *ptr++; alac->setinfo_rice_kmodifier = *ptr++; - ptr++; /* channels? */ + alac->numchannels = *ptr++; bytestream_get_be16(&ptr); /* ??? */ bytestream_get_be32(&ptr); /* max coded frame size */ bytestream_get_be32(&ptr); /* bitrate ? */ @@ -456,10 +456,9 @@ static int alac_decode_frame(AVCodecContext *avctx, init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8); channels = get_bits(&alac->gb, 3) + 1; - if (channels > MAX_CHANNELS) { - av_log(avctx, AV_LOG_ERROR, "channels > %d not supported\n", - MAX_CHANNELS); - return -1; + if (channels != avctx->channels) { + av_log(avctx, AV_LOG_ERROR, "frame header channel count mismatch\n"); + return AVERROR_INVALIDDATA; } /* 2^result = something to do with output waiting. @@ -634,7 +633,6 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) { ALACContext *alac = avctx->priv_data; alac->avctx = avctx; - alac->numchannels = alac->avctx->channels; /* initialize from the extradata */ if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) { @@ -657,6 +655,21 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) return -1; } + if (alac->numchannels < 1) { + av_log(avctx, AV_LOG_WARNING, "Invalid channel count\n"); + alac->numchannels = avctx->channels; + } else { + if (alac->numchannels > MAX_CHANNELS) + alac->numchannels = avctx->channels; + else + avctx->channels = alac->numchannels; + } + if (avctx->channels > MAX_CHANNELS) { + av_log(avctx, AV_LOG_ERROR, "Unsupported channel count: %d\n", + avctx->channels); + return AVERROR_PATCHWELCOME; + } + return 0; } From e5e4f92b5c9e013adf3e8be0128ed7b3d5b02ad0 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 20:08:46 -0400 Subject: [PATCH 07/35] alacdec: allocate per-channel buffers based on channel count. reduces memory usage when the stream has fewer than MAX_CHANNELS --- libavcodec/alac.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index d4926e848f..d784b4f4c5 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -88,7 +88,7 @@ typedef struct { static void allocate_buffers(ALACContext *alac) { int chan; - for (chan = 0; chan < MAX_CHANNELS; chan++) { + for (chan = 0; chan < alac->numchannels; chan++) { alac->predicterror_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); @@ -125,8 +125,6 @@ static int alac_set_info(ALACContext *alac) bytestream_get_be32(&ptr); /* bitrate ? */ bytestream_get_be32(&ptr); /* samplerate */ - allocate_buffers(alac); - return 0; } @@ -670,6 +668,8 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) return AVERROR_PATCHWELCOME; } + allocate_buffers(alac); + return 0; } @@ -678,7 +678,7 @@ static av_cold int alac_decode_close(AVCodecContext *avctx) ALACContext *alac = avctx->priv_data; int chan; - for (chan = 0; chan < MAX_CHANNELS; chan++) { + for (chan = 0; chan < alac->numchannels; chan++) { av_freep(&alac->predicterror_buffer[chan]); av_freep(&alac->outputsamples_buffer[chan]); av_freep(&alac->wasted_bits_buffer[chan]); From 53df079a730043cd0aa330c9aba7950034b1424f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 20:14:48 -0400 Subject: [PATCH 08/35] alacdec: check for buffer allocation failure. Also rearranges some functions for easier cleanup on failure. --- libavcodec/alac.c | 126 +++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index d784b4f4c5..8e6c4f9225 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -85,49 +85,6 @@ typedef struct { int wasted_bits; } ALACContext; -static void allocate_buffers(ALACContext *alac) -{ - int chan; - for (chan = 0; chan < alac->numchannels; chan++) { - alac->predicterror_buffer[chan] = - av_malloc(alac->setinfo_max_samples_per_frame * 4); - - alac->outputsamples_buffer[chan] = - av_malloc(alac->setinfo_max_samples_per_frame * 4); - - alac->wasted_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); - } -} - -static int alac_set_info(ALACContext *alac) -{ - const unsigned char *ptr = alac->avctx->extradata; - - ptr += 4; /* size */ - ptr += 4; /* alac */ - ptr += 4; /* 0 ? */ - - if(AV_RB32(ptr) >= UINT_MAX/4){ - av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n"); - return -1; - } - - /* buffer size / 2 ? */ - alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); - ptr++; /* ??? */ - alac->setinfo_sample_size = *ptr++; - alac->setinfo_rice_historymult = *ptr++; - alac->setinfo_rice_initialhistory = *ptr++; - alac->setinfo_rice_kmodifier = *ptr++; - alac->numchannels = *ptr++; - bytestream_get_be16(&ptr); /* ??? */ - bytestream_get_be32(&ptr); /* max coded frame size */ - bytestream_get_be32(&ptr); /* bitrate ? */ - bytestream_get_be32(&ptr); /* samplerate */ - - return 0; -} - static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){ /* read x - number of 1s before 0 represent the rice */ int x = get_unary_0_9(gb); @@ -627,8 +584,74 @@ static int alac_decode_frame(AVCodecContext *avctx, return input_buffer_size; } +static av_cold int alac_decode_close(AVCodecContext *avctx) +{ + ALACContext *alac = avctx->priv_data; + + int chan; + for (chan = 0; chan < alac->numchannels; chan++) { + av_freep(&alac->predicterror_buffer[chan]); + av_freep(&alac->outputsamples_buffer[chan]); + av_freep(&alac->wasted_bits_buffer[chan]); + } + + return 0; +} + +static int allocate_buffers(ALACContext *alac) +{ + int chan; + for (chan = 0; chan < alac->numchannels; chan++) { + alac->predicterror_buffer[chan] = + av_malloc(alac->setinfo_max_samples_per_frame * 4); + + alac->outputsamples_buffer[chan] = + av_malloc(alac->setinfo_max_samples_per_frame * 4); + + alac->wasted_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); + + if (!alac->predicterror_buffer[chan] || + !alac->outputsamples_buffer[chan] || + !alac->wasted_bits_buffer[chan]) { + alac_decode_close(alac->avctx); + return AVERROR(ENOMEM); + } + } + return 0; +} + +static int alac_set_info(ALACContext *alac) +{ + const unsigned char *ptr = alac->avctx->extradata; + + ptr += 4; /* size */ + ptr += 4; /* alac */ + ptr += 4; /* 0 ? */ + + if(AV_RB32(ptr) >= UINT_MAX/4){ + av_log(alac->avctx, AV_LOG_ERROR, "setinfo_max_samples_per_frame too large\n"); + return -1; + } + + /* buffer size / 2 ? */ + alac->setinfo_max_samples_per_frame = bytestream_get_be32(&ptr); + ptr++; /* ??? */ + alac->setinfo_sample_size = *ptr++; + alac->setinfo_rice_historymult = *ptr++; + alac->setinfo_rice_initialhistory = *ptr++; + alac->setinfo_rice_kmodifier = *ptr++; + alac->numchannels = *ptr++; + bytestream_get_be16(&ptr); /* ??? */ + bytestream_get_be32(&ptr); /* max coded frame size */ + bytestream_get_be32(&ptr); /* bitrate ? */ + bytestream_get_be32(&ptr); /* samplerate */ + + return 0; +} + static av_cold int alac_decode_init(AVCodecContext * avctx) { + int ret; ALACContext *alac = avctx->priv_data; alac->avctx = avctx; @@ -668,20 +691,9 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) return AVERROR_PATCHWELCOME; } - allocate_buffers(alac); - - return 0; -} - -static av_cold int alac_decode_close(AVCodecContext *avctx) -{ - ALACContext *alac = avctx->priv_data; - - int chan; - for (chan = 0; chan < alac->numchannels; chan++) { - av_freep(&alac->predicterror_buffer[chan]); - av_freep(&alac->outputsamples_buffer[chan]); - av_freep(&alac->wasted_bits_buffer[chan]); + if ((ret = allocate_buffers(alac)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error allocating buffers\n"); + return ret; } return 0; From dbbb9262ca0fd09f2582b11157a74c88ab7e1db5 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 5 Oct 2011 20:17:32 -0400 Subject: [PATCH 09/35] alacdec: remove unneeded numsamples checks --- libavcodec/alac.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 8e6c4f9225..3772484ff5 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -305,8 +305,6 @@ static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], uint8_t interlacing_leftweight) { int i; - if (numsamples <= 0) - return; /* weighted interlacing */ if (interlacing_leftweight) { @@ -348,9 +346,6 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], { int i; - if (numsamples <= 0) - return; - /* weighted interlacing */ if (interlacing_leftweight) { for (i = 0; i < numsamples; i++) { From d251c85dcea29b04cb577837be441d81c9e90876 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 13:00:39 -0400 Subject: [PATCH 10/35] alacdec: cosmetics: rename 'wasted_bits' to 'extra_bits'. The bits are not wasted, they are additional low bits that are added to the 16-bit decompressed samples to increase the output sample depth. --- libavcodec/alac.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 3772484ff5..ce1244fc18 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -72,7 +72,7 @@ typedef struct { int32_t *outputsamples_buffer[MAX_CHANNELS]; - int32_t *wasted_bits_buffer[MAX_CHANNELS]; + int32_t *extra_bits_buffer[MAX_CHANNELS]; /* stuff from setinfo */ uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */ @@ -82,7 +82,7 @@ typedef struct { uint8_t setinfo_rice_kmodifier; /* 0x0e */ /* end setinfo stuff */ - int wasted_bits; + int extra_bits; /**< number of extra bits beyond 16-bit */ } ALACContext; static inline int decode_scalar(GetBitContext *gb, int k, int limit, int readsamplesize){ @@ -338,8 +338,8 @@ static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], int32_t *buffer_out, - int32_t *wasted_bits_buffer[MAX_CHANNELS], - int wasted_bits, + int32_t *extra_bits_buffer[MAX_CHANNELS], + int extra_bits, int numchannels, int numsamples, uint8_t interlacing_shift, uint8_t interlacing_leftweight) @@ -357,9 +357,9 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], a -= (b * interlacing_leftweight) >> interlacing_shift; b += a; - if (wasted_bits) { - b = (b << wasted_bits) | wasted_bits_buffer[0][i]; - a = (a << wasted_bits) | wasted_bits_buffer[1][i]; + if (extra_bits) { + b = (b << extra_bits) | extra_bits_buffer[0][i]; + a = (a << extra_bits) | extra_bits_buffer[1][i]; } buffer_out[i * numchannels] = b << 8; @@ -372,9 +372,9 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], left = buffer[0][i]; right = buffer[1][i]; - if (wasted_bits) { - left = (left << wasted_bits) | wasted_bits_buffer[0][i]; - right = (right << wasted_bits) | wasted_bits_buffer[1][i]; + if (extra_bits) { + left = (left << extra_bits) | extra_bits_buffer[0][i]; + right = (right << extra_bits) | extra_bits_buffer[1][i]; } buffer_out[i * numchannels] = left << 8; @@ -421,7 +421,7 @@ static int alac_decode_frame(AVCodecContext *avctx, /* the output sample size is stored soon */ hassize = get_bits1(&alac->gb); - alac->wasted_bits = get_bits(&alac->gb, 2) << 3; + alac->extra_bits = get_bits(&alac->gb, 2) << 3; /* whether the frame is compressed */ isnotcompressed = get_bits1(&alac->gb); @@ -444,7 +444,7 @@ static int alac_decode_frame(AVCodecContext *avctx, } *outputsize = outputsamples * alac->bytespersample; - readsamplesize = alac->setinfo_sample_size - (alac->wasted_bits) + channels - 1; + readsamplesize = alac->setinfo_sample_size - alac->extra_bits + channels - 1; if (readsamplesize > MIN_CACHE_BITS) { av_log(avctx, AV_LOG_ERROR, "readsamplesize too big (%d)\n", readsamplesize); return -1; @@ -474,11 +474,11 @@ static int alac_decode_frame(AVCodecContext *avctx, predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16); } - if (alac->wasted_bits) { + if (alac->extra_bits) { int i, ch; for (i = 0; i < outputsamples; i++) { for (ch = 0; ch < channels; ch++) - alac->wasted_bits_buffer[ch][i] = get_bits(&alac->gb, alac->wasted_bits); + alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits); } } for (chan = 0; chan < channels; chan++) { @@ -532,7 +532,7 @@ static int alac_decode_frame(AVCodecContext *avctx, } } } - alac->wasted_bits = 0; + alac->extra_bits = 0; interlacing_shift = 0; interlacing_leftweight = 0; } @@ -559,8 +559,8 @@ static int alac_decode_frame(AVCodecContext *avctx, if (channels == 2) { decorrelate_stereo_24(alac->outputsamples_buffer, outbuffer, - alac->wasted_bits_buffer, - alac->wasted_bits, + alac->extra_bits_buffer, + alac->extra_bits, alac->numchannels, outputsamples, interlacing_shift, @@ -587,7 +587,7 @@ static av_cold int alac_decode_close(AVCodecContext *avctx) for (chan = 0; chan < alac->numchannels; chan++) { av_freep(&alac->predicterror_buffer[chan]); av_freep(&alac->outputsamples_buffer[chan]); - av_freep(&alac->wasted_bits_buffer[chan]); + av_freep(&alac->extra_bits_buffer[chan]); } return 0; @@ -603,11 +603,11 @@ static int allocate_buffers(ALACContext *alac) alac->outputsamples_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); - alac->wasted_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); + alac->extra_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); if (!alac->predicterror_buffer[chan] || !alac->outputsamples_buffer[chan] || - !alac->wasted_bits_buffer[chan]) { + !alac->extra_bits_buffer[chan]) { alac_decode_close(alac->avctx); return AVERROR(ENOMEM); } From e739d35156c85b3ccae4fdacd368933f0408227a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 13:16:14 -0400 Subject: [PATCH 11/35] alacdec: split stereo decorrelation into a separate function. It is identical for 16-bit and 24-bit, so there is no need to have duplicate code. --- libavcodec/alac.c | 77 +++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index ce1244fc18..96b25e0086 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -298,33 +298,33 @@ static void predictor_decompress_fir_adapt(int32_t *error_buffer, } } -static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], - int16_t *buffer_out, - int numchannels, int numsamples, - uint8_t interlacing_shift, - uint8_t interlacing_leftweight) +static void decorrelate_stereo(int32_t *buffer[MAX_CHANNELS], + int numchannels, int numsamples, + uint8_t interlacing_shift, + uint8_t interlacing_leftweight) { int i; - /* weighted interlacing */ - if (interlacing_leftweight) { - for (i = 0; i < numsamples; i++) { - int32_t a, b; + for (i = 0; i < numsamples; i++) { + int32_t a, b; - a = buffer[0][i]; - b = buffer[1][i]; + a = buffer[0][i]; + b = buffer[1][i]; - a -= (b * interlacing_leftweight) >> interlacing_shift; - b += a; + a -= (b * interlacing_leftweight) >> interlacing_shift; + b += a; - buffer_out[i*numchannels] = b; - buffer_out[i*numchannels + 1] = a; - } - - return; + buffer[0][i] = b; + buffer[1][i] = a; } +} + +static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], + int16_t *buffer_out, + int numchannels, int numsamples) +{ + int i; - /* otherwise basic interlacing took place */ for (i = 0; i < numsamples; i++) { int16_t left, right; @@ -340,32 +340,10 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], int32_t *buffer_out, int32_t *extra_bits_buffer[MAX_CHANNELS], int extra_bits, - int numchannels, int numsamples, - uint8_t interlacing_shift, - uint8_t interlacing_leftweight) + int numchannels, int numsamples) { int i; - /* weighted interlacing */ - if (interlacing_leftweight) { - for (i = 0; i < numsamples; i++) { - int32_t a, b; - - a = buffer[0][i]; - b = buffer[1][i]; - - a -= (b * interlacing_leftweight) >> interlacing_shift; - b += a; - - if (extra_bits) { - b = (b << extra_bits) | extra_bits_buffer[0][i]; - a = (a << extra_bits) | extra_bits_buffer[1][i]; - } - - buffer_out[i * numchannels] = b << 8; - buffer_out[i * numchannels + 1] = a << 8; - } - } else { for (i = 0; i < numsamples; i++) { int32_t left, right; @@ -380,7 +358,6 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], buffer_out[i * numchannels] = left << 8; buffer_out[i * numchannels + 1] = right << 8; } - } } static int alac_decode_frame(AVCodecContext *avctx, @@ -539,15 +516,19 @@ static int alac_decode_frame(AVCodecContext *avctx, if (get_bits(&alac->gb, 3) != 7) av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n"); + if (channels == 2 && interlacing_leftweight) { + decorrelate_stereo(alac->outputsamples_buffer, alac->numchannels, + outputsamples, interlacing_shift, + interlacing_leftweight); + } + switch(alac->setinfo_sample_size) { case 16: if (channels == 2) { reconstruct_stereo_16(alac->outputsamples_buffer, (int16_t*)outbuffer, alac->numchannels, - outputsamples, - interlacing_shift, - interlacing_leftweight); + outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) { @@ -562,9 +543,7 @@ static int alac_decode_frame(AVCodecContext *avctx, alac->extra_bits_buffer, alac->extra_bits, alac->numchannels, - outputsamples, - interlacing_shift, - interlacing_leftweight); + outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) From c39bddd392f4fe79e038f5753ac10abb78dedeb8 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 13:27:16 -0400 Subject: [PATCH 12/35] alacdec: move appending of extra_bits to a separate function. This should also fix decoding of mono 24-bit. --- libavcodec/alac.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 96b25e0086..b7071d2a15 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -319,6 +319,17 @@ static void decorrelate_stereo(int32_t *buffer[MAX_CHANNELS], } } +static void append_extra_bits(int32_t *buffer[MAX_CHANNELS], + int32_t *extra_bits_buffer[MAX_CHANNELS], + int extra_bits, int numchannels, int numsamples) +{ + int i, ch; + + for (ch = 0; ch < numchannels; ch++) + for (i = 0; i < numsamples; i++) + buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i]; +} + static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], int16_t *buffer_out, int numchannels, int numsamples) @@ -338,8 +349,6 @@ static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], int32_t *buffer_out, - int32_t *extra_bits_buffer[MAX_CHANNELS], - int extra_bits, int numchannels, int numsamples) { int i; @@ -350,11 +359,6 @@ static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], left = buffer[0][i]; right = buffer[1][i]; - if (extra_bits) { - left = (left << extra_bits) | extra_bits_buffer[0][i]; - right = (right << extra_bits) | extra_bits_buffer[1][i]; - } - buffer_out[i * numchannels] = left << 8; buffer_out[i * numchannels + 1] = right << 8; } @@ -522,6 +526,11 @@ static int alac_decode_frame(AVCodecContext *avctx, interlacing_leftweight); } + if (alac->extra_bits) { + append_extra_bits(alac->outputsamples_buffer, alac->extra_bits_buffer, + alac->extra_bits, alac->numchannels, outputsamples); + } + switch(alac->setinfo_sample_size) { case 16: if (channels == 2) { @@ -540,8 +549,6 @@ static int alac_decode_frame(AVCodecContext *avctx, if (channels == 2) { decorrelate_stereo_24(alac->outputsamples_buffer, outbuffer, - alac->extra_bits_buffer, - alac->extra_bits, alac->numchannels, outputsamples); } else { From cb50329fc5ea89240ea5e835a3ee72ce16cf052a Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 13:31:03 -0400 Subject: [PATCH 13/35] alacdec: rename 2 functions. Now they only do stereo interleaving. --- libavcodec/alac.c | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index b7071d2a15..6563e52f30 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -330,9 +330,9 @@ static void append_extra_bits(int32_t *buffer[MAX_CHANNELS], buffer[ch][i] = (buffer[ch][i] << extra_bits) | extra_bits_buffer[ch][i]; } -static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], - int16_t *buffer_out, - int numchannels, int numsamples) +static void interleave_stereo_16(int32_t *buffer[MAX_CHANNELS], + int16_t *buffer_out, int numchannels, + int numsamples) { int i; @@ -347,9 +347,9 @@ static void reconstruct_stereo_16(int32_t *buffer[MAX_CHANNELS], } } -static void decorrelate_stereo_24(int32_t *buffer[MAX_CHANNELS], - int32_t *buffer_out, - int numchannels, int numsamples) +static void interleave_stereo_24(int32_t *buffer[MAX_CHANNELS], + int32_t *buffer_out, int numchannels, + int numsamples) { int i; @@ -534,10 +534,8 @@ static int alac_decode_frame(AVCodecContext *avctx, switch(alac->setinfo_sample_size) { case 16: if (channels == 2) { - reconstruct_stereo_16(alac->outputsamples_buffer, - (int16_t*)outbuffer, - alac->numchannels, - outputsamples); + interleave_stereo_16(alac->outputsamples_buffer, outbuffer, + alac->numchannels, outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) { @@ -547,10 +545,8 @@ static int alac_decode_frame(AVCodecContext *avctx, break; case 24: if (channels == 2) { - decorrelate_stereo_24(alac->outputsamples_buffer, - outbuffer, - alac->numchannels, - outputsamples); + interleave_stereo_24(alac->outputsamples_buffer, outbuffer, + alac->numchannels, outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) From 7080533cda2cccf980326b0942de8ff046619fd4 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 13:36:01 -0400 Subject: [PATCH 14/35] alacdec: remove the numchannels parameter from several functions. They only operate on stereo content, so the extra param is not necessary and also allows for simplifying the code. --- libavcodec/alac.c | 40 +++++++++++++--------------------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 6563e52f30..3b79645ce1 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -299,8 +299,7 @@ static void predictor_decompress_fir_adapt(int32_t *error_buffer, } static void decorrelate_stereo(int32_t *buffer[MAX_CHANNELS], - int numchannels, int numsamples, - uint8_t interlacing_shift, + int numsamples, uint8_t interlacing_shift, uint8_t interlacing_leftweight) { int i; @@ -331,37 +330,25 @@ static void append_extra_bits(int32_t *buffer[MAX_CHANNELS], } static void interleave_stereo_16(int32_t *buffer[MAX_CHANNELS], - int16_t *buffer_out, int numchannels, - int numsamples) + int16_t *buffer_out, int numsamples) { int i; for (i = 0; i < numsamples; i++) { - int16_t left, right; - - left = buffer[0][i]; - right = buffer[1][i]; - - buffer_out[i*numchannels] = left; - buffer_out[i*numchannels + 1] = right; + *buffer_out++ = buffer[0][i]; + *buffer_out++ = buffer[1][i]; } } static void interleave_stereo_24(int32_t *buffer[MAX_CHANNELS], - int32_t *buffer_out, int numchannels, - int numsamples) + int32_t *buffer_out, int numsamples) { int i; - for (i = 0; i < numsamples; i++) { - int32_t left, right; - - left = buffer[0][i]; - right = buffer[1][i]; - - buffer_out[i * numchannels] = left << 8; - buffer_out[i * numchannels + 1] = right << 8; - } + for (i = 0; i < numsamples; i++) { + *buffer_out++ = buffer[0][i] << 8; + *buffer_out++ = buffer[1][i] << 8; + } } static int alac_decode_frame(AVCodecContext *avctx, @@ -521,9 +508,8 @@ static int alac_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Error : Wrong End Of Frame\n"); if (channels == 2 && interlacing_leftweight) { - decorrelate_stereo(alac->outputsamples_buffer, alac->numchannels, - outputsamples, interlacing_shift, - interlacing_leftweight); + decorrelate_stereo(alac->outputsamples_buffer, outputsamples, + interlacing_shift, interlacing_leftweight); } if (alac->extra_bits) { @@ -535,7 +521,7 @@ static int alac_decode_frame(AVCodecContext *avctx, case 16: if (channels == 2) { interleave_stereo_16(alac->outputsamples_buffer, outbuffer, - alac->numchannels, outputsamples); + outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) { @@ -546,7 +532,7 @@ static int alac_decode_frame(AVCodecContext *avctx, case 24: if (channels == 2) { interleave_stereo_24(alac->outputsamples_buffer, outbuffer, - alac->numchannels, outputsamples); + outputsamples); } else { int i; for (i = 0; i < outputsamples; i++) From b46e58f7410488f49b22d0bc5d32479f352a8d61 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 14:02:21 -0400 Subject: [PATCH 15/35] alacdec: remove unneeded local variable --- libavcodec/alac.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 3b79645ce1..5ff8cad8b4 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -484,11 +484,8 @@ static int alac_decode_frame(AVCodecContext *avctx, if (alac->setinfo_sample_size <= 16) { for (i = 0; i < outputsamples; i++) for (chan = 0; chan < channels; chan++) { - int32_t audiobits; - - audiobits = get_sbits_long(&alac->gb, alac->setinfo_sample_size); - - alac->outputsamples_buffer[chan][i] = audiobits; + alac->outputsamples_buffer[chan][i] = get_sbits_long(&alac->gb, + alac->setinfo_sample_size); } } else { for (i = 0; i < outputsamples; i++) { From c3a92412c067ed3e38ad89756e3146468fd3073c Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 14:02:52 -0400 Subject: [PATCH 16/35] alacdec: always use get_sbits_long() for uncompressed samples --- libavcodec/alac.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 5ff8cad8b4..f61d31f926 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -481,21 +481,11 @@ static int alac_decode_frame(AVCodecContext *avctx, } else { /* not compressed, easy case */ int i, chan; - if (alac->setinfo_sample_size <= 16) { - for (i = 0; i < outputsamples; i++) + for (i = 0; i < outputsamples; i++) { for (chan = 0; chan < channels; chan++) { alac->outputsamples_buffer[chan][i] = get_sbits_long(&alac->gb, alac->setinfo_sample_size); } - } else { - for (i = 0; i < outputsamples; i++) { - for (chan = 0; chan < channels; chan++) { - alac->outputsamples_buffer[chan][i] = get_bits(&alac->gb, - alac->setinfo_sample_size); - alac->outputsamples_buffer[chan][i] = sign_extend(alac->outputsamples_buffer[chan][i], - alac->setinfo_sample_size); - } - } } alac->extra_bits = 0; interlacing_shift = 0; From 01200f1283291f5040c1396b5ff94f09b733a59d Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 14:19:32 -0400 Subject: [PATCH 17/35] alacdec: move some declarations to the top of the function --- libavcodec/alac.c | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index f61d31f926..c6461a9fb2 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -366,6 +366,7 @@ static int alac_decode_frame(AVCodecContext *avctx, int isnotcompressed; uint8_t interlacing_shift; uint8_t interlacing_leftweight; + int i, ch; /* short-circuit null buffers */ if (!inbuffer || !input_buffer_size) @@ -425,51 +426,49 @@ static int alac_decode_frame(AVCodecContext *avctx, int prediction_type[MAX_CHANNELS]; int prediction_quantitization[MAX_CHANNELS]; int ricemodifier[MAX_CHANNELS]; - int i, chan; interlacing_shift = get_bits(&alac->gb, 8); interlacing_leftweight = get_bits(&alac->gb, 8); - for (chan = 0; chan < channels; chan++) { - prediction_type[chan] = get_bits(&alac->gb, 4); - prediction_quantitization[chan] = get_bits(&alac->gb, 4); + for (ch = 0; ch < channels; ch++) { + prediction_type[ch] = get_bits(&alac->gb, 4); + prediction_quantitization[ch] = get_bits(&alac->gb, 4); - ricemodifier[chan] = get_bits(&alac->gb, 3); - predictor_coef_num[chan] = get_bits(&alac->gb, 5); + ricemodifier[ch] = get_bits(&alac->gb, 3); + predictor_coef_num[ch] = get_bits(&alac->gb, 5); /* read the predictor table */ - for (i = 0; i < predictor_coef_num[chan]; i++) - predictor_coef_table[chan][i] = (int16_t)get_bits(&alac->gb, 16); + for (i = 0; i < predictor_coef_num[ch]; i++) + predictor_coef_table[ch][i] = (int16_t)get_bits(&alac->gb, 16); } if (alac->extra_bits) { - int i, ch; for (i = 0; i < outputsamples; i++) { for (ch = 0; ch < channels; ch++) alac->extra_bits_buffer[ch][i] = get_bits(&alac->gb, alac->extra_bits); } } - for (chan = 0; chan < channels; chan++) { + for (ch = 0; ch < channels; ch++) { bastardized_rice_decompress(alac, - alac->predicterror_buffer[chan], + alac->predicterror_buffer[ch], outputsamples, readsamplesize, alac->setinfo_rice_initialhistory, alac->setinfo_rice_kmodifier, - ricemodifier[chan] * alac->setinfo_rice_historymult / 4, + ricemodifier[ch] * alac->setinfo_rice_historymult / 4, (1 << alac->setinfo_rice_kmodifier) - 1); - if (prediction_type[chan] == 0) { + if (prediction_type[ch] == 0) { /* adaptive fir */ - predictor_decompress_fir_adapt(alac->predicterror_buffer[chan], - alac->outputsamples_buffer[chan], + predictor_decompress_fir_adapt(alac->predicterror_buffer[ch], + alac->outputsamples_buffer[ch], outputsamples, readsamplesize, - predictor_coef_table[chan], - predictor_coef_num[chan], - prediction_quantitization[chan]); + predictor_coef_table[ch], + predictor_coef_num[ch], + prediction_quantitization[ch]); } else { - av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[chan]); + av_log(avctx, AV_LOG_ERROR, "FIXME: unhandled prediction type: %i\n", prediction_type[ch]); /* I think the only other prediction type (or perhaps this is * just a boolean?) runs adaptive fir twice.. like: * predictor_decompress_fir_adapt(predictor_error, tempout, ...) @@ -480,11 +479,10 @@ static int alac_decode_frame(AVCodecContext *avctx, } } else { /* not compressed, easy case */ - int i, chan; for (i = 0; i < outputsamples; i++) { - for (chan = 0; chan < channels; chan++) { - alac->outputsamples_buffer[chan][i] = get_sbits_long(&alac->gb, - alac->setinfo_sample_size); + for (ch = 0; ch < channels; ch++) { + alac->outputsamples_buffer[ch][i] = get_sbits_long(&alac->gb, + alac->setinfo_sample_size); } } alac->extra_bits = 0; @@ -510,7 +508,6 @@ static int alac_decode_frame(AVCodecContext *avctx, interleave_stereo_16(alac->outputsamples_buffer, outbuffer, outputsamples); } else { - int i; for (i = 0; i < outputsamples; i++) { ((int16_t*)outbuffer)[i] = alac->outputsamples_buffer[0][i]; } @@ -521,7 +518,6 @@ static int alac_decode_frame(AVCodecContext *avctx, interleave_stereo_24(alac->outputsamples_buffer, outbuffer, outputsamples); } else { - int i; for (i = 0; i < outputsamples; i++) ((int32_t *)outbuffer)[i] = alac->outputsamples_buffer[0][i] << 8; } From 63cf54df7a0fabc9503af4457a7bf47e622efea1 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 14:21:35 -0400 Subject: [PATCH 18/35] alacdec: cosmetics: use 'ch' instead of 'chan' to iterate channels --- libavcodec/alac.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index c6461a9fb2..6b10bf6a78 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -534,11 +534,11 @@ static av_cold int alac_decode_close(AVCodecContext *avctx) { ALACContext *alac = avctx->priv_data; - int chan; - for (chan = 0; chan < alac->numchannels; chan++) { - av_freep(&alac->predicterror_buffer[chan]); - av_freep(&alac->outputsamples_buffer[chan]); - av_freep(&alac->extra_bits_buffer[chan]); + int ch; + for (ch = 0; ch < alac->numchannels; ch++) { + av_freep(&alac->predicterror_buffer[ch]); + av_freep(&alac->outputsamples_buffer[ch]); + av_freep(&alac->extra_bits_buffer[ch]); } return 0; @@ -546,19 +546,19 @@ static av_cold int alac_decode_close(AVCodecContext *avctx) static int allocate_buffers(ALACContext *alac) { - int chan; - for (chan = 0; chan < alac->numchannels; chan++) { - alac->predicterror_buffer[chan] = + int ch; + for (ch = 0; ch < alac->numchannels; ch++) { + alac->predicterror_buffer[ch] = av_malloc(alac->setinfo_max_samples_per_frame * 4); - alac->outputsamples_buffer[chan] = + alac->outputsamples_buffer[ch] = av_malloc(alac->setinfo_max_samples_per_frame * 4); - alac->extra_bits_buffer[chan] = av_malloc(alac->setinfo_max_samples_per_frame * 4); + alac->extra_bits_buffer[ch] = av_malloc(alac->setinfo_max_samples_per_frame * 4); - if (!alac->predicterror_buffer[chan] || - !alac->outputsamples_buffer[chan] || - !alac->extra_bits_buffer[chan]) { + if (!alac->predicterror_buffer[ch] || + !alac->outputsamples_buffer[ch] || + !alac->extra_bits_buffer[ch]) { alac_decode_close(alac->avctx); return AVERROR(ENOMEM); } From b316af7a7c6b20ded1fd996933e47d4feb89aac9 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 9 Oct 2011 14:23:44 -0400 Subject: [PATCH 19/35] alacdec: ask for a sample for unsupported sample depths. Also return AVERROR_PATCHWELCOME. --- libavcodec/alac.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 6b10bf6a78..85a441abe8 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -617,9 +617,9 @@ static av_cold int alac_decode_init(AVCodecContext * avctx) break; case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32; break; - default: av_log(avctx, AV_LOG_ERROR, "Sample depth %d is not supported.\n", - alac->setinfo_sample_size); - return -1; + default: av_log_ask_for_sample(avctx, "Sample depth %d is not supported.\n", + alac->setinfo_sample_size); + return AVERROR_PATCHWELCOME; } if (alac->numchannels < 1) { From 68f7e9cd8e29d0331f783844bb92d64d208aa861 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 10 Oct 2011 11:21:07 -0400 Subject: [PATCH 20/35] alacdec: simplify buffer allocation by using FF_ALLOC_OR_GOTO() --- libavcodec/alac.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 85a441abe8..4b442196e9 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -548,22 +548,21 @@ static int allocate_buffers(ALACContext *alac) { int ch; for (ch = 0; ch < alac->numchannels; ch++) { - alac->predicterror_buffer[ch] = - av_malloc(alac->setinfo_max_samples_per_frame * 4); + int buf_size = alac->setinfo_max_samples_per_frame * sizeof(int32_t); - alac->outputsamples_buffer[ch] = - av_malloc(alac->setinfo_max_samples_per_frame * 4); + FF_ALLOC_OR_GOTO(alac->avctx, alac->predicterror_buffer[ch], + buf_size, buf_alloc_fail); - alac->extra_bits_buffer[ch] = av_malloc(alac->setinfo_max_samples_per_frame * 4); + FF_ALLOC_OR_GOTO(alac->avctx, alac->outputsamples_buffer[ch], + buf_size, buf_alloc_fail); - if (!alac->predicterror_buffer[ch] || - !alac->outputsamples_buffer[ch] || - !alac->extra_bits_buffer[ch]) { - alac_decode_close(alac->avctx); - return AVERROR(ENOMEM); - } + FF_ALLOC_OR_GOTO(alac->avctx, alac->extra_bits_buffer[ch], + buf_size, buf_alloc_fail); } return 0; +buf_alloc_fail: + alac_decode_close(alac->avctx); + return AVERROR(ENOMEM); } static int alac_set_info(ALACContext *alac) From 30f3e7b524cc31155db7a1b0057f651312f6341e Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 10 Oct 2011 13:07:19 -0400 Subject: [PATCH 21/35] alacdec: remove unneeded NULL or zero-size packet checks. This is already done in avcodec_decode_audio3() --- libavcodec/alac.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/alac.c b/libavcodec/alac.c index 4b442196e9..1056e6c8f4 100644 --- a/libavcodec/alac.c +++ b/libavcodec/alac.c @@ -368,10 +368,6 @@ static int alac_decode_frame(AVCodecContext *avctx, uint8_t interlacing_leftweight; int i, ch; - /* short-circuit null buffers */ - if (!inbuffer || !input_buffer_size) - return -1; - init_get_bits(&alac->gb, inbuffer, input_buffer_size * 8); channels = get_bits(&alac->gb, 3) + 1; From 6b94711f15257dfd1b45596e060b88a26059bc0d Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 17:52:48 -0400 Subject: [PATCH 22/35] pcmdec: do not needlessly set *data_size to 0 --- libavcodec/pcm.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 66edfba0f2..4b115836fd 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -302,7 +302,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, } buf_size= FFMIN(buf_size, *data_size/2); - *data_size=0; n = buf_size/sample_size; From 381e195b46d080aee1d9b05ef2b6b140e9463519 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 19:24:47 -0400 Subject: [PATCH 23/35] pcmdec: move DVD PCM bits_per_coded_sample check near to the code that sets the sample size. --- libavcodec/pcm.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 4b115836fd..158366c19a 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -279,10 +279,15 @@ static int pcm_decode_frame(AVCodecContext *avctx, sample_size = av_get_bits_per_sample(avctx->codec_id)/8; /* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */ - if (CODEC_ID_PCM_DVD == avctx->codec_id) + if (CODEC_ID_PCM_DVD == avctx->codec_id) { + if (avctx->bits_per_coded_sample != 20 && + avctx->bits_per_coded_sample != 24) { + av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n"); + return AVERROR(EINVAL); + } /* 2 samples are interleaved per block in PCM_DVD */ sample_size = avctx->bits_per_coded_sample * 2 / 8; - else if (avctx->codec_id == CODEC_ID_PCM_LXF) + } else if (avctx->codec_id == CODEC_ID_PCM_LXF) /* we process 40-bit blocks per channel for LXF */ sample_size = 5; @@ -433,9 +438,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, src = src8; } break; - default: - av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n"); - return -1; } samples = (uint8_t *) dst_int32_t; break; From 83efd7652e6bf916bfecfc0ff4c961df928d228e Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 19:47:10 -0400 Subject: [PATCH 24/35] pcmdec: remove unnecessary check for sample_fmt change --- libavcodec/pcm.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 158366c19a..c0d093015a 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -266,11 +266,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, samples = data; src = buf; - if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) { - av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n"); - return -1; - } - if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){ av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); return -1; From d94e29cac94d1f938cf3a25320522cc9de0a6b86 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 19:49:25 -0400 Subject: [PATCH 25/35] pcmdec: move number of channels check to pcm_decode_init() --- libavcodec/pcm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index c0d093015a..2a50a8146d 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -213,6 +213,11 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx) PCMDecode *s = avctx->priv_data; int i; + if (avctx->channels <= 0 || avctx->channels > MAX_CHANNELS) { + av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); + return AVERROR(EINVAL); + } + switch(avctx->codec->id) { case CODEC_ID_PCM_ALAW: for(i=0;i<256;i++) @@ -266,11 +271,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, samples = data; src = buf; - if(avctx->channels <= 0 || avctx->channels > MAX_CHANNELS){ - av_log(avctx, AV_LOG_ERROR, "PCM channels out of bounds\n"); - return -1; - } - sample_size = av_get_bits_per_sample(avctx->codec_id)/8; /* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */ From 06af335a33a771bad05dc1873c3f9d8e84abfb45 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 19:52:50 -0400 Subject: [PATCH 26/35] pcmenc: remove unneeded sample_fmt check. It is already checked by avcodec_open2(). --- libavcodec/pcm.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 2a50a8146d..e7cf874f44 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -95,11 +95,6 @@ static int pcm_encode_frame(AVCodecContext *avctx, samples = data; dst = frame; - if (avctx->sample_fmt!=avctx->codec->sample_fmts[0]) { - av_log(avctx, AV_LOG_ERROR, "invalid sample_fmt\n"); - return -1; - } - switch(avctx->codec->id) { case CODEC_ID_PCM_U32LE: ENCODE(uint32_t, le32, samples, dst, n, 0, 0x80000000) From 67a3b67c717e4e53b9217ec1d579f2dff5e46717 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Wed, 28 Sep 2011 19:31:05 -0400 Subject: [PATCH 27/35] pcm_zork: use AV_SAMPLE_FMT_U8 instead of shifting all samples by 8. --- libavcodec/pcm.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index e7cf874f44..ec2660cbd3 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -172,10 +172,11 @@ static int pcm_encode_frame(AVCodecContext *avctx, dst += n*sample_size; break; case CODEC_ID_PCM_ZORK: - for(;n>0;n--) { - v= *samples++ >> 8; - if(v<0) v = -v; - else v+= 128; + srcu8 = data; + for (; n > 0; n--) { + v = *srcu8++; + if (v < 128) + v = 128 - v; *dst++ = v; } break; @@ -387,12 +388,11 @@ static int pcm_decode_frame(AVCodecContext *avctx, samples += n * sample_size; break; case CODEC_ID_PCM_ZORK: - for(;n>0;n--) { - int x= *src++; - if(x&128) x-= 128; - else x = -x; - AV_WN16A(samples, x << 8); - samples += 2; + for (; n > 0; n--) { + int v = *src++; + if (v < 128) + v = 128 - v; + *samples++ = v; } break; case CODEC_ID_PCM_ALAW: @@ -518,4 +518,4 @@ PCM_CODEC (CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-b PCM_CODEC (CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian"); PCM_CODEC (CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian"); PCM_CODEC (CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian"); -PCM_CODEC (CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_S16, pcm_zork, "PCM Zork"); +PCM_CODEC (CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); From 85579b638179f40102c4bcedb8a2dde4cf19f391 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 29 Sep 2011 12:12:23 -0400 Subject: [PATCH 28/35] avcodec: remove the Zork PCM encoder. The Zork PCM decoder does not decode the 1 sample we have correctly, therefore the encoder based on the decoder is also incorrect. There is no good reason to keep the encoder. --- doc/general.texi | 2 +- libavcodec/Makefile | 1 - libavcodec/allcodecs.c | 2 +- libavcodec/pcm.c | 11 +---------- tests/codec-regression.sh | 1 - tests/ref/acodec/pcm | 4 ---- 6 files changed, 3 insertions(+), 18 deletions(-) diff --git a/doc/general.texi b/doc/general.texi index b1c2534be0..24869c3208 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -666,7 +666,7 @@ following image formats are supported: @item PCM unsigned 24-bit little-endian @tab X @tab X @item PCM unsigned 32-bit big-endian @tab X @tab X @item PCM unsigned 32-bit little-endian @tab X @tab X -@item PCM Zork @tab X @tab X +@item PCM Zork @tab @tab X @item QCELP / PureVoice @tab @tab X @item QDesign Music Codec 2 @tab @tab X @tab There are still some distortions. diff --git a/libavcodec/Makefile b/libavcodec/Makefile index bd4275a1f4..9dfde53eb7 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -483,7 +483,6 @@ OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o -OBJS-$(CONFIG_PCM_ZORK_ENCODER) += pcm.o OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_ADX_DECODER) += adxdec.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 64669b7c8f..107ec310e0 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -313,7 +313,7 @@ void avcodec_register_all(void) REGISTER_ENCDEC (PCM_U24LE, pcm_u24le); REGISTER_ENCDEC (PCM_U32BE, pcm_u32be); REGISTER_ENCDEC (PCM_U32LE, pcm_u32le); - REGISTER_ENCDEC (PCM_ZORK , pcm_zork); + REGISTER_DECODER (PCM_ZORK , pcm_zork); /* DPCM codecs */ REGISTER_DECODER (INTERPLAY_DPCM, interplay_dpcm); diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index ec2660cbd3..ca3926402a 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -171,15 +171,6 @@ static int pcm_encode_frame(AVCodecContext *avctx, memcpy(dst, samples, n*sample_size); dst += n*sample_size; break; - case CODEC_ID_PCM_ZORK: - srcu8 = data; - for (; n > 0; n--) { - v = *srcu8++; - if (v < 128) - v = 128 - v; - *dst++ = v; - } - break; case CODEC_ID_PCM_ALAW: for(;n>0;n--) { v = *samples++; @@ -518,4 +509,4 @@ PCM_CODEC (CODEC_ID_PCM_U24BE, AV_SAMPLE_FMT_S32, pcm_u24be, "PCM unsigned 24-b PCM_CODEC (CODEC_ID_PCM_U24LE, AV_SAMPLE_FMT_S32, pcm_u24le, "PCM unsigned 24-bit little-endian"); PCM_CODEC (CODEC_ID_PCM_U32BE, AV_SAMPLE_FMT_S32, pcm_u32be, "PCM unsigned 32-bit big-endian"); PCM_CODEC (CODEC_ID_PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned 32-bit little-endian"); -PCM_CODEC (CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); +PCM_DECODER(CODEC_ID_PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); diff --git a/tests/codec-regression.sh b/tests/codec-regression.sh index cafa84779f..38d641a197 100755 --- a/tests/codec-regression.sh +++ b/tests/codec-regression.sh @@ -357,6 +357,5 @@ do_audio_enc_dec au flt pcm_f32be do_audio_enc_dec wav flt pcm_f32le do_audio_enc_dec au dbl pcm_f64be do_audio_enc_dec wav dbl pcm_f64le -do_audio_enc_dec wav s16 pcm_zork do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000" fi diff --git a/tests/ref/acodec/pcm b/tests/ref/acodec/pcm index da64e62a6f..1c710b8c97 100644 --- a/tests/ref/acodec/pcm +++ b/tests/ref/acodec/pcm @@ -62,10 +62,6 @@ ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav 4233680 ./tests/data/acodec/pcm_f64le.wav 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 -ebd38ed390ebdefe0bdf00d21bf12c6b *./tests/data/acodec/pcm_zork.wav -529258 ./tests/data/acodec/pcm_zork.wav -7b02646acdd063650bb3ebc444543ace *./tests/data/pcm.acodec.out.wav -stddev: 633.11 PSNR: 40.30 MAXDIFF:32768 bytes: 1058400/ 1058400 8168a5c1343553ef027541830f2cb879 *./tests/data/acodec/pcm_s24daud.302 10368730 ./tests/data/acodec/pcm_s24daud.302 f552afadfdfcd6348a07095da6382de5 *./tests/data/pcm.acodec.out.wav From 0093f96d34e411e1fb3def454598d2018f4c2941 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 29 Sep 2011 16:00:00 -0400 Subject: [PATCH 29/35] pcmdec: return buf_size instead of src-buf. The values will always be the same, so this change eliminates an unneeded variable. It also gets rid of the need to reset src when memcpy() is used. --- libavcodec/pcm.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index ca3926402a..37dda7dac9 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -247,16 +247,15 @@ static int pcm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; + const uint8_t *src = avpkt->data; int buf_size = avpkt->size; PCMDecode *s = avctx->priv_data; int sample_size, c, n, i; uint8_t *samples; - const uint8_t *src, *src8, *src2[MAX_CHANNELS]; + const uint8_t *src8, *src2[MAX_CHANNELS]; int32_t *dst_int32_t; samples = data; - src = buf; sample_size = av_get_bits_per_sample(avctx->codec_id)/8; @@ -329,7 +328,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, AV_WN16A(samples, bytestream_get_le16(&src2[c])); samples += 2; } - src = src2[avctx->channels-1]; break; case CODEC_ID_PCM_U16LE: DECODE(16, le16, src, samples, n, 0, 0x8000) @@ -375,7 +373,6 @@ static int pcm_decode_frame(AVCodecContext *avctx, #endif /* HAVE_BIGENDIAN */ case CODEC_ID_PCM_U8: memcpy(samples, src, n*sample_size); - src += n*sample_size; samples += n * sample_size; break; case CODEC_ID_PCM_ZORK: @@ -439,14 +436,13 @@ static int pcm_decode_frame(AVCodecContext *avctx, ((src8[2] & 0xF0) << 8) | (src8[4] << 4) | (src8[3] >> 4); } } - src += n * avctx->channels * 5; samples = (uint8_t *) dst_int32_t; break; default: return -1; } *data_size = samples - (uint8_t *)data; - return src - buf; + return buf_size; } #if CONFIG_ENCODERS From 154cd253e576b9d2994da7eae9d32796ac8cfa4f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 29 Sep 2011 16:30:20 -0400 Subject: [PATCH 30/35] pcmdec: move codec-specific variable declarations to the corresponding codec blocks. --- libavcodec/pcm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 37dda7dac9..8d9399265e 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -250,9 +250,8 @@ static int pcm_decode_frame(AVCodecContext *avctx, const uint8_t *src = avpkt->data; int buf_size = avpkt->size; PCMDecode *s = avctx->priv_data; - int sample_size, c, n, i; + int sample_size, c, n; uint8_t *samples; - const uint8_t *src8, *src2[MAX_CHANNELS]; int32_t *dst_int32_t; samples = data; @@ -320,6 +319,8 @@ static int pcm_decode_frame(AVCodecContext *avctx, } break; case CODEC_ID_PCM_S16LE_PLANAR: + { + const uint8_t *src2[MAX_CHANNELS]; n /= avctx->channels; for(c=0;cchannels;c++) src2[c] = &src[c*n*2]; @@ -329,6 +330,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, samples += 2; } break; + } case CODEC_ID_PCM_U16LE: DECODE(16, le16, src, samples, n, 0, 0x8000) break; @@ -391,6 +393,8 @@ static int pcm_decode_frame(AVCodecContext *avctx, } break; case CODEC_ID_PCM_DVD: + { + const uint8_t *src8; dst_int32_t = data; n /= avctx->channels; switch (avctx->bits_per_coded_sample) { @@ -419,7 +423,11 @@ static int pcm_decode_frame(AVCodecContext *avctx, } samples = (uint8_t *) dst_int32_t; break; + } case CODEC_ID_PCM_LXF: + { + int i; + const uint8_t *src8; dst_int32_t = data; n /= avctx->channels; //unpack and de-planerize @@ -438,6 +446,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, } samples = (uint8_t *) dst_int32_t; break; + } default: return -1; } From f1901180e02a766edbc74b8fb8cfbb88b79ef347 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Thu, 29 Sep 2011 16:44:50 -0400 Subject: [PATCH 31/35] pcmdec: fix output buffer size check by calculating the actual output size prior to decoding. --- libavcodec/pcm.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 8d9399265e..c9eb543e92 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -250,7 +250,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, const uint8_t *src = avpkt->data; int buf_size = avpkt->size; PCMDecode *s = avctx->priv_data; - int sample_size, c, n; + int sample_size, c, n, out_size; uint8_t *samples; int32_t *dst_int32_t; @@ -286,10 +286,17 @@ static int pcm_decode_frame(AVCodecContext *avctx, buf_size -= buf_size % n; } - buf_size= FFMIN(buf_size, *data_size/2); - n = buf_size/sample_size; + out_size = n * av_get_bytes_per_sample(avctx->sample_fmt); + if (avctx->codec_id == CODEC_ID_PCM_DVD || + avctx->codec_id == CODEC_ID_PCM_LXF) + out_size *= 2; + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "output buffer too small\n"); + return AVERROR(EINVAL); + } + switch(avctx->codec->id) { case CODEC_ID_PCM_U32LE: DECODE(32, le32, src, samples, n, 0, 0x80000000) @@ -450,7 +457,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, default: return -1; } - *data_size = samples - (uint8_t *)data; + *data_size = out_size; return buf_size; } From 71ccfb3f14fdff783ff0f1a06ac37e4597f65bed Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Mon, 10 Oct 2011 11:35:35 -0400 Subject: [PATCH 32/35] aac_latm: remove unneeded check for zero-size packet. This is already checked by avcodec_decode_audio3() --- libavcodec/aacdec.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c index 37ccd18ecb..ca69e77e29 100644 --- a/libavcodec/aacdec.c +++ b/libavcodec/aacdec.c @@ -2487,9 +2487,6 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out, int *out_size, int muxlength, err; GetBitContext gb; - if (avpkt->size == 0) - return 0; - init_get_bits(&gb, avpkt->data, avpkt->size * 8); // check for LOAS sync word From 402c98783d2818311dbfdd98f6287f27e9a4d809 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 17:17:59 -0400 Subject: [PATCH 33/35] libopencore-amr: remove unneeded frame_count field. Use AVCodecContext.frame_number instead. --- libavcodec/libopencore-amr.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index 484545fe67..22889bc240 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -79,7 +79,6 @@ static int get_bitrate_mode(int bitrate, void *log_ctx) typedef struct AMRContext { AVClass *av_class; - int frame_count; void *dec_state; void *enc_state; int enc_bitrate; @@ -100,7 +99,6 @@ static av_cold int amr_nb_decode_init(AVCodecContext *avctx) { AMRContext *s = avctx->priv_data; - s->frame_count = 0; s->dec_state = Decoder_Interface_init(); if (!s->dec_state) { av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\n"); @@ -136,7 +134,7 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, int packet_size; av_dlog(avctx, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n", - buf, buf_size, s->frame_count); + buf, buf_size, avctx->frame_number); dec_mode = (buf[0] >> 3) & 0x000F; packet_size = block_size[dec_mode] + 1; @@ -147,7 +145,6 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } - s->frame_count++; av_dlog(avctx, "packet_size=%d buf= 0x%X %X %X %X\n", packet_size, buf[0], buf[1], buf[2], buf[3]); /* call decoder */ @@ -172,8 +169,6 @@ static av_cold int amr_nb_encode_init(AVCodecContext *avctx) { AMRContext *s = avctx->priv_data; - s->frame_count = 0; - if (avctx->sample_rate != 8000) { av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n"); return AVERROR(ENOSYS); From 345d15d2f9430ea9667b15b9faca09e12ba41d28 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 17:21:32 -0400 Subject: [PATCH 34/35] libopencore-amr: remove unneeded buf_size==0 check. avcodec_decode_audio3() already checks it before sending the packet to the decoder. --- libavcodec/libopencore-amr.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index 22889bc240..6c54a1d118 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -274,10 +274,6 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data, int packet_size; static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1}; - if (!buf_size) - /* nothing to do */ - return 0; - mode = (buf[0] >> 3) & 0x000F; packet_size = block_size[mode]; From 4a6a29a7fbf023b19797c38a86099d9f81d25524 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 27 Sep 2011 17:24:27 -0400 Subject: [PATCH 35/35] libopencore-amr: check output buffer size before decoding --- libavcodec/libopencore-amr.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c index 6c54a1d118..a705975aa9 100644 --- a/libavcodec/libopencore-amr.c +++ b/libavcodec/libopencore-amr.c @@ -131,11 +131,17 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, AMRContext *s = avctx->priv_data; static const uint8_t block_size[16] = { 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 }; enum Mode dec_mode; - int packet_size; + int packet_size, out_size; av_dlog(avctx, "amr_decode_frame buf=%p buf_size=%d frame_count=%d!!\n", buf, buf_size, avctx->frame_number); + out_size = 160 * av_get_bytes_per_sample(avctx->sample_fmt); + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); + return AVERROR(EINVAL); + } + dec_mode = (buf[0] >> 3) & 0x000F; packet_size = block_size[dec_mode] + 1; @@ -149,7 +155,7 @@ static int amr_nb_decode_frame(AVCodecContext *avctx, void *data, packet_size, buf[0], buf[1], buf[2], buf[3]); /* call decoder */ Decoder_Interface_Decode(s->dec_state, buf, data, 0); - *data_size = 160 * 2; + *data_size = out_size; return packet_size; } @@ -271,9 +277,15 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; AMRWBContext *s = avctx->priv_data; int mode; - int packet_size; + int packet_size, out_size; static const uint8_t block_size[16] = {18, 24, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1}; + out_size = 320 * av_get_bytes_per_sample(avctx->sample_fmt); + if (*data_size < out_size) { + av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n"); + return AVERROR(EINVAL); + } + mode = (buf[0] >> 3) & 0x000F; packet_size = block_size[mode]; @@ -284,7 +296,7 @@ static int amr_wb_decode_frame(AVCodecContext *avctx, void *data, } D_IF_decode(s->state, buf, data, _good_frame); - *data_size = 320 * 2; + *data_size = out_size; return packet_size; }