36 #define FREEZE_INTERVAL 128
40 #define MAX_FRAME_SIZE 32768
45 #define MAX_TRELLIS 16
51 for (i = 0; i < 2; i++) {
74 int frontier = 1 << avctx->
trellis;
77 for (i = 0; i < 2; i++) {
101 "allowed. Using %d instead of %d\n", new_frame_size,
117 "allowed. Using %d instead of %d\n", new_trellis,
132 35, 72, 110, 150, 190, 233, 276, 323,
133 370, 422, 473, 530, 587, 650, 714, 786,
134 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
135 1765, 1980, 2195, 2557, 2919
139 int *xlow,
int *xhigh)
145 *xlow = xout[0] + xout[1] >> 14;
146 *xhigh = xout[0] - xout[1] >> 14;
157 int diff = av_clip_int16(xhigh - state->s_predictor);
158 int pred = 141 * state->scale_factor >> 8;
160 return ((diff ^ (diff >> (
sizeof(diff)*8-1))) < pred) + 2*(diff >= 0);
165 int diff = av_clip_int16(xlow - state->s_predictor);
167 int limit = diff ^ (diff >> (
sizeof(
diff)*8-1));
169 limit = limit + 1 << 10;
170 if (limit >
low_quant[8] * state->scale_factor)
172 while (i < 29 && limit >
low_quant[i] * state->scale_factor)
174 return (diff < 0 ? (i < 2 ? 63 : 33) : 61) - i;
179 const int16_t *samples)
182 int frontier = 1 << trellis;
185 int pathn[2] = {0, 0}, froze = -1;
188 for (i = 0; i < 2; i++) {
190 nodes_next[i] = c->
nodep_buf[i] + frontier;
192 nodes[i][0] = c->
node_buf[i] + frontier;
193 nodes[i][0]->
ssd = 0;
194 nodes[i][0]->
path = 0;
195 nodes[i][0]->state = c->
band[i];
198 for (i = 0; i < nb_samples >> 1; i++) {
201 int heap_pos[2] = {0, 0};
203 for (j = 0; j < 2; j++) {
204 next[j] = c->
node_buf[j] + frontier*(i & 1);
205 memset(nodes_next[j], 0, frontier *
sizeof(**nodes_next));
210 for (j = 0; j < frontier && nodes[0][j]; j++) {
216 int range = j < frontier/2 ? 4 : 0;
219 int ilow =
encode_low(&cur_node->state, xlow);
221 for (k = ilow - range; k <= ilow + range && k <= 63; k += 4) {
222 int decoded, dec_diff, pos;
229 decoded = av_clip_intp2((cur_node->state.scale_factor *
231 + cur_node->state.s_predictor, 14);
232 dec_diff = xlow - decoded;
234 #define STORE_NODE(index, UPDATE, VALUE)\
235 ssd = cur_node->ssd + dec_diff*dec_diff;\
238 if (ssd < cur_node->ssd)\
240 if (heap_pos[index] < frontier) {\
241 pos = heap_pos[index]++;\
242 av_assert2(pathn[index] < FREEZE_INTERVAL * frontier);\
243 node = nodes_next[index][pos] = next[index]++;\
244 node->path = pathn[index]++;\
248 pos = (frontier>>1) + (heap_pos[index] & ((frontier>>1) - 1));\
249 if (ssd >= nodes_next[index][pos]->ssd)\
252 node = nodes_next[index][pos];\
255 node->state = cur_node->state;\
257 c->paths[index][node->path].value = VALUE;\
258 c->paths[index][node->path].prev = cur_node->path;\
262 int parent = (pos - 1) >> 1;\
263 if (nodes_next[index][parent]->ssd <= ssd)\
265 FFSWAP(struct TrellisNode*, nodes_next[index][parent],\
266 nodes_next[index][pos]);\
273 for (j = 0; j < frontier && nodes[1][j]; j++) {
281 for (ihigh = 0; ihigh < 4; ihigh++) {
282 int dhigh, decoded, dec_diff, pos;
286 dhigh = cur_node->state.scale_factor *
288 decoded = av_clip_intp2(dhigh + cur_node->state.s_predictor, 14);
289 dec_diff = xhigh - decoded;
295 for (j = 0; j < 2; j++) {
298 if (nodes[j][0]->
ssd > (1 << 16)) {
299 for (k = 1; k < frontier && nodes[j][k]; k++)
300 nodes[j][k]->
ssd -= nodes[j][0]->
ssd;
301 nodes[j][0]->ssd = 0;
306 p[0] = &c->
paths[0][nodes[0][0]->path];
307 p[1] = &c->
paths[1][nodes[1][0]->path];
308 for (j = i; j > froze; j--) {
309 dst[j] = p[1]->value << 6 | p[0]->value;
314 pathn[0] = pathn[1] = 0;
315 memset(nodes[0] + 1, 0, (frontier - 1)*
sizeof(**nodes));
316 memset(nodes[1] + 1, 0, (frontier - 1)*
sizeof(**nodes));
322 for (j = i; j > froze; j--) {
323 dst[j] = p[1]->value << 6 | p[0]->value;
327 c->
band[0] = nodes[0][0]->state;
328 c->
band[1] = nodes[1][0]->state;
332 const int16_t *samples)
334 int xlow, xhigh, ilow, ihigh;
341 *dst = ihigh << 6 | ilow;
346 const int16_t *samples)
349 for (i = 0; i < nb_samples; i += 2)
357 const int16_t *samples = (
const int16_t *)frame->
data[0];
358 int nb_samples, out_size,
ret;
372 if (nb_samples < frame->nb_samples) {
373 int16_t last_samples[2] = { samples[nb_samples], samples[nb_samples] };