1 /*
2 * MobiClip Video decoder
3 * Copyright (c) 2015-2016 Florian Nouwt
4 * Copyright (c) 2017 Adib Surani
5 * Copyright (c) 2020 Paul B Mahol
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 #include <inttypes.h>
25
28
35
36 #define MOBI_RL_VLC_BITS 12
37 #define MOBI_MV_VLC_BITS 6
38
40 {
41 0x00, 0x04, 0x01, 0x02, 0x05, 0x08, 0x0C, 0x09, 0x06, 0x03, 0x07, 0x0A,
42 0x0D, 0x0E, 0x0B, 0x0F
43 };
44
46 {
47 { 10, 13, 13, 10, 16, 10, 13, 13, 13, 13, 16, 10, 16, 13, 13, 16 },
48 { 11, 14, 14, 11, 18, 11, 14, 14, 14, 14, 18, 11, 18, 14, 14, 18 },
49 { 13, 16, 16, 13, 20, 13, 16, 16, 16, 16, 20, 13, 20, 16, 16, 20 },
50 { 14, 18, 18, 14, 23, 14, 18, 18, 18, 18, 23, 14, 23, 18, 18, 23 },
51 { 16, 20, 20, 16, 25, 16, 20, 20, 20, 20, 25, 16, 25, 20, 20, 25 },
52 { 18, 23, 23, 18, 29, 18, 23, 23, 23, 23, 29, 18, 29, 23, 23, 29 },
53 };
54
56 {
57 { 20, 19, 19, 25, 18, 25, 19, 24, 24, 19, 20, 18, 32, 18, 20, 19, 19, 24, 24, 19, 19, 25, 18, 25, 18, 25, 18, 25, 19, 24, 24, 19,
58 19, 24, 24, 19, 18, 32, 18, 20, 18, 32, 18, 24, 24, 19, 19, 24, 24, 18, 25, 18, 25, 18, 19, 24, 24, 19, 18, 32, 18, 24, 24, 18,},
59 { 22, 21, 21, 28, 19, 28, 21, 26, 26, 21, 22, 19, 35, 19, 22, 21, 21, 26, 26, 21, 21, 28, 19, 28, 19, 28, 19, 28, 21, 26, 26, 21,
60 21, 26, 26, 21, 19, 35, 19, 22, 19, 35, 19, 26, 26, 21, 21, 26, 26, 19, 28, 19, 28, 19, 21, 26, 26, 21, 19, 35, 19, 26, 26, 19,},
61 { 26, 24, 24, 33, 23, 33, 24, 31, 31, 24, 26, 23, 42, 23, 26, 24, 24, 31, 31, 24, 24, 33, 23, 33, 23, 33, 23, 33, 24, 31, 31, 24,
62 24, 31, 31, 24, 23, 42, 23, 26, 23, 42, 23, 31, 31, 24, 24, 31, 31, 23, 33, 23, 33, 23, 24, 31, 31, 24, 23, 42, 23, 31, 31, 23,},
63 { 28, 26, 26, 35, 25, 35, 26, 33, 33, 26, 28, 25, 45, 25, 28, 26, 26, 33, 33, 26, 26, 35, 25, 35, 25, 35, 25, 35, 26, 33, 33, 26,
64 26, 33, 33, 26, 25, 45, 25, 28, 25, 45, 25, 33, 33, 26, 26, 33, 33, 25, 35, 25, 35, 25, 26, 33, 33, 26, 25, 45, 25, 33, 33, 25,},
65 { 32, 30, 30, 40, 28, 40, 30, 38, 38, 30, 32, 28, 51, 28, 32, 30, 30, 38, 38, 30, 30, 40, 28, 40, 28, 40, 28, 40, 30, 38, 38, 30,
66 30, 38, 38, 30, 28, 51, 28, 32, 28, 51, 28, 38, 38, 30, 30, 38, 38, 28, 40, 28, 40, 28, 30, 38, 38, 30, 28, 51, 28, 38, 38, 28,},
67 { 36, 34, 34, 46, 32, 46, 34, 43, 43, 34, 36, 32, 58, 32, 36, 34, 34, 43, 43, 34, 34, 46, 32, 46, 32, 46, 32, 46, 34, 43, 43, 34,
68 34, 43, 43, 34, 32, 58, 32, 36, 32, 58, 32, 43, 43, 34, 34, 43, 43, 32, 46, 32, 46, 32, 34, 43, 43, 34, 32, 58, 32, 43, 43, 32,},
69 };
70
72 {
73 15, 0, 2, 1, 4, 8, 12, 3, 11, 13, 14, 7, 10, 5, 9, 6,
74 };
75
77 {
78 0, 4, 1, 8, 2, 12, 3, 5, 10, 15, 7, 13, 14, 11, 9, 6,
79 };
80
82 {
83 0x00, 0x1F, 0x3F, 0x0F, 0x08, 0x04, 0x02, 0x01, 0x0B, 0x0E, 0x1B, 0x0D,
84 0x03, 0x07, 0x0C, 0x17, 0x1D, 0x0A, 0x1E, 0x05, 0x10, 0x2F, 0x37, 0x3B,
85 0x13, 0x3D, 0x3E, 0x09, 0x1C, 0x06, 0x15, 0x1A, 0x33, 0x11, 0x12, 0x14,
86 0x18, 0x20, 0x3C, 0x35, 0x19, 0x16, 0x3A, 0x30, 0x31, 0x32, 0x27, 0x34,
87 0x2B, 0x2D, 0x39, 0x38, 0x23, 0x36, 0x2E, 0x21, 0x25, 0x22, 0x24, 0x2C,
88 0x2A, 0x28, 0x29, 0x26,
89 };
90
92 {
93 0x00, 0x0F, 0x04, 0x01, 0x08, 0x02, 0x0C, 0x03, 0x05, 0x0A, 0x0D, 0x07, 0x0E, 0x0B, 0x1F, 0x09,
94 0x06, 0x10, 0x3F, 0x1E, 0x17, 0x1D, 0x1B, 0x1C, 0x13, 0x18, 0x1A, 0x12, 0x11, 0x14, 0x15, 0x20,
95 0x2F, 0x16, 0x19, 0x37, 0x3D, 0x3E, 0x3B, 0x3C, 0x33, 0x35, 0x21, 0x24, 0x22, 0x28, 0x23, 0x2C,
96 0x30, 0x27, 0x2D, 0x25, 0x3A, 0x2B, 0x2E, 0x2A, 0x31, 0x34, 0x38, 0x32, 0x29, 0x26, 0x39, 0x36
97 };
98
100 {
101 {
102 12, 6, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
105 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 1, 27, 11, 7, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
107 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
108 1, 41, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
109 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
110 },
111 {
112 27, 10, 5, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 8, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 1, 15, 10, 8, 4, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
117 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
118 1, 21, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
119 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
120 },
121 };
122
124 9, 11, 11, 11, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
125 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12,
126 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 10, 10, 9,
127 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
128 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
129 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6,
130 6, 6, 6, 6, 6, 6, 5, 5, 5, 4, 2, 3, 4, 4,
131 };
132
134 0x0, 0x822, 0x803, 0xB, 0xA, 0xB81, 0xB61, 0xB41, 0xB21, 0x122,
135 0x102, 0xE2, 0xC2, 0xA2, 0x63, 0x43, 0x24, 0xC, 0x25, 0x2E1, 0x301,
136 0xBA1, 0xBC1, 0xBE1, 0xC01, 0x26, 0x44, 0x83, 0xA3, 0xC3, 0x142,
137 0x321, 0x341, 0xC21, 0xC41, 0xC61, 0xC81, 0xCA1, 0xCC1, 0xCE1, 0xD01,
138 0x0, 0x9, 0x8, 0xB01, 0xAE1, 0xAC1, 0xAA1, 0xA81, 0xA61, 0xA41, 0xA21,
139 0x802, 0x2C1, 0x2A1, 0x281, 0x261, 0x241, 0x221, 0x201, 0x1E1, 0x82,
140 0x62, 0x7, 0x6, 0xA01, 0x9E1, 0x9C1, 0x9A1, 0x981, 0x961, 0x941, 0x921,
141 0x1C1, 0x1A1, 0x42, 0x23, 0x5, 0x901, 0x8E1, 0x8C1, 0x8A1, 0x181, 0x161,
142 0x141, 0x4, 0x881, 0x861, 0x841, 0x821, 0x121, 0x101, 0xE1, 0xC1, 0x22,
143 0x3, 0xA1, 0x81, 0x61, 0x801, 0x1, 0x21, 0x41, 0x2,
144 };
145
147 0x0, 0x807, 0x806, 0x16, 0x15, 0x842, 0x823, 0x805, 0x1A1, 0xA3, 0x102, 0x83,
148 0x64, 0x44, 0x27, 0x14, 0x13, 0x17, 0x18, 0x28, 0x122, 0x862, 0x882, 0x9E1, 0xA01,
149 0x19, 0x1A, 0x1B, 0x29, 0xC3, 0x2A, 0x45, 0xE3, 0x1C1, 0x808, 0x8A2, 0x8C2, 0xA21,
150 0xA41, 0xA61, 0xA81, 0x0, 0x12, 0x11, 0x9C1, 0x9A1, 0x981, 0x961, 0x941, 0x822, 0x804,
151 0x181, 0x161, 0xE2, 0xC2, 0xA2, 0x63, 0x43, 0x26, 0x25, 0x10, 0x82, 0xF, 0xE, 0xD, 0x901,
152 0x8E1, 0x8C1, 0x803, 0x141, 0x121, 0x101, 0x921, 0x62, 0x24, 0xC, 0xB, 0xA, 0x881, 0x861,
153 0xC1, 0x8A1, 0xE1, 0x42, 0x23, 0x9, 0x802, 0xA1, 0x841, 0x821, 0x81, 0x61, 0x8, 0x7, 0x22,
154 0x6, 0x41, 0x5, 0x4, 0x801, 0x1, 0x2, 0x21, 0x3,
155 };
156
158 {
159 10, 8, 8, 7, 8, 8, 8, 7, 8, 8, 8, 7, 7, 7, 7, 6,
160 };
161
163 {
164 {
165 { 2, 3, 3, 5, 5, 4, 4, 5, 5, 2 },
166 { 2, 3, 4, 4, 3, 4, 4, 2 },
167 { 3, 4, 4, 2, 4, 4, 3, 2 },
168 { 1, 3, 4, 5, 5, 3, 3 },
169 { 2, 4, 4, 3, 3, 4, 4, 2 },
170 { 2, 3, 4, 4, 4, 4, 3, 2 },
171 { 2, 3, 4, 4, 4, 4, 3, 2 },
172 { 2, 2, 3, 4, 5, 5, 2 },
173 { 2, 3, 4, 4, 3, 4, 4, 2 },
174 { 2, 4, 4, 3, 4, 4, 3, 2 },
175 { 2, 3, 3, 5, 5, 4, 3, 2 },
176 { 2, 3, 4, 4, 3, 3, 2 },
177 { 1, 4, 4, 3, 3, 4, 4 },
178 { 2, 3, 4, 4, 3, 3, 2 },
179 { 2, 3, 4, 4, 3, 3, 2 },
180 { 3, 3, 2, 2, 3, 3 },
181 },
182 {
183 { 3, 4, 5, 5, 3, 5, 6, 6, 4, 1 },
184 { 2, 3, 4, 5, 5, 2, 3, 3 },
185 { 2, 4, 4, 3, 3, 4, 4, 2 },
186 { 1, 4, 4, 3, 4, 4, 3 },
187 { 3, 3, 2, 4, 5, 5, 3, 2 },
188 { 3, 4, 4, 3, 3, 3, 3, 2 },
189 { 1, 3, 3, 4, 4, 4, 5, 5 },
190 { 1, 4, 4, 3, 3, 4, 4 },
191 { 2, 4, 4, 3, 3, 4, 4, 2 },
192 { 1, 3, 3, 4, 4, 4, 5, 5 },
193 { 2, 3, 4, 4, 4, 4, 3, 2 },
194 { 2, 3, 3, 4, 4, 3, 2 },
195 { 1, 4, 4, 3, 3, 4, 4 },
196 { 1, 4, 4, 3, 3, 4, 4 },
197 { 2, 3, 3, 4, 4, 3, 2 },
198 { 2, 3, 3, 3, 3, 2 },
199 }
200 };
201
203 {
204 {
205 { 1, 8, 9, 4, 3, 2, 7, 5, 6, 0 },
206 { 0, 9, 5, 4, 2, 3, 8, 1 },
207 { 3, 9, 5, 0, 4, 8, 2, 1 },
208 { 1, 3, 4, 8, 5, 2, 0 },
209 { 0, 5, 4, 8, 2, 3, 9, 1 },
210 { 0, 3, 5, 9, 4, 8, 2, 1 },
211 { 0, 3, 9, 5, 8, 4, 2, 1 },
212 { 0, 2, 3, 4, 8, 5, 1 },
213 { 0, 3, 8, 4, 2, 5, 9, 1 },
214 { 2, 8, 9, 3, 5, 4, 0, 1 },
215 { 0, 4, 3, 8, 9, 5, 2, 1 },
216 { 0, 4, 8, 5, 3, 2, 1 },
217 { 1, 9, 4, 2, 0, 5, 3 },
218 { 2, 4, 9, 5, 3, 0, 1 },
219 { 0, 4, 9, 5, 3, 2, 1 },
220 { 5, 4, 1, 0, 3, 2 },
221 },
222 {
223 { 8, 2, 3, 6, 1, 7, 5, 4, 9, 0 },
224 { 9, 2, 3, 5, 4, 1, 8, 0 },
225 { 0, 5, 4, 2, 9, 3, 8, 1 },
226 { 1, 5, 4, 2, 8, 3, 0 },
227 { 2, 9, 8, 3, 5, 4, 0, 1 },
228 { 3, 5, 4, 2, 9, 8, 0, 1 },
229 { 1, 2, 0, 9, 8, 3, 5, 4 },
230 { 1, 8, 5, 2, 0, 4, 3 },
231 { 0, 5, 4, 2, 8, 3, 9, 1 },
232 { 1, 2, 0, 9, 8, 3, 5, 4 },
233 { 0, 3, 9, 8, 5, 4, 2, 1 },
234 { 0, 4, 3, 8, 5, 2, 1 },
235 { 1, 5, 4, 2, 0, 9, 3 },
236 { 1, 9, 5, 2, 0, 4, 3 },
237 { 0, 5, 3, 9, 4, 2, 1 },
238 { 0, 4, 5, 3, 2, 1 },
239 }
240 };
241
250
254
257
262
264
267
272
275
278
280 {
289 for (
int i = 0;
i < 2;
i++) {
291 for (int j = 0; j < 16; j++) {
298 }
299 }
300 }
301
303 {
306
310 }
311
313
315
320
321 for (
int i = 0;
i < 6;
i++) {
325 }
326
328
329 return 0;
330 }
331
333 {
335 int qx, qy;
336
337 if (quantizer < 12 || quantizer > 161)
339
340 s->quantizer = quantizer;
341
342 qx = quantizer % 6;
343 qy = quantizer / 6;
344
345 for (
int i = 0;
i < 16;
i++)
347
348 for (
int i = 0;
i < 64;
i++)
350
351 for (
int i = 0;
i < 20;
i++)
353
354 return 0;
355 }
356
358 {
359 unsigned a = rs[0] + rs[2];
360 unsigned b = rs[0] - rs[2];
361 unsigned c = rs[1] + ((
int)rs[3] >> 1);
362 unsigned d = ((
int)rs[1] >> 1) - rs[3];
363
368 }
369
371 {
373 unsigned x3, x2, x1, x0;
375
378 return;
379 }
380
385
387
388 e = (unsigned)arr[7] + arr[1] - arr[3] - (arr[3] >> 1);
389 f = (unsigned)arr[7] - arr[1] + arr[5] + (arr[5] >> 1);
390 g = (unsigned)arr[5] - arr[3] - arr[7] - (arr[7] >> 1);
391 h = (unsigned)arr[5] + arr[3] + arr[1] + (arr[1] >> 1);
392 x3 = (unsigned)
g + (
h >> 2);
393 x2 = (unsigned)e + (
f >> 2);
394 x1 = (e >> 2) - (
unsigned)
f;
395 x0 = (unsigned)
h - (
g >> 2);
396
397 arr[0] =
tmp[0] + x0;
398 arr[1] =
tmp[1] + x1;
399 arr[2] =
tmp[2] + x2;
400 arr[3] =
tmp[3] + x3;
401 arr[4] =
tmp[3] - x3;
402 arr[5] =
tmp[2] - x2;
403 arr[6] =
tmp[1] - x1;
404 arr[7] =
tmp[0] - x0;
405 }
406
409 {
414
415 *last = (n >> 11) == 1;
416 *
run = (n >> 5) & 0x3F;
418 }
419
421 int bx,
int by,
int size,
int plane)
422 {
425 int mat[64] = { 0 };
427 const int *qtab =
s->qtab[
size == 8];
428 uint8_t *dst =
frame->data[plane] + by *
frame->linesize[plane] + bx;
429
432
434
448 } else {
452 }
453
458 mat[ztab[
pos]] = qval *(unsigned)
level;
459
460 if (last)
461 break;
462 }
463
464 mat[0] += 32;
465 for (
int y = 0; y <
size; y++)
467
468 for (
int y = 0; y <
size; y++) {
469 for (
int x = y + 1; x <
size; x++) {
470 int a = mat[x *
size + y];
471 int b = mat[y *
size + x];
472
473 mat[y *
size + x] =
a;
474 mat[x *
size + y] =
b;
475 }
476
478 for (
int x = 0; x <
size; x++)
480 dst +=
frame->linesize[plane];
481 }
482
483 return 0;
484 }
485
487 int bx,
int by,
int size,
int plane)
488 {
492
493 if (idx == 0) {
497
498 for (int y = by; y < by + 8; y += 4) {
499 for (int x = bx; x < bx + 8; x += 4) {
504 }
506 }
507 }
508 return 0;
509 } else {
511 }
512 }
513
515 {
516 return size == 16 ? (x + 1) >> 1 : x;
517 }
518
520 {
522 int x, y;
523
524 if (
b.x == -1 &&
b.y >=
b.size) {
525 ret.x = -1,
ret.y =
b.size - 1;
526 }
else if (
b.x >= -1 &&
b.y >= -1) {
528 }
else if (
b.x == -1 &&
b.y == -2) {
530 }
else if (
b.x == -2 &&
b.y == -1) {
532 }
533
536
537 return ret.block[y *
ret.linesize + x];
538 }
539
541 {
542 return ((
a +
b) + 1) / 2;
543 }
544
546 {
547 return ((
a +
b +
b +
c) * 2 / 4 + 1) / 2;
548 }
549
551 {
553
555 }
556
558 {
560
562 }
563
565 {
567
570
572 }
573
575 {
577
580
582 }
583
585 {
587
588 if ((bxy.
x % 2) == 0) {
591
592 ba = bxy;
594 ba.
y = bxy.
y + bxy.
x / 2;
596
597 bb = bxy;
599 bb.
y = bxy.
y + bxy.
x / 2 + 1;
601
603 } else {
605
606 ba = bxy;
608 ba.
y = bxy.
y + bxy.
x / 2 + 1;
610 }
611
613 }
614
616 {
618
622
625
627
629 }
else if (bxy.
y == 0) {
631
634
636 }
else if (bxy.
x == 1) {
638
641
643 } else {
645
648
650 }
651
653 }
654
656 {
658
662
665
667
669 }
else if (bxy.
x == 0) {
671
674
676 }
else if (bxy.
y == 1) {
678
681
683 } else {
685
688
690 }
691
693 }
694
696 {
697 int clr, acc1, acc2;
699
704 return clr;
705
709 } else {
712 }
714
718 } else {
721 }
723
724 return half3(acc1, clr, acc2);
725 }
726
728 {
732
735
738
741
743
745 }
else if (bxy.
y == 1) {
748
750 }
else if (bxy.
x < bxy.
size - 1) {
753
755 }
else if (bxy.
y % 2 == 0) {
757
758 ba.
x = bxy.
y / 2 + bxy.
size - 1;
761
762 bb.
x = bxy.
y / 2 + bxy.
size;
764
766
768 } else {
769 ba.
x = bxy.
y / 2 + bxy.
size;
771
773 }
774
776 }
777
779 {
780 for (
int y = 0; y <
size; y++) {
783 }
784 }
785
787 int w,
int h,
int ax,
int ay,
789 {
791
799
800 for (
int y = 0; y <
size; y++) {
802 for (
int x = 0; x <
size; x++) {
804
806
808
809 block[ax + x + (ay + y) * linesize] =
val;
810 }
811 }
812 }
813
815 {
816 int sum = 0;
817
818 for (
int y = 0; y <
h; y++) {
819 for (
int x = 0; x <
w; x++) {
821 }
823 }
824
825 return sum;
826 }
827
829 int pmode,
int add_coeffs,
int size,
int plane)
830 {
833 int w = avctx->
width >> !!plane,
h = avctx->
height >> !!plane;
835
836 switch (pmode) {
837 case 0:
839 break;
840 case 1:
842 break;
843 case 2:
844 {
845 int arr1[16];
846 int arr2[16];
847 uint8_t *top =
frame->data[plane] +
FFMAX(ay - 1, 0) *
frame->linesize[plane] + ax;
849 int bottommost =
frame->data[plane][(ay +
size - 1) *
frame->linesize[plane] +
FFMAX(ax - 1, 0)];
850 int rightmost =
frame->data[plane][
FFMAX(ay - 1, 0) *
frame->linesize[plane] + ax +
size - 1];
856
857 for (
int x = 0; x <
size; x++) {
860 }
861
862 for (
int y = 0; y <
size; y++) {
865 }
866
868 for (
int y = 0; y <
size; y++) {
869 for (
int x = 0; x <
size; x++) {
870 block[x] = (((top[x] +
left[0] + ((arr1[x] * (y + 1) +
871 arr2[y] * (x + 1)) >> 2 *
shift)) + 1) / 2) & 0xFF;
872 }
875 }
876 }
877 break;
878 case 3:
879 {
880 uint8_t fill;
881
882 if (ax == 0 && ay == 0) {
883 fill = 0x80;
884 } else if (ax >= 1 && ay >= 1) {
889
890 fill = ((
left + top) * 2 / (2 *
size) + 1) / 2;
891 } else if (ax >= 1) {
894 } else if (ay >= 1) {
897 } else {
898 return -1;
899 }
900
903 }
904 break;
905 case 4:
907 break;
908 case 5:
910 break;
911 case 6:
913 break;
914 case 7:
916 break;
917 case 8:
919 break;
920 }
921
922 if (add_coeffs)
924
926 }
927
929 {
932 int index = (y & 0xC) | (x / 4 % 4);
933
937
940 val = x + (x >=
val ? 1 : 0);
941 }
942
946
948 }
949
951 int x, int y, int pmode, int has_coeffs, int plane)
952 {
956
957 if (!has_coeffs) {
958 if (pmode < 0)
961 }
962
966
968 if (pmode < 0)
971 } else {
973
974 for (int by = y; by < y + 8; by += 4) {
975 for (int bx = x; bx < x + 8; bx += 4) {
976 int new_pmode = pmode;
977
978 if (new_pmode < 0)
984 }
985 }
986 }
987
989 }
990
993 {
998
1001
1003
1021 } else {
1023
1024 if (pmode == 2) {
1028 pmode = 9;
1029 }
1030
1047 }
1048
1050 if (pmode_uv == 2) {
1057 pmode_uv = 9;
1058 }
1059
1067
1068 return 0;
1069 }
1070
1072 {
1073 return x == 16 ? 0 : x == 8 ? 1 : x == 4 ? 2 : x == 2 ? 3 : 0;
1074 }
1075
1078 int offsetm, int offsetx, int offsety)
1079 {
1083 int fheight = avctx->
height;
1084 int fwidth = avctx->
width;
1085
1089
1090 if (sidx < 0)
1091 sidx += 6;
1092
1096 }
1097 if (
mv.x >= INT_MAX ||
mv.y >= INT_MAX)
1099
1100 motion[offsetm].
x =
mv.x;
1101 motion[offsetm].
y =
mv.y;
1102
1103 for (
int i = 0;
i < 3;
i++) {
1104 int method, src_linesize, dst_linesize;
1106
1108 offsetx = offsetx >> 1;
1109 offsety = offsety >> 1;
1114 fwidth = fwidth >> 1;
1115 fheight = fheight >> 1;
1116 }
1117
1121 if (!
s->pic[sidx]->data[
i])
1123
1124 method = (
mv.x & 1) | ((
mv.y & 1) << 1);
1125 src_linesize =
s->pic[sidx]->linesize[
i];
1126 dst_linesize =
s->pic[
s->current_pic]->linesize[
i];
1127 dst =
s->pic[
s->current_pic]->data[
i] + offsetx + offsety * dst_linesize;
1128
1129 if (offsetx + (
mv.x >> 1) < 0 ||
1130 offsety + (
mv.y >> 1) < 0 ||
1131 offsetx +
width + (
mv.x + 1 >> 1) > fwidth ||
1132 offsety +
height + (
mv.y + 1 >> 1) > fheight)
1134
1135 switch (method) {
1136 case 0:
1137 src =
s->pic[sidx]->data[
i] + offsetx + (
mv.x >> 1) +
1138 (offsety + (
mv.y >> 1)) * src_linesize;
1139 for (
int y = 0; y <
height; y++) {
1140 for (
int x = 0; x <
width; x++)
1142 dst += dst_linesize;
1143 src += src_linesize;
1144 }
1145 break;
1146 case 1:
1147 src =
s->pic[sidx]->data[
i] + offsetx + (
mv.x >> 1) +
1148 (offsety + (
mv.y >> 1)) * src_linesize;
1149 for (
int y = 0; y <
height; y++) {
1150 for (
int x = 0; x <
width; x++) {
1151 dst[x] = (uint8_t)((
src[x] >> 1) + (
src[x + 1] >> 1));
1152 }
1153
1154 dst += dst_linesize;
1155 src += src_linesize;
1156 }
1157 break;
1158 case 2:
1159 src =
s->pic[sidx]->data[
i] + offsetx + (
mv.x >> 1) +
1160 (offsety + (
mv.y >> 1)) * src_linesize;
1161 for (
int y = 0; y <
height; y++) {
1162 for (
int x = 0; x <
width; x++) {
1163 dst[x] = (uint8_t)((
src[x] >> 1) + (
src[x + src_linesize] >> 1));
1164 }
1165
1166 dst += dst_linesize;
1167 src += src_linesize;
1168 }
1169 break;
1170 case 3:
1171 src =
s->pic[sidx]->data[
i] + offsetx + (
mv.x >> 1) +
1172 (offsety + (
mv.y >> 1)) * src_linesize;
1173 for (
int y = 0; y <
height; y++) {
1174 for (
int x = 0; x <
width; x++) {
1175 dst[x] = (uint8_t)((((
src[x] >> 1) + (
src[x + 1] >> 1)) >> 1) +
1176 (((
src[x + src_linesize] >> 1) + (
src[x + 1 + src_linesize] >> 1)) >> 1));
1177 }
1178
1179 dst += dst_linesize;
1180 src += src_linesize;
1181 }
1182 break;
1183 }
1184 }
1185 } else {
1186 int tidx;
1189
1193
1194 for (
int i = 0;
i < 2;
i++) {
1196
1199
1201 offsetm, offsetx +
i * adjx, offsety +
i * adjy);
1204 }
1205 }
1206
1207 return 0;
1208 }
1209
1212 {
1217
1220
1223
1224 s->bdsp.bswap16_buf((uint16_t *)
s->bitstream,
1227
1231
1234 frame->key_frame = 1;
1237
1241
1242 for (
int y = 0; y < avctx->
height; y += 16) {
1243 for (
int x = 0; x < avctx->
width; x += 16) {
1247 }
1248 }
1249 } else {
1251
1252 memset(motion, 0,
s->motion_size);
1253
1255 frame->key_frame = 0;
1257
1261
1262 for (
int y = 0; y < avctx->
height; y += 16) {
1263 for (
int x = 0; x < avctx->
width; x += 16) {
1264 int idx;
1265
1266 motion[0].
x =
mid_pred(motion[x / 16 + 1].x, motion[x / 16 + 2].x, motion[x / 16 + 3].x);
1267 motion[0].
y =
mid_pred(motion[x / 16 + 1].y, motion[x / 16 + 2].y, motion[x / 16 + 3].y);
1268 motion[x / 16 + 2].
x = 0;
1269 motion[x / 16 + 2].
y = 0;
1270
1273
1274 if (idx == 6 || idx == 7) {
1278 } else {
1287
1288 for (int sy = y; sy < y + 16; sy += 8) {
1289 for (int sx = x; sx < x + 16; sx += 8) {
1293 }
1294 }
1295
1301 }
1302 }
1303 }
1304 }
1305
1308
1309 s->current_pic = (
s->current_pic + 1) % 6;
1313 *got_frame = 1;
1314
1315 return 0;
1316 }
1317
1319 {
1321
1322 for (
int i = 0;
i < 6;
i++)
1324 }
1325
1327 {
1329
1331 s->bitstream_size = 0;
1334
1335 for (
int i = 0;
i < 6;
i++) {
1337 }
1338
1339 return 0;
1340 }
1341
1354 };