1 /*
2 * Amuse Graphics Movie decoder
3 *
4 * Copyright (c) 2018 Paul B Mahol
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 #define BITSTREAM_READER_LE
28
30
38
40 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19,
41 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56,
42 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56,
43 68,109,103, 77, 24, 35, 55, 64, 81,104,113, 92,
44 49, 64, 78, 87,103,121,120,101, 72, 92, 95, 98,
45 112,100,103,99
46 };
47
49 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66,
50 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
51 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
52 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
53 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
54 99, 99, 99, 99
55 };
56
60
66
78
82
85
87
89
92
95
98
101
104
106 {
107 int len = 0, skip = 0,
max;
108
111
114 case 1:
115 case 9:
117 skip = 3;
118 break;
119 case 2:
121 skip = 4;
122 break;
123 case 3:
125 skip = 4;
126 break;
127 case 5:
128 case 13:
130 skip = 3;
131 break;
132 case 6:
134 skip = 4;
135 break;
136 case 7:
138 skip = 4;
139 break;
140 case 10:
142 skip = 4;
143 break;
144 case 11:
146 skip = 4;
147 break;
148 case 14:
150 skip = 4;
151 break;
152 case 15:
154 skip = 5;
155 break;
156 default:
158 }
159
163 *oskip = 0;
174 } else {
176 }
177 } else {
180 }
181 }
else if (
mode == 0) {
183 }
185 } else {
190 *oskip = 0;
192 }
193
194 return 0;
195 }
196
198 const int *quant_matrix, int *skip, int *dc_level)
199 {
200 const uint8_t *scantable =
s->scantable.permutated;
202
203 memset(
s->wblocks, 0,
s->wblocks_size);
204
205 for (
int i = 0;
i < 64;
i++) {
206 int16_t *
block =
s->wblocks + scantable[
i];
207
208 for (
int j = 0; j <
s->blocks_w;) {
209 if (*skip > 0) {
210 int rskip;
211
212 rskip =
FFMIN(*skip,
s->blocks_w - j);
213 j += rskip;
215 for (int k = 0; k < rskip; k++)
216 block[64 * k] = *dc_level * quant_matrix[0];
217 }
219 *skip -= rskip;
220 } else {
224
227
228 block[0] = (
i == 0 ? *dc_level :
level) * quant_matrix[
i];
230 j++;
231 }
232 }
233 }
234
235 return 0;
236 }
237
239 const int *quant_matrix, int *skip,
241 {
242 const uint8_t *scantable =
s->scantable.permutated;
244
245 memset(
s->wblocks, 0,
s->wblocks_size);
246 memset(
s->map, 0,
s->map_size);
247
248 for (
int i = 0;
i < 64;
i++) {
249 int16_t *
block =
s->wblocks + scantable[
i];
250
251 for (
int j = 0; j <
s->blocks_w;) {
252 if (*skip > 0) {
253 int rskip;
254
255 rskip =
FFMIN(*skip,
s->blocks_w - j);
256 j += rskip;
258 *skip -= rskip;
259 } else {
263
266 j++;
267 }
268 }
269 }
270
271 return 0;
272 }
273
275 const int *quant_matrix, int *skip, int *dc_level)
276 {
277 const uint8_t *scantable =
s->scantable.permutated;
278 const int offset =
s->plus ? 0 : 1024;
279 int16_t *
block =
s->block;
281
282 memset(
block, 0,
sizeof(
s->block));
283
284 if (*skip > 0) {
285 (*skip)--;
286 } else {
291 }
292 block[scantable[0]] =
offset + *dc_level * quant_matrix[0];
293
294 for (
int i = 1;
i < 64;) {
295 if (*skip > 0) {
296 int rskip;
297
298 rskip =
FFMIN(*skip, 64 -
i);
300 *skip -= rskip;
301 } else {
305
308 }
309 }
310
311 return 0;
312 }
313
316 int plane)
317 {
318 int ret, skip = 0, dc_level = 0;
319 const int offset =
s->plus ? 0 : 1024;
320
323
326 64 *
s->blocks_w *
sizeof(*
s->wblocks));
329
330 for (
int y = 0; y <
s->blocks_h; y++) {
334
335 for (
int x = 0; x <
s->blocks_w; x++) {
337 s->idsp.idct_put(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
338 frame->linesize[plane],
s->wblocks + 64 * x);
339 }
340 }
341 } else {
342 for (
int y = 0; y <
s->blocks_h; y++) {
343 for (
int x = 0; x <
s->blocks_w; x++) {
347
348 s->idsp.idct_put(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
349 frame->linesize[plane],
s->block);
350 }
351 }
352 }
353
359
360 return 0;
361 }
362
364 const int *quant_matrix, int *skip,
366 {
367 const uint8_t *scantable =
s->scantable.permutated;
368 int16_t *
block =
s->block;
370
371 memset(
block, 0,
sizeof(
s->block));
372
373 for (
int i = 0;
i < 64;) {
374 if (*skip > 0) {
375 int rskip;
376
377 rskip =
FFMIN(*skip, 64 -
i);
379 *skip -= rskip;
380 } else {
384
387 }
388 }
389
390 return 0;
391 }
392
396 {
398
401
404 64 *
s->blocks_w *
sizeof(*
s->wblocks));
407
409 s->blocks_w *
sizeof(*
s->map));
412
413 for (
int y = 0; y <
s->blocks_h; y++) {
417
418 for (
int x = 0; x <
s->blocks_w; x++) {
419 int shift = plane == 0;
421 int orig_mv_x =
s->mvectors[mvpos].x;
422 int mv_x =
s->mvectors[mvpos].x / (1 + !
shift);
423 int mv_y =
s->mvectors[mvpos].y / (1 + !
shift);
424 int h =
s->avctx->coded_height >> !
shift;
425 int w =
s->avctx->coded_width >> !
shift;
427
428 if (orig_mv_x >= -32) {
429 if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 >
h ||
430 x * 8 + mv_x < 0 || x * 8 + mv_x + 8 >
w)
432
434 prev->
data[plane] + ((
s->blocks_h - 1 - y) * 8 - mv_y) * prev->
linesize[plane] + (x * 8 + mv_x),
437 s->idsp.idct(
s->wblocks + x * 64);
438 for (
int i = 0;
i < 64;
i++)
439 s->wblocks[
i + x * 64] = (
s->wblocks[
i + x * 64] + 1) & 0xFFFC;
440 s->idsp.add_pixels_clamped(&
s->wblocks[x*64],
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
441 frame->linesize[plane]);
442 }
444 s->idsp.idct_put(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
445 frame->linesize[plane],
s->wblocks + x * 64);
446 }
447 }
448 }
449 }
else if (
s->flags & 2) {
450 for (
int y = 0; y <
s->blocks_h; y++) {
451 for (
int x = 0; x <
s->blocks_w; x++) {
452 int shift = plane == 0;
454 int orig_mv_x =
s->mvectors[mvpos].x;
455 int mv_x =
s->mvectors[mvpos].x / (1 + !
shift);
456 int mv_y =
s->mvectors[mvpos].y / (1 + !
shift);
457 int h =
s->avctx->coded_height >> !
shift;
458 int w =
s->avctx->coded_width >> !
shift;
460
464
465 if (orig_mv_x >= -32) {
466 if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 >
h ||
467 x * 8 + mv_x < 0 || x * 8 + mv_x + 8 >
w)
469
471 prev->
data[plane] + ((
s->blocks_h - 1 - y) * 8 - mv_y) * prev->
linesize[plane] + (x * 8 + mv_x),
474 s->idsp.idct(
s->block);
475 for (
int i = 0;
i < 64;
i++)
476 s->block[
i] = (
s->block[
i] + 1) & 0xFFFC;
477 s->idsp.add_pixels_clamped(
s->block,
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
478 frame->linesize[plane]);
479 }
481 s->idsp.idct_put(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
482 frame->linesize[plane],
s->block);
483 }
484 }
485 }
486 }
else if (
s->flags & 1) {
488 64 *
s->blocks_w *
sizeof(*
s->wblocks));
491
493 s->blocks_w *
sizeof(*
s->map));
496
497 for (
int y = 0; y <
s->blocks_h; y++) {
501
502 for (
int x = 0; x <
s->blocks_w; x++) {
504 continue;
505 s->idsp.idct_add(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
506 frame->linesize[plane],
s->wblocks + 64 * x);
507 }
508 }
509 } else {
510 for (
int y = 0; y <
s->blocks_h; y++) {
511 for (
int x = 0; x <
s->blocks_w; x++) {
513
517
519 continue;
520 s->idsp.idct_add(
frame->data[plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[plane] + x * 8,
521 frame->linesize[plane],
s->block);
522 }
523 }
524 }
525
531
532 return 0;
533 }
534
536 {
538 double f = 1.0 -
fabs(qscale);
539
540 if (!
s->key_frame && (
s->flags & 2)) {
541 if (qscale >= 0.0) {
542 for (
int i = 0;
i < 64;
i++) {
545 }
546 } else {
547 for (
int i = 0;
i < 64;
i++) {
548 luma[
i] =
FFMAX(1, 16 - qscale * 32);
550 }
551 }
552 } else {
553 if (qscale >= 0.0) {
554 for (
int i = 0;
i < 64;
i++) {
557 }
558 } else {
559 for (
int i = 0;
i < 64;
i++) {
562 }
563 }
564 }
565
566 for (
int i = 0;
i < 64;
i++) {
568
569 s->luma_quant_matrix[
i] = luma[
pos] * ((
pos / 8) & 1 ? -1 : 1);
570 s->chroma_quant_matrix[
i] =
chroma[
pos] * ((
pos / 8) & 1 ? -1 : 1);
571 }
572 }
573
575 {
577 uint8_t
r = 0,
g = 0,
b = 0;
578
581
582 for (
int y = 0; y < avctx->
height; y++) {
583 for (
int x = 0; x < avctx->
width; x++) {
584 dst[x*3+0] = bytestream2_get_byteu(gbyte) +
r;
586 dst[x*3+1] = bytestream2_get_byteu(gbyte) +
g;
588 dst[x*3+2] = bytestream2_get_byteu(gbyte) +
b;
590 }
591 dst -=
frame->linesize[0];
592 }
593
594 return 0;
595 }
596
598 uint8_t **
u, uint8_t **v,
599 int ylinesize, int ulinesize, int vlinesize,
600 uint8_t *fill,
601 int *nx,
int *ny,
int *np,
int w,
int h)
602 {
603 uint8_t *y0dst = *y0;
604 uint8_t *y1dst = *y1;
606 uint8_t *vdst = *v;
607 int x = *nx, y = *ny,
pos = *np;
608
610 y0dst[2*x+0] += fill[0];
611 y0dst[2*x+1] += fill[1];
612 y1dst[2*x+0] += fill[2];
613 y1dst[2*x+1] += fill[3];
615 }
else if (
pos == 1) {
616 udst[x] += fill[0];
617 vdst[x] += fill[1];
618 x++;
620 x = 0;
621 y++;
623 return 1;
624 y0dst -= 2*ylinesize;
625 y1dst -= 2*ylinesize;
626 udst -= ulinesize;
627 vdst -= vlinesize;
628 }
629 y0dst[2*x+0] += fill[2];
630 y0dst[2*x+1] += fill[3];
632 }
else if (
pos == 2) {
633 y1dst[2*x+0] += fill[0];
634 y1dst[2*x+1] += fill[1];
635 udst[x] += fill[2];
636 vdst[x] += fill[3];
637 x++;
639 x = 0;
640 y++;
642 return 1;
643 y0dst -= 2*ylinesize;
644 y1dst -= 2*ylinesize;
645 udst -= ulinesize;
646 vdst -= vlinesize;
647 }
649 }
650
651 *y0 = y0dst;
652 *y1 = y1dst;
654 *v = vdst;
656 *nx = x;
657 *ny = y;
658
659 return 0;
660 }
661
663 {
665 int runlen, y = 0, x = 0;
666 uint8_t fill[4];
668
670 code = bytestream2_peek_le32(gbyte);
671 runlen =
code & 0xFFFFFF;
672
673 if (
code >> 24 == 0x77) {
675
676 for (
int i = 0;
i < 4;
i++)
677 fill[
i] = bytestream2_get_byte(gbyte);
678
679 while (runlen > 0) {
680 runlen--;
681
682 for (
int i = 0;
i < 4;
i++) {
684 x++;
685 if (x >=
frame->width * 3) {
686 x = 0;
687 y++;
688 dst -=
frame->linesize[0];
689 if (y >=
frame->height)
690 return 0;
691 }
692 }
693 }
694 } else {
695 for (
int i = 0;
i < 4;
i++)
696 fill[
i] = bytestream2_get_byte(gbyte);
697
698 for (
int i = 0;
i < 4;
i++) {
700 x++;
701 if (x >=
frame->width * 3) {
702 x = 0;
703 y++;
704 dst -=
frame->linesize[0];
705 if (y >=
frame->height)
706 return 0;
707 }
708 }
709 }
710 }
711
712 return 0;
713 }
714
716 {
718 uint8_t *y1dst = y0dst -
frame->linesize[0];
719 uint8_t *udst =
frame->data[1] + ((avctx->
height >> 1) - 1) *
frame->linesize[1];
720 uint8_t *vdst =
frame->data[2] + ((avctx->
height >> 1) - 1) *
frame->linesize[2];
721 int runlen, y = 0, x = 0,
pos = 0;
722 uint8_t fill[4];
724
726 code = bytestream2_peek_le32(gbyte);
727 runlen =
code & 0xFFFFFF;
728
729 if (
code >> 24 == 0x77) {
731
732 for (
int i = 0;
i < 4;
i++)
733 fill[
i] = bytestream2_get_byte(gbyte);
734
735 while (runlen > 0) {
736 runlen--;
737
745 return 0;
746 }
747 } else {
748 for (
int i = 0;
i < 4;
i++)
749 fill[
i] = bytestream2_get_byte(gbyte);
750
758 return 0;
759 }
760 }
761
762 return 0;
763 }
764
766 {
768 uint8_t *y1dst = y0dst -
frame->linesize[0];
769 uint8_t *udst =
frame->data[1] + ((avctx->
height >> 1) - 1) *
frame->linesize[1];
770 uint8_t *vdst =
frame->data[2] + ((avctx->
height >> 1) - 1) *
frame->linesize[2];
771 uint8_t ly0 = 0, ly1 = 0, ly2 = 0, ly3 = 0, lu = 0, lv = 0;
772
773 for (
int y = 0; y < avctx->
height / 2; y++) {
774 for (
int x = 0; x < avctx->
width / 2; x++) {
775 y0dst[x*2+0] = bytestream2_get_byte(gbyte) + ly0;
776 ly0 = y0dst[x*2+0];
777 y0dst[x*2+1] = bytestream2_get_byte(gbyte) + ly1;
778 ly1 = y0dst[x*2+1];
779 y1dst[x*2+0] = bytestream2_get_byte(gbyte) + ly2;
780 ly2 = y1dst[x*2+0];
781 y1dst[x*2+1] = bytestream2_get_byte(gbyte) + ly3;
782 ly3 = y1dst[x*2+1];
783 udst[x] = bytestream2_get_byte(gbyte) + lu;
784 lu = udst[x];
785 vdst[x] = bytestream2_get_byte(gbyte) + lv;
786 lv = vdst[x];
787 }
788
789 y0dst -= 2*
frame->linesize[0];
790 y1dst -= 2*
frame->linesize[0];
791 udst -=
frame->linesize[1];
792 vdst -=
frame->linesize[2];
793 }
794
795 return 0;
796 }
797
799 {
802
804
807
811
813
816
820
822
825
829
830 return 0;
831 }
832
834 {
838
840 nb_mvs *
sizeof(*
s->mvectors));
843
845 (
s->size[0] +
s->size[1] +
s->size[2]))) < 0)
847
848 memset(
s->mvectors, 0,
sizeof(*
s->mvectors) * nb_mvs);
849
850 for (
int i = 0;
i < nb_mvs;
i++) {
856 }
857
858 for (
int i = 0;
i < nb_mvs;
i++) {
864 }
865
870
871 return 0;
872 }
873
876 {
879
881
886 }
887
890
894
896
899
903
905
908
912
913 return 0;
914 }
915
920
922 {
923 if (idx < 256 && idx >= 0) {
924 codes[idx] = pfx;
925 } else if (idx >= 0) {
926 get_tree_codes(codes, nodes, nodes[idx].child[0], pfx + (0 << bitpos), bitpos + 1);
927 get_tree_codes(codes, nodes, nodes[idx].child[1], pfx + (1
U << bitpos), bitpos + 1);
928 }
929 }
930
932 {
933 int zlcount = 0, curlen, idx, nindex, last, llast;
934 int blcounts[32] = { 0 };
935 int syms[8192];
937 int node_idx[1024];
938 int old_idx[512];
939
940 for (
int i = 0;
i < 256;
i++) {
941 int bitlen = bitlens[
i];
942 int blcount = blcounts[bitlen];
943
944 zlcount += bitlen < 1;
945 syms[(bitlen << 8) + blcount] =
i;
946 blcounts[bitlen]++;
947 }
948
949 for (
int i = 0;
i < 512;
i++) {
952 }
953
954 for (
int i = 0;
i < 256;
i++) {
955 node_idx[
i] = 257 +
i;
956 }
957
958 curlen = 1;
959 node_idx[512] = 256;
960 last = 255;
961 nindex = 1;
962
963 for (curlen = 1; curlen < 32; curlen++) {
964 if (blcounts[curlen] > 0) {
965 int max_zlcount = zlcount + blcounts[curlen];
966
967 for (
int i = 0; zlcount < 256 && zlcount < max_zlcount; zlcount++,
i++) {
968 int p = node_idx[nindex - 1 + 512];
969 int ch = syms[256 * curlen +
i];
970
971 if (nindex <= 0)
973
974 if (nodes[p].child[0] == -1) {
975 nodes[p].
child[0] = ch;
976 } else {
977 nodes[p].
child[1] = ch;
978 nindex--;
979 }
981 }
982 }
983 llast = last - 1;
984 idx = 0;
985 while (nindex > 0) {
986 int p, ch;
987
988 last = llast - idx;
989 p = node_idx[nindex - 1 + 512];
990 ch = node_idx[last];
991 if (nodes[p].child[0] == -1) {
992 nodes[p].
child[0] = ch;
993 } else {
994 nodes[p].
child[1] = ch;
995 nindex--;
996 }
997 old_idx[idx] = ch;
999 if (idx == llast)
1000 goto next;
1001 idx++;
1002 if (nindex <= 0) {
1003 for (
int i = 0;
i < idx;
i++)
1004 node_idx[512 +
i] = old_idx[
i];
1005 }
1006 }
1007 nindex = idx;
1008 }
1009
1010 next:
1011
1013 return 0;
1014 }
1015
1017 {
1018 uint32_t new_codes[256];
1020 uint8_t symbols[256];
1021 uint32_t codes[256];
1022 int nb_codes = 0;
1023
1027
1028 for (
int i = 0;
i < 256;
i++) {
1030 bits[nb_codes] = bitlen[
i];
1031 codes[nb_codes] = new_codes[
i];
1032 symbols[nb_codes] =
i;
1033 nb_codes++;
1034 }
1035 }
1036
1040 codes, 4, 4,
1041 symbols, 1, 1,
1043 }
1044
1046 {
1049 uint8_t lens[256];
1051
1055
1057
1058 if (
s->output_size > avctx->
width * avctx->
height * 9LL + 10000)
1060
1064
1067 if (x) {
1070
1071 for (
int i = 0;
i < count;
i++)
1073
1074 for (
int i = 0;
i < 256;
i++) {
1077 }
1078 } else {
1079 for (
int i = 0;
i < 256;
i++)
1081 }
1082
1085
1086 x = 0;
1091 s->output[x++] =
val;
1092 }
1093
1094 return 0;
1095 }
1096
1099 {
1104 unsigned compressed_size;
1105 long skip;
1107
1109 return 0;
1110
1112
1113 header = bytestream2_get_le32(gbyte);
1114 s->fflags = bytestream2_get_le32(gbyte);
1115 s->bitstream_size =
s->fflags & 0x1FFFFFFF;
1118 if (avpkt->
size <
s->bitstream_size + 8)
1120
1122 frame->key_frame =
s->key_frame;
1124
1125 if (!
s->key_frame) {
1126 if (!
s->prev_frame->data[0]) {
1129 }
1130 }
1131
1136 else
1141 }
else if (!
s->dct) {
1143 }
1144
1147 w = bytestream2_get_le32(gbyte);
1148 h = bytestream2_get_le32(gbyte);
1149 if (
w == INT32_MIN ||
h == INT32_MIN)
1154 }
1158 }
1159
1164
1170
1171 s->compression = bytestream2_get_le32(gbyte);
1172 if (
s->compression < 0 ||
s->compression > 100)
1174
1175 for (
int i = 0;
i < 3;
i++)
1176 s->size[
i] = bytestream2_get_le32(gbyte);
1178 compressed_size =
s->output_size;
1179 skip = 8LL;
1180 } else {
1181 compressed_size = avpkt->
size;
1182 skip = 32LL;
1183 }
1184 if (
s->size[0] < 0 ||
s->size[1] < 0 ||
s->size[2] < 0 ||
1185 skip +
s->size[0] +
s->size[1] +
s->size[2] > compressed_size) {
1187 }
1188 }
1189
1192
1193 if (
frame->key_frame) {
1194 if (!
s->dct && !
s->rgb)
1196 else if (!
s->dct &&
s->rgb)
1198 else
1200 } else {
1202 s->prev_frame->height !=
frame->height)
1204
1205 if (!(
s->flags & 2)) {
1209 }
1210
1213 }
else if (!
s->dct && !
s->rgb) {
1215 } else {
1217 }
1218 }
1221
1225
1228
1229 *got_frame = 1;
1230
1232 }
1233
1235 {
1237
1243
1246
1247 if (!
s->rgb && !
s->dct) {
1250 }
1251
1255
1259
1260 return 0;
1261 }
1262
1264 {
1266
1268 }
1269
1271 {
1273
1277 s->mvectors_size = 0;
1279 s->wblocks_size = 0;
1281 s->padded_output_size = 0;
1284
1285 return 0;
1286 }
1287
1302 };