aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpc7.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-02-03 02:41:47 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-02-03 03:51:32 +0100
commitd77294c5e404c8a214da0e74f7836390b48b2dba (patch)
tree9c894cf54b1e18f285cc04eaf7e021e9976f4f2b /libavcodec/mpc7.c
parent9477fa094b89645b3a34ef3bc52c4f18719ab4b3 (diff)
parente15e2a6d2a886aa9944ac9798687104c829d1541 (diff)
downloadffmpeg-d77294c5e404c8a214da0e74f7836390b48b2dba.tar.gz
Merge remote-tracking branch 'qatar/master'
* qatar/master: libx264: fix indentation. vorbis: fix overflows in floor1[] vector and inverse db table index. win64: add a XMM clobber test configure option. movdec: Parse the dvc1 atom ARM: ac3: fix ac3_bit_alloc_calc_bap_armv6 swscale: K&R formatting cosmetics for Blackfin code frwu: lowercase the FRWU codec name movdec: fix dts generation in fragmented files fate: make acodec-ac3_fixed test output raw AC3 APIchanges: add missing commit hashes swscale: implement MMX, SSE2 and AVX functions for RGB32 input. ra144enc: drop pointless "encoder" from .long_name bethsoftvideo: fix palette reading. mpc7: use av_fast_padded_malloc() mpc7: simplify handling of packet sizes that are not a multiple of 4 bytes doc: decoding Forward Uncompressed is supported Fix a typo in the x86 asm version of ff_vector_clip_int32() pcmenc: Do not set avpkt->size. ff_alloc_packet: modify the size of the packet to match the requested size Conflicts: doc/APIchanges libavcodec/libx264.c libavcodec/mpc7.c libavformat/isom.h libswscale/Makefile libswscale/bfin/yuv2rgb_bfin.c tests/ref/fate/bethsoft-vid tests/ref/seek/ac3_ac3 Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mpc7.c')
-rw-r--r--libavcodec/mpc7.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/libavcodec/mpc7.c b/libavcodec/mpc7.c
index c60a621c65..5693c4ddb2 100644
--- a/libavcodec/mpc7.c
+++ b/libavcodec/mpc7.c
@@ -200,34 +200,46 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
const uint8_t *buf = avpkt->data;
- int buf_size = avpkt->size;
+ int buf_size;
MPCContext *c = avctx->priv_data;
GetBitContext gb;
int i, ch;
int mb = -1;
Band *bands = c->bands;
- int off, ret;
+ int off, ret, last_frame, skip;
int bits_used, bits_avail;
memset(bands, 0, sizeof(*bands) * (c->maxbands + 1));
- if(buf_size <= 4){
- av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size);
- return AVERROR(EINVAL);
+
+ buf_size = avpkt->size & ~3;
+ if (buf_size <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "packet size is too small (%i bytes)\n",
+ avpkt->size);
+ return AVERROR_INVALIDDATA;
+ }
+ if (buf_size != avpkt->size) {
+ av_log(avctx, AV_LOG_WARNING, "packet size is not a multiple of 4. "
+ "extra bytes at the end will be skipped.\n");
}
+ skip = buf[0];
+ last_frame = buf[1];
+ buf += 4;
+ buf_size -= 4;
+
/* get output buffer */
- c->frame.nb_samples = buf[1] ? c->lastframelen : MPC_FRAME_SIZE;
+ c->frame.nb_samples = last_frame ? c->lastframelen : MPC_FRAME_SIZE;
if ((ret = avctx->get_buffer(avctx, &c->frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
- av_fast_padded_malloc(&c->buffer, &c->buffer_size, FFALIGN(buf_size - 1, 4));
- if (!c->buffer)
+ av_fast_padded_malloc(&c->bits, &c->buf_size, buf_size);
+ if (!c->bits)
return AVERROR(ENOMEM);
- c->dsp.bswap_buf((uint32_t*)c->buffer, (const uint32_t*)(buf + 4), (buf_size - 4) >> 2);
- init_get_bits(&gb, c->buffer, (buf_size - 4)* 8);
- skip_bits_long(&gb, buf[0]);
+ c->dsp.bswap_buf((uint32_t *)c->bits, (const uint32_t *)buf, buf_size >> 2);
+ init_get_bits(&gb, c->bits, buf_size * 8);
+ skip_bits_long(&gb, skip);
/* read subband indexes */
for(i = 0; i <= c->maxbands; i++){
@@ -284,21 +296,21 @@ static int mpc7_decode_frame(AVCodecContext * avctx, void *data,
ff_mpc_dequantize_and_synth(c, mb, c->frame.data[0], 2);
bits_used = get_bits_count(&gb);
- bits_avail = (buf_size - 4) * 8;
- if(!buf[1] && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))){
+ bits_avail = buf_size * 8;
+ if (!last_frame && ((bits_avail < bits_used) || (bits_used + 32 <= bits_avail))) {
av_log(NULL,0, "Error decoding frame: used %i of %i bits\n", bits_used, bits_avail);
return -1;
}
if(c->frames_to_skip){
c->frames_to_skip--;
*got_frame_ptr = 0;
- return buf_size;
+ return avpkt->size;
}
*got_frame_ptr = 1;
*(AVFrame *)data = c->frame;
- return buf_size;
+ return avpkt->size;
}
static void mpc7_decode_flush(AVCodecContext *avctx)
@@ -312,8 +324,8 @@ static void mpc7_decode_flush(AVCodecContext *avctx)
static av_cold int mpc7_decode_close(AVCodecContext *avctx)
{
MPCContext *c = avctx->priv_data;
- av_freep(&c->buffer);
- c->buffer_size = 0;
+ av_freep(&c->bits);
+ c->buf_size = 0;
return 0;
}