34 uint16_t *freqs, uint16_t *freqs1,
35 uint16_t *cnts, uint8_t *dectab)
37 uint32_t
a = 0,
b = 4096 / nsym,
c =
b - (
b >> 1);
41 for (
int d = 0; d < nsym; d++) {
45 for (
int q =
a + 128 - 1 >> 7,
f = (
a +
b - 1 >> 7) + 1; q <
f; q++)
54 for (
int i = 0;
i < 3;
i++) {
55 for (
int j = 0; j < 4096; j++) {
61 for (
int i = 0;
i < 6;
i++) {
63 s->run_model3[
i].freqs[0],
s->run_model3[
i].freqs[1],
64 s->run_model3[
i].cnts,
s->run_model3[
i].dectab);
68 s->range_model3.freqs[0],
s->range_model3.freqs[1],
69 s->range_model3.cnts,
s->range_model3.dectab);
72 s->fill_model3.freqs[0],
s->fill_model3.freqs[1],
73 s->fill_model3.cnts,
s->fill_model3.dectab);
76 s->count_model3.freqs[0],
s->count_model3.freqs[1],
77 s->count_model3.cnts,
s->count_model3.dectab);
79 for (
int i = 0;
i < 4;
i++) {
81 s->sxy_model3[
i].freqs[0],
s->sxy_model3[
i].freqs[1],
82 s->sxy_model3[
i].cnts,
s->sxy_model3[
i].dectab);
85 for (
int i = 0;
i < 2;
i++) {
87 s->mv_model3[
i].freqs[0],
s->mv_model3[
i].freqs[1],
88 s->mv_model3[
i].cnts,
s->mv_model3[
i].dectab);
91 for (
int i = 0;
i < 6;
i++) {
93 s->op_model3[
i].freqs[0],
s->op_model3[
i].freqs[1],
94 s->op_model3[
i].cnts,
s->op_model3[
i].dectab);
103 code = bytestream2_get_byteu(gb) | (
code << 8);
114 for (
int b = 0;
b < m->
size;
b++) {
140 if (*totfr + 50 > 4096)
147 uint16_t *
a, uint16_t *
b, uint32_t *
c,
int max)
149 uint32_t q,
g, maxpos, d, e = *
c, totfr = *
c;
152 for (d = 0; e <= 2048; d++)
157 m->
freqs[maxpos] += 4096 - e >> d;
159 for (q = 0,
g = 0, e = 0; q < m->
size; q++) {
161 uint32_t p = e +
f -
g;
162 uint32_t k = m->
freqs[q];
174 if (p + k > rccode) {
182 if ((q != maxpos) && (m->
freqs[q] > m->
freqs[maxpos]))
184 if (totfr + 50 > 4096)
206 int c, d, e,
f, k, p, length,
i, j,
index;
207 uint16_t *freqs, *freqs1, *cnts;
216 for (
i = 0;
i < length;
i++) {
226 for (j = 0, e = 0; j < 256; j++) {
235 k = ((
f + e - 1) >> 7) + 1;
238 for (
i = 0;
i < k - p;
i++)
243 memcpy(m, &n,
sizeof(n));
255 for (
int c = 0;
c <
len;
c++)
262 uint16_t cnts[256] = {0};
263 uint16_t freqs[512] = {0};
273 for (
b =
a = 0;
b < 256;
b++) {
274 freqs[2 *
b] = cnts[
b];
275 freqs[2 *
b + 1] =
a;
287 g = freqs[2 * e + 1];
288 m->
freqs[2 *
b] = freqs[2 * e];
297 int c, d, e,
f,
g, k, q, p;
302 for (
c = m->
size, d = 256 -
c, e = 0; e <
c; e++)
305 for (e = 0; d <= 2048; e++)
308 for (q = d = 0,
g = q = 0;
g <
c;
g++) {
314 n.
freqs[2 *
g + 1] = d << e;
315 n.
cnts[
g] = k - (k >> 1);
326 for (p =
f =
g = 0; p <
c; p++) {
328 if (k > d && k <
value) {
338 n.
cnts[
c] = e - (e >> 1);
344 if (n.
cnts[32] + e > 4096)
348 for (
c = 0, e = n.
size - 1;
c < e;
c++) {
351 int l = n.
freqs[2 *
c + 1];
363 memcpy(m, &n,
sizeof(n));
420 uint16_t *
a, uint16_t *
b)
422 int c, d, e,
f,
g, q;
424 for (
c = 0, d = 0, e = 0,
f = 0,
g = 0, q = m->
size;
g < q;
g++) {
425 uint32_t p = m->
freqs[2 *
g + 1];
428 uint32_t k = m->
freqs[2 *
g];
478 int left = *(
const uint8_t *)p1;
479 int right = *(
const uint8_t *)p2;
491 for (
i = 0;
i <
b;
i++)
495 memcpy(m, &n,
sizeof(n));
521 memcpy(m, &n,
sizeof(n));
534 for (
i = 0;
i <
size;
i++,
a += freqs)
547 for (
int i = 0;
i <
size;
i++) {
567 int c, d, e,
f,
g, q;
575 d = 256 -
c + (64 *
c + 64);
576 for (e = 0; d <= 2048; e++) {
582 for (
f = d = 0;
f <
c;
f++) {
596 n.
freqs[2 * p + 1] =
g << e;
598 n.
cnts[p] = l - (l >> 1);
613 n.
freqs[2 * d + 1] = e;
618 memcpy(m, &n,
sizeof(n));
636 memcpy(m, &n,
sizeof(n));
646 for (
int i = 0;
i <
size;
i++) {
670 int c, d, e,
f,
g, q;
674 for (
c = 0;
c < 256;
c++) {
680 for (
c = m->
size, d = (4096 - (256 -
c)) / (
c + 1) | 0, e = d - (d >> 1),
g = 0;
g <
c;) {
688 for (d =
c = n.
cntsum = 0; 256 > d; d++) {
693 f = (
c +
g - 1 >> 7) + 1;
696 for (q =
c + 128 - 1 >> 7; q <
f; q++) {
702 memcpy(m, &n,
sizeof(n));
711 for (
int i = 0;
i <
size;
i++) {
727 if (rc->
code1 == 0x20000) {
728 rc->
code = bytestream2_get_le32(gb);
734 uint16_t *freqs1, uint16_t *freqs2,
735 uint16_t *cnts, uint8_t *dectable,
740 uint32_t
r, y,
a,
b, e,
g, q;
742 r = dectable[(rc->
code & 0xFFFu) >> 7];
744 while (freqs2[
r + 1] <= (rc->
code & 0xFFF)) {
757 if (*cntsum + 16 > 4096) {
759 for (
int c = 0,
i = 0;
i <
max + 1;
i++) {
765 q = ((
c - 1) >> 7) + 1;
767 for (
int j = 0; j < q -
g; j++)
789 for (
int b = 0;
b < m->
size;
b++)
809 for (;
c < m->
size;
g++,
c++) {
819 memcpy(m, &n,
sizeof(n));
828 uint16_t
a = 0,
b = 0;
836 *
value = bytestream2_get_byte(&
s->gb);
843 *
value = bytestream2_get_byte(&
s->gb);
848 *
value = bytestream2_get_byte(&
s->gb);
853 *
value = bytestream2_get_byte(&
s->gb);
894 uint32_t *green, uint32_t *blue,
904 *cx1 = (*cx << 6) & 0xFC0;
911 *cx1 = (*cx << 6) & 0xFC0;
918 *cx1 = (*cx << 6) & 0xFC0;
926 rc->
code = bytestream2_get_le32(gb);
935 int cx = 0, cx1 = 0, k = 0;
936 int run, off, y = 0, x = 0, ret;
937 uint32_t backstep = linesize - avctx->
width;
938 uint32_t clr = 0, lx, ly, ptype,
r,
g,
b;
944 while (k < avctx->
width + 1) {
949 s->run_model3[0].freqs[0],
950 s->run_model3[0].freqs[1],
951 s->run_model3[0].cnts,
952 s->run_model3[0].dectab, &
run);
958 clr = (
b << 16) + (
g << 8) +
r;
964 dst[y * linesize + x] = clr;
968 if (x >= avctx->
width) {
979 s->op_model3[ptype].freqs[0],
980 s->op_model3[ptype].freqs[1],
981 s->op_model3[ptype].cnts,
982 s->op_model3[ptype].dectab, &ptype);
989 clr = (
b << 16) + (
g << 8) +
r;
994 s->run_model3[ptype].freqs[0],
995 s->run_model3[ptype].freqs[1],
996 s->run_model3[ptype].cnts,
997 s->run_model3[ptype].dectab, &
run);
1004 dst, linesize, &lx, &ly,
1005 backstep, off, &cx, &cx1);
1014 uint32_t *
dst,
int linesize,
1015 uint32_t *prev,
int plinesize)
1019 int ret,
temp,
min,
max, x, y, cx = 0, cx1 = 0;
1020 int backstep = linesize - avctx->
width;
1021 int mvx = 0, mvy = 0;
1023 if (bytestream2_get_byte(gb) == 0)
1028 s->range_model3.freqs[0],
1029 s->range_model3.freqs[1],
1030 s->range_model3.cnts,
1031 s->range_model3.dectab, &
min);
1033 s->range_model3.freqs[0],
1034 s->range_model3.freqs[1],
1035 s->range_model3.cnts,
1036 s->range_model3.dectab, &
temp);
1042 s->range_model3.freqs[0],
1043 s->range_model3.freqs[1],
1044 s->range_model3.cnts,
1045 s->range_model3.dectab, &
max);
1047 s->range_model3.freqs[0],
1048 s->range_model3.freqs[1],
1049 s->range_model3.cnts,
1050 s->range_model3.dectab, &
temp);
1058 memset(
s->blocks, 0,
sizeof(*
s->blocks) *
s->nbcount);
1064 s->fill_model3.freqs[0],
1065 s->fill_model3.freqs[1],
1066 s->fill_model3.cnts,
1067 s->fill_model3.dectab, &fill);
1069 s->count_model3.freqs[0],
1070 s->count_model3.freqs[1],
1071 s->count_model3.cnts,
1072 s->count_model3.dectab, &count);
1078 while (
min < s->nbcount && count-- > 0) {
1079 s->blocks[
min++] = fill;
1087 for (y = 0; y <
s->nby; y++) {
1088 for (x = 0; x <
s->nbx; x++) {
1089 int sy1 = 0, sy2 = 16, sx1 = 0, sx2 = 16;
1091 if (
s->blocks[y *
s->nbx + x] == 0)
1094 if (((
s->blocks[y *
s->nbx + x] + 1) & 1) > 0) {
1096 s->sxy_model3[0].freqs[0],
1097 s->sxy_model3[0].freqs[1],
1098 s->sxy_model3[0].cnts,
1099 s->sxy_model3[0].dectab, &sx1);
1101 s->sxy_model3[1].freqs[0],
1102 s->sxy_model3[1].freqs[1],
1103 s->sxy_model3[1].cnts,
1104 s->sxy_model3[1].dectab, &sy1);
1106 s->sxy_model3[2].freqs[0],
1107 s->sxy_model3[2].freqs[1],
1108 s->sxy_model3[2].cnts,
1109 s->sxy_model3[2].dectab, &sx2);
1111 s->sxy_model3[3].freqs[0],
1112 s->sxy_model3[3].freqs[1],
1113 s->sxy_model3[3].cnts,
1114 s->sxy_model3[3].dectab, &sy2);
1121 if (((
s->blocks[y *
s->nbx + x] + 3) & 2) > 0) {
1122 int i,
a,
b,
c, j, by = y * 16, bx = x * 16;
1125 a =
s->rc.code & 0xFFF;
1134 code =
a + ((
s->rc.code >> 1) & 0xFFFFF800) -
b;
1136 code = bytestream2_get_byteu(gb) | (
code << 8);
1143 s->mv_model3[0].freqs[0],
1144 s->mv_model3[0].freqs[1],
1145 s->mv_model3[0].cnts,
1146 s->mv_model3[0].dectab, &mvx);
1148 s->mv_model3[1].freqs[0],
1149 s->mv_model3[1].freqs[1],
1150 s->mv_model3[1].cnts,
1151 s->mv_model3[1].dectab, &mvy);
1159 if (by + mvy + sy1 < 0 || bx + mvx + sx1 < 0 ||
1160 by + mvy + sy1 >= avctx->
height || bx + mvx + sx1 >= avctx->
width)
1163 for (
i = 0;
i < sy2 - sy1 && (by + sy1 +
i) < avctx->
height && (by + mvy + sy1 +
i) < avctx->
height;
i++) {
1164 for (j = 0; j < sx2 - sx1 && (bx + sx1 + j) < avctx->
width && (bx + mvx + sx1 + j) < avctx->
width; j++) {
1165 dst[(by +
i + sy1) * linesize + bx + sx1 + j] = prev[(by + mvy + sy1 +
i) * plinesize + bx + sx1 + mvx + j];
1169 int run, bx = x * 16 + sx1, by = y * 16 + sy1;
1170 uint32_t clr = 0, ptype = 0,
r,
g,
b;
1172 if (bx >= avctx->
width)
1175 for (; by < y * 16 + sy2 && by < avctx->
height;) {
1177 s->op_model3[ptype].freqs[0],
1178 s->op_model3[ptype].freqs[1],
1179 s->op_model3[ptype].cnts,
1180 s->op_model3[ptype].dectab, &ptype);
1188 clr = (
b << 16) + (
g << 8) +
r;
1193 s->run_model3[ptype].freqs[0],
1194 s->run_model3[ptype].freqs[1],
1195 s->run_model3[ptype].cnts,
1196 s->run_model3[ptype].dectab, &
run);
1203 dst, prev, linesize, plinesize, &bx, &by,
1204 backstep, sx1, sx2, &cx, &cx1);
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static double val(void *priv, double ch)
Libavcodec external API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
#define i(width, name, range_min, range_max)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
#define FFSWAP(type, a, b)
#define FFDIFFSIGN(x, y)
Comparator.
#define AV_QSORT(p, num, type, cmp)
Quicksort This sort is fast, and fully inplace but not stable and it is possible to construct input t...
static int decode3(GetByteContext *gb, RangeCoder *rc, uint32_t a, uint32_t b)
static void grow_dec(PixelModel3 *m)
static void incr_cntdec(PixelModel3 *m, int a)
static int update_model5_to_6(PixelModel3 *m, uint8_t value)
static int decode_static2(PixelModel3 *m, uint32_t val)
static int decode_value3(SCPRContext *s, uint32_t max, uint32_t *cntsum, uint16_t *freqs1, uint16_t *freqs2, uint16_t *cnts, uint8_t *dectable, uint32_t *value)
static int decode_adaptive45(PixelModel3 *m, int rccode, uint32_t *value, uint16_t *a, uint16_t *b, uint32_t *c, int max)
static int update_model3_to_7(PixelModel3 *m, uint8_t value)
static int cmpbytes(const void *p1, const void *p2)
static int add_dec(PixelModel3 *m, int sym, int f1, int f2)
static int decode_unit3(SCPRContext *s, PixelModel3 *m, uint32_t code, uint32_t *value)
static int update_model4_to_5(PixelModel3 *m, uint32_t value)
static void calc_sum(PixelModel3 *m)
static int decompress_p3(AVCodecContext *avctx, uint32_t *dst, int linesize, uint32_t *prev, int plinesize)
static int add_symbol(PixelModel3 *m, int index, uint32_t symbol, int *totfr, int max)
static void calc_sum5(PixelModel3 *m)
static void rescale(PixelModel3 *m, int *totfr)
static int update_model1_to_2(PixelModel3 *m, uint32_t val)
static int update_model1_to_4(PixelModel3 *m, uint32_t val)
static int decode_adaptive6(PixelModel3 *m, uint32_t code, uint32_t *value, uint16_t *a, uint16_t *b)
static void sync_code3(GetByteContext *gb, RangeCoder *rc)
static int decode_static3(PixelModel3 *m, uint32_t val)
static int decode_static1(PixelModel3 *m, uint32_t val)
static void init_rangecoder3(RangeCoder *rc, GetByteContext *gb)
static int update_model1_to_5(PixelModel3 *m, uint32_t val)
static int update_model2_to_3(PixelModel3 *m, uint32_t val)
static void renew_table3(uint32_t nsym, uint32_t *cntsum, uint16_t *freqs, uint16_t *freqs1, uint16_t *cnts, uint8_t *dectab)
static int decompress_i3(AVCodecContext *avctx, uint32_t *dst, int linesize)
static void reinit_tables3(SCPRContext *s)
static int update_model2_to_6(PixelModel3 *m, uint8_t value, int a4)
static int update_model6_to_7(PixelModel3 *m)
static int decode_units3(SCPRContext *s, uint32_t *red, uint32_t *green, uint32_t *blue, int *cx, int *cx1)
static void rescale_dec(PixelModel3 *m)
static av_unused int decode_run_p(AVCodecContext *avctx, uint32_t ptype, int run, int x, int y, uint32_t clr, uint32_t *dst, uint32_t *prev, int linesize, int plinesize, uint32_t *bx, uint32_t *by, uint32_t backstep, int sx1, int sx2, int *cx, int *cx1)
static av_unused int decode_run_i(AVCodecContext *avctx, uint32_t ptype, int run, int *px, int *py, uint32_t clr, uint32_t *dst, int linesize, uint32_t *plx, uint32_t *ply, uint32_t backstep, int off, int *cx, int *cx1)
#define FF_ARRAY_ELEMS(a)
main external API structure.
int width
picture width / height.