aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-09-24 20:11:34 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2011-10-28 12:02:24 -0400
commitd0640765708405215e13c88a0c48d4231ec646ab (patch)
tree9743658a4c97575dbd0cbbc61d9a867611725c1d /libavcodec
parent1db6437f6ce88be241981b78f776b14404bb14fe (diff)
downloadffmpeg-d0640765708405215e13c88a0c48d4231ec646ab.tar.gz
wmavoice: only set data_size to 0 when necessary
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/wmavoice.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c
index 2096d69870..d20fd69822 100644
--- a/libavcodec/wmavoice.c
+++ b/libavcodec/wmavoice.c
@@ -1748,7 +1748,10 @@ static int synth_superframe(AVCodecContext *ctx,
s->sframe_cache_size = 0;
}
- if ((res = check_bits_for_superframe(gb, s)) == 1) return 1;
+ if ((res = check_bits_for_superframe(gb, s)) == 1) {
+ *data_size = 0;
+ return 1;
+ }
/* First bit is speech/music bit, it differentiates between WMAVoice
* speech samples (the actual codec) and WMAVoice music samples, which
@@ -1808,8 +1811,10 @@ static int synth_superframe(AVCodecContext *ctx,
&samples[n * MAX_FRAMESIZE],
lsps[n], n == 0 ? s->prev_lsps : lsps[n - 1],
&excitation[s->history_nsamples + n * MAX_FRAMESIZE],
- &synth[s->lsps + n * MAX_FRAMESIZE])))
+ &synth[s->lsps + n * MAX_FRAMESIZE]))) {
+ *data_size = 0;
return res;
+ }
}
/* Statistics? FIXME - we don't check for length, a slight overrun
@@ -1921,7 +1926,6 @@ static int wmavoice_decode_packet(AVCodecContext *ctx, void *data,
*data_size, 480 * sizeof(float));
return -1;
}
- *data_size = 0;
/* Packets are sometimes a multiple of ctx->block_align, with a packet
* header at each ctx->block_align bytes. However, Libav's ASF demuxer
@@ -1929,8 +1933,10 @@ static int wmavoice_decode_packet(AVCodecContext *ctx, void *data,
* in a single "muxer" packet, so we artificially emulate that by
* capping the packet size at ctx->block_align. */
for (size = avpkt->size; size > ctx->block_align; size -= ctx->block_align);
- if (!size)
+ if (!size) {
+ *data_size = 0;
return 0;
+ }
init_get_bits(&s->gb, avpkt->data, size << 3);
/* size == ctx->block_align is used to indicate whether we are dealing with