diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-12 09:59:13 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-26 16:23:14 -0400 |
commit | 6896aa7a382fdabdb81330f21208aaeb04e8cef7 (patch) | |
tree | 09434d1e7b0210206c9b95229cd675e77d451709 /libavcodec | |
parent | 6a818cb3ff2056d43361e5fd09e318cd2ca2a7b4 (diff) | |
download | ffmpeg-6896aa7a382fdabdb81330f21208aaeb04e8cef7.tar.gz |
ws_snd: use samples pointer for loop termination instead of a separate
iterator variable.
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/ws-snd1.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/libavcodec/ws-snd1.c b/libavcodec/ws-snd1.c index a9f303add1..3842ec9b32 100644 --- a/libavcodec/ws-snd1.c +++ b/libavcodec/ws-snd1.c @@ -62,6 +62,7 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, int sample = 128; int i; uint8_t *samples = data; + uint8_t *samples_end; if (!buf_size) return 0; @@ -83,6 +84,7 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, av_log(avctx, AV_LOG_ERROR, "Frame data is larger than input buffer\n"); return -1; } + samples_end = samples + out_size; if (in_size == out_size) { for (i = 0; i < out_size; i++) @@ -91,24 +93,22 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, return buf_size; } - while (out_size > 0 && buf - avpkt->data < buf_size) { + while (samples < samples_end && buf - avpkt->data < buf_size) { int code, smp, size; uint8_t count; code = (*buf) >> 6; count = (*buf) & 0x3F; buf++; - /* make sure we don't write more than out_size samples */ + /* make sure we don't write past the output buffer */ switch (code) { case 0: smp = 4; break; case 1: smp = 2; break; case 2: smp = (count & 0x20) ? 1 : count + 1; break; default: smp = count + 1; break; } - if (out_size < smp) { - out_size = 0; + if (samples_end - samples < smp) break; - } /* make sure we don't read past the input buffer */ size = ((code == 2 && (count & 0x20)) || code == 3) ? 0 : count + 1; @@ -131,7 +131,6 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, sample += ws_adpcm_2bit[(code >> 6) & 0x3]; sample = av_clip_uint8(sample); *samples++ = sample; - out_size -= 4; } break; case 1: /* ADPCM 4-bit */ @@ -143,7 +142,6 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, sample += ws_adpcm_4bit[code >> 4]; sample = av_clip_uint8(sample); *samples++ = sample; - out_size -= 2; } break; case 2: /* no compression */ @@ -154,11 +152,9 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, sample += t >> 3; sample = av_clip_uint8(sample); *samples++ = sample; - out_size--; } else { /* copy */ for (count++; count > 0; count--) { *samples++ = *buf++; - out_size--; } sample = buf[-1]; } @@ -166,7 +162,6 @@ static int ws_snd_decode_frame(AVCodecContext *avctx, default: /* run */ for(count++; count > 0; count--) { *samples++ = sample; - out_size--; } } } |