diff options
Diffstat (limited to 'apps/codecs/demac/libdemac/predictor.c')
-rw-r--r-- | apps/codecs/demac/libdemac/predictor.c | 137 |
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; |