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