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
23
24 #define BITSTREAM_READER_LE
29
33 static const int8_t
map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
34
38
47
54
60
62 {
63 for (int x3 = 0; x3 < 3; x3++)
64 for (int x2 = 0; x2 < 3; x2++)
65 for (int x1 = 0; x1 < 3; x1++)
66 mul_3x3[x1 + x2 * 3 + x3 * 3 * 3] = x1 + (x2 << 4) + (x3 << 8);
67 for (int x3 = 0; x3 < 5; x3++)
68 for (int x2 = 0; x2 < 5; x2++)
69 for (int x1 = 0; x1 < 5; x1++)
70 mul_3x5[x1 + x2 * 5 + x3 * 5 * 5] = x1 + (x2 << 4) + (x3 << 8);
71 for (int x2 = 0; x2 < 11; x2++)
72 for (int x1 = 0; x1 < 11; x1++)
73 mul_2x11[x1 + x2 * 11] = x1 + (x2 << 4);
74 }
75
77 {
80
84
88 }
89
91 if (
s->max_samples == 0)
92 s->max_samples = UINT64_MAX;
95 s->cols = 1 <<
s->level;
96 s->wrapbuf_len = 2 *
s->cols - 2;
97 s->block_len =
s->rows *
s->cols;
98 s->max_framesize =
s->block_len;
99
101 s->wrapbuf =
av_calloc(
s->wrapbuf_len,
sizeof(
int));
104 if (!
s->block || !
s->wrapbuf || !
s->ampbuf || !
s->bitstream)
106
107 s->midbuf =
s->ampbuf + 0x8000;
109
111
112 return 0;
113 }
114
115 #define set_pos(s, r, c, idx) do { \
116 unsigned pos = ((r) << s->level) + (c); \
117 s->block[pos] = s->midbuf[(idx)]; \
118 } while (0)
119
121 {
123
124 for (
i = 0;
i <
s->rows;
i++)
126 return 0;
127 }
128
130 {
132 }
133
135 {
138 int b, middle = 1 << (ind - 1);
139
140 for (
i = 0;
i <
s->rows;
i++) {
143 }
144 return 0;
145 }
146
148 {
151
152 for (
i = 0;
i <
s->rows;
i++) {
157 break;
159 continue;
160 }
164 continue;
165 }
168 }
169 return 0;
170 }
171
173 {
176
177 for (
i = 0;
i <
s->rows;
i++) {
181 continue;
182 }
183
186 }
187 return 0;
188 }
189
191 {
194
195 for (
i = 0;
i <
s->rows;
i++) {
199 if (
i >=
s->rows)
break;
201 continue;
202 }
203
207 continue;
208 }
209
212 }
213 return 0;
214 }
215
217 {
220
221 for (
i = 0;
i <
s->rows;
i++) {
225 continue;
226 }
227
230 }
231 return 0;
232 }
233
235 {
238
239 for (
i = 0;
i <
s->rows;
i++) {
244 break;
246 continue;
247 }
248
252 continue;
253 }
254
259 continue;
260 }
261
264 }
265 return 0;
266 }
267
269 {
272
273 for (
i = 0;
i <
s->rows;
i++) {
277 continue;
278 }
279
284 continue;
285 }
286
289 }
290 return 0;
291 }
292
294 {
297
298 for (
i = 0;
i <
s->rows;
i++) {
303 break;
305 continue;
306 }
307
311 continue;
312 }
313
316 }
317 return 0;
318 }
319
321 {
324
325 for (
i = 0;
i <
s->rows;
i++) {
329 continue;
330 }
331
334 }
335 return 0;
336 }
337
339 {
342 int n1, n2, n3;
343
344 for (
i = 0;
i <
s->rows;
i++) {
345 /* b = (x1) + (x2 * 3) + (x3 * 9) */
350 }
351
353 n2 = ((
mul_3x3[
b] >> 4) & 0x0F) - 1;
354 n3 = ((
mul_3x3[
b] >> 8) & 0x0F) - 1;
355
358 break;
361 break;
363 }
364 return 0;
365 }
366
368 {
371 int n1, n2, n3;
372
373 for (
i = 0;
i <
s->rows;
i++) {
374 /* b = (x1) + (x2 * 5) + (x3 * 25) */
379 }
380
382 n2 = ((
mul_3x5[
b] >> 4) & 0x0F) - 2;
383 n3 = ((
mul_3x5[
b] >> 8) & 0x0F) - 2;
384
387 break;
390 break;
392 }
393 return 0;
394 }
395
397 {
400 int n1, n2;
401 for (
i = 0;
i <
s->rows;
i++) {
402 /* b = (x1) + (x2 * 11) */
407 }
408
411
414 break;
416 }
417 return 0;
418 }
419
421
431 };
432
434 {
438
439 for (
i = 0;
i <
s->cols;
i++) {
444 }
445 return 0;
446 }
447
448 static void juggle(
int *wrap_p,
int *block_p,
unsigned sub_len,
unsigned sub_count)
449 {
451 int *p;
452 unsigned int r0, r1, r2, r3;
453
454 for (
i = 0;
i < sub_len;
i++) {
455 p = block_p;
456 r0 = wrap_p[0];
457 r1 = wrap_p[1];
458 for (j = 0; j < sub_count/2; j++) {
459 r2 = *p;
460 *p = r1 * 2 + (r0 + r2);
461 p += sub_len;
462 r3 = *p;
463 *p = r2 * 2 - (r1 + r3);
464 p += sub_len;
465 r0 = r2;
466 r1 = r3;
467 }
468
469 *wrap_p++ = r0;
470 *wrap_p++ = r1;
471 block_p++;
472 }
473 }
474
476 {
477 unsigned sub_count, sub_len, todo_count, step_subcount,
i;
478 int *wrap_p, *block_p, *p;
479
480 /* juggle only if subblock_len > 1 */
482 return;
483
484 /* 2048 / subblock_len */
486 step_subcount = 1;
487 else
488 step_subcount = (2048 >>
s->level) - 2;
489
490 /* Apply juggle() (rows)x(cols)
491 * from (step_subcount * 2) x (subblock_len/2)
492 * to (step_subcount * subblock_len) x (1)
493 */
494 todo_count =
s->rows;
496 while (1) {
498 sub_count = step_subcount;
499 if (sub_count > todo_count)
500 sub_count = todo_count;
501
502 sub_len =
s->cols / 2;
503 sub_count *= 2;
504
505 juggle(wrap_p, block_p, sub_len, sub_count);
506 wrap_p += sub_len * 2;
507
508 for (
i = 0, p = block_p;
i < sub_count;
i++) {
509 p[0]++;
510 p += sub_len;
511 }
512
513 while (sub_len > 1) {
514 sub_len /= 2;
515 sub_count *= 2;
516 juggle(wrap_p, block_p, sub_len, sub_count);
517 wrap_p += sub_len * 2;
518 }
519
520 if (todo_count <= step_subcount)
521 break;
522
523 todo_count -= step_subcount;
524 block_p += step_subcount <<
s->level;
525 }
526 }
527
529 {
531 int pwr, count,
val,
i, x,
ret;
532
535
536 count = 1 << pwr;
537
538 for (
i = 0, x = 0;
i < count;
i++) {
541 }
542
543 for (
i = 1, x = -
val;
i <= count;
i++) {
546 }
547
551
553
554 return 0;
555 }
556
559 {
562 const uint8_t *buf;
564 int ret, n, buf_size, input_buf_size;
565
566 if (!
pkt->
size && !
s->bitstream_size) {
567 *got_frame_ptr = 0;
568 return 0;
569 }
570
571 buf_size =
FFMIN(
pkt->
size,
s->max_framesize -
s->bitstream_size);
572 input_buf_size = buf_size;
573 if (
s->bitstream_index +
s->bitstream_size + buf_size >
s->max_framesize) {
574 memmove(
s->bitstream, &
s->bitstream[
s->bitstream_index],
s->bitstream_size);
575 s->bitstream_index = 0;
576 }
578 memcpy(&
s->bitstream[
s->bitstream_index +
s->bitstream_size],
pkt->
data, buf_size);
579 buf = &
s->bitstream[
s->bitstream_index];
580 buf_size +=
s->bitstream_size;
581 s->bitstream_size = buf_size;
582 if (buf_size < s->max_framesize &&
pkt->
data) {
583 *got_frame_ptr = 0;
584 return input_buf_size;
585 }
586
589
594
599
602 int val =
s->block[n] >>
s->level;
604 }
605
606 *got_frame_ptr = 1;
609
610 if (n > buf_size &&
pkt->
data) {
611 s->bitstream_size = 0;
612 s->bitstream_index = 0;
614 }
615
616 if (
s->bitstream_size > 0) {
617 s->bitstream_index += n;
618 s->bitstream_size -=
FFMIN(
s->bitstream_size, n);
619 return input_buf_size;
620 }
621 return n;
622 }
623
625 {
627
632 s->bitstream_size = 0;
633
634 return 0;
635 }
636
638 .
p.
name =
"interplayacm",
648 };