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, ¶m, 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