summaryrefslogtreecommitdiff
path: root/libavcodec/sipr.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-10-05 04:07:59 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-10-05 04:07:59 +0200
commitec1ffae0cdbcb84e0d3474b41a51fe36b93e1a76 (patch)
tree8d82b0732c235ff3606e078c4ad4285bd60c44d7 /libavcodec/sipr.c
parentf7da257a897684415c23a472b068febade7c2aca (diff)
parentdd376b1a1235fdf65e8d1ce7b7874915011c4798 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: qcelpdec: cosmetics: do not add line break before opening bracket in 'for', 'while', 'if/else', and 'switch' statements. qcelp: check output buffer size before decoding qcelpdec: fix the return value of qcelp_decode_frame(). sipr: fix the output data size check and only calculate it once. Synchronize various 4CCs and codec tags from FFmpeg. qdm2: check output buffer size before decoding Fix out of bound reads in the QDM2 decoder. Check for out of bound writes in the QDM2 decoder. ogg/celt: do not set sample_fmt in the demuxer Conflicts: libavcodec/avcodec.h libavcodec/qdm2.c libavformat/oggparsecelt.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/sipr.c')
-rw-r--r--libavcodec/sipr.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/libavcodec/sipr.c b/libavcodec/sipr.c
index d6179a8edf..a2e2fe4267 100644
--- a/libavcodec/sipr.c
+++ b/libavcodec/sipr.c
@@ -509,7 +509,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
GetBitContext gb;
float *data = datap;
int subframe_size = ctx->mode == MODE_16k ? L_SUBFR_16k : SUBFR_SIZE;
- int i;
+ int i, out_size;
ctx->avctx = avctx;
if (avpkt->size < (mode_par->bits_per_frame >> 3)) {
@@ -520,7 +520,11 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
*data_size = 0;
return -1;
}
- if (*data_size < subframe_size * mode_par->subframe_count * sizeof(float)) {
+
+ out_size = mode_par->frames_per_packet * subframe_size *
+ mode_par->subframe_count *
+ av_get_bytes_per_sample(avctx->sample_fmt);
+ if (*data_size < out_size) {
av_log(avctx, AV_LOG_ERROR,
"Error processing packet: output buffer (%d) too small\n",
*data_size);
@@ -542,8 +546,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
data += subframe_size * mode_par->subframe_count;
}
- *data_size = mode_par->frames_per_packet * subframe_size *
- mode_par->subframe_count * sizeof(float);
+ *data_size = out_size;
return mode_par->bits_per_frame >> 3;
}