35 #define FREEZE_INTERVAL 128
39 #define MAX_FRAME_SIZE 32768
44 #define MAX_TRELLIS 16
50 for (i = 0; i < 2; i++) {
73 int frontier = 1 << avctx->
trellis;
76 for (i = 0; i < 2; i++) {
100 "allowed. Using %d instead of %d\n", new_frame_size,
116 "allowed. Using %d instead of %d\n", new_trellis,
129 35, 72, 110, 150, 190, 233, 276, 323,
130 370, 422, 473, 530, 587, 650, 714, 786,
131 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
132 1765, 1980, 2195, 2557, 2919
136 int *xlow,
int *xhigh)
142 *xlow = xout1 + xout2 >> 14;
143 *xhigh = xout1 - xout2 >> 14;
154 int diff = av_clip_int16(xhigh - state->s_predictor);
155 int pred = 141 * state->scale_factor >> 8;
157 return ((diff ^ (diff >> (
sizeof(diff)*8-1))) < pred) + 2*(diff >= 0);
162 int diff = av_clip_int16(xlow - state->s_predictor);
164 int limit = diff ^ (diff >> (
sizeof(diff)*8-1));
166 limit = limit + 1 << 10;
167 if (limit >
low_quant[8] * state->scale_factor)
169 while (i < 29 && limit >
low_quant[i] * state->scale_factor)
171 return (diff < 0 ? (i < 2 ? 63 : 33) : 61) - i;
179 int frontier = 1 << trellis;
182 int pathn[2] = {0, 0}, froze = -1;
185 for (i = 0; i < 2; i++) {
187 nodes_next[i] = c->
nodep_buf[i] + frontier;
189 nodes[i][0] = c->
node_buf[i] + frontier;
190 nodes[i][0]->
ssd = 0;
191 nodes[i][0]->
path = 0;
192 nodes[i][0]->state = c->
band[i];
195 for (i = 0; i < nb_samples >> 1; i++) {
198 int heap_pos[2] = {0, 0};
200 for (j = 0; j < 2; j++) {
201 next[j] = c->
node_buf[j] + frontier*(i & 1);
202 memset(nodes_next[j], 0, frontier *
sizeof(**nodes_next));
207 for (j = 0; j < frontier && nodes[0][j]; j++) {
213 int range = j < frontier/2 ? 4 : 0;
216 int ilow =
encode_low(&cur_node->state, xlow);
218 for (k = ilow - range; k <= ilow + range && k <= 63; k += 4) {
219 int decoded, dec_diff, pos;
226 decoded = av_clip((cur_node->state.scale_factor *
228 + cur_node->state.s_predictor, -16384, 16383);
229 dec_diff = xlow - decoded;
231 #define STORE_NODE(index, UPDATE, VALUE)\
232 ssd = cur_node->ssd + dec_diff*dec_diff;\
235 if (ssd < cur_node->ssd)\
237 if (heap_pos[index] < frontier) {\
238 pos = heap_pos[index]++;\
239 assert(pathn[index] < FREEZE_INTERVAL * frontier);\
240 node = nodes_next[index][pos] = next[index]++;\
241 node->path = pathn[index]++;\
245 pos = (frontier>>1) + (heap_pos[index] & ((frontier>>1) - 1));\
246 if (ssd >= nodes_next[index][pos]->ssd)\
249 node = nodes_next[index][pos];\
252 node->state = cur_node->state;\
254 c->paths[index][node->path].value = VALUE;\
255 c->paths[index][node->path].prev = cur_node->path;\
259 int parent = (pos - 1) >> 1;\
260 if (nodes_next[index][parent]->ssd <= ssd)\
262 FFSWAP(struct TrellisNode*, nodes_next[index][parent],\
263 nodes_next[index][pos]);\
270 for (j = 0; j < frontier && nodes[1][j]; j++) {
278 for (ihigh = 0; ihigh < 4; ihigh++) {
279 int dhigh, decoded, dec_diff, pos;
283 dhigh = cur_node->state.scale_factor *
285 decoded = av_clip(dhigh + cur_node->state.s_predictor,
287 dec_diff = xhigh - decoded;
293 for (j = 0; j < 2; j++) {
296 if (nodes[j][0]->
ssd > (1 << 16)) {
297 for (k = 1; k < frontier && nodes[j][k]; k++)
298 nodes[j][k]->
ssd -= nodes[j][0]->
ssd;
299 nodes[j][0]->ssd = 0;
304 p[0] = &c->
paths[0][nodes[0][0]->path];
305 p[1] = &c->
paths[1][nodes[1][0]->path];
306 for (j = i; j > froze; j--) {
307 dst[j] = p[1]->value << 6 | p[0]->value;
312 pathn[0] = pathn[1] = 0;
313 memset(nodes[0] + 1, 0, (frontier - 1)*
sizeof(**nodes));
314 memset(nodes[1] + 1, 0, (frontier - 1)*
sizeof(**nodes));
320 for (j = i; j > froze; j--) {
321 dst[j] = p[1]->value << 6 | p[0]->value;
325 c->
band[0] = nodes[0][0]->state;
326 c->
band[1] = nodes[1][0]->state;
332 int xlow, xhigh, ilow, ihigh;
339 *dst = ihigh << 6 | ilow;
347 for (i = 0; i < nb_samples; i += 2)
352 const AVFrame *frame,
int *got_packet_ptr)
355 const int16_t *samples = (
const int16_t *)frame->
data[0];
356 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] };