1 /*
2 * Interplay ACM decoder
3 *
4 * Copyright (c) 2004-2008 Marko Kreen
5 * Copyright (c) 2008 Adam Gashlin
6 * Copyright (c) 2015 Paul B Mahol
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
24
25 #define BITSTREAM_READER_LE
30
34 static const int8_t
map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
35
39
48
55
61
63 {
64 for (int x3 = 0; x3 < 3; x3++)
65 for (int x2 = 0; x2 < 3; x2++)
66 for (int x1 = 0; x1 < 3; x1++)
67 mul_3x3[x1 + x2 * 3 + x3 * 3 * 3] = x1 + (x2 << 4) + (x3 << 8);
68 for (int x3 = 0; x3 < 5; x3++)
69 for (int x2 = 0; x2 < 5; x2++)
70 for (int x1 = 0; x1 < 5; x1++)
71 mul_3x5[x1 + x2 * 5 + x3 * 5 * 5] = x1 + (x2 << 4) + (x3 << 8);
72 for (int x2 = 0; x2 < 11; x2++)
73 for (int x1 = 0; x1 < 11; x1++)
74 mul_2x11[x1 + x2 * 11] = x1 + (x2 << 4);
75 }
76
78 {
81
85
89 }
90
92 if (
s->max_samples == 0)
93 s->max_samples = UINT64_MAX;
96 s->cols = 1 <<
s->level;
97 s->wrapbuf_len = 2 *
s->cols - 2;
98 s->block_len =
s->rows *
s->cols;
99 s->max_framesize =
s->block_len;
100
102 s->wrapbuf =
av_calloc(
s->wrapbuf_len,
sizeof(
int));
105 if (!
s->block || !
s->wrapbuf || !
s->ampbuf || !
s->bitstream)
107
108 s->midbuf =
s->ampbuf + 0x8000;
110
112
113 return 0;
114 }
115
116 #define set_pos(s, r, c, idx) do { \
117 unsigned pos = ((r) << s->level) + (c); \
118 s->block[pos] = s->midbuf[(idx)]; \
119 } while (0)
120
122 {
124
125 for (
i = 0;
i <
s->rows;
i++)
127 return 0;
128 }
129
131 {
133 }
134
136 {
139 int b, middle = 1 << (ind - 1);
140
141 for (
i = 0;
i <
s->rows;
i++) {
144 }
145 return 0;
146 }
147
149 {
152
153 for (
i = 0;
i <
s->rows;
i++) {
158 break;
160 continue;
161 }
165 continue;
166 }
169 }
170 return 0;
171 }
172
174 {
177
178 for (
i = 0;
i <
s->rows;
i++) {
182 continue;
183 }
184
187 }
188 return 0;
189 }
190
192 {
195
196 for (
i = 0;
i <
s->rows;
i++) {
200 if (
i >=
s->rows)
break;
202 continue;
203 }
204
208 continue;
209 }
210
213 }
214 return 0;
215 }
216
218 {
221
222 for (
i = 0;
i <
s->rows;
i++) {
226 continue;
227 }
228
231 }
232 return 0;
233 }
234
236 {
239
240 for (
i = 0;
i <
s->rows;
i++) {
245 break;
247 continue;
248 }
249
253 continue;
254 }
255
260 continue;
261 }
262
265 }
266 return 0;
267 }
268
270 {
273
274 for (
i = 0;
i <
s->rows;
i++) {
278 continue;
279 }
280
285 continue;
286 }
287
290 }
291 return 0;
292 }
293
295 {
298
299 for (
i = 0;
i <
s->rows;
i++) {
304 break;
306 continue;
307 }
308
312 continue;
313 }
314
317 }
318 return 0;
319 }
320
322 {
325
326 for (
i = 0;
i <
s->rows;
i++) {
330 continue;
331 }
332
335 }
336 return 0;
337 }
338
340 {
343 int n1, n2, n3;
344
345 for (
i = 0;
i <
s->rows;
i++) {
346 /* b = (x1) + (x2 * 3) + (x3 * 9) */
351 }
352
354 n2 = ((
mul_3x3[
b] >> 4) & 0x0F) - 1;
355 n3 = ((
mul_3x3[
b] >> 8) & 0x0F) - 1;
356
359 break;
362 break;
364 }
365 return 0;
366 }
367
369 {
372 int n1, n2, n3;
373
374 for (
i = 0;
i <
s->rows;
i++) {
375 /* b = (x1) + (x2 * 5) + (x3 * 25) */
380 }
381
383 n2 = ((
mul_3x5[
b] >> 4) & 0x0F) - 2;
384 n3 = ((
mul_3x5[
b] >> 8) & 0x0F) - 2;
385
388 break;
391 break;
393 }
394 return 0;
395 }
396
398 {
401 int n1, n2;
402 for (
i = 0;
i <
s->rows;
i++) {
403 /* b = (x1) + (x2 * 11) */
408 }
409
412
415 break;
417 }
418 return 0;
419 }
420
422
432 };
433
435 {
439
440 for (
i = 0;
i <
s->cols;
i++) {
445 }
446 return 0;
447 }
448
449 static void juggle(
int *wrap_p,
int *block_p,
unsigned sub_len,
unsigned sub_count)
450 {
453 unsigned int r0, r1, r2, r3;
454
455 for (
i = 0;
i < sub_len;
i++) {
457 r0 = wrap_p[0];
458 r1 = wrap_p[1];
459 for (j = 0; j < sub_count/2; j++) {
461 *
p = r1 * 2 + (r0 + r2);
464 *
p = r2 * 2 - (r1 + r3);
466 r0 = r2;
467 r1 = r3;
468 }
469
470 *wrap_p++ = r0;
471 *wrap_p++ = r1;
472 block_p++;
473 }
474 }
475
477 {
478 unsigned sub_count, sub_len, todo_count, step_subcount,
i;
479 int *wrap_p, *block_p, *
p;
480
481 /* juggle only if subblock_len > 1 */
483 return;
484
485 /* 2048 / subblock_len */
487 step_subcount = 1;
488 else
489 step_subcount = (2048 >>
s->level) - 2;
490
491 /* Apply juggle() (rows)x(cols)
492 * from (step_subcount * 2) x (subblock_len/2)
493 * to (step_subcount * subblock_len) x (1)
494 */
495 todo_count =
s->rows;
497 while (1) {
499 sub_count = step_subcount;
500 if (sub_count > todo_count)
501 sub_count = todo_count;
502
503 sub_len =
s->cols / 2;
504 sub_count *= 2;
505
506 juggle(wrap_p, block_p, sub_len, sub_count);
507 wrap_p += sub_len * 2;
508
509 for (
i = 0,
p = block_p;
i < sub_count;
i++) {
512 }
513
514 while (sub_len > 1) {
515 sub_len /= 2;
516 sub_count *= 2;
517 juggle(wrap_p, block_p, sub_len, sub_count);
518 wrap_p += sub_len * 2;
519 }
520
521 if (todo_count <= step_subcount)
522 break;
523
524 todo_count -= step_subcount;
525 block_p += step_subcount <<
s->level;
526 }
527 }
528
530 {
532 int pwr, count,
val,
i, x,
ret;
533
536
537 count = 1 << pwr;
538
539 for (
i = 0, x = 0;
i < count;
i++) {
542 }
543
544 for (
i = 1, x = -
val;
i <= count;
i++) {
547 }
548
552
554
555 return 0;
556 }
557
560 {
563 const uint8_t *buf;
565 int ret, n, buf_size, input_buf_size;
566
567 if (!
pkt->
size && !
s->bitstream_size) {
568 *got_frame_ptr = 0;
569 return 0;
570 }
571
572 buf_size =
FFMIN(
pkt->
size,
s->max_framesize -
s->bitstream_size);
573 input_buf_size = buf_size;
574 if (
s->bitstream_index +
s->bitstream_size + buf_size >
s->max_framesize) {
575 memmove(
s->bitstream, &
s->bitstream[
s->bitstream_index],
s->bitstream_size);
576 s->bitstream_index = 0;
577 }
579 memcpy(&
s->bitstream[
s->bitstream_index +
s->bitstream_size],
pkt->
data, buf_size);
580 buf = &
s->bitstream[
s->bitstream_index];
581 buf_size +=
s->bitstream_size;
582 s->bitstream_size = buf_size;
583 if (buf_size < s->max_framesize &&
pkt->
data) {
584 *got_frame_ptr = 0;
585 return input_buf_size;
586 }
587
590
592 s->max_samples -=
FFMIN(
frame->nb_samples,
s->max_samples);
595
600
603 int val =
s->block[n] >>
s->level;
605 }
606
607 *got_frame_ptr = 1;
610
611 if (n > buf_size &&
pkt->
data) {
612 s->bitstream_size = 0;
613 s->bitstream_index = 0;
615 }
616
617 if (
s->bitstream_size > 0) {
618 s->bitstream_index += n;
619 s->bitstream_size -=
FFMIN(
s->bitstream_size, n);
620 return input_buf_size;
621 }
622 return n;
623 }
624
626 {
628
633 s->bitstream_size = 0;
634
635 return 0;
636 }
637
639 .
p.
name =
"interplayacm",
649 };