36 #define FREEZE_INTERVAL 128
40 #define MAX_FRAME_SIZE 32768
45 #define MAX_TRELLIS 16
51 for (i = 0; i < 2; i++) {
56 #if FF_API_OLD_ENCODE_AUDIO
77 int frontier = 1 << avctx->
trellis;
80 for (i = 0; i < 2; i++) {
104 "allowed. Using %d instead of %d\n", new_frame_size,
120 "allowed. Using %d instead of %d\n", new_trellis,
126 #if FF_API_OLD_ENCODE_AUDIO
141 35, 72, 110, 150, 190, 233, 276, 323,
142 370, 422, 473, 530, 587, 650, 714, 786,
143 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
144 1765, 1980, 2195, 2557, 2919
148 int *xlow,
int *xhigh)
154 *xlow = xout1 + xout2 >> 14;
155 *xhigh = xout1 - xout2 >> 14;
166 int diff = av_clip_int16(xhigh - state->s_predictor);
167 int pred = 141 * state->scale_factor >> 8;
169 return ((diff ^ (diff >> (
sizeof(diff)*8-1))) < pred) + 2*(diff >= 0);
174 int diff = av_clip_int16(xlow - state->s_predictor);
176 int limit = diff ^ (diff >> (
sizeof(
diff)*8-1));
178 limit = limit + 1 << 10;
179 if (limit >
low_quant[8] * state->scale_factor)
181 while (i < 29 && limit >
low_quant[i] * state->scale_factor)
183 return (diff < 0 ? (i < 2 ? 63 : 33) : 61) - i;
191 int frontier = 1 << trellis;
194 int pathn[2] = {0, 0}, froze = -1;
197 for (i = 0; i < 2; i++) {
199 nodes_next[i] = c->
nodep_buf[i] + frontier;
201 nodes[i][0] = c->
node_buf[i] + frontier;
202 nodes[i][0]->
ssd = 0;
203 nodes[i][0]->
path = 0;
204 nodes[i][0]->state = c->
band[i];
207 for (i = 0; i < nb_samples >> 1; i++) {
210 int heap_pos[2] = {0, 0};
212 for (j = 0; j < 2; j++) {
213 next[j] = c->
node_buf[j] + frontier*(i & 1);
214 memset(nodes_next[j], 0, frontier *
sizeof(**nodes_next));
219 for (j = 0; j < frontier && nodes[0][j]; j++) {
225 int range = j < frontier/2 ? 4 : 0;
228 int ilow =
encode_low(&cur_node->state, xlow);
230 for (k = ilow - range; k <= ilow + range && k <= 63; k += 4) {
231 int decoded, dec_diff, pos;
238 decoded = av_clip((cur_node->state.scale_factor *
240 + cur_node->state.s_predictor, -16384, 16383);
241 dec_diff = xlow - decoded;
243 #define STORE_NODE(index, UPDATE, VALUE)\
244 ssd = cur_node->ssd + dec_diff*dec_diff;\
247 if (ssd < cur_node->ssd)\
249 if (heap_pos[index] < frontier) {\
250 pos = heap_pos[index]++;\
251 av_assert2(pathn[index] < FREEZE_INTERVAL * frontier);\
252 node = nodes_next[index][pos] = next[index]++;\
253 node->path = pathn[index]++;\
257 pos = (frontier>>1) + (heap_pos[index] & ((frontier>>1) - 1));\
258 if (ssd >= nodes_next[index][pos]->ssd)\
261 node = nodes_next[index][pos];\
264 node->state = cur_node->state;\
266 c->paths[index][node->path].value = VALUE;\
267 c->paths[index][node->path].prev = cur_node->path;\
271 int parent = (pos - 1) >> 1;\
272 if (nodes_next[index][parent]->ssd <= ssd)\
274 FFSWAP(struct TrellisNode*, nodes_next[index][parent],\
275 nodes_next[index][pos]);\
282 for (j = 0; j < frontier && nodes[1][j]; j++) {
290 for (ihigh = 0; ihigh < 4; ihigh++) {
291 int dhigh, decoded, dec_diff, pos;
295 dhigh = cur_node->state.scale_factor *
297 decoded = av_clip(dhigh + cur_node->state.s_predictor,
299 dec_diff = xhigh - decoded;
305 for (j = 0; j < 2; j++) {
308 if (nodes[j][0]->
ssd > (1 << 16)) {
309 for (k = 1; k < frontier && nodes[j][k]; k++)
310 nodes[j][k]->
ssd -= nodes[j][0]->
ssd;
311 nodes[j][0]->ssd = 0;
316 p[0] = &c->
paths[0][nodes[0][0]->path];
317 p[1] = &c->
paths[1][nodes[1][0]->path];
318 for (j = i; j > froze; j--) {
319 dst[j] = p[1]->value << 6 | p[0]->value;
324 pathn[0] = pathn[1] = 0;
325 memset(nodes[0] + 1, 0, (frontier - 1)*
sizeof(**nodes));
326 memset(nodes[1] + 1, 0, (frontier - 1)*
sizeof(**nodes));
332 for (j = i; j > froze; j--) {
333 dst[j] = p[1]->value << 6 | p[0]->value;
337 c->
band[0] = nodes[0][0]->state;
338 c->
band[1] = nodes[1][0]->state;
344 int xlow, xhigh, ilow, ihigh;
351 *dst = ihigh << 6 | ilow;
367 const int16_t *samples = (
const int16_t *)frame->
data[0];
368 int nb_samples, out_size, ret;
382 if (nb_samples < frame->nb_samples) {