]> git.sesse.net Git - ffmpeg/commitdiff
cleanup IMA-ADPCM WAV decoder
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 2 Mar 2006 13:55:49 +0000 (13:55 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 2 Mar 2006 13:55:49 +0000 (13:55 +0000)
Originally committed as revision 5095 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/adpcm.c

index de66daf7dbe801c410fa79cb084e4f381fef16c2..86abbf799f9a48410e4b5b99b423d1cb3ee2d789 100644 (file)
@@ -694,8 +694,10 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
 
         cs->step_index = (*src++) & 0x7F;
 
-        if (cs->step_index > 88) av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
-        if (cs->step_index > 88) cs->step_index = 88;
+        if (cs->step_index > 88){
+            av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
+            cs->step_index = 88;
+        }
 
         cs->step = step_table[cs->step_index];
 
@@ -721,35 +723,32 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
         if (avctx->block_align != 0 && buf_size > avctx->block_align)
             buf_size = avctx->block_align;
 
+//        samples_per_block= (block_align-4*chanels)*8 / (bits_per_sample * chanels) + 1;
+
         for(i=0; i<avctx->channels; i++){
             cs = &(c->status[i]);
-            cs->predictor = *src++;
-            cs->predictor |= (*src++) << 8;
-            if(cs->predictor & 0x8000)
-                cs->predictor -= 0x10000;
-            CLAMP_TO_SHORT(cs->predictor);
+            cs->predictor = (int16_t)(src[0] + (src[1]<<8));
+            src+=2;
 
         // XXX: is this correct ??: *samples++ = cs->predictor;
 
             cs->step_index = *src++;
-            if (cs->step_index < 0) cs->step_index = 0;
-            if (cs->step_index > 88) cs->step_index = 88;
-            if (*src++) av_log(avctx, AV_LOG_ERROR, "unused byte should be null !!\n"); /* unused */
+            if (cs->step_index > 88){
+                av_log(avctx, AV_LOG_ERROR, "ERROR: step_index = %i\n", cs->step_index);
+                cs->step_index = 88;
+            }
+            if (*src++) av_log(avctx, AV_LOG_ERROR, "unused byte should be null but is %d!!\n", src[-1]); /* unused */
         }
 
-        for(m=4; src < (buf + buf_size);) {
-            *samples++ = adpcm_ima_expand_nibble(&c->status[0], src[0] & 0x0F, 3);
-            if (st)
-                *samples++ = adpcm_ima_expand_nibble(&c->status[1], src[4] & 0x0F, 3);
-            *samples++ = adpcm_ima_expand_nibble(&c->status[0], (src[0] >> 4) & 0x0F, 3);
-            if (st) {
-                *samples++ = adpcm_ima_expand_nibble(&c->status[1], (src[4] >> 4) & 0x0F, 3);
-                if (!--m) {
-                    m=4;
-                    src+=4;
-                }
+        while(src < buf + buf_size){
+            for(m=0; m<4; m++){
+                for(i=0; i<=st; i++)
+                    *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] & 0x0F, 3);
+                for(i=0; i<=st; i++)
+                    *samples++ = adpcm_ima_expand_nibble(&c->status[i], src[4*i] >> 4  , 3);
+                src++;
             }
-            src++;
+            src += 4*st;
         }
         break;
     case CODEC_ID_ADPCM_4XM: