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++)
46 dectab[q] = d;
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;
155 rccode >>= d;
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;
232 cnts[j] = d;
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++)
306 d <<= 1;
307
308 for (q = d = 0,
g = q = 0;
g <
c;
g++) {
310 d = d + (p - q);
312 k = q << e;
314 n.
freqs[2 *
g + 1] = d << e;
315 n.
cnts[
g] = k - (k >> 1);
317 d += q;
318 q = p + 1;
319 }
320
323 d = 0;
325 d = -1;
326 for (p =
f =
g = 0; p <
c; p++) {
328 if (k > d && k <
value) {
329 d = k;
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
438 if (p >= d) {
440 d = p;
442 }
443 }
444 }
445
448
453 } else {
456 }
457
461
465 return 0;
470 }
471
473 return 1;
474 }
475
476 static int cmpbytes(
const void *p1,
const void *p2)
477 {
478 int left = *(
const uint8_t *)p1;
479 int right = *(const uint8_t *)p2;
481 }
482
484 {
487
491 for (
i = 0;
i <
b;
i++)
494
495 memcpy(m, &n, sizeof(n));
496
497 return 0;
498 }
499
501 {
504
510 }
516 } else {
518 }
519 }
520
521 memcpy(m, &n, sizeof(n));
522
523 return 0;
524 }
525
527 {
530
534 for (
i = 0;
i <
size;
i++,
a += freqs)
538
539 return 0;
540 }
541
543 {
545
547 for (
int i = 0;
i <
size;
i++) {
551 else
553 }
554 }
555
558
561 return 0;
562 }
563
565 {
567 int c, d, e,
f,
g, q;
568
571
573
575 d = 256 -
c + (64 *
c + 64);
576 for (e = 0; d <= 2048; e++) {
577 d <<= 1;
578 }
579
582 for (
f = d = 0;
f <
c;
f++) {
585 int l;
587
589 d = p;
590 q = 128;
591 } else {
592 q = 64;
593 }
594 l = q << e;
596 n.
freqs[2 * p + 1] =
g << e;
598 n.
cnts[p] = l - (l >> 1);
600 q = k + 1;
601 }
605
606 if (d > 0) {
613 n.
freqs[2 * d + 1] = e;
616 }
617
618 memcpy(m, &n, sizeof(n));
619
620 return 0;
621 }
622
624 {
627
630
635
636 memcpy(m, &n, sizeof(n));
637
638 return 0;
639 }
640
642 {
644
646 for (
int i = 0;
i <
size;
i++) {
649
652 else
655 }
656 }
657
660
663
664 return 0;
665 }
666
668 {
670 int c, d, e,
f,
g, q;
671
673
674 for (
c = 0;
c < 256;
c++) {
678 }
679
680 for (
c = m->
size, d = (4096 - (256 -
c)) / (
c + 1) | 0, e = d - (d >> 1),
g = 0;
g <
c;) {
685 }
688 for (d =
c = n.
cntsum = 0; 256 > d; d++) {
689 e = d;
693 f = (
c +
g - 1 >> 7) + 1;
696 for (q =
c + 128 - 1 >> 7; q <
f; q++) {
698 }
700 }
701
702 memcpy(m, &n, sizeof(n));
703
704 return 0;
705 }
706
708 {
710
711 for (
int i = 0;
i <
size;
i++) {
714 }
715
717 return 0;
718
721 return 0;
722 }
723
725 {
727 if (rc->
code1 == 0x20000) {
728 rc->
code = bytestream2_get_le32(gb);
730 }
731 }
732
734 uint16_t *freqs1, uint16_t *freqs2,
735 uint16_t *cnts, uint8_t *dectable,
737 {
740 uint32_t
r, y,
a,
b, e,
g, q;
741
742 r = dectable[(rc->
code & 0xFFF
u) >> 7];
744 while (freqs2[
r + 1] <= (rc->
code & 0xFFF)) {
746 break;
747 }
748 }
749
752
756 *cntsum += 16;
757 if (*cntsum + 16 > 4096) {
758 *cntsum = 0;
759 for (
int c = 0,
i = 0;
i <
max + 1;
i++) {
765 q = ((
c - 1) >> 7) + 1;
767 for (
int j = 0; j < q -
g; j++)
769 }
770 y = e - (e >> 1);
772 *cntsum += y;
773 }
774 }
775
778
780
781 return 0;
782 }
783
785 {
787
789 for (
int b = 0;
b < m->
size;
b++)
792 }
793
795 {
798
800
804 }
805
809 for (;
c < m->
size;
g++,
c++) {
812 }
814 if (e > 4096)
816
818
819 memcpy(m, &n, sizeof(n));
820
821 return 0;
822 }
823
825 {
828 uint16_t
a = 0,
b = 0;
829 uint32_t param;
832
835 case 0:
836 *
value = bytestream2_get_byte(&
s->gb);
841 break;
842 case 1:
843 *
value = bytestream2_get_byte(&
s->gb);
846 break;
847 case 2:
848 *
value = bytestream2_get_byte(&
s->gb);
851 break;
852 case 3:
853 *
value = bytestream2_get_byte(&
s->gb);
858 break;
859 case 4:
865 break;
866 case 5:
871 break;
872 case 6:
880 break;
881 case 7:
885 }
886
889
890 return 0;
891 }
892
894 uint32_t *green, uint32_t *blue,
895 int *cx, int *cx1)
896 {
899
903
904 *cx1 = (*cx << 6) & 0xFC0;
905 *cx = *red >> 2;
906
910
911 *cx1 = (*cx << 6) & 0xFC0;
912 *cx = *green >> 2;
913
917
918 *cx1 = (*cx << 6) & 0xFC0;
919 *cx = *blue >> 2;
920
921 return 0;
922 }
923
925 {
926 rc->
code = bytestream2_get_le32(gb);
928 }
929
931 {
935 int cx = 0, cx1 = 0, k = 0;
936 int run, off, y = 0, x = 0,
ret;
937 uint32_t backstep = linesize - avctx->
width;
938 uint32_t clr = 0, lx, ly, ptype,
r,
g,
b;
939
943
944 while (k < avctx->
width + 1) {
949 s->run_model3[0].freqs[0],
950 s->run_model3[0].freqs[1],
951 s->run_model3[0].cnts,
952 s->run_model3[0].dectab, &
run);
957
958 clr = (
b << 16) + (
g << 8) +
r;
963
964 dst[y * linesize + x] = clr;
965 lx = x;
966 ly = y;
967 x++;
968 if (x >= avctx->
width) {
969 x = 0;
970 y++;
971 }
972 }
973 }
974 off = -linesize - 1;
975 ptype = 0;
976
979 s->op_model3[ptype].freqs[0],
980 s->op_model3[ptype].freqs[1],
981 s->op_model3[ptype].cnts,
982 s->op_model3[ptype].dectab, &ptype);
985 if (ptype == 0) {
989 clr = (
b << 16) + (
g << 8) +
r;
990 }
991 if (ptype > 5)
994 s->run_model3[ptype].freqs[0],
995 s->run_model3[ptype].freqs[1],
996 s->run_model3[ptype].cnts,
997 s->run_model3[ptype].dectab, &
run);
1002
1004 dst, linesize, &lx, &ly,
1005 backstep, off, &cx, &cx1);
1008 }
1009
1010 return 0;
1011 }
1012
1014 uint32_t *
dst,
int linesize,
1015 uint32_t *prev, int plinesize)
1016 {
1020 int backstep = linesize - avctx->
width;
1021 int mvx = 0, mvy = 0;
1022
1023 if (bytestream2_get_byte(gb) == 0)
1024 return 1;
1026
1028 s->range_model3.freqs[0],
1029 s->range_model3.freqs[1],
1030 s->range_model3.cnts,
1031 s->range_model3.dectab, &
min);
1033 s->range_model3.freqs[0],
1034 s->range_model3.freqs[1],
1035 s->range_model3.cnts,
1036 s->range_model3.dectab, &
temp);
1039
1042 s->range_model3.freqs[0],
1043 s->range_model3.freqs[1],
1044 s->range_model3.cnts,
1045 s->range_model3.dectab, &
max);
1047 s->range_model3.freqs[0],
1048 s->range_model3.freqs[1],
1049 s->range_model3.cnts,
1050 s->range_model3.dectab, &
temp);
1053
1057
1058 memset(
s->blocks, 0,
sizeof(*
s->blocks) *
s->nbcount);
1059
1061 int fill, count;
1062
1064 s->fill_model3.freqs[0],
1065 s->fill_model3.freqs[1],
1066 s->fill_model3.cnts,
1067 s->fill_model3.dectab, &fill);
1069 s->count_model3.freqs[0],
1070 s->count_model3.freqs[1],
1071 s->count_model3.cnts,
1072 s->count_model3.dectab, &count);
1075 if (count <= 0)
1077
1078 while (min < s->nbcount && count-- > 0) {
1079 s->blocks[
min++] = fill;
1080 }
1081 }
1082
1086
1087 for (y = 0; y <
s->nby; y++) {
1088 for (x = 0; x <
s->nbx; x++) {
1089 int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
1090
1091 if (
s->blocks[y *
s->nbx + x] == 0)
1092 continue;
1093
1094 if (((
s->blocks[y *
s->nbx + x] + 1) & 1) > 0) {
1096 s->sxy_model3[0].freqs[0],
1097 s->sxy_model3[0].freqs[1],
1098 s->sxy_model3[0].cnts,
1099 s->sxy_model3[0].dectab, &sx1);
1101 s->sxy_model3[1].freqs[0],
1102 s->sxy_model3[1].freqs[1],
1103 s->sxy_model3[1].cnts,
1104 s->sxy_model3[1].dectab, &sy1);
1106 s->sxy_model3[2].freqs[0],
1107 s->sxy_model3[2].freqs[1],
1108 s->sxy_model3[2].cnts,
1109 s->sxy_model3[2].dectab, &sx2);
1111 s->sxy_model3[3].freqs[0],
1112 s->sxy_model3[3].freqs[1],
1113 s->sxy_model3[3].cnts,
1114 s->sxy_model3[3].dectab, &sy2);
1117
1118 sx2++;
1119 sy2++;
1120 }
1121 if (((
s->blocks[y *
s->nbx + x] + 3) & 2) > 0) {
1122 int i,
a,
b,
c, j, by = y * 16, bx = x * 16;
1124
1125 a =
s->rc.code & 0xFFF;
1127
1133
1134 code =
a + ((
s->rc.code >> 1) & 0xFFFFF800) -
b;
1136 code = bytestream2_get_byteu(gb) | (
code << 8);
1138
1140
1143 s->mv_model3[0].freqs[0],
1144 s->mv_model3[0].freqs[1],
1145 s->mv_model3[0].cnts,
1146 s->mv_model3[0].dectab, &mvx);
1148 s->mv_model3[1].freqs[0],
1149 s->mv_model3[1].freqs[1],
1150 s->mv_model3[1].cnts,
1151 s->mv_model3[1].dectab, &mvy);
1154
1155 mvx -= 256;
1156 mvy -= 256;
1157 }
1158
1159 if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 ||
1160 by + mvy + sy1 >= avctx->
height || bx + mvx + sx1 >= avctx->
width)
1162
1163 for (
i = 0;
i < sy2 - sy1 && (by + sy1 +
i) < avctx->
height && (by + mvy + sy1 +
i) < avctx->
height;
i++) {
1164 for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->
width && (bx + mvx + sx1 + j) < avctx->
width; j++) {
1165 dst[(by +
i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 +
i) * plinesize + bx + sx1 + mvx + j];
1166 }
1167 }
1168 } else {
1169 int run, bx = x * 16 + sx1, by = y * 16 + sy1;
1170 uint32_t clr, ptype = 0,
r,
g,
b;
1171
1172 if (bx >= avctx->
width)
1174
1175 for (; by < y * 16 + sy2 && by < avctx->
height;) {
1177 s->op_model3[ptype].freqs[0],
1178 s->op_model3[ptype].freqs[1],
1179 s->op_model3[ptype].cnts,
1180 s->op_model3[ptype].dectab, &ptype);
1183 if (ptype == 0) {
1187
1188 clr = (
b << 16) + (
g << 8) +
r;
1189 }
1190 if (ptype > 5)
1193 s->run_model3[ptype].freqs[0],
1194 s->run_model3[ptype].freqs[1],
1195 s->run_model3[ptype].cnts,
1196 s->run_model3[ptype].dectab, &
run);
1201
1203 dst, prev, linesize, plinesize, &bx, &by,
1204 backstep, sx1, sx2, &cx, &cx1);
1207 }
1208 }
1209 }
1210 }
1211
1212 return 0;
1213 }
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