From: Andre Noll Date: Thu, 12 Nov 2009 21:08:09 +0000 (+0100) Subject: wma: Decode as much as possible. X-Git-Tag: v0.4.1~26 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=749779fab22f802e41472a31db5a84b9b6314996 wma: Decode as much as possible. Currently, we only decode at most one superframe during each scheduler run. This patch makes the wma decoder as much as what fits into the output buffer. --- diff --git a/wmadec_filter.c b/wmadec_filter.c index 802cb825..9cb964fc 100644 --- a/wmadec_filter.c +++ b/wmadec_filter.c @@ -1187,11 +1187,9 @@ fail: static ssize_t wmadec_convert(char *inbuffer, size_t len, struct filter_node *fn) { - int ret, out_size = fn->bufsize - fn->loaded; + int ret, converted = 0; struct private_wmadec_data *pwd = fn->private_data; - if (out_size < 128 * 1024) - return 0; if (len <= WMA_FRAME_SKIP) return 0; if (!pwd) { @@ -1203,16 +1201,22 @@ static ssize_t wmadec_convert(char *inbuffer, size_t len, fn->fc->samplerate = pwd->ahi.sample_rate; return pwd->ahi.header_len; } - /* skip 31 bytes */ - if (len <= WMA_FRAME_SKIP + pwd->ahi.block_align) - return 0; - ret = wma_decode_superframe(pwd, fn->buf + fn->loaded, - &out_size, (uint8_t *)inbuffer + WMA_FRAME_SKIP, - len - WMA_FRAME_SKIP); - if (ret < 0) - return ret; - fn->loaded += out_size; - return ret + WMA_FRAME_SKIP; + for (;;) { + int out_size; + if (converted + WMA_FRAME_SKIP + pwd->ahi.block_align > len) + break; + out_size = fn->bufsize - fn->loaded; + if (out_size < 128 * 1024) + break; + ret = wma_decode_superframe(pwd, fn->buf + fn->loaded, + &out_size, (uint8_t *)inbuffer + converted + WMA_FRAME_SKIP, + len - WMA_FRAME_SKIP); + if (ret < 0) + return ret; + fn->loaded += out_size; + converted += ret + WMA_FRAME_SKIP; + } + return converted; } static void wmadec_close(struct filter_node *fn)