summaryrefslogtreecommitdiff
path: root/apps/codecs/demac/libdemac/predictor.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/demac/libdemac/predictor.c')
-rw-r--r--apps/codecs/demac/libdemac/predictor.c137
1 files changed, 73 insertions, 64 deletions
diff --git a/apps/codecs/demac/libdemac/predictor.c b/apps/codecs/demac/libdemac/predictor.c
index 1a9b48e0ca..67a17f4b5d 100644
--- a/apps/codecs/demac/libdemac/predictor.c
+++ b/apps/codecs/demac/libdemac/predictor.c
@@ -75,7 +75,7 @@ int ICODE_ATTR_DEMAC predictor_decode_stereo(struct predictor_t* p,
75{ 75{
76 int32_t predictionA, predictionB; 76 int32_t predictionA, predictionB;
77 77
78 while (count--) 78 while (LIKELY(count--))
79 { 79 {
80 /* Predictor Y */ 80 /* Predictor Y */
81 p->buf[YDELAYA] = p->YlastA; 81 p->buf[YDELAYA] = p->YlastA;
@@ -134,60 +134,66 @@ int ICODE_ATTR_DEMAC predictor_decode_stereo(struct predictor_t* p,
134 p->XlastA = *decoded1 + ((predictionA + (predictionB >> 1)) >> 10); 134 p->XlastA = *decoded1 + ((predictionA + (predictionB >> 1)) >> 10);
135 p->XfilterA = p->XlastA + ((p->XfilterA * 31) >> 5); 135 p->XfilterA = p->XlastA + ((p->XfilterA * 31) >> 5);
136 136
137 if (*decoded0 > 0) 137 if (LIKELY(*decoded0 != 0))
138 { 138 {
139 p->YcoeffsA[0] -= p->buf[YADAPTCOEFFSA]; 139 if (*decoded0 > 0)
140 p->YcoeffsA[1] -= p->buf[YADAPTCOEFFSA-1]; 140 {
141 p->YcoeffsA[2] -= p->buf[YADAPTCOEFFSA-2]; 141 p->YcoeffsA[0] -= p->buf[YADAPTCOEFFSA];
142 p->YcoeffsA[3] -= p->buf[YADAPTCOEFFSA-3]; 142 p->YcoeffsA[1] -= p->buf[YADAPTCOEFFSA-1];
143 143 p->YcoeffsA[2] -= p->buf[YADAPTCOEFFSA-2];
144 p->YcoeffsB[0] -= p->buf[YADAPTCOEFFSB]; 144 p->YcoeffsA[3] -= p->buf[YADAPTCOEFFSA-3];
145 p->YcoeffsB[1] -= p->buf[YADAPTCOEFFSB-1]; 145
146 p->YcoeffsB[2] -= p->buf[YADAPTCOEFFSB-2]; 146 p->YcoeffsB[0] -= p->buf[YADAPTCOEFFSB];
147 p->YcoeffsB[3] -= p->buf[YADAPTCOEFFSB-3]; 147 p->YcoeffsB[1] -= p->buf[YADAPTCOEFFSB-1];
148 p->YcoeffsB[4] -= p->buf[YADAPTCOEFFSB-4]; 148 p->YcoeffsB[2] -= p->buf[YADAPTCOEFFSB-2];
149 } 149 p->YcoeffsB[3] -= p->buf[YADAPTCOEFFSB-3];
150 else if (*decoded0 < 0) 150 p->YcoeffsB[4] -= p->buf[YADAPTCOEFFSB-4];
151 { 151 }
152 p->YcoeffsA[0] += p->buf[YADAPTCOEFFSA]; 152 else
153 p->YcoeffsA[1] += p->buf[YADAPTCOEFFSA-1]; 153 {
154 p->YcoeffsA[2] += p->buf[YADAPTCOEFFSA-2]; 154 p->YcoeffsA[0] += p->buf[YADAPTCOEFFSA];
155 p->YcoeffsA[3] += p->buf[YADAPTCOEFFSA-3]; 155 p->YcoeffsA[1] += p->buf[YADAPTCOEFFSA-1];
156 156 p->YcoeffsA[2] += p->buf[YADAPTCOEFFSA-2];
157 p->YcoeffsB[0] += p->buf[YADAPTCOEFFSB]; 157 p->YcoeffsA[3] += p->buf[YADAPTCOEFFSA-3];
158 p->YcoeffsB[1] += p->buf[YADAPTCOEFFSB-1]; 158
159 p->YcoeffsB[2] += p->buf[YADAPTCOEFFSB-2]; 159 p->YcoeffsB[0] += p->buf[YADAPTCOEFFSB];
160 p->YcoeffsB[3] += p->buf[YADAPTCOEFFSB-3]; 160 p->YcoeffsB[1] += p->buf[YADAPTCOEFFSB-1];
161 p->YcoeffsB[4] += p->buf[YADAPTCOEFFSB-4]; 161 p->YcoeffsB[2] += p->buf[YADAPTCOEFFSB-2];
162 p->YcoeffsB[3] += p->buf[YADAPTCOEFFSB-3];
163 p->YcoeffsB[4] += p->buf[YADAPTCOEFFSB-4];
164 }
162 } 165 }
163 166
164 *(decoded0++) = p->YfilterA; 167 *(decoded0++) = p->YfilterA;
165 168
166 if (*decoded1 > 0) 169 if (LIKELY(*decoded1 != 0))
167 {
168 p->XcoeffsA[0] -= p->buf[XADAPTCOEFFSA];
169 p->XcoeffsA[1] -= p->buf[XADAPTCOEFFSA-1];
170 p->XcoeffsA[2] -= p->buf[XADAPTCOEFFSA-2];
171 p->XcoeffsA[3] -= p->buf[XADAPTCOEFFSA-3];
172
173 p->XcoeffsB[0] -= p->buf[XADAPTCOEFFSB];
174 p->XcoeffsB[1] -= p->buf[XADAPTCOEFFSB-1];
175 p->XcoeffsB[2] -= p->buf[XADAPTCOEFFSB-2];
176 p->XcoeffsB[3] -= p->buf[XADAPTCOEFFSB-3];
177 p->XcoeffsB[4] -= p->buf[XADAPTCOEFFSB-4];
178 }
179 else if (*decoded1 < 0)
180 { 170 {
181 p->XcoeffsA[0] += p->buf[XADAPTCOEFFSA]; 171 if (*decoded1 > 0)
182 p->XcoeffsA[1] += p->buf[XADAPTCOEFFSA-1]; 172 {
183 p->XcoeffsA[2] += p->buf[XADAPTCOEFFSA-2]; 173 p->XcoeffsA[0] -= p->buf[XADAPTCOEFFSA];
184 p->XcoeffsA[3] += p->buf[XADAPTCOEFFSA-3]; 174 p->XcoeffsA[1] -= p->buf[XADAPTCOEFFSA-1];
185 175 p->XcoeffsA[2] -= p->buf[XADAPTCOEFFSA-2];
186 p->XcoeffsB[0] += p->buf[XADAPTCOEFFSB]; 176 p->XcoeffsA[3] -= p->buf[XADAPTCOEFFSA-3];
187 p->XcoeffsB[1] += p->buf[XADAPTCOEFFSB-1]; 177
188 p->XcoeffsB[2] += p->buf[XADAPTCOEFFSB-2]; 178 p->XcoeffsB[0] -= p->buf[XADAPTCOEFFSB];
189 p->XcoeffsB[3] += p->buf[XADAPTCOEFFSB-3]; 179 p->XcoeffsB[1] -= p->buf[XADAPTCOEFFSB-1];
190 p->XcoeffsB[4] += p->buf[XADAPTCOEFFSB-4]; 180 p->XcoeffsB[2] -= p->buf[XADAPTCOEFFSB-2];
181 p->XcoeffsB[3] -= p->buf[XADAPTCOEFFSB-3];
182 p->XcoeffsB[4] -= p->buf[XADAPTCOEFFSB-4];
183 }
184 else
185 {
186 p->XcoeffsA[0] += p->buf[XADAPTCOEFFSA];
187 p->XcoeffsA[1] += p->buf[XADAPTCOEFFSA-1];
188 p->XcoeffsA[2] += p->buf[XADAPTCOEFFSA-2];
189 p->XcoeffsA[3] += p->buf[XADAPTCOEFFSA-3];
190
191 p->XcoeffsB[0] += p->buf[XADAPTCOEFFSB];
192 p->XcoeffsB[1] += p->buf[XADAPTCOEFFSB-1];
193 p->XcoeffsB[2] += p->buf[XADAPTCOEFFSB-2];
194 p->XcoeffsB[3] += p->buf[XADAPTCOEFFSB-3];
195 p->XcoeffsB[4] += p->buf[XADAPTCOEFFSB-4];
196 }
191 } 197 }
192 198
193 *(decoded1++) = p->XfilterA; 199 *(decoded1++) = p->XfilterA;
@@ -196,7 +202,7 @@ int ICODE_ATTR_DEMAC predictor_decode_stereo(struct predictor_t* p,
196 p->buf++; 202 p->buf++;
197 203
198 /* Have we filled the history buffer? */ 204 /* Have we filled the history buffer? */
199 if (p->buf == p->historybuffer + PREDICTOR_HISTORY_SIZE) { 205 if (UNLIKELY(p->buf == p->historybuffer + PREDICTOR_HISTORY_SIZE)) {
200 memmove(p->historybuffer, p->buf, 206 memmove(p->historybuffer, p->buf,
201 PREDICTOR_SIZE * sizeof(int32_t)); 207 PREDICTOR_SIZE * sizeof(int32_t));
202 p->buf = p->historybuffer; 208 p->buf = p->historybuffer;
@@ -215,7 +221,7 @@ int ICODE_ATTR_DEMAC predictor_decode_mono(struct predictor_t* p,
215 221
216 currentA = p->YlastA; 222 currentA = p->YlastA;
217 223
218 while (count--) 224 while (LIKELY(count--))
219 { 225 {
220 A = *decoded0; 226 A = *decoded0;
221 227
@@ -232,25 +238,28 @@ int ICODE_ATTR_DEMAC predictor_decode_mono(struct predictor_t* p,
232 p->buf[YADAPTCOEFFSA] = SIGN(p->buf[YDELAYA]); 238 p->buf[YADAPTCOEFFSA] = SIGN(p->buf[YDELAYA]);
233 p->buf[YADAPTCOEFFSA-1] = SIGN(p->buf[YDELAYA-1]); 239 p->buf[YADAPTCOEFFSA-1] = SIGN(p->buf[YDELAYA-1]);
234 240
235 if (A > 0) 241 if (LIKELY(A != 0))
236 {
237 p->YcoeffsA[0] -= p->buf[YADAPTCOEFFSA];
238 p->YcoeffsA[1] -= p->buf[YADAPTCOEFFSA-1];
239 p->YcoeffsA[2] -= p->buf[YADAPTCOEFFSA-2];
240 p->YcoeffsA[3] -= p->buf[YADAPTCOEFFSA-3];
241 }
242 else if (A < 0)
243 { 242 {
244 p->YcoeffsA[0] += p->buf[YADAPTCOEFFSA]; 243 if (A > 0)
245 p->YcoeffsA[1] += p->buf[YADAPTCOEFFSA-1]; 244 {
246 p->YcoeffsA[2] += p->buf[YADAPTCOEFFSA-2]; 245 p->YcoeffsA[0] -= p->buf[YADAPTCOEFFSA];
247 p->YcoeffsA[3] += p->buf[YADAPTCOEFFSA-3]; 246 p->YcoeffsA[1] -= p->buf[YADAPTCOEFFSA-1];
247 p->YcoeffsA[2] -= p->buf[YADAPTCOEFFSA-2];
248 p->YcoeffsA[3] -= p->buf[YADAPTCOEFFSA-3];
249 }
250 else
251 {
252 p->YcoeffsA[0] += p->buf[YADAPTCOEFFSA];
253 p->YcoeffsA[1] += p->buf[YADAPTCOEFFSA-1];
254 p->YcoeffsA[2] += p->buf[YADAPTCOEFFSA-2];
255 p->YcoeffsA[3] += p->buf[YADAPTCOEFFSA-3];
256 }
248 } 257 }
249 258
250 p->buf++; 259 p->buf++;
251 260
252 /* Have we filled the history buffer? */ 261 /* Have we filled the history buffer? */
253 if (p->buf == p->historybuffer + PREDICTOR_HISTORY_SIZE) { 262 if (UNLIKELY(p->buf == p->historybuffer + PREDICTOR_HISTORY_SIZE)) {
254 memmove(p->historybuffer, p->buf, 263 memmove(p->historybuffer, p->buf,
255 PREDICTOR_SIZE * sizeof(int32_t)); 264 PREDICTOR_SIZE * sizeof(int32_t));
256 p->buf = p->historybuffer; 265 p->buf = p->historybuffer;