36 #define FREEZE_INTERVAL 128
40 #define MAX_FRAME_SIZE 32768
45 #define MAX_TRELLIS 16
51 for (
i = 0;
i < 2;
i++) {
64 c->band[0].scale_factor = 8;
65 c->band[1].scale_factor = 2;
66 c->prev_samples_pos = 22;
69 int frontier = 1 << avctx->
trellis;
72 for (
i = 0;
i < 2;
i++) {
76 if (!
c->paths[
i] || !
c->node_buf[
i] || !
c->nodep_buf[
i]) {
96 "allowed. Using %d instead of %d\n", new_frame_size,
112 "allowed. Using %d instead of %d\n", new_trellis,
127 35, 72, 110, 150, 190, 233, 276, 323,
128 370, 422, 473, 530, 587, 650, 714, 786,
129 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
130 1765, 1980, 2195, 2557, 2919
134 int *xlow,
int *xhigh)
137 c->prev_samples[
c->prev_samples_pos++] =
samples[0];
138 c->prev_samples[
c->prev_samples_pos++] =
samples[1];
139 c->dsp.apply_qmf(
c->prev_samples +
c->prev_samples_pos - 24, xout);
140 *xlow = xout[0] + xout[1] >> 14;
141 *xhigh = xout[0] - xout[1] >> 14;
143 memmove(
c->prev_samples,
144 c->prev_samples +
c->prev_samples_pos - 22,
145 22 *
sizeof(
c->prev_samples[0]));
146 c->prev_samples_pos = 22;
152 int diff = av_clip_int16(xhigh -
state->s_predictor);
153 int pred = 141 *
state->scale_factor >> 8;
160 int diff = av_clip_int16(xlow -
state->s_predictor);
164 limit = limit + 1 << 10;
169 return (
diff < 0 ? (
i < 2 ? 63 : 33) : 61) -
i;
177 int frontier = 1 << trellis;
180 int pathn[2] = {0, 0}, froze = -1;
183 for (
i = 0;
i < 2;
i++) {
184 nodes[
i] =
c->nodep_buf[
i];
185 nodes_next[
i] =
c->nodep_buf[
i] + frontier;
186 memset(
c->nodep_buf[
i], 0, 2 * frontier *
sizeof(*
c->nodep_buf[
i]));
187 nodes[
i][0] =
c->node_buf[
i] + frontier;
188 nodes[
i][0]->
ssd = 0;
189 nodes[
i][0]->
path = 0;
190 nodes[
i][0]->state =
c->band[
i];
193 for (
i = 0; i < nb_samples >> 1;
i++) {
196 int heap_pos[2] = {0, 0};
198 for (j = 0; j < 2; j++) {
199 next[j] =
c->node_buf[j] + frontier*(
i & 1);
200 memset(nodes_next[j], 0, frontier *
sizeof(**nodes_next));
205 for (j = 0; j < frontier && nodes[0][j]; j++) {
211 int range = j < frontier/2 ? 4 : 0;
214 int ilow =
encode_low(&cur_node->state, xlow);
216 for (k = ilow - range; k <= ilow + range && k <= 63; k += 4) {
217 int decoded, dec_diff, pos;
224 decoded = av_clip_intp2((cur_node->state.scale_factor *
226 + cur_node->state.s_predictor, 14);
227 dec_diff = xlow - decoded;
229 #define STORE_NODE(index, UPDATE, VALUE)\
230 ssd = cur_node->ssd + dec_diff*dec_diff;\
233 if (ssd < cur_node->ssd)\
235 if (heap_pos[index] < frontier) {\
236 pos = heap_pos[index]++;\
237 av_assert2(pathn[index] < FREEZE_INTERVAL * frontier);\
238 node = nodes_next[index][pos] = next[index]++;\
239 node->path = pathn[index]++;\
243 pos = (frontier>>1) + (heap_pos[index] & ((frontier>>1) - 1));\
244 if (ssd >= nodes_next[index][pos]->ssd)\
247 node = nodes_next[index][pos];\
250 node->state = cur_node->state;\
252 c->paths[index][node->path].value = VALUE;\
253 c->paths[index][node->path].prev = cur_node->path;\
257 int parent = (pos - 1) >> 1;\
258 if (nodes_next[index][parent]->ssd <= ssd)\
260 FFSWAP(struct TrellisNode*, nodes_next[index][parent],\
261 nodes_next[index][pos]);\
268 for (j = 0; j < frontier && nodes[1][j]; j++) {
276 for (ihigh = 0; ihigh < 4; ihigh++) {
277 int dhigh, decoded, dec_diff, pos;
281 dhigh = cur_node->state.scale_factor *
283 decoded = av_clip_intp2(dhigh + cur_node->state.s_predictor, 14);
284 dec_diff = xhigh - decoded;
290 for (j = 0; j < 2; j++) {
293 if (nodes[j][0]->
ssd > (1 << 16)) {
294 for (k = 1; k < frontier && nodes[j][k]; k++)
295 nodes[j][k]->
ssd -= nodes[j][0]->
ssd;
296 nodes[j][0]->ssd = 0;
301 p[0] = &
c->paths[0][nodes[0][0]->path];
302 p[1] = &
c->paths[1][nodes[1][0]->path];
303 for (j =
i; j > froze; j--) {
304 dst[j] = p[1]->value << 6 | p[0]->value;
305 p[0] = &
c->paths[0][p[0]->
prev];
306 p[1] = &
c->paths[1][p[1]->
prev];
309 pathn[0] = pathn[1] = 0;
310 memset(nodes[0] + 1, 0, (frontier - 1)*
sizeof(**nodes));
311 memset(nodes[1] + 1, 0, (frontier - 1)*
sizeof(**nodes));
315 p[0] = &
c->paths[0][nodes[0][0]->
path];
316 p[1] = &
c->paths[1][nodes[1][0]->
path];
317 for (j =
i; j > froze; j--) {
318 dst[j] = p[1]->value << 6 | p[0]->value;
319 p[0] = &
c->paths[0][p[0]->
prev];
320 p[1] = &
c->paths[1][p[1]->
prev];
322 c->band[0] = nodes[0][0]->state;
323 c->band[1] = nodes[1][0]->state;
329 int xlow, xhigh, ilow, ihigh;
336 *dst = ihigh << 6 | ilow;
344 for (
i = 0;
i < nb_samples;
i += 2)
352 const int16_t *
samples = (
const int16_t *)
frame->data[0];
359 nb_samples =
frame->nb_samples - (
frame->nb_samples & 1);
367 if (nb_samples < frame->nb_samples) {
368 int16_t last_samples[2] = {
samples[nb_samples],
samples[nb_samples] };