Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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, &param, 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
}