diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-24 20:13:56 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-10-28 12:02:24 -0400 |
commit | 813907d42483279e767fc84f2d02aa088197a22d (patch) | |
tree | 2c31d02e7b993883791cbf9116db6a7e9e26aab4 /libavcodec | |
parent | d0640765708405215e13c88a0c48d4231ec646ab (diff) | |
download | ffmpeg-813907d42483279e767fc84f2d02aa088197a22d.tar.gz |
wmavoice: move output buffer size check to synth_superframe().
this allows for checking against the actual output size instead of max size.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/wmavoice.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c index d20fd69822..61258ba1ce 100644 --- a/libavcodec/wmavoice.c +++ b/libavcodec/wmavoice.c @@ -1730,7 +1730,7 @@ static int synth_superframe(AVCodecContext *ctx, { WMAVoiceContext *s = ctx->priv_data; GetBitContext *gb = &s->gb, s_gb; - int n, res, n_samples = 480; + int n, res, out_size, n_samples = 480; double lsps[MAX_FRAMES][MAX_LSPS]; const double *mean_lsf = s->lsps == 16 ? wmavoice_mean_lsf16[s->lsp_def_mode] : wmavoice_mean_lsf10[s->lsp_def_mode]; @@ -1792,6 +1792,14 @@ static int synth_superframe(AVCodecContext *ctx, stabilize_lsps(lsps[n], s->lsps); } + out_size = n_samples * av_get_bytes_per_sample(ctx->sample_fmt); + if (*data_size < out_size) { + av_log(ctx, AV_LOG_ERROR, + "Output buffer too small (%d given - %zu needed)\n", + *data_size, out_size); + return -1; + } + /* Parse frames, optionally preceeded by per-frame (independent) LSPs. */ for (n = 0; n < 3; n++) { if (!s->has_residual_lsps) { @@ -1826,7 +1834,7 @@ static int synth_superframe(AVCodecContext *ctx, } /* Specify nr. of output samples */ - *data_size = n_samples * sizeof(float); + *data_size = out_size; /* Update history */ memcpy(s->prev_lsps, lsps[2], @@ -1920,13 +1928,6 @@ static int wmavoice_decode_packet(AVCodecContext *ctx, void *data, GetBitContext *gb = &s->gb; int size, res, pos; - if (*data_size < 480 * sizeof(float)) { - av_log(ctx, AV_LOG_ERROR, - "Output buffer too small (%d given - %zu needed)\n", - *data_size, 480 * sizeof(float)); - return -1; - } - /* Packets are sometimes a multiple of ctx->block_align, with a packet * header at each ctx->block_align bytes. However, Libav's ASF demuxer * feeds us ASF packets, which may concatenate multiple "codec" packets |