Go to the documentation of this file. 1 /*
2 * ScreenPressor version 3 decoder
3 *
4 * Copyright (c) 2017 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
28
32
34 uint16_t *freqs, uint16_t *freqs1,
35 uint16_t *cnts, uint8_t *dectab)
36 {
37 uint32_t
a = 0,
b = 4096 / nsym,
c =
b - (
b >> 1);
38
40
41 for (
int d = 0;
d < nsym;
d++) {
45 for (
int q =
a + 128 - 1 >> 7,
f = (
a +
b - 1 >> 7) + 1; q <
f; q++)
47
49 }
50 }
51
53 {
54 for (
int i = 0;
i < 3;
i++) {
55 for (int j = 0; j < 4096; j++) {
58 }
59 }
60
61 for (
int i = 0;
i < 6;
i++) {
63 s->run_model3[
i].freqs[0],
s->run_model3[
i].freqs[1],
64 s->run_model3[
i].cnts,
s->run_model3[
i].dectab);
65 }
66
68 s->range_model3.freqs[0],
s->range_model3.freqs[1],
69 s->range_model3.cnts,
s->range_model3.dectab);
70
72 s->fill_model3.freqs[0],
s->fill_model3.freqs[1],
73 s->fill_model3.cnts,
s->fill_model3.dectab);
74
76 s->count_model3.freqs[0],
s->count_model3.freqs[1],
77 s->count_model3.cnts,
s->count_model3.dectab);
78
79 for (
int i = 0;
i < 4;
i++) {
81 s->sxy_model3[
i].freqs[0],
s->sxy_model3[
i].freqs[1],
82 s->sxy_model3[
i].cnts,
s->sxy_model3[
i].dectab);
83 }
84
85 for (
int i = 0;
i < 2;
i++) {
87 s->mv_model3[
i].freqs[0],
s->mv_model3[
i].freqs[1],
88 s->mv_model3[
i].cnts,
s->mv_model3[
i].dectab);
89 }
90
91 for (
int i = 0;
i < 6;
i++) {
93 s->op_model3[
i].freqs[0],
s->op_model3[
i].freqs[1],
94 s->op_model3[
i].cnts,
s->op_model3[
i].dectab);
95 }
96 }
97
99 {
101
103 code = bytestream2_get_byteu(gb) | (
code << 8);
105
106 return 0;
107 }
108
110 {
112
114 for (
int b = 0;
b < m->
size;
b++) {
117 }
118
120 }
121
123 {
125 return 0;
126
130 }
131
135
138
139 *totfr += 50;
140 if (*totfr + 50 > 4096)
142
143 return 1;
144 }
145
147 uint16_t *
a, uint16_t *
b, uint32_t *
c,
int max)
148 {
149 uint32_t q,
g, maxpos,
d, e = *
c, totfr = *
c;
151
152 for (
d = 0; e <= 2048;
d++)
153 e <<= 1;
157 m->
freqs[maxpos] += 4096 - e >>
d;
158
159 for (q = 0,
g = 0, e = 0; q < m->
size; q++) {
161 uint32_t p = e +
f -
g;
162 uint32_t k = m->
freqs[q];
163
164 if (rccode < p) {
172 }
173
174 if (p + k > rccode) {
181 totfr += 50;
182 if ((q != maxpos) && (m->
freqs[q] > m->
freqs[maxpos]))
184 if (totfr + 50 > 4096)
187 return 1;
188 }
189
192 }
193
201 }
202
204 {
206 int c,
d, e,
f, k, p, length,
i, j,
index;
207 uint16_t *freqs, *freqs1, *cnts;
208
210
216 for (
i = 0;
i < length;
i++) {
218 continue;
223 }
226 for (j = 0, e = 0; j < 256; j++) {
231 freqs1[j] = e;
233 }
234 p = (e + 127) >> 7;
235 k = ((
f + e - 1) >> 7) + 1;
238 for (
i = 0;
i < k - p;
i++)
241 }
242
243 memcpy(m, &n, sizeof(n));
244
245 return 0;
246 }
247
249 {
252
255 for (
int c = 0;
c <
len;
c++)
258 }
259
261 {
262 uint16_t cnts[256] = {0};
263 uint16_t freqs[512] = {0};
266
269
272
273 for (
b =
a = 0;
b < 256;
b++) {
274 freqs[2 *
b] = cnts[
b];
275 freqs[2 *
b + 1] =
a;
277 }
278
281
287 g = freqs[2 * e + 1];
288 m->
freqs[2 *
b] = freqs[2 * e];
290 }
292 }
293
295 {
297 int c,
d, e,
f,
g, k, q, p;
298
301
302 for (
c = m->
size,
d = 256 -
c, e = 0; e <
c; e++)
304
305 for (e = 0;
d <= 2048; e++)
307
308 for (q =
d = 0,
g = q = 0;
g <
c;
g++) {
312 k = q << e;
315 n.
cnts[
g] = k - (k >> 1);
318 q = p + 1;
319 }
320
326 for (p =
f =
g = 0; p <
c; p++) {
332 }
333 }
335 }
338 n.
cnts[
c] = e - (e >> 1);
344 if (n.
cnts[32] + e > 4096)
346
348 for (
c = 0, e = n.
size - 1;
c < e;
c++) {
351 int l = n.
freqs[2 *
c + 1];
359 }
360 }
361 }
362
363 memcpy(m, &n, sizeof(n));
364
365 return 0;
366 }
367
369 {
371
375 }
376
378 {
380
382 return -1;
383
390
392 }
393
395 {
397
413 }
414
417 }
418
420 uint16_t *
a, uint16_t *
b)
421 {
422 int c,
d, e,
f,
g, q;
423
424 for (
c = 0,
d = 0, e = 0,
f = 0,
g = 0, q = m->
size;
g < q;
g++) {
425 uint32_t p = m->
freqs[2 *
g + 1];
426
428 uint32_t k = m->
freqs[2 *
g];
429
435 return 1;
436 }
437
442 }
443 }
444 }
445
448
453 } else {
456 }
457
461
465 return 0;
468 }
469
471 return 1;
472 }
473
474 static int cmpbytes(
const void *p1,
const void *p2)
475 {
476 int left = *(
const uint8_t *)p1;
477 int right = *(const uint8_t *)p2;
479 }
480
482 {
485
489 for (
i = 0;
i <
b;
i++)
492
493 memcpy(m, &n, sizeof(n));
494
495 return 0;
496 }
497
499 {
502
508 }
514 } else {
516 }
517 }
518
519 memcpy(m, &n, sizeof(n));
520
521 return 0;
522 }
523
525 {
528
532 for (
i = 0;
i <
size;
i++,
a += freqs)
536
537 return 0;
538 }
539
541 {
543
545 for (
int i = 0;
i <
size;
i++) {
549 else
551 }
552 }
553
556
559 return 0;
560 }
561
563 {
565 int c,
d, e,
f,
g, q;
566
569
571
573 d = 256 -
c + (64 *
c + 64);
574 for (e = 0;
d <= 2048; e++) {
576 }
577
580 for (
f =
d = 0;
f <
c;
f++) {
583 int l;
585
588 q = 128;
589 } else {
590 q = 64;
591 }
592 l = q << e;
594 n.
freqs[2 * p + 1] =
g << e;
596 n.
cnts[p] = l - (l >> 1);
598 q = k + 1;
599 }
603
614 }
615
616 memcpy(m, &n, sizeof(n));
617
618 return 0;
619 }
620
622 {
625
628
633
634 memcpy(m, &n, sizeof(n));
635
636 return 0;
637 }
638
640 {
642
644 for (
int i = 0;
i <
size;
i++) {
647
650 else
653 }
654 }
655
658
661
662 return 0;
663 }
664
666 {
668 int c,
d, e,
f,
g, q;
669
671
672 for (
c = 0;
c < 256;
c++) {
676 }
677
678 for (
c = m->
size,
d = (4096 - (256 -
c)) / (
c + 1) | 0, e =
d - (
d >> 1),
g = 0;
g <
c;) {
683 }
691 f = (
c +
g - 1 >> 7) + 1;
694 for (q =
c + 128 - 1 >> 7; q <
f; q++) {
696 }
698 }
699
700 memcpy(m, &n, sizeof(n));
701
702 return 0;
703 }
704
706 {
708
709 for (
int i = 0;
i <
size;
i++) {
712 }
713
715 return 0;
716
719 return 0;
720 }
721
723 {
725 if (rc->
code1 == 0x20000) {
726 rc->
code = bytestream2_get_le32(gb);
728 }
729 }
730
732 uint16_t *freqs1, uint16_t *freqs2,
733 uint16_t *cnts, uint8_t *dectable,
735 {
738 uint32_t
r, y,
a,
b, e,
g, q;
739
740 r = dectable[(rc->
code & 0xFFF
u) >> 7];
742 while (freqs2[
r + 1] <= (rc->
code & 0xFFF)) {
744 break;
745 }
746 }
747
750
754 *cntsum += 16;
755 if (*cntsum + 16 > 4096) {
756 *cntsum = 0;
757 for (
int c = 0,
i = 0;
i <
max + 1;
i++) {
763 q = ((
c - 1) >> 7) + 1;
765 for (
int j = 0; j < q -
g; j++)
767 }
768 y = e - (e >> 1);
770 *cntsum += y;
771 }
772 }
773
776
778
779 return 0;
780 }
781
783 {
785
787 for (
int b = 0;
b < m->
size;
b++)
790 }
791
793 {
796
798
802 }
803
807 for (;
c < m->
size;
g++,
c++) {
810 }
812 if (e > 4096)
814
816
817 memcpy(m, &n, sizeof(n));
818
819 return 0;
820 }
821
823 {
826 uint16_t
a = 0,
b = 0;
827 uint32_t param;
830
833 case 0:
834 *
value = bytestream2_get_byte(&
s->gb);
839 break;
840 case 1:
841 *
value = bytestream2_get_byte(&
s->gb);
844 break;
845 case 2:
846 *
value = bytestream2_get_byte(&
s->gb);
849 break;
850 case 3:
851 *
value = bytestream2_get_byte(&
s->gb);
856 break;
857 case 4:
863 break;
864 case 5:
869 break;
870 case 6:
875 }
878 break;
879 case 7:
883 }
884
887
888 return 0;
889 }
890
892 uint32_t *green, uint32_t *blue,
893 int *cx, int *cx1)
894 {
897
901
902 *cx1 = (*cx << 6) & 0xFC0;
903 *cx = *red >> 2;
904
908
909 *cx1 = (*cx << 6) & 0xFC0;
910 *cx = *green >> 2;
911
915
916 *cx1 = (*cx << 6) & 0xFC0;
917 *cx = *blue >> 2;
918
919 return 0;
920 }
921
923 {
924 rc->
code = bytestream2_get_le32(gb);
926 }
927
929 {
933 int cx = 0, cx1 = 0, k = 0;
934 int run, off, y = 0, x = 0,
ret;
935 uint32_t backstep = linesize - avctx->
width;
936 uint32_t clr = 0, lx, ly, ptype,
r,
g,
b;
937
941
942 while (k < avctx->
width + 1) {
947 s->run_model3[0].freqs[0],
948 s->run_model3[0].freqs[1],
949 s->run_model3[0].cnts,
950 s->run_model3[0].dectab, &
run);
955
956 clr = (
b << 16) + (
g << 8) +
r;
961
962 dst[y * linesize + x] = clr;
963 lx = x;
964 ly = y;
965 x++;
966 if (x >= avctx->
width) {
967 x = 0;
968 y++;
969 }
970 }
971 }
972 off = -linesize - 1;
973 ptype = 0;
974
977 s->op_model3[ptype].freqs[0],
978 s->op_model3[ptype].freqs[1],
979 s->op_model3[ptype].cnts,
980 s->op_model3[ptype].dectab, &ptype);
983 if (ptype == 0) {
987 clr = (
b << 16) + (
g << 8) +
r;
988 }
989 if (ptype > 5)
992 s->run_model3[ptype].freqs[0],
993 s->run_model3[ptype].freqs[1],
994 s->run_model3[ptype].cnts,
995 s->run_model3[ptype].dectab, &
run);
1000
1002 dst, linesize, &lx, &ly,
1003 backstep, off, &cx, &cx1);
1006 }
1007
1008 return 0;
1009 }
1010
1012 uint32_t *dst, int linesize,
1013 uint32_t *prev, int plinesize)
1014 {
1018 int backstep = linesize - avctx->
width;
1019 int mvx = 0, mvy = 0;
1020
1021 if (bytestream2_get_byte(gb) == 0)
1022 return 1;
1024
1026 s->range_model3.freqs[0],
1027 s->range_model3.freqs[1],
1028 s->range_model3.cnts,
1029 s->range_model3.dectab, &
min);
1031 s->range_model3.freqs[0],
1032 s->range_model3.freqs[1],
1033 s->range_model3.cnts,
1034 s->range_model3.dectab, &
temp);
1037
1040 s->range_model3.freqs[0],
1041 s->range_model3.freqs[1],
1042 s->range_model3.cnts,
1043 s->range_model3.dectab, &
max);
1045 s->range_model3.freqs[0],
1046 s->range_model3.freqs[1],
1047 s->range_model3.cnts,
1048 s->range_model3.dectab, &
temp);
1051
1055
1056 memset(
s->blocks, 0,
sizeof(*
s->blocks) *
s->nbcount);
1057
1059 int fill, count;
1060
1062 s->fill_model3.freqs[0],
1063 s->fill_model3.freqs[1],
1064 s->fill_model3.cnts,
1065 s->fill_model3.dectab, &fill);
1067 s->count_model3.freqs[0],
1068 s->count_model3.freqs[1],
1069 s->count_model3.cnts,
1070 s->count_model3.dectab, &count);
1073 if (count <= 0)
1075
1076 while (min < s->nbcount && count-- > 0) {
1077 s->blocks[
min++] = fill;
1078 }
1079 }
1080
1084
1085 for (y = 0; y <
s->nby; y++) {
1086 for (x = 0; x <
s->nbx; x++) {
1087 int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
1088
1089 if (
s->blocks[y *
s->nbx + x] == 0)
1090 continue;
1091
1092 if (((
s->blocks[y *
s->nbx + x] + 1) & 1) > 0) {
1094 s->sxy_model3[0].freqs[0],
1095 s->sxy_model3[0].freqs[1],
1096 s->sxy_model3[0].cnts,
1097 s->sxy_model3[0].dectab, &sx1);
1099 s->sxy_model3[1].freqs[0],
1100 s->sxy_model3[1].freqs[1],
1101 s->sxy_model3[1].cnts,
1102 s->sxy_model3[1].dectab, &sy1);
1104 s->sxy_model3[2].freqs[0],
1105 s->sxy_model3[2].freqs[1],
1106 s->sxy_model3[2].cnts,
1107 s->sxy_model3[2].dectab, &sx2);
1109 s->sxy_model3[3].freqs[0],
1110 s->sxy_model3[3].freqs[1],
1111 s->sxy_model3[3].cnts,
1112 s->sxy_model3[3].dectab, &sy2);
1115
1116 sx2++;
1117 sy2++;
1118 }
1119 if (((
s->blocks[y *
s->nbx + x] + 3) & 2) > 0) {
1120 int i,
a,
b,
c, j, by = y * 16, bx = x * 16;
1122
1123 a =
s->rc.code & 0xFFF;
1125
1131
1132 code =
a + ((
s->rc.code >> 1) & 0xFFFFF800) -
b;
1134 code = bytestream2_get_byteu(gb) | (
code << 8);
1136
1138
1141 s->mv_model3[0].freqs[0],
1142 s->mv_model3[0].freqs[1],
1143 s->mv_model3[0].cnts,
1144 s->mv_model3[0].dectab, &mvx);
1146 s->mv_model3[1].freqs[0],
1147 s->mv_model3[1].freqs[1],
1148 s->mv_model3[1].cnts,
1149 s->mv_model3[1].dectab, &mvy);
1152
1153 mvx -= 256;
1154 mvy -= 256;
1155 }
1156
1157 if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 ||
1158 by + mvy + sy1 >= avctx->
height || bx + mvx + sx1 >= avctx->
width)
1160
1161 for (
i = 0;
i < sy2 - sy1 && (by + sy1 +
i) < avctx->
height && (by + mvy + sy1 +
i) < avctx->
height;
i++) {
1162 for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->
width && (bx + mvx + sx1 + j) < avctx->
width; j++) {
1163 dst[(by +
i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 +
i) * plinesize + bx + sx1 + mvx + j];
1164 }
1165 }
1166 } else {
1167 int run, bx = x * 16 + sx1, by = y * 16 + sy1;
1168 uint32_t clr, ptype = 0,
r,
g,
b;
1169
1170 if (bx >= avctx->
width)
1172
1173 for (; by < y * 16 + sy2 && by < avctx->
height;) {
1175 s->op_model3[ptype].freqs[0],
1176 s->op_model3[ptype].freqs[1],
1177 s->op_model3[ptype].cnts,
1178 s->op_model3[ptype].dectab, &ptype);
1181 if (ptype == 0) {
1185
1186 clr = (
b << 16) + (
g << 8) +
r;
1187 }
1188 if (ptype > 5)
1191 s->run_model3[ptype].freqs[0],
1192 s->run_model3[ptype].freqs[1],
1193 s->run_model3[ptype].cnts,
1194 s->run_model3[ptype].dectab, &
run);
1199
1201 dst, prev, linesize, plinesize, &bx, &by,
1202 backstep, sx1, sx2, &cx, &cx1);
1205 }
1206 }
1207 }
1208 }
1209
1210 return 0;
1211 }
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left