From cb8f366af6d80de6815e3375e4d17aee19366607 Mon Sep 17 00:00:00 2001 From: "Timothy B. Terriberry" <tterribe@xiph.org> Date: Tue, 1 Feb 2011 12:32:34 -0800 Subject: [PATCH] Don't allow empty eBands. Currently compute_ebands()'s attempts to round bands to even sizes and enforce size constraints on consecutive bands can leave some bands entirely empty (e.g., Fs=8000, frame_size=64, i=11). This adds a simple post-processing loop to remove such bands. --- libcelt/modes.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libcelt/modes.c b/libcelt/modes.c index 67326b6b0..c5302b7aa 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -133,7 +133,7 @@ static const celt_int16 bark_freq[BARK_BANDS+1] = { static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *nbEBands) { celt_int16 *eBands; - int i, lin, low, high, nBark, offset=0; + int i, j, lin, low, high, nBark, offset=0; /* All modes that have 2.5 ms short blocks use the same definition */ if (Fs == 400*(celt_int32)frame_size) @@ -190,6 +190,12 @@ static celt_int16 *compute_ebands(celt_int32 Fs, int frame_size, int res, int *n eBands[i] -= (2*eBands[i]-eBands[i-1]-eBands[i+1])/2; } } + /* Remove any empty bands. */ + for (i=j=0;i<*nbEBands;i++) + if(eBands[i+1]>eBands[j]) + eBands[++j]=eBands[i+1]; + *nbEBands=j; + /*for (i=0;i<=*nbEBands+1;i++) printf ("%d ", eBands[i]); printf ("\n"); -- GitLab