changeset 27238:7aa646bb7589

Simplify and clamp coefficient index for MS ADPCM
author reimar
date Sat, 12 Jul 2008 10:08:40 +0000
parents 6a283385441b
children 999b3eb48e78
files libmpcodecs/ad_msadpcm.c
diffstat 1 files changed, 17 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/ad_msadpcm.c	Sat Jul 12 09:23:14 2008 +0000
+++ b/libmpcodecs/ad_msadpcm.c	Sat Jul 12 10:08:40 2008 +0000
@@ -91,10 +91,21 @@
   return CONTROL_UNKNOWN;
 }
 
+static inline int check_coeff(uint8_t c) {
+  if (c > 6) {
+    mp_msg(MSGT_DECAUDIO, MSGL_WARN,
+      "MS ADPCM: coefficient (%d) out of range (should be [0..6])\n",
+      c);
+    c = 6;
+  }
+  return c;
+}
+
 static int ms_adpcm_decode_block(unsigned short *output, unsigned char *input,
   int channels, int block_size)
 {
   int current_channel = 0;
+  int coeff_idx;
   int idelta[2];
   int sample1[2];
   int sample2[2];
@@ -112,21 +123,15 @@
     return -1;
 
   // fetch the header information, in stereo if both channels are present
-  if (input[stream_ptr] > 6)
-    mp_msg(MSGT_DECAUDIO, MSGL_WARN,
-      "MS ADPCM: coefficient (%d) out of range (should be [0..6])\n",
-      input[stream_ptr]);
-  coeff1[0] = ms_adapt_coeff1[input[stream_ptr]];
-  coeff2[0] = ms_adapt_coeff2[input[stream_ptr]];
+  coeff_idx = check_coeff(input[stream_ptr]);
+  coeff1[0] = ms_adapt_coeff1[coeff_idx];
+  coeff2[0] = ms_adapt_coeff2[coeff_idx];
   stream_ptr++;
   if (channels == 2)
   {
-    if (input[stream_ptr] > 6)
-     mp_msg(MSGT_DECAUDIO, MSGL_WARN,
-       "MS ADPCM: coefficient (%d) out of range (should be [0..6])\n",
-       input[stream_ptr]);
-    coeff1[1] = ms_adapt_coeff1[input[stream_ptr]];
-    coeff2[1] = ms_adapt_coeff2[input[stream_ptr]];
+    coeff_idx = check_coeff(input[stream_ptr]);
+    coeff1[1] = ms_adapt_coeff1[coeff_idx];
+    coeff2[1] = ms_adapt_coeff2[coeff_idx];
     stream_ptr++;
   }