You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1226 lines
33KB

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