From 749779fab22f802e41472a31db5a84b9b6314996 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Thu, 12 Nov 2009 22:08:09 +0100 Subject: [PATCH] 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. --- wmadec_filter.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) 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) -- 2.39.2