ws_snd: use samples pointer for loop termination instead of a separate
authorJustin Ruggles <justin.ruggles@gmail.com>
Mon, 12 Sep 2011 13:59:13 +0000 (09:59 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Mon, 26 Sep 2011 20:23:14 +0000 (16:23 -0400)
iterator variable.

libavcodec/ws-snd1.c

index a9f303a..3842ec9 100644 (file)
@@ -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--;
             }
         }
     }