[FFmpeg-cvslog] ws_snd: use samples pointer for loop termination instead of a separate

Justin Ruggles git at videolan.org
Tue Sep 27 02:25:30 CEST 2011


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Mon Sep 12 09:59:13 2011 -0400| [6896aa7a382fdabdb81330f21208aaeb04e8cef7] | committer: Justin Ruggles

ws_snd: use samples pointer for loop termination instead of a separate
iterator variable.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6896aa7a382fdabdb81330f21208aaeb04e8cef7
---

 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 a9f303a..3842ec9 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--;
             }
         }
     }



More information about the ffmpeg-cvslog mailing list