]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - wmadec_filter.c
Don't try to init the decoder if less than WMA_FRAME_SKIP bytes are available.
[paraslash.git] / wmadec_filter.c
index e39dc7f04bfaf3be53ed2ebc836561653cc4a1a1..35e2703c1f796c390ce8386d764adb4a9395bff5 100644 (file)
@@ -822,49 +822,50 @@ static int wma_decode_block(struct private_wmadec_data *pwd)
 
        /* parse spectral coefficients : just RLE encoding */
        for (ch = 0; ch < pwd->ahi.channels; ch++) {
-               if (pwd->channel_coded[ch]) {
-                       struct vlc *coef_vlc;
-                       int level, run, sign, tindex;
-                       int16_t *ptr, *eptr;
-                       const uint16_t *level_table, *run_table;
-
-                       /* special VLC tables are used for ms stereo because
-                          there is potentially less energy there */
-                       tindex = (ch == 1 && pwd->ms_stereo);
-                       coef_vlc = &pwd->coef_vlc[tindex];
-                       run_table = pwd->run_table[tindex];
-                       level_table = pwd->level_table[tindex];
-                       /* XXX: optimize */
-                       ptr = &pwd->coefs1[ch][0];
-                       eptr = ptr + nb_coefs[ch];
-                       memset(ptr, 0, pwd->block_len * sizeof(int16_t));
-                       for (;;) {
-                               code = get_vlc(&pwd->gb, coef_vlc->table,
-                                       VLCBITS, VLCMAX);
-                               if (code < 0)
-                                       return -1;
-                               if (code == 1) /* EOB */
-                                       break;
-                               if (code == 0) { /* escape */
-                                       level = get_bits(&pwd->gb, coef_nb_bits);
-                                       /* reading block_len_bits would be better */
-                                       run = get_bits(&pwd->gb, pwd->frame_len_bits);
-                               } else { /* normal code */
-                                       run = run_table[code];
-                                       level = level_table[code];
-                               }
-                               sign = get_bit(&pwd->gb);
-                               if (!sign)
-                                       level = -level;
-                               ptr += run;
-                               if (ptr >= eptr) {
-                                       PARA_ERROR_LOG("overflow in spectral RLE, ignoring\n");
-                                       break;
-                               }
-                               *ptr++ = level;
-                               if (ptr >= eptr) /* EOB can be omitted */
-                                       break;
+               struct vlc *coef_vlc;
+               int level, run, tindex;
+               int16_t *ptr, *eptr;
+               const uint16_t *level_table, *run_table;
+
+               if (!pwd->channel_coded[ch])
+                       continue;
+               /*
+                * special VLC tables are used for ms stereo because there is
+                * potentially less energy there
+                */
+               tindex = (ch == 1 && pwd->ms_stereo);
+               coef_vlc = &pwd->coef_vlc[tindex];
+               run_table = pwd->run_table[tindex];
+               level_table = pwd->level_table[tindex];
+               /* XXX: optimize */
+               ptr = &pwd->coefs1[ch][0];
+               eptr = ptr + nb_coefs[ch];
+               memset(ptr, 0, pwd->block_len * sizeof(int16_t));
+               for (;;) {
+                       code = get_vlc(&pwd->gb, coef_vlc->table,
+                               VLCBITS, VLCMAX);
+                       if (code < 0)
+                               return -1;
+                       if (code == 1) /* EOB */
+                               break;
+                       if (code == 0) { /* escape */
+                               level = get_bits(&pwd->gb, coef_nb_bits);
+                               /* reading block_len_bits would be better */
+                               run = get_bits(&pwd->gb, pwd->frame_len_bits);
+                       } else { /* normal code */
+                               run = run_table[code];
+                               level = level_table[code];
+                       }
+                       if (!get_bit(&pwd->gb))
+                               level = -level;
+                       ptr += run;
+                       if (ptr >= eptr) {
+                               PARA_ERROR_LOG("overflow in spectral RLE, ignoring\n");
+                               break;
                        }
+                       *ptr++ = level;
+                       if (ptr >= eptr) /* EOB can be omitted */
+                               break;
                }
        }
 
@@ -1249,6 +1250,8 @@ static ssize_t wmadec_convert(char *inbuffer, size_t len,
 
        if (out_size < 128 * 1024)
                return 0;
+       if (len <= WMA_FRAME_SKIP)
+               return 0;
        if (!pwd) {
                ret = wma_decode_init(inbuffer, len, &pwd);
                if (ret <= 0)