diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-20 15:27:44 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-10-04 16:13:20 -0400 |
commit | 1b5a189f06879338088809b3049ea7620f4e7e78 (patch) | |
tree | 0323a732394a8d9ff80f0bc5c80c1952113db67b | |
parent | 12bd8532cf09883e5d1f1ec817c18a376147deb8 (diff) | |
download | ffmpeg-1b5a189f06879338088809b3049ea7620f4e7e78.tar.gz |
sipr: fix the output data size check and only calculate it once.
-rw-r--r-- | libavcodec/sipr.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libavcodec/sipr.c b/libavcodec/sipr.c index c9fccb2d3a..f57ec4fd2a 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; } |