/src/ffmpeg/libavcodec/scpr3.c
Line | Count | Source |
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 | | |
27 | | #include "libavutil/qsort.h" |
28 | | |
29 | | #include "avcodec.h" |
30 | | #include "bytestream.h" |
31 | | #include "scpr.h" |
32 | | |
33 | | static void renew_table3(uint32_t nsym, uint32_t *cntsum, |
34 | | uint16_t *freqs, uint16_t *freqs1, |
35 | | uint16_t *cnts, uint8_t *dectab) |
36 | 419k | { |
37 | 419k | uint32_t a = 0, b = 4096 / nsym, c = b - (b >> 1); |
38 | | |
39 | 419k | *cntsum = c * nsym; |
40 | | |
41 | 63.8M | for (int d = 0; d < nsym; d++) { |
42 | 63.4M | freqs[d] = b; |
43 | 63.4M | freqs1[d] = a; |
44 | 63.4M | cnts[d] = c; |
45 | 76.8M | for (int q = a + 128 - 1 >> 7, f = (a + b - 1 >> 7) + 1; q < f; q++) |
46 | 13.4M | dectab[q] = d; |
47 | | |
48 | 63.4M | a += b; |
49 | 63.4M | } |
50 | 419k | } |
51 | | |
52 | | static void reinit_tables3(SCPRContext * s) |
53 | 19.9k | { |
54 | 79.9k | for (int i = 0; i < 3; i++) { |
55 | 245M | for (int j = 0; j < 4096; j++) { |
56 | 245M | PixelModel3 *m = &s->pixel_model3[i][j]; |
57 | 245M | m->type = 0; |
58 | 245M | } |
59 | 59.9k | } |
60 | | |
61 | 139k | for (int i = 0; i < 6; i++) { |
62 | 119k | renew_table3(256, &s->run_model3[i].cntsum, |
63 | 119k | s->run_model3[i].freqs[0], s->run_model3[i].freqs[1], |
64 | 119k | s->run_model3[i].cnts, s->run_model3[i].dectab); |
65 | 119k | } |
66 | | |
67 | 19.9k | renew_table3(256, &s->range_model3.cntsum, |
68 | 19.9k | s->range_model3.freqs[0], s->range_model3.freqs[1], |
69 | 19.9k | s->range_model3.cnts, s->range_model3.dectab); |
70 | | |
71 | 19.9k | renew_table3(5, &s->fill_model3.cntsum, |
72 | 19.9k | s->fill_model3.freqs[0], s->fill_model3.freqs[1], |
73 | 19.9k | s->fill_model3.cnts, s->fill_model3.dectab); |
74 | | |
75 | 19.9k | renew_table3(256, &s->count_model3.cntsum, |
76 | 19.9k | s->count_model3.freqs[0], s->count_model3.freqs[1], |
77 | 19.9k | s->count_model3.cnts, s->count_model3.dectab); |
78 | | |
79 | 99.8k | for (int i = 0; i < 4; i++) { |
80 | 79.9k | renew_table3(16, &s->sxy_model3[i].cntsum, |
81 | 79.9k | s->sxy_model3[i].freqs[0], s->sxy_model3[i].freqs[1], |
82 | 79.9k | s->sxy_model3[i].cnts, s->sxy_model3[i].dectab); |
83 | 79.9k | } |
84 | | |
85 | 59.9k | for (int i = 0; i < 2; i++) { |
86 | 39.9k | renew_table3(512, &s->mv_model3[i].cntsum, |
87 | 39.9k | s->mv_model3[i].freqs[0], s->mv_model3[i].freqs[1], |
88 | 39.9k | s->mv_model3[i].cnts, s->mv_model3[i].dectab); |
89 | 39.9k | } |
90 | | |
91 | 139k | for (int i = 0; i < 6; i++) { |
92 | 119k | renew_table3(6, &s->op_model3[i].cntsum, |
93 | 119k | s->op_model3[i].freqs[0], s->op_model3[i].freqs[1], |
94 | 119k | s->op_model3[i].cnts, s->op_model3[i].dectab); |
95 | 119k | } |
96 | 19.9k | } |
97 | | |
98 | | static int decode3(GetByteContext *gb, RangeCoder *rc, uint32_t a, uint32_t b) |
99 | 9.38M | { |
100 | 9.38M | uint32_t code = a * (rc->code >> 12) + (rc->code & 0xFFF) - b; |
101 | | |
102 | 13.8M | while (code < 0x800000 && bytestream2_get_bytes_left(gb) > 0) |
103 | 4.50M | code = bytestream2_get_byteu(gb) | (code << 8); |
104 | 9.38M | rc->code = code; |
105 | | |
106 | 9.38M | return 0; |
107 | 9.38M | } |
108 | | |
109 | | static void rescale(PixelModel3 *m, int *totfr) |
110 | 8.91k | { |
111 | 8.91k | uint32_t a; |
112 | | |
113 | 8.91k | a = 256 - m->size; |
114 | 69.3k | for (int b = 0; b < m->size; b++) { |
115 | 60.4k | m->freqs[b] -= m->freqs[b] >> 1; |
116 | 60.4k | a += m->freqs[b]; |
117 | 60.4k | } |
118 | | |
119 | 8.91k | *totfr = a; |
120 | 8.91k | } |
121 | | |
122 | | static int add_symbol(PixelModel3 *m, int index, uint32_t symbol, int *totfr, int max) |
123 | 449k | { |
124 | 449k | if (m->size == max) |
125 | 46.1k | return 0; |
126 | | |
127 | 987k | for (int c = m->size - 1; c >= index; c--) { |
128 | 583k | m->symbols[c + 1] = m->symbols[c]; |
129 | 583k | m->freqs[c + 1] = m->freqs[c]; |
130 | 583k | } |
131 | | |
132 | 403k | m->symbols[index] = symbol; |
133 | 403k | m->freqs[index] = 50; |
134 | 403k | m->size++; |
135 | | |
136 | 403k | if (m->maxpos >= index) |
137 | 196k | m->maxpos++; |
138 | | |
139 | 403k | *totfr += 50; |
140 | 403k | if (*totfr + 50 > 4096) |
141 | 983 | rescale(m, totfr); |
142 | | |
143 | 403k | return 1; |
144 | 449k | } |
145 | | |
146 | | static int decode_adaptive45(PixelModel3 *m, int rccode, uint32_t *value, |
147 | | uint16_t *a, uint16_t *b, uint32_t *c, int max) |
148 | 2.12M | { |
149 | 2.12M | uint32_t q, g, maxpos, d, e = *c, totfr = *c; |
150 | 2.12M | int ret; |
151 | | |
152 | 5.64M | for (d = 0; e <= 2048; d++) |
153 | 3.51M | e <<= 1; |
154 | 2.12M | maxpos = m->maxpos; |
155 | 2.12M | rccode >>= d; |
156 | 2.12M | *c = m->freqs[maxpos]; |
157 | 2.12M | m->freqs[maxpos] += 4096 - e >> d; |
158 | | |
159 | 5.66M | for (q = 0, g = 0, e = 0; q < m->size; q++) { |
160 | 5.54M | uint32_t f = m->symbols[q]; |
161 | 5.54M | uint32_t p = e + f - g; |
162 | 5.54M | uint32_t k = m->freqs[q]; |
163 | | |
164 | 5.54M | if (rccode < p) { |
165 | 331k | *value = rccode - e + g; |
166 | 331k | *b = rccode << d; |
167 | 331k | *a = 1 << d; |
168 | 331k | m->freqs[maxpos] = *c; |
169 | 331k | ret = add_symbol(m, q, *value, &totfr, max); |
170 | 331k | *c = totfr; |
171 | 331k | return ret; |
172 | 331k | } |
173 | | |
174 | 5.21M | if (p + k > rccode) { |
175 | 1.67M | *value = f; |
176 | 1.67M | e += *value - g; |
177 | 1.67M | *b = e << d; |
178 | 1.67M | *a = k << d; |
179 | 1.67M | m->freqs[maxpos] = *c; |
180 | 1.67M | m->freqs[q] += 50; |
181 | 1.67M | totfr += 50; |
182 | 1.67M | if ((q != maxpos) && (m->freqs[q] > m->freqs[maxpos])) |
183 | 46.5k | m->maxpos = q; |
184 | 1.67M | if (totfr + 50 > 4096) |
185 | 7.93k | rescale(m, &totfr); |
186 | 1.67M | *c = totfr; |
187 | 1.67M | return 1; |
188 | 1.67M | } |
189 | | |
190 | 3.53M | e += f - g + k; |
191 | 3.53M | g = f + 1; |
192 | 3.53M | } |
193 | | |
194 | 118k | m->freqs[maxpos] = *c; |
195 | 118k | *value = g + rccode - e; |
196 | 118k | *b = rccode << d; |
197 | 118k | *a = 1 << d; |
198 | 118k | ret = add_symbol(m, q, *value, &totfr, max); |
199 | 118k | *c = totfr; |
200 | 118k | return ret; |
201 | 2.12M | } |
202 | | |
203 | | static int update_model6_to_7(PixelModel3 *m) |
204 | 1.14k | { |
205 | 1.14k | PixelModel3 n = {0}; |
206 | 1.14k | int c, d, e, f, k, p, length, i, j, index; |
207 | 1.14k | uint16_t *freqs, *freqs1, *cnts; |
208 | | |
209 | 1.14k | n.type = 7; |
210 | | |
211 | 1.14k | length = m->length; |
212 | 1.14k | freqs = n.freqs; |
213 | 1.14k | freqs1 = n.freqs1; |
214 | 1.14k | cnts = n.cnts; |
215 | 1.14k | n.cntsum = m->cnts[length]; |
216 | 74.2k | for (i = 0; i < length; i++) { |
217 | 73.1k | if (!m->cnts[i]) |
218 | 4.94k | continue; |
219 | 68.2k | index = m->symbols[i]; |
220 | 68.2k | freqs[index] = m->freqs[2 * i]; |
221 | 68.2k | freqs1[index] = m->freqs[2 * i + 1]; |
222 | 68.2k | cnts[index] = m->cnts[i]; |
223 | 68.2k | } |
224 | 1.14k | c = 1 << m->fshift; |
225 | 1.14k | d = c - (c >> 1); |
226 | 278k | for (j = 0, e = 0; j < 256; j++) { |
227 | 278k | f = freqs[j]; |
228 | 278k | if (!f) { |
229 | 212k | f = c; |
230 | 212k | freqs[j] = c; |
231 | 212k | freqs1[j] = e; |
232 | 212k | cnts[j] = d; |
233 | 212k | } |
234 | 278k | p = (e + 127) >> 7; |
235 | 278k | k = ((f + e - 1) >> 7) + 1; |
236 | 278k | if (k > FF_ARRAY_ELEMS(n.dectab)) |
237 | 948 | return AVERROR_INVALIDDATA; |
238 | 312k | for (i = 0; i < k - p; i++) |
239 | 35.3k | n.dectab[p + i] = j; |
240 | 277k | e += f; |
241 | 277k | } |
242 | | |
243 | 195 | memcpy(m, &n, sizeof(n)); |
244 | | |
245 | 195 | return 0; |
246 | 1.14k | } |
247 | | |
248 | | static void calc_sum(PixelModel3 *m) |
249 | 7.31k | { |
250 | 7.31k | uint32_t a; |
251 | 7.31k | int len; |
252 | | |
253 | 7.31k | len = m->length; |
254 | 7.31k | a = 256 - m->size << (m->fshift > 0 ? m->fshift - 1 : 0); |
255 | 251k | for (int c = 0; c < len; c++) |
256 | 243k | a += m->cnts[c]; |
257 | 7.31k | m->cnts[len] = a; |
258 | 7.31k | } |
259 | | |
260 | | static void rescale_dec(PixelModel3 *m) |
261 | 3.16k | { |
262 | 3.16k | uint16_t cnts[256] = {0}; |
263 | 3.16k | uint16_t freqs[512] = {0}; |
264 | 3.16k | int b, c, e, g; |
265 | 3.16k | uint32_t a; |
266 | | |
267 | 813k | for (a = 1 << (0 < m->fshift ? m->fshift - 1 : 0), b = 0; b < 256; b++) |
268 | 810k | cnts[b] = a; |
269 | | |
270 | 86.4k | for (a = 0, b = m->size; a < b; a++) |
271 | 83.2k | cnts[m->symbols[a]] = m->cnts[a]; |
272 | | |
273 | 813k | for (b = a = 0; b < 256; b++) { |
274 | 810k | freqs[2 * b] = cnts[b]; |
275 | 810k | freqs[2 * b + 1] = a; |
276 | 810k | a += cnts[b]; |
277 | 810k | } |
278 | | |
279 | 3.16k | if (m->fshift > 0) |
280 | 1.28k | m->fshift--; |
281 | | |
282 | 3.16k | a = 256 - m->size << (0 < m->fshift ? m->fshift - 1 : 0); |
283 | 86.4k | for (b = 0, c = m->size; b < c; b++) { |
284 | 83.2k | m->cnts[b] -= m->cnts[b] >> 1; |
285 | 83.2k | a = a + m->cnts[b]; |
286 | 83.2k | e = m->symbols[b]; |
287 | 83.2k | g = freqs[2 * e + 1]; |
288 | 83.2k | m->freqs[2 * b] = freqs[2 * e]; |
289 | 83.2k | m->freqs[2 * b + 1] = g; |
290 | 83.2k | } |
291 | 3.16k | m->cnts[m->length] = a; |
292 | 3.16k | } |
293 | | |
294 | | static int update_model5_to_6(PixelModel3 *m, uint8_t value) |
295 | 4.69k | { |
296 | 4.69k | PixelModel3 n = {0}; |
297 | 4.69k | int c, d, e, f, g, k, q, p; |
298 | | |
299 | 4.69k | n.type = 6; |
300 | 4.69k | n.length = 32; |
301 | | |
302 | 79.8k | for (c = m->size, d = 256 - c, e = 0; e < c; e++) |
303 | 75.1k | d = d + m->freqs[e]; |
304 | | |
305 | 8.92k | for (e = 0; d <= 2048; e++) |
306 | 4.22k | d <<= 1; |
307 | | |
308 | 79.8k | for (q = d = 0, g = q = 0; g < c; g++) { |
309 | 75.1k | p = m->symbols[g]; |
310 | 75.1k | d = d + (p - q); |
311 | 75.1k | q = m->freqs[g]; |
312 | 75.1k | k = q << e; |
313 | 75.1k | n.freqs[2 * g] = k; |
314 | 75.1k | n.freqs[2 * g + 1] = d << e; |
315 | 75.1k | n.cnts[g] = k - (k >> 1); |
316 | 75.1k | n.symbols[g] = p; |
317 | 75.1k | d += q; |
318 | 75.1k | q = p + 1; |
319 | 75.1k | } |
320 | | |
321 | 4.69k | n.fshift = e; |
322 | 4.69k | e = 1 << n.fshift; |
323 | 4.69k | d = 0; |
324 | 4.69k | if (value > 0) { |
325 | 3.44k | d = -1; |
326 | 58.5k | for (p = f = g = 0; p < c; p++) { |
327 | 55.1k | k = n.symbols[p]; |
328 | 55.1k | if (k > d && k < value) { |
329 | 36.3k | d = k; |
330 | 36.3k | g = n.freqs[2 * p]; |
331 | 36.3k | f = n.freqs[2 * p + 1]; |
332 | 36.3k | } |
333 | 55.1k | } |
334 | 3.44k | d = 0 < g ? f + g + (value - d - 1 << n.fshift) : value << n.fshift; |
335 | 3.44k | } |
336 | 4.69k | n.freqs[2 * c] = e; |
337 | 4.69k | n.freqs[2 * c + 1] = d; |
338 | 4.69k | n.cnts[c] = e - (e >> 1); |
339 | 4.69k | n.symbols[c] = value; |
340 | 4.69k | n.size = c + 1; |
341 | 4.69k | e = 25 << n.fshift; |
342 | 4.69k | n.cnts[c] += e; |
343 | 4.69k | n.cnts[32] += e; |
344 | 4.69k | if (n.cnts[32] + e > 4096) |
345 | 0 | rescale_dec(&n); |
346 | | |
347 | 4.69k | calc_sum(&n); |
348 | 79.8k | for (c = 0, e = n.size - 1; c < e; c++) { |
349 | 714k | for (g = c + 1, f = n.size; g < f; g++) { |
350 | 639k | if (q = n.freqs[2 * g], k = n.freqs[2 * c], q > k) { |
351 | 19.3k | int l = n.freqs[2 * c + 1]; |
352 | 19.3k | int h = n.freqs[2 * g + 1]; |
353 | 19.3k | n.freqs[2 * c] = q; |
354 | 19.3k | n.freqs[2 * c + 1] = h; |
355 | 19.3k | n.freqs[2 * g] = k; |
356 | 19.3k | n.freqs[2 * g + 1] = l; |
357 | 19.3k | FFSWAP(uint16_t, n.cnts[c], n.cnts[g]); |
358 | 19.3k | FFSWAP(uint8_t, n.symbols[c], n.symbols[g]); |
359 | 19.3k | } |
360 | 639k | } |
361 | 75.1k | } |
362 | | |
363 | 4.69k | memcpy(m, &n, sizeof(n)); |
364 | | |
365 | 4.69k | return 0; |
366 | 4.69k | } |
367 | | |
368 | | static void grow_dec(PixelModel3 *m) |
369 | 416 | { |
370 | 416 | int a; |
371 | | |
372 | 416 | a = 2 * m->length; |
373 | 416 | m->cnts[2 * m->length] = m->cnts[m->length]; |
374 | 416 | m->length = a; |
375 | 416 | } |
376 | | |
377 | | static int add_dec(PixelModel3 *m, int sym, int f1, int f2) |
378 | 23.7k | { |
379 | 23.7k | int size; |
380 | | |
381 | 23.7k | if (m->size >= 40 || m->size >= m->length) |
382 | 1.55k | return -1; |
383 | | |
384 | 22.2k | size = m->size; |
385 | 22.2k | m->symbols[size] = sym; |
386 | 22.2k | m->freqs[2 * size] = f1; |
387 | 22.2k | m->freqs[2 * size + 1] = f2; |
388 | 22.2k | m->cnts[size] = f1 - (f1 >> 1); |
389 | 22.2k | m->size++; |
390 | | |
391 | 22.2k | return size; |
392 | 23.7k | } |
393 | | |
394 | | static void incr_cntdec(PixelModel3 *m, int a) |
395 | 246k | { |
396 | 246k | int b, len, d, e, g; |
397 | | |
398 | 246k | b = 25 << m->fshift; |
399 | 246k | len = m->length; |
400 | 246k | m->cnts[a] += b; |
401 | 246k | m->cnts[len] += b; |
402 | 246k | if (a > 0 && m->cnts[a] > m->cnts[a - 1]) { |
403 | 61.2k | FFSWAP(uint16_t, m->cnts[a], m->cnts[a - 1]); |
404 | 61.2k | d = m->freqs[2 * a]; |
405 | 61.2k | e = m->freqs[2 * a + 1]; |
406 | 61.2k | g = m->freqs[2 * (a - 1) + 1]; |
407 | 61.2k | m->freqs[2 * a] = m->freqs[2 * (a - 1)]; |
408 | 61.2k | m->freqs[2 * a + 1] = g; |
409 | 61.2k | g = a - 1; |
410 | 61.2k | m->freqs[2 * g] = d; |
411 | 61.2k | m->freqs[2 * g + 1] = e; |
412 | 61.2k | FFSWAP(uint8_t, m->symbols[a], m->symbols[a - 1]); |
413 | 61.2k | } |
414 | | |
415 | 246k | if (m->cnts[len] + b > 4096) |
416 | 3.16k | rescale_dec(m); |
417 | 246k | } |
418 | | |
419 | | static int decode_adaptive6(PixelModel3 *m, uint32_t code, uint32_t *value, |
420 | | uint16_t *a, uint16_t *b) |
421 | 247k | { |
422 | 247k | int c, d, e, f, g, q; |
423 | | |
424 | 1.79M | for (c = 0, d = 0, e = 0, f = 0, g = 0, q = m->size; g < q; g++) { |
425 | 1.77M | uint32_t p = m->freqs[2 * g + 1]; |
426 | | |
427 | 1.77M | if (p <= code) { |
428 | 1.12M | uint32_t k = m->freqs[2 * g]; |
429 | | |
430 | 1.12M | if (p + k > code) { |
431 | 223k | *value = m->symbols[g]; |
432 | 223k | *a = k; |
433 | 223k | *b = p; |
434 | 223k | incr_cntdec(m, g); |
435 | 223k | return 1; |
436 | 223k | } |
437 | | |
438 | 901k | if (p >= d) { |
439 | 405k | c = k; |
440 | 405k | d = p; |
441 | 405k | e = m->symbols[g]; |
442 | 405k | } |
443 | 901k | } |
444 | 1.77M | } |
445 | | |
446 | 23.3k | g = 1 << m->fshift; |
447 | 23.3k | q = f = 0; |
448 | | |
449 | 23.3k | if (c > 0) { |
450 | 22.8k | f = code - (d + c) >> m->fshift; |
451 | 22.8k | q = f + e + 1; |
452 | 22.8k | f = d + c + (f << m->fshift); |
453 | 22.8k | } else { |
454 | 482 | q = code >> m->fshift; |
455 | 482 | f = q << m->fshift; |
456 | 482 | } |
457 | | |
458 | 23.3k | *a = g; |
459 | 23.3k | *b = f; |
460 | 23.3k | *value = q; |
461 | | |
462 | 23.3k | c = add_dec(m, q, g, f); |
463 | 23.3k | if (c < 0) { |
464 | 1.55k | if (m->length == 64) |
465 | 1.14k | return 0; |
466 | 416 | grow_dec(m); |
467 | 416 | c = add_dec(m, q, g, f); |
468 | 416 | if (c < 0) |
469 | 0 | return AVERROR_INVALIDDATA; |
470 | 416 | } |
471 | | |
472 | 22.2k | incr_cntdec(m, c); |
473 | 22.2k | return 1; |
474 | 23.3k | } |
475 | | |
476 | | static int cmpbytes(const void *p1, const void *p2) |
477 | 423k | { |
478 | 423k | int left = *(const uint8_t *)p1; |
479 | 423k | int right = *(const uint8_t *)p2; |
480 | 423k | return FFDIFFSIGN(left, right); |
481 | 423k | } |
482 | | |
483 | | static int update_model1_to_2(PixelModel3 *m, uint32_t val) |
484 | 2.75k | { |
485 | 2.75k | PixelModel3 n = {0}; |
486 | 2.75k | int i, b; |
487 | | |
488 | 2.75k | n.type = 2; |
489 | 2.75k | n.size = m->size + 1; |
490 | 2.75k | b = m->size; |
491 | 41.3k | for (i = 0; i < b; i++) |
492 | 38.6k | n.symbols[i] = m->symbols[i]; |
493 | 2.75k | n.symbols[b] = val; |
494 | | |
495 | 2.75k | memcpy(m, &n, sizeof(n)); |
496 | | |
497 | 2.75k | return 0; |
498 | 2.75k | } |
499 | | |
500 | | static int update_model1_to_4(PixelModel3 *m, uint32_t val) |
501 | 429k | { |
502 | 429k | PixelModel3 n = {0}; |
503 | 429k | int size, i; |
504 | | |
505 | 429k | size = m->size; |
506 | 429k | n.type = 4; |
507 | 429k | n.size = size; |
508 | 997k | for (i = 0; i < n.size; i++) { |
509 | 568k | n.symbols[i] = m->symbols[i]; |
510 | 568k | } |
511 | 429k | AV_QSORT(n.symbols, size, uint8_t, cmpbytes); |
512 | 997k | for (i = 0; i < n.size; i++) { |
513 | 568k | if (val == n.symbols[i]) { |
514 | 429k | n.freqs[i] = 100; |
515 | 429k | n.maxpos = i; |
516 | 429k | } else { |
517 | 138k | n.freqs[i] = 50; |
518 | 138k | } |
519 | 568k | } |
520 | | |
521 | 429k | memcpy(m, &n, sizeof(n)); |
522 | | |
523 | 429k | return 0; |
524 | 429k | } |
525 | | |
526 | | static int update_model1_to_5(PixelModel3 *m, uint32_t val) |
527 | 10.1k | { |
528 | 10.1k | int i, size, freqs; |
529 | 10.1k | uint32_t a; |
530 | | |
531 | 10.1k | update_model1_to_4(m, val); |
532 | 10.1k | size = m->size; |
533 | 10.1k | a = 256 - size; |
534 | 65.5k | for (i = 0; i < size; i++, a += freqs) |
535 | 55.4k | freqs = m->freqs[i]; |
536 | 10.1k | m->type = 5; |
537 | 10.1k | m->cntsum = a; |
538 | | |
539 | 10.1k | return 0; |
540 | 10.1k | } |
541 | | |
542 | | static int decode_static1(PixelModel3 *m, uint32_t val) |
543 | 723k | { |
544 | 723k | uint32_t size; |
545 | | |
546 | 723k | size = m->size; |
547 | 1.52M | for (int i = 0; i < size; i++) { |
548 | 1.22M | if (val == m->symbols[i]) { |
549 | 429k | if (size <= 4) |
550 | 419k | return update_model1_to_4(m, val); |
551 | 10.1k | else |
552 | 10.1k | return update_model1_to_5(m, val); |
553 | 429k | } |
554 | 1.22M | } |
555 | | |
556 | 294k | if (size >= 14) |
557 | 2.75k | return update_model1_to_2(m, val); |
558 | | |
559 | 292k | m->symbols[size] = val; |
560 | 292k | m->size++; |
561 | 292k | return 0; |
562 | 294k | } |
563 | | |
564 | | static int update_model2_to_6(PixelModel3 *m, uint8_t value, int a4) |
565 | 2.62k | { |
566 | 2.62k | PixelModel3 n = {0}; |
567 | 2.62k | int c, d, e, f, g, q; |
568 | | |
569 | 2.62k | n.type = 6; |
570 | 2.62k | n.length = a4; |
571 | | |
572 | 2.62k | memset(n.symbols, 1u, a4); |
573 | | |
574 | 2.62k | c = m->size; |
575 | 2.62k | d = 256 - c + (64 * c + 64); |
576 | 4.86k | for (e = 0; d <= 2048; e++) { |
577 | 2.24k | d <<= 1; |
578 | 2.24k | } |
579 | | |
580 | 2.62k | g = q = 0; |
581 | 2.62k | AV_QSORT(m->symbols, c, uint8_t, cmpbytes); |
582 | 54.3k | for (f = d = 0; f < c; f++) { |
583 | 51.7k | int p = f; |
584 | 51.7k | int k = m->symbols[p]; |
585 | 51.7k | int l; |
586 | 51.7k | g = g + (k - q); |
587 | | |
588 | 51.7k | if (k == value) { |
589 | 2.62k | d = p; |
590 | 2.62k | q = 128; |
591 | 49.0k | } else { |
592 | 49.0k | q = 64; |
593 | 49.0k | } |
594 | 51.7k | l = q << e; |
595 | 51.7k | n.freqs[2 * p] = l; |
596 | 51.7k | n.freqs[2 * p + 1] = g << e; |
597 | 51.7k | n.symbols[p] = k; |
598 | 51.7k | n.cnts[p] = l - (l >> 1); |
599 | 51.7k | g += q; |
600 | 51.7k | q = k + 1; |
601 | 51.7k | } |
602 | 2.62k | n.size = c; |
603 | 2.62k | n.fshift = e; |
604 | 2.62k | calc_sum(&n); |
605 | | |
606 | 2.62k | if (d > 0) { |
607 | 1.70k | c = n.freqs[0]; |
608 | 1.70k | e = n.freqs[1]; |
609 | 1.70k | g = n.freqs[2 * d + 1]; |
610 | 1.70k | n.freqs[0] = n.freqs[2 * d]; |
611 | 1.70k | n.freqs[1] = g; |
612 | 1.70k | n.freqs[2 * d] = c; |
613 | 1.70k | n.freqs[2 * d + 1] = e; |
614 | 1.70k | FFSWAP(uint16_t, n.cnts[0], n.cnts[d]); |
615 | 1.70k | FFSWAP(uint8_t, n.symbols[0], n.symbols[d]); |
616 | 1.70k | } |
617 | | |
618 | 2.62k | memcpy(m, &n, sizeof(n)); |
619 | | |
620 | 2.62k | return 0; |
621 | 2.62k | } |
622 | | |
623 | | static int update_model2_to_3(PixelModel3 *m, uint32_t val) |
624 | 130 | { |
625 | 130 | PixelModel3 n = {0}; |
626 | 130 | uint32_t size; |
627 | | |
628 | 130 | n.type = 3; |
629 | 130 | n.size = m->size + 1; |
630 | | |
631 | 130 | size = m->size; |
632 | 8.45k | for (int i = 0; i < size; i++) |
633 | 8.32k | n.symbols[i] = m->symbols[i]; |
634 | 130 | n.symbols[size] = val; |
635 | | |
636 | 130 | memcpy(m, &n, sizeof(n)); |
637 | | |
638 | 130 | return 0; |
639 | 130 | } |
640 | | |
641 | | static int decode_static2(PixelModel3 *m, uint32_t val) |
642 | 21.5k | { |
643 | 21.5k | uint32_t size; |
644 | | |
645 | 21.5k | size = m->size; |
646 | 662k | for (int i = 0; i < size; i++) { |
647 | 643k | if (val == m->symbols[i]) { |
648 | 2.62k | int a; |
649 | | |
650 | 2.62k | if (m->size <= 32) |
651 | 2.31k | a = 32; |
652 | 303 | else |
653 | 303 | a = 64; |
654 | 2.62k | return update_model2_to_6(m, val, a); |
655 | 2.62k | } |
656 | 643k | } |
657 | | |
658 | 18.9k | if (size >= 64) |
659 | 130 | return update_model2_to_3(m, val); |
660 | | |
661 | 18.8k | m->symbols[size] = val; |
662 | 18.8k | m->size++; |
663 | | |
664 | 18.8k | return 0; |
665 | 18.9k | } |
666 | | |
667 | | static int update_model3_to_7(PixelModel3 *m, uint8_t value) |
668 | 129 | { |
669 | 129 | PixelModel3 n = {0}; |
670 | 129 | int c, d, e, f, g, q; |
671 | | |
672 | 129 | n.type = 7; |
673 | | |
674 | 33.1k | for (c = 0; c < 256; c++) { |
675 | 33.0k | d = c; |
676 | 33.0k | n.freqs[d] = 1; |
677 | 33.0k | n.cnts[d] = 1; |
678 | 33.0k | } |
679 | | |
680 | 8.99k | for (c = m->size, d = (4096 - (256 - c)) / (c + 1) | 0, e = d - (d >> 1), g = 0; g < c;) { |
681 | 8.86k | q = g++; |
682 | 8.86k | q = m->symbols[q]; |
683 | 8.86k | n.freqs[q] = d; |
684 | 8.86k | n.cnts[q] = e; |
685 | 8.86k | } |
686 | 129 | n.freqs[value] += d; |
687 | 129 | n.cnts[value] += 16; |
688 | 33.1k | for (d = c = n.cntsum = 0; 256 > d; d++) { |
689 | 33.0k | e = d; |
690 | 33.0k | n.cntsum += n.cnts[e]; |
691 | 33.0k | n.freqs1[e] = c; |
692 | 33.0k | g = n.freqs[e]; |
693 | 33.0k | f = (c + g - 1 >> 7) + 1; |
694 | 33.0k | if (f > FF_ARRAY_ELEMS(n.dectab)) |
695 | 0 | return AVERROR_INVALIDDATA; |
696 | 37.1k | for (q = c + 128 - 1 >> 7; q < f; q++) { |
697 | 4.12k | n.dectab[q] = e; |
698 | 4.12k | } |
699 | 33.0k | c += g; |
700 | 33.0k | } |
701 | | |
702 | 129 | memcpy(m, &n, sizeof(n)); |
703 | | |
704 | 129 | return 0; |
705 | 129 | } |
706 | | |
707 | | static int decode_static3(PixelModel3 *m, uint32_t val) |
708 | 628 | { |
709 | 628 | uint32_t size = m->size; |
710 | | |
711 | 36.5k | for (int i = 0; i < size; i++) { |
712 | 36.0k | if (val == m->symbols[i]) |
713 | 129 | return update_model3_to_7(m, val); |
714 | 36.0k | } |
715 | | |
716 | 499 | if (size >= 256) |
717 | 0 | return 0; |
718 | | |
719 | 499 | m->symbols[size] = val; |
720 | 499 | m->size++; |
721 | 499 | return 0; |
722 | 499 | } |
723 | | |
724 | | static void sync_code3(GetByteContext *gb, RangeCoder *rc) |
725 | 11.6M | { |
726 | 11.6M | rc->code1++; |
727 | 11.6M | if (rc->code1 == 0x20000) { |
728 | 15 | rc->code = bytestream2_get_le32(gb); |
729 | 15 | rc->code1 = 0; |
730 | 15 | } |
731 | 11.6M | } |
732 | | |
733 | | static int decode_value3(SCPRContext *s, uint32_t max, uint32_t *cntsum, |
734 | | uint16_t *freqs1, uint16_t *freqs2, |
735 | | uint16_t *cnts, uint8_t *dectable, |
736 | | uint32_t *value) |
737 | 7.01M | { |
738 | 7.01M | GetByteContext *gb = &s->gb; |
739 | 7.01M | RangeCoder *rc = &s->rc; |
740 | 7.01M | uint32_t r, y, a, b, e, g, q; |
741 | | |
742 | 7.01M | r = dectable[(rc->code & 0xFFFu) >> 7]; |
743 | 7.01M | if (r < max) { |
744 | 26.5M | while (freqs2[r + 1] <= (rc->code & 0xFFF)) { |
745 | 19.9M | if (++r >= max) |
746 | 86.9k | break; |
747 | 19.9M | } |
748 | 6.69M | } |
749 | | |
750 | 7.01M | if (r > max) |
751 | 0 | return AVERROR_INVALIDDATA; |
752 | | |
753 | 7.01M | cnts[r] += 16; |
754 | 7.01M | a = freqs1[r]; |
755 | 7.01M | b = freqs2[r]; |
756 | 7.01M | *cntsum += 16; |
757 | 7.01M | if (*cntsum + 16 > 4096) { |
758 | 43.7k | *cntsum = 0; |
759 | 5.71M | for (int c = 0, i = 0; i < max + 1; i++) { |
760 | 5.67M | e = cnts[i]; |
761 | 5.67M | freqs2[i] = c; |
762 | 5.67M | freqs1[i] = e; |
763 | 5.67M | g = (c + 127) >> 7; |
764 | 5.67M | c += e; |
765 | 5.67M | q = ((c - 1) >> 7) + 1; |
766 | 5.67M | if (q > g) { |
767 | 2.05M | for (int j = 0; j < q - g; j++) |
768 | 1.39M | dectable[j + g] = i; |
769 | 654k | } |
770 | 5.67M | y = e - (e >> 1); |
771 | 5.67M | cnts[i] = y; |
772 | 5.67M | *cntsum += y; |
773 | 5.67M | } |
774 | 43.7k | } |
775 | | |
776 | 7.01M | decode3(gb, rc, a, b); |
777 | 7.01M | sync_code3(gb, rc); |
778 | | |
779 | 7.01M | *value = r; |
780 | | |
781 | 7.01M | return 0; |
782 | 7.01M | } |
783 | | |
784 | | static void calc_sum5(PixelModel3 *m) |
785 | 41.4k | { |
786 | 41.4k | uint32_t a; |
787 | | |
788 | 41.4k | a = 256 - m->size; |
789 | 248k | for (int b = 0; b < m->size; b++) |
790 | 207k | a += m->freqs[b]; |
791 | 41.4k | m->cntsum = a; |
792 | 41.4k | } |
793 | | |
794 | | static int update_model4_to_5(PixelModel3 *m, uint32_t value) |
795 | 41.4k | { |
796 | 41.4k | PixelModel3 n = {0}; |
797 | 41.4k | int c, e, g, totfr; |
798 | | |
799 | 41.4k | n.type = 5; |
800 | | |
801 | 116k | for (c = 0, e = 0; c < m->size && m->symbols[c] < value; c++) { |
802 | 75.0k | n.symbols[c] = m->symbols[c]; |
803 | 75.0k | e += n.freqs[c] = m->freqs[c]; |
804 | 75.0k | } |
805 | | |
806 | 41.4k | g = c; |
807 | 41.4k | n.symbols[g] = value; |
808 | 41.4k | e += n.freqs[g++] = 50; |
809 | 132k | for (; c < m->size; g++, c++) { |
810 | 90.7k | n.symbols[g] = m->symbols[c]; |
811 | 90.7k | e += n.freqs[g] = m->freqs[c]; |
812 | 90.7k | } |
813 | 41.4k | n.size = m->size + 1; |
814 | 41.4k | if (e > 4096) |
815 | 0 | rescale(&n, &totfr); |
816 | | |
817 | 41.4k | calc_sum5(&n); |
818 | | |
819 | 41.4k | memcpy(m, &n, sizeof(n)); |
820 | | |
821 | 41.4k | return 0; |
822 | 41.4k | } |
823 | | |
824 | | static int decode_unit3(SCPRContext *s, PixelModel3 *m, uint32_t code, uint32_t *value) |
825 | 4.64M | { |
826 | 4.64M | GetByteContext *gb = &s->gb; |
827 | 4.64M | RangeCoder *rc = &s->rc; |
828 | 4.64M | uint16_t a = 0, b = 0; |
829 | 4.64M | uint32_t param; |
830 | 4.64M | int type; |
831 | 4.64M | int ret; |
832 | | |
833 | 4.64M | type = m->type; |
834 | 4.64M | switch (type) { |
835 | 1.51M | case 0: |
836 | 1.51M | *value = bytestream2_get_byte(&s->gb); |
837 | 1.51M | m->type = 1; |
838 | 1.51M | m->size = 1; |
839 | 1.51M | m->symbols[0] = *value; |
840 | 1.51M | sync_code3(gb, rc); |
841 | 1.51M | break; |
842 | 723k | case 1: |
843 | 723k | *value = bytestream2_get_byte(&s->gb); |
844 | 723k | decode_static1(m, *value); |
845 | 723k | sync_code3(gb, rc); |
846 | 723k | break; |
847 | 21.5k | case 2: |
848 | 21.5k | *value = bytestream2_get_byte(&s->gb); |
849 | 21.5k | decode_static2(m, *value); |
850 | 21.5k | sync_code3(gb, rc); |
851 | 21.5k | break; |
852 | 628 | case 3: |
853 | 628 | *value = bytestream2_get_byte(&s->gb); |
854 | 628 | ret = decode_static3(m, *value); |
855 | 628 | if (ret < 0) |
856 | 0 | return AVERROR_INVALIDDATA; |
857 | 628 | sync_code3(gb, rc); |
858 | 628 | break; |
859 | 1.40M | case 4: |
860 | 1.40M | param = m->freqs[0] + m->freqs[1] + m->freqs[2] + m->freqs[3] + 256 - m->size; |
861 | 1.40M | if (!decode_adaptive45(m, code, value, &a, &b, ¶m, 4)) |
862 | 41.4k | update_model4_to_5(m, *value); |
863 | 1.40M | decode3(gb, rc, a, b); |
864 | 1.40M | sync_code3(gb, rc); |
865 | 1.40M | break; |
866 | 718k | case 5: |
867 | 718k | if (!decode_adaptive45(m, code, value, &a, &b, &m->cntsum, 16)) |
868 | 4.69k | update_model5_to_6(m, *value); |
869 | 718k | decode3(gb, rc, a, b); |
870 | 718k | sync_code3(gb, rc); |
871 | 718k | break; |
872 | 247k | case 6: |
873 | 247k | ret = decode_adaptive6(m, code, value, &a, &b); |
874 | 247k | if (!ret) |
875 | 1.14k | ret = update_model6_to_7(m); |
876 | 247k | if (ret < 0) |
877 | 948 | return ret; |
878 | 246k | decode3(gb, rc, a, b); |
879 | 246k | sync_code3(gb, rc); |
880 | 246k | break; |
881 | 6.65k | case 7: |
882 | 6.65k | return decode_value3(s, 255, &m->cntsum, |
883 | 6.65k | m->freqs, m->freqs1, |
884 | 6.65k | m->cnts, m->dectab, value); |
885 | 4.64M | } |
886 | | |
887 | 4.63M | if (*value > 255) |
888 | 3.25k | return AVERROR_INVALIDDATA; |
889 | | |
890 | 4.63M | return 0; |
891 | 4.63M | } |
892 | | |
893 | | static int decode_units3(SCPRContext * s, uint32_t *red, |
894 | | uint32_t *green, uint32_t *blue, |
895 | | int *cx, int *cx1) |
896 | 1.54M | { |
897 | 1.54M | RangeCoder *rc = &s->rc; |
898 | 1.54M | int ret; |
899 | | |
900 | 1.54M | ret = decode_unit3(s, &s->pixel_model3[0][*cx + *cx1], rc->code & 0xFFF, red); |
901 | 1.54M | if (ret < 0) |
902 | 2.59k | return ret; |
903 | | |
904 | 1.54M | *cx1 = (*cx << 6) & 0xFC0; |
905 | 1.54M | *cx = *red >> 2; |
906 | | |
907 | 1.54M | ret = decode_unit3(s, &s->pixel_model3[1][*cx + *cx1], rc->code & 0xFFF, green); |
908 | 1.54M | if (ret < 0) |
909 | 837 | return ret; |
910 | | |
911 | 1.54M | *cx1 = (*cx << 6) & 0xFC0; |
912 | 1.54M | *cx = *green >> 2; |
913 | | |
914 | 1.54M | ret = decode_unit3(s, &s->pixel_model3[2][*cx + *cx1], rc->code & 0xFFF, blue); |
915 | 1.54M | if (ret < 0) |
916 | 764 | return ret; |
917 | | |
918 | 1.54M | *cx1 = (*cx << 6) & 0xFC0; |
919 | 1.54M | *cx = *blue >> 2; |
920 | | |
921 | 1.54M | return 0; |
922 | 1.54M | } |
923 | | |
924 | | static void init_rangecoder3(RangeCoder *rc, GetByteContext *gb) |
925 | 132k | { |
926 | 132k | rc->code = bytestream2_get_le32(gb); |
927 | 132k | rc->code1 = 0; |
928 | 132k | } |
929 | | |
930 | | static int decompress_i3(AVCodecContext *avctx, uint32_t *dst, int linesize) |
931 | 19.9k | { |
932 | 19.9k | SCPRContext *s = avctx->priv_data; |
933 | 19.9k | GetByteContext *gb = &s->gb; |
934 | 19.9k | RangeCoder *rc = &s->rc; |
935 | 19.9k | int cx = 0, cx1 = 0, k = 0; |
936 | 19.9k | int run, off, y = 0, x = 0, ret; |
937 | 19.9k | uint32_t backstep = linesize - avctx->width; |
938 | 19.9k | uint32_t clr = 0, lx, ly, ptype, r, g, b; |
939 | | |
940 | 19.9k | bytestream2_skip(gb, 1); |
941 | 19.9k | init_rangecoder3(rc, gb); |
942 | 19.9k | reinit_tables3(s); |
943 | | |
944 | 1.45M | while (k < avctx->width + 1) { |
945 | 1.45M | ret = decode_units3(s, &r, &g, &b, &cx, &cx1); |
946 | 1.45M | if (ret < 0) |
947 | 1.93k | return ret; |
948 | 1.45M | ret = decode_value3(s, 255, &s->run_model3[0].cntsum, |
949 | 1.45M | s->run_model3[0].freqs[0], |
950 | 1.45M | s->run_model3[0].freqs[1], |
951 | 1.45M | s->run_model3[0].cnts, |
952 | 1.45M | s->run_model3[0].dectab, &run); |
953 | 1.45M | if (ret < 0) |
954 | 0 | return ret; |
955 | 1.45M | if (run <= 0) |
956 | 11.5k | return AVERROR_INVALIDDATA; |
957 | | |
958 | 1.44M | clr = (b << 16) + (g << 8) + r; |
959 | 1.44M | k += run; |
960 | 168M | while (run-- > 0) { |
961 | 167M | if (y >= avctx->height) |
962 | 864 | return AVERROR_INVALIDDATA; |
963 | | |
964 | 167M | dst[y * linesize + x] = clr; |
965 | 167M | lx = x; |
966 | 167M | ly = y; |
967 | 167M | x++; |
968 | 167M | if (x >= avctx->width) { |
969 | 129k | x = 0; |
970 | 129k | y++; |
971 | 129k | } |
972 | 167M | } |
973 | 1.44M | } |
974 | 5.59k | off = -linesize - 1; |
975 | 5.59k | ptype = 0; |
976 | | |
977 | 52.2k | while (x < avctx->width && y < avctx->height) { |
978 | 51.6k | ret = decode_value3(s, 5, &s->op_model3[ptype].cntsum, |
979 | 51.6k | s->op_model3[ptype].freqs[0], |
980 | 51.6k | s->op_model3[ptype].freqs[1], |
981 | 51.6k | s->op_model3[ptype].cnts, |
982 | 51.6k | s->op_model3[ptype].dectab, &ptype); |
983 | 51.6k | if (ret < 0) |
984 | 0 | return ret; |
985 | 51.6k | if (ptype == 0) { |
986 | 27.9k | ret = decode_units3(s, &r, &g, &b, &cx, &cx1); |
987 | 27.9k | if (ret < 0) |
988 | 292 | return ret; |
989 | 27.6k | clr = (b << 16) + (g << 8) + r; |
990 | 27.6k | } |
991 | 51.3k | if (ptype > 5) |
992 | 0 | return AVERROR_INVALIDDATA; |
993 | 51.3k | ret = decode_value3(s, 255, &s->run_model3[ptype].cntsum, |
994 | 51.3k | s->run_model3[ptype].freqs[0], |
995 | 51.3k | s->run_model3[ptype].freqs[1], |
996 | 51.3k | s->run_model3[ptype].cnts, |
997 | 51.3k | s->run_model3[ptype].dectab, &run); |
998 | 51.3k | if (ret < 0) |
999 | 0 | return ret; |
1000 | 51.3k | if (run <= 0) |
1001 | 3.93k | return AVERROR_INVALIDDATA; |
1002 | | |
1003 | 47.4k | ret = decode_run_i(avctx, ptype, run, &x, &y, clr, |
1004 | 47.4k | dst, linesize, &lx, &ly, |
1005 | 47.4k | backstep, off, &cx, &cx1); |
1006 | 47.4k | if (ret < 0) |
1007 | 717 | return ret; |
1008 | 47.4k | } |
1009 | | |
1010 | 655 | return 0; |
1011 | 5.59k | } |
1012 | | |
1013 | | static int decompress_p3(AVCodecContext *avctx, |
1014 | | uint32_t *dst, int linesize, |
1015 | | uint32_t *prev, int plinesize) |
1016 | 117k | { |
1017 | 117k | SCPRContext *s = avctx->priv_data; |
1018 | 117k | GetByteContext *gb = &s->gb; |
1019 | 117k | int ret, temp, min, max, x, y, cx = 0, cx1 = 0; |
1020 | 117k | int backstep = linesize - avctx->width; |
1021 | 117k | int mvx = 0, mvy = 0; |
1022 | | |
1023 | 117k | if (bytestream2_get_byte(gb) == 0) |
1024 | 5.08k | return 1; |
1025 | 112k | init_rangecoder3(&s->rc, gb); |
1026 | | |
1027 | 112k | ret = decode_value3(s, 255, &s->range_model3.cntsum, |
1028 | 112k | s->range_model3.freqs[0], |
1029 | 112k | s->range_model3.freqs[1], |
1030 | 112k | s->range_model3.cnts, |
1031 | 112k | s->range_model3.dectab, &min); |
1032 | 112k | ret |= decode_value3(s, 255, &s->range_model3.cntsum, |
1033 | 112k | s->range_model3.freqs[0], |
1034 | 112k | s->range_model3.freqs[1], |
1035 | 112k | s->range_model3.cnts, |
1036 | 112k | s->range_model3.dectab, &temp); |
1037 | 112k | if (ret < 0) |
1038 | 0 | return ret; |
1039 | | |
1040 | 112k | min += temp << 8; |
1041 | 112k | ret |= decode_value3(s, 255, &s->range_model3.cntsum, |
1042 | 112k | s->range_model3.freqs[0], |
1043 | 112k | s->range_model3.freqs[1], |
1044 | 112k | s->range_model3.cnts, |
1045 | 112k | s->range_model3.dectab, &max); |
1046 | 112k | ret |= decode_value3(s, 255, &s->range_model3.cntsum, |
1047 | 112k | s->range_model3.freqs[0], |
1048 | 112k | s->range_model3.freqs[1], |
1049 | 112k | s->range_model3.cnts, |
1050 | 112k | s->range_model3.dectab, &temp); |
1051 | 112k | if (ret < 0) |
1052 | 0 | return ret; |
1053 | | |
1054 | 112k | max += temp << 8; |
1055 | 112k | if (min > max || min >= s->nbcount) |
1056 | 40.3k | return AVERROR_INVALIDDATA; |
1057 | | |
1058 | 72.1k | memset(s->blocks, 0, sizeof(*s->blocks) * s->nbcount); |
1059 | | |
1060 | 1.46M | while (min <= max) { |
1061 | 1.43M | int fill, count; |
1062 | | |
1063 | 1.43M | ret = decode_value3(s, 4, &s->fill_model3.cntsum, |
1064 | 1.43M | s->fill_model3.freqs[0], |
1065 | 1.43M | s->fill_model3.freqs[1], |
1066 | 1.43M | s->fill_model3.cnts, |
1067 | 1.43M | s->fill_model3.dectab, &fill); |
1068 | 1.43M | ret |= decode_value3(s, 255, &s->count_model3.cntsum, |
1069 | 1.43M | s->count_model3.freqs[0], |
1070 | 1.43M | s->count_model3.freqs[1], |
1071 | 1.43M | s->count_model3.cnts, |
1072 | 1.43M | s->count_model3.dectab, &count); |
1073 | 1.43M | if (ret < 0) |
1074 | 0 | return ret; |
1075 | 1.43M | if (count <= 0) |
1076 | 35.5k | return AVERROR_INVALIDDATA; |
1077 | | |
1078 | 24.4M | while (min < s->nbcount && count-- > 0) { |
1079 | 23.0M | s->blocks[min++] = fill; |
1080 | 23.0M | } |
1081 | 1.39M | } |
1082 | | |
1083 | 36.5k | ret = av_frame_copy(s->current_frame, s->last_frame); |
1084 | 36.5k | if (ret < 0) |
1085 | 853 | return ret; |
1086 | | |
1087 | 21.7M | for (y = 0; y < s->nby; y++) { |
1088 | 315M | for (x = 0; x < s->nbx; x++) { |
1089 | 293M | int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16; |
1090 | | |
1091 | 293M | if (s->blocks[y * s->nbx + x] == 0) |
1092 | 293M | continue; |
1093 | | |
1094 | 422k | if (((s->blocks[y * s->nbx + x] + 1) & 1) > 0) { |
1095 | 394k | ret = decode_value3(s, 15, &s->sxy_model3[0].cntsum, |
1096 | 394k | s->sxy_model3[0].freqs[0], |
1097 | 394k | s->sxy_model3[0].freqs[1], |
1098 | 394k | s->sxy_model3[0].cnts, |
1099 | 394k | s->sxy_model3[0].dectab, &sx1); |
1100 | 394k | ret |= decode_value3(s, 15, &s->sxy_model3[1].cntsum, |
1101 | 394k | s->sxy_model3[1].freqs[0], |
1102 | 394k | s->sxy_model3[1].freqs[1], |
1103 | 394k | s->sxy_model3[1].cnts, |
1104 | 394k | s->sxy_model3[1].dectab, &sy1); |
1105 | 394k | ret |= decode_value3(s, 15, &s->sxy_model3[2].cntsum, |
1106 | 394k | s->sxy_model3[2].freqs[0], |
1107 | 394k | s->sxy_model3[2].freqs[1], |
1108 | 394k | s->sxy_model3[2].cnts, |
1109 | 394k | s->sxy_model3[2].dectab, &sx2); |
1110 | 394k | ret |= decode_value3(s, 15, &s->sxy_model3[3].cntsum, |
1111 | 394k | s->sxy_model3[3].freqs[0], |
1112 | 394k | s->sxy_model3[3].freqs[1], |
1113 | 394k | s->sxy_model3[3].cnts, |
1114 | 394k | s->sxy_model3[3].dectab, &sy2); |
1115 | 394k | if (ret < 0) |
1116 | 0 | return ret; |
1117 | | |
1118 | 394k | sx2++; |
1119 | 394k | sy2++; |
1120 | 394k | } |
1121 | 422k | if (((s->blocks[y * s->nbx + x] + 3) & 2) > 0) { |
1122 | 38.8k | int i, a, b, c, j, by = y * 16, bx = x * 16; |
1123 | 38.8k | uint32_t code; |
1124 | | |
1125 | 38.8k | a = s->rc.code & 0xFFF; |
1126 | 38.8k | c = 1; |
1127 | | |
1128 | 38.8k | if (a < 0x800) |
1129 | 27.9k | c = 0; |
1130 | 38.8k | b = 2048; |
1131 | 38.8k | if (!c) |
1132 | 27.9k | b = 0; |
1133 | | |
1134 | 38.8k | code = a + ((s->rc.code >> 1) & 0xFFFFF800) - b; |
1135 | 42.3k | while (code < 0x800000 && bytestream2_get_bytes_left(gb) > 0) |
1136 | 3.46k | code = bytestream2_get_byteu(gb) | (code << 8); |
1137 | 38.8k | s->rc.code = code; |
1138 | | |
1139 | 38.8k | sync_code3(gb, &s->rc); |
1140 | | |
1141 | 38.8k | if (!c) { |
1142 | 27.9k | ret = decode_value3(s, 511, &s->mv_model3[0].cntsum, |
1143 | 27.9k | s->mv_model3[0].freqs[0], |
1144 | 27.9k | s->mv_model3[0].freqs[1], |
1145 | 27.9k | s->mv_model3[0].cnts, |
1146 | 27.9k | s->mv_model3[0].dectab, &mvx); |
1147 | 27.9k | ret |= decode_value3(s, 511, &s->mv_model3[1].cntsum, |
1148 | 27.9k | s->mv_model3[1].freqs[0], |
1149 | 27.9k | s->mv_model3[1].freqs[1], |
1150 | 27.9k | s->mv_model3[1].cnts, |
1151 | 27.9k | s->mv_model3[1].dectab, &mvy); |
1152 | 27.9k | if (ret < 0) |
1153 | 0 | return ret; |
1154 | | |
1155 | 27.9k | mvx -= 256; |
1156 | 27.9k | mvy -= 256; |
1157 | 27.9k | } |
1158 | | |
1159 | 38.8k | if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 || |
1160 | 34.8k | by + mvy + sy1 >= avctx->height || bx + mvx + sx1 >= avctx->width) |
1161 | 7.03k | return AVERROR_INVALIDDATA; |
1162 | | |
1163 | 147k | for (i = 0; i < sy2 - sy1 && (by + sy1 + i) < avctx->height && (by + mvy + sy1 + i) < avctx->height; i++) { |
1164 | 1.26M | for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->width && (bx + mvx + sx1 + j) < avctx->width; j++) { |
1165 | 1.15M | dst[(by + i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 + i) * plinesize + bx + sx1 + mvx + j]; |
1166 | 1.15M | } |
1167 | 115k | } |
1168 | 383k | } else { |
1169 | 383k | int run, bx = x * 16 + sx1, by = y * 16 + sy1; |
1170 | 383k | uint32_t clr = 0, ptype = 0, r, g, b; |
1171 | | |
1172 | 383k | if (bx >= avctx->width) |
1173 | 1.90k | return AVERROR_INVALIDDATA; |
1174 | | |
1175 | 616k | for (; by < y * 16 + sy2 && by < avctx->height;) { |
1176 | 253k | ret = decode_value3(s, 5, &s->op_model3[ptype].cntsum, |
1177 | 253k | s->op_model3[ptype].freqs[0], |
1178 | 253k | s->op_model3[ptype].freqs[1], |
1179 | 253k | s->op_model3[ptype].cnts, |
1180 | 253k | s->op_model3[ptype].dectab, &ptype); |
1181 | 253k | if (ret < 0) |
1182 | 0 | return ret; |
1183 | 253k | if (ptype == 0) { |
1184 | 67.3k | ret = decode_units3(s, &r, &g, &b, &cx, &cx1); |
1185 | 67.3k | if (ret < 0) |
1186 | 1.97k | return ret; |
1187 | | |
1188 | 65.3k | clr = (b << 16) + (g << 8) + r; |
1189 | 65.3k | } |
1190 | 251k | if (ptype > 5) |
1191 | 0 | return AVERROR_INVALIDDATA; |
1192 | 251k | ret = decode_value3(s, 255, &s->run_model3[ptype].cntsum, |
1193 | 251k | s->run_model3[ptype].freqs[0], |
1194 | 251k | s->run_model3[ptype].freqs[1], |
1195 | 251k | s->run_model3[ptype].cnts, |
1196 | 251k | s->run_model3[ptype].dectab, &run); |
1197 | 251k | if (ret < 0) |
1198 | 0 | return ret; |
1199 | 251k | if (run <= 0) |
1200 | 5.92k | return AVERROR_INVALIDDATA; |
1201 | | |
1202 | 245k | ret = decode_run_p(avctx, ptype, run, x, y, clr, |
1203 | 245k | dst, prev, linesize, plinesize, &bx, &by, |
1204 | 245k | backstep, sx1, sx2, &cx, &cx1); |
1205 | 245k | if (ret < 0) |
1206 | 10.7k | return ret; |
1207 | 245k | } |
1208 | 381k | } |
1209 | 422k | } |
1210 | 21.7M | } |
1211 | | |
1212 | 8.15k | return 0; |
1213 | 35.7k | } |