Coverage Report

Created: 2026-10-28 08:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/ffv1enc.c
Line
Count
Source
1
/*
2
 * FFV1 encoder
3
 *
4
 * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at>
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22
23
/**
24
 * @file
25
 * FF Video Codec 1 (a lossless codec) encoder
26
 */
27
28
#include "libavutil/attributes.h"
29
#include "libavutil/avassert.h"
30
#include "libavutil/crc.h"
31
#include "libavutil/mem.h"
32
#include "libavutil/opt.h"
33
#include "libavutil/pixdesc.h"
34
#include "libavutil/qsort.h"
35
36
#include "avcodec.h"
37
#include "encode.h"
38
#include "codec_internal.h"
39
#include "put_bits.h"
40
#include "put_golomb.h"
41
#include "rangecoder.h"
42
#include "ffv1.h"
43
#include "ffv1enc.h"
44
45
static const int8_t quant5_10bit[256] = {
46
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
47
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
48
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
49
     1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
50
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
51
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
52
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
53
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
54
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
55
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
56
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
57
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
58
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1,
59
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
60
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
61
    -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
62
};
63
64
static const int8_t quant5[256] = {
65
     0,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
66
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
67
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
68
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
69
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
70
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
71
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
72
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
73
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
74
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
75
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
76
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
77
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
78
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
79
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
80
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
81
};
82
83
static const int8_t quant9_10bit[256] = {
84
     0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
85
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,
86
     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
87
     3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
88
     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
89
     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
90
     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
91
     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
92
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
93
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
94
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
95
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
96
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
97
    -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
98
    -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
99
    -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
100
};
101
102
static const int8_t quant11[256] = {
103
     0,  1,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,
104
     4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
105
     4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
106
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
107
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
108
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
109
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
110
     5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
111
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
112
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
113
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
114
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
115
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
116
    -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
117
    -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
118
    -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
119
};
120
121
static const uint8_t ver2_state[256] = {
122
      0,  10,  10,  10,  10,  16,  16,  16, 28,   16,  16,  29,  42,  49,  20,  49,
123
     59,  25,  26,  26,  27,  31,  33,  33, 33,   34,  34,  37,  67,  38,  39,  39,
124
     40,  40,  41,  79,  43,  44,  45,  45, 48,   48,  64,  50,  51,  52,  88,  52,
125
     53,  74,  55,  57,  58,  58,  74,  60, 101,  61,  62,  84,  66,  66,  68,  69,
126
     87,  82,  71,  97,  73,  73,  82,  75, 111,  77,  94,  78,  87,  81,  83,  97,
127
     85,  83,  94,  86,  99,  89,  90,  99, 111,  92,  93,  134, 95,  98, 105,  98,
128
    105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
129
    115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
130
    165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
131
    147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
132
    172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
133
    175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
134
    197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
135
    209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
136
    226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
137
    241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
138
};
139
140
static void find_best_state(uint8_t best_state[256][256],
141
                            const uint8_t one_state[256])
142
0
{
143
0
    int i, j, k, m;
144
0
    uint32_t l2tab[256];
145
146
0
    for (i = 1; i < 256; i++)
147
0
        l2tab[i] = -log2(i / 256.0) * ((1U << 31) / 8);
148
149
0
    for (i = 0; i < 256; i++) {
150
0
        uint64_t best_len[256];
151
152
0
        for (j = 0; j < 256; j++)
153
0
            best_len[j] = UINT64_MAX;
154
155
0
        for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
156
0
            uint32_t occ[256] = { 0 };
157
0
            uint64_t len      = 0;
158
0
            occ[j] = UINT32_MAX;
159
160
0
            if (!one_state[j])
161
0
                continue;
162
163
0
            for (k = 0; k < 256; k++) {
164
0
                uint32_t newocc[256] = { 0 };
165
0
                for (m = 1; m < 256; m++)
166
0
                    if (occ[m]) {
167
0
                        len += (occ[m]*((       i *(uint64_t)l2tab[    m]
168
0
                                         + (256-i)*(uint64_t)l2tab[256-m])>>8)) >> 8;
169
0
                    }
170
0
                if (len < best_len[k]) {
171
0
                    best_len[k]      = len;
172
0
                    best_state[i][k] = j;
173
0
                }
174
0
                for (m = 1; m < 256; m++)
175
0
                    if (occ[m]) {
176
0
                        newocc[      one_state[      m]] += occ[m] * (uint64_t)       i  >> 8;
177
0
                        newocc[256 - one_state[256 - m]] += occ[m] * (uint64_t)(256 - i) >> 8;
178
0
                    }
179
0
                memcpy(occ, newocc, sizeof(occ));
180
0
            }
181
0
        }
182
0
    }
183
0
}
184
185
static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c,
186
                                                          uint8_t *state, int v,
187
                                                          int is_signed,
188
                                                          uint64_t rc_stat[256][2],
189
                                                          uint64_t rc_stat2[32][2])
190
506M
{
191
506M
    int i;
192
193
506M
#define put_rac(C, S, B)                        \
194
2.08G
    do {                                        \
195
2.08G
        if (rc_stat) {                          \
196
0
            rc_stat[*(S)][B]++;                 \
197
0
            rc_stat2[(S) - state][B]++;         \
198
0
        }                                       \
199
2.08G
        put_rac(C, S, B);                       \
200
2.08G
    } while (0)
201
202
506M
    if (v) {
203
97.7M
        const unsigned a = is_signed ? FFABS(v) : v;
204
97.7M
        const int e = av_log2(a);
205
97.7M
        put_rac(c, state + 0, 0);
206
97.7M
        if (e <= 9) {
207
373M
            for (i = 0; i < e; i++)
208
304M
                put_rac(c, state + 1 + i, 1);  // 1..10
209
68.6M
            put_rac(c, state + 1 + i, 0);
210
211
373M
            for (i = e - 1; i >= 0; i--)
212
304M
                put_rac(c, state + 22 + i, (a >> i) & 1);  // 22..31
213
214
68.6M
            if (is_signed)
215
46.5M
                put_rac(c, state + 11 + e, v < 0);  // 11..21
216
68.6M
        } else {
217
432M
            for (i = 0; i < e; i++)
218
403M
                put_rac(c, state + 1 + FFMIN(i, 9), 1);  // 1..10
219
29.0M
            put_rac(c, state + 1 + 9, 0);
220
221
432M
            for (i = e - 1; i >= 0; i--)
222
403M
                put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1);  // 22..31
223
224
29.0M
            if (is_signed)
225
12.5M
                put_rac(c, state + 11 + 10, v < 0);  // 11..21
226
29.0M
        }
227
409M
    } else {
228
409M
        put_rac(c, state + 0, 1);
229
409M
    }
230
506M
#undef put_rac
231
506M
}
232
233
static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
234
                                   int v, int is_signed)
235
2.79M
{
236
2.79M
    put_symbol_inline(c, state, v, is_signed, NULL, NULL);
237
2.79M
}
238
239
240
static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
241
                                  int v, int bits)
242
17.3M
{
243
17.3M
    int i, k, code;
244
17.3M
    v = fold(v - state->bias, bits);
245
246
17.3M
    i = state->count;
247
17.3M
    k = 0;
248
87.2M
    while (i < state->error_sum) { // FIXME: optimize
249
69.9M
        k++;
250
69.9M
        i += i;
251
69.9M
    }
252
253
17.3M
    av_assert2(k <= 16);
254
255
17.3M
    code = v ^ ((2 * state->drift + state->count) >> 31);
256
257
17.3M
    ff_dlog(NULL, "v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code,
258
17.3M
            state->bias, state->error_sum, state->drift, state->count, k);
259
17.3M
    set_sr_golomb(pb, code, k, 12, bits);
260
261
17.3M
    update_vlc_state(state, v);
262
17.3M
}
263
264
8.15k
#define TYPE int16_t
265
422M
#define RENAME(name) name
266
#include "ffv1enc_template.c"
267
#undef TYPE
268
#undef RENAME
269
270
31.6k
#define TYPE int32_t
271
126k
#define RENAME(name) name ## 32
272
#include "ffv1enc_template.c"
273
274
static int encode_plane(FFV1Context *f, FFV1SliceContext *sc,
275
                        const uint8_t *src, int w, int h,
276
                        int stride, int plane_index, int remap_index, int pixel_stride, int ac)
277
85.1k
{
278
85.1k
    int x, y, i, ret;
279
85.1k
    const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
280
85.1k
    const int ring_size = f->context_model ? 3 : 2;
281
85.1k
    int16_t *sample[3];
282
85.1k
    sc->run_index = 0;
283
284
85.1k
    sample[2] = sc->sample_buffer; // dummy to avoid UB pointer arithmetic
285
286
85.1k
    memset(sc->sample_buffer, 0, ring_size * (w + 6) * sizeof(*sc->sample_buffer));
287
288
6.89M
    for (y = 0; y < h; y++) {
289
22.9M
        for (i = 0; i < ring_size; i++)
290
16.1M
            sample[i] = sc->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
291
292
6.80M
        sample[0][-1]= sample[1][0  ];
293
6.80M
        sample[1][ w]= sample[1][w-1];
294
295
6.80M
        if (f->bits_per_raw_sample <= 8) {
296
39.6M
            for (x = 0; x < w; x++)
297
35.3M
                sample[0][x] = src[x * pixel_stride + stride * y];
298
4.34M
            if (sc->remap)
299
0
                for (x = 0; x < w; x++)
300
0
                    sample[0][x] = sc->fltmap[remap_index][ sample[0][x] ];
301
302
4.34M
            if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, 8, ac, pass1)) < 0)
303
0
                return ret;
304
4.34M
        } else {
305
2.45M
            if (f->packed_at_lsb) {
306
19.8M
                for (x = 0; x < w; x++) {
307
18.0M
                    sample[0][x] = ((uint16_t*)(src + stride*y))[x * pixel_stride];
308
18.0M
                }
309
1.77M
            } else {
310
44.2M
                for (x = 0; x < w; x++) {
311
43.5M
                    sample[0][x] = ((uint16_t*)(src + stride*y))[x * pixel_stride] >> (16 - f->bits_per_raw_sample);
312
43.5M
                }
313
688k
            }
314
2.45M
            if (sc->remap)
315
27.9M
                for (x = 0; x < w; x++)
316
27.7M
                    sample[0][x] = sc->fltmap[remap_index][ (uint16_t)sample[0][x] ];
317
318
2.45M
            if((ret = encode_line(f, sc, f->avctx, w, sample, plane_index, f->bits_per_raw_sample, ac, pass1)) < 0)
319
471
                return ret;
320
2.45M
        }
321
6.80M
    }
322
84.7k
    return 0;
323
85.1k
}
324
325
static void load_plane(FFV1Context *f, FFV1SliceContext *sc,
326
                      const uint8_t *src, int w, int h,
327
                      int stride, int remap_index, int pixel_stride)
328
22.6k
{
329
22.6k
    int x, y;
330
331
22.6k
    memset(sc->fltmap[remap_index], 0, 65536 * sizeof(*sc->fltmap[remap_index]));
332
333
235k
    for (y = 0; y < h; y++) {
334
212k
        if (f->bits_per_raw_sample <= 8) {
335
0
            for (x = 0; x < w; x++)
336
0
                sc->fltmap[remap_index][ src[x * pixel_stride + stride * y] ] = 1;
337
212k
        } else {
338
212k
            if (f->packed_at_lsb) {
339
0
                for (x = 0; x < w; x++)
340
0
                    sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x * pixel_stride] ] = 1;
341
212k
            } else {
342
33.0M
                for (x = 0; x < w; x++)
343
32.8M
                    sc->fltmap[remap_index][ ((uint16_t*)(src + stride*y))[x * pixel_stride] >> (16 - f->bits_per_raw_sample) ] = 1;
344
212k
            }
345
212k
        }
346
212k
    }
347
22.6k
}
348
349
static void write_quant_table(RangeCoder *c, int16_t *quant_table)
350
48.1k
{
351
48.1k
    int last = 0;
352
48.1k
    int i;
353
48.1k
    uint8_t state[CONTEXT_SIZE];
354
48.1k
    memset(state, 128, sizeof(state));
355
356
6.16M
    for (i = 1; i < MAX_QUANT_TABLE_SIZE/2; i++)
357
6.11M
        if (quant_table[i] != quant_table[i - 1]) {
358
127k
            put_symbol(c, state, i - last - 1, 0);
359
127k
            last = i;
360
127k
        }
361
48.1k
    put_symbol(c, state, i - last - 1, 0);
362
48.1k
}
363
364
static void write_quant_tables(RangeCoder *c,
365
                               int16_t quant_table[MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE])
366
9.63k
{
367
9.63k
    int i;
368
57.8k
    for (i = 0; i < 5; i++)
369
48.1k
        write_quant_table(c, quant_table[i]);
370
9.63k
}
371
372
static int contains_non_128(uint8_t (*initial_state)[CONTEXT_SIZE],
373
                            int nb_contexts)
374
9.63k
{
375
9.63k
    if (!initial_state)
376
0
        return 0;
377
27.6M
    for (int i = 0; i < nb_contexts; i++)
378
911M
        for (int j = 0; j < CONTEXT_SIZE; j++)
379
883M
            if (initial_state[i][j] != 128)
380
0
                return 1;
381
9.63k
    return 0;
382
9.63k
}
383
384
static void write_header(FFV1Context *f)
385
6.91k
{
386
6.91k
    uint8_t state[CONTEXT_SIZE];
387
6.91k
    int i, j;
388
6.91k
    RangeCoder *const c = &f->slices[0].c;
389
390
6.91k
    memset(state, 128, sizeof(state));
391
392
6.91k
    if (f->version < 2) {
393
0
        put_symbol(c, state, f->version, 0);
394
0
        put_symbol(c, state, f->ac, 0);
395
0
        if (f->ac == AC_RANGE_CUSTOM_TAB) {
396
0
            for (i = 1; i < 256; i++)
397
0
                put_symbol(c, state,
398
0
                           f->state_transition[i] - c->one_state[i], 1);
399
0
        }
400
0
        put_symbol(c, state, f->colorspace, 0); //YUV cs type
401
0
        if (f->version > 0)
402
0
            put_symbol(c, state, f->bits_per_raw_sample, 0);
403
0
        put_rac(c, state, f->chroma_planes);
404
0
        put_symbol(c, state, f->chroma_h_shift, 0);
405
0
        put_symbol(c, state, f->chroma_v_shift, 0);
406
0
        put_rac(c, state, f->transparency);
407
408
0
        write_quant_tables(c, f->quant_tables[f->context_model]);
409
6.91k
    } else if (f->version < 3) {
410
0
        put_symbol(c, state, f->slice_count, 0);
411
0
        for (i = 0; i < f->slice_count; i++) {
412
0
            FFV1SliceContext *fs = &f->slices[i];
413
0
            put_symbol(c, state,
414
0
                       (fs->slice_x      + 1) * f->num_h_slices / f->width, 0);
415
0
            put_symbol(c, state,
416
0
                       (fs->slice_y      + 1) * f->num_v_slices / f->height, 0);
417
0
            put_symbol(c, state,
418
0
                       (fs->slice_width  + 1) * f->num_h_slices / f->width - 1,
419
0
                       0);
420
0
            put_symbol(c, state,
421
0
                       (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
422
0
                       0);
423
0
            for (j = 0; j < f->plane_count; j++) {
424
0
                put_symbol(c, state, fs->plane[j].quant_table_index, 0);
425
0
                av_assert0(fs->plane[j].quant_table_index == f->context_model);
426
0
            }
427
0
        }
428
0
    }
429
6.91k
}
430
431
static void set_micro_version(FFV1Context *f)
432
4.83k
{
433
4.83k
    f->combined_version = f->version << 16;
434
4.83k
    if (f->version > 2) {
435
4.83k
        if (f->version == 3) {
436
1.14k
            f->micro_version = 4;
437
3.69k
        } else if (f->version == 4) {
438
3.69k
            f->micro_version = 10;
439
3.69k
        } else
440
0
            av_assert0(0);
441
442
4.83k
        f->combined_version += f->micro_version;
443
4.83k
    } else
444
0
        av_assert0(f->micro_version == 0);
445
4.83k
}
446
447
av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
448
4.81k
{
449
4.81k
    FFV1Context *f = avctx->priv_data;
450
451
4.81k
    RangeCoder c;
452
4.81k
    uint8_t state[CONTEXT_SIZE];
453
4.81k
    int i, j, k;
454
4.81k
    uint8_t state2[32][CONTEXT_SIZE];
455
4.81k
    unsigned v;
456
457
4.81k
    memset(state2, 128, sizeof(state2));
458
4.81k
    memset(state, 128, sizeof(state));
459
460
4.81k
    f->avctx->extradata_size = 10000 + 4 +
461
4.81k
                                    (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
462
4.81k
    f->avctx->extradata = av_malloc(f->avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
463
4.81k
    if (!f->avctx->extradata)
464
0
        return AVERROR(ENOMEM);
465
4.81k
    ff_init_range_encoder(&c, f->avctx->extradata, f->avctx->extradata_size);
466
4.81k
    ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
467
468
4.81k
    put_symbol(&c, state, f->version, 0);
469
4.81k
    if (f->version > 2)
470
4.81k
        put_symbol(&c, state, f->micro_version, 0);
471
472
4.81k
    put_symbol(&c, state, f->ac, 0);
473
4.81k
    if (f->ac == AC_RANGE_CUSTOM_TAB)
474
766k
        for (i = 1; i < 256; i++)
475
763k
            put_symbol(&c, state, f->state_transition[i] - c.one_state[i], 1);
476
477
4.81k
    put_symbol(&c, state, f->colorspace, 0); // YUV cs type
478
4.81k
    put_symbol(&c, state, f->bits_per_raw_sample, 0);
479
4.81k
    put_rac(&c, state, f->chroma_planes);
480
4.81k
    put_symbol(&c, state, f->chroma_h_shift, 0);
481
4.81k
    put_symbol(&c, state, f->chroma_v_shift, 0);
482
4.81k
    put_rac(&c, state, f->transparency);
483
4.81k
    if (f->colorspace == 2)
484
504
        put_symbol(&c, state, f->bayer_order, 0); /* 0 = RGGB */
485
4.81k
    put_symbol(&c, state, f->num_h_slices - 1, 0);
486
4.81k
    put_symbol(&c, state, f->num_v_slices - 1, 0);
487
488
4.81k
    put_symbol(&c, state, f->quant_table_count, 0);
489
14.4k
    for (i = 0; i < f->quant_table_count; i++)
490
9.63k
        write_quant_tables(&c, f->quant_tables[i]);
491
492
14.4k
    for (i = 0; i < f->quant_table_count; i++) {
493
9.63k
        if (contains_non_128(f->initial_states[i], f->context_count[i])) {
494
0
            put_rac(&c, state, 1);
495
0
            for (j = 0; j < f->context_count[i]; j++)
496
0
                for (k = 0; k < CONTEXT_SIZE; k++) {
497
0
                    int pred = j ? f->initial_states[i][j - 1][k] : 128;
498
0
                    put_symbol(&c, state2[k],
499
0
                               (int8_t)(f->initial_states[i][j][k] - pred), 1);
500
0
                }
501
9.63k
        } else {
502
9.63k
            put_rac(&c, state, 0);
503
9.63k
        }
504
9.63k
    }
505
506
4.81k
    if (f->version > 2) {
507
4.81k
        put_symbol(&c, state, f->ec, 0);
508
4.81k
        put_symbol(&c, state, f->intra = (f->avctx->gop_size < 2), 0);
509
4.81k
        if (f->combined_version >= 0x40004)
510
3.69k
            put_symbol(&c, state, f->flt, 0);
511
4.81k
    }
512
513
4.81k
    f->avctx->extradata_size = ff_rac_terminate(&c, 0);
514
4.81k
    v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, f->avctx->extradata, f->avctx->extradata_size) ^ (f->crcref ? 0x8CD88196 : 0);
515
4.81k
    AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
516
4.81k
    f->avctx->extradata_size += 4;
517
518
4.81k
    return 0;
519
4.81k
}
520
521
static int sort_stt(FFV1Context *s, uint8_t stt[256])
522
0
{
523
0
    int i, i2, changed, print = 0;
524
525
0
    do {
526
0
        changed = 0;
527
0
        for (i = 12; i < 244; i++) {
528
0
            for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
529
530
0
#define COST(old, new)                                      \
531
0
    s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) +     \
532
0
    s->rc_stat[old][1] * -log2((new)         / 256.0)
533
534
0
#define COST2(old, new)                         \
535
0
    COST(old, new) + COST(256 - (old), 256 - (new))
536
537
0
                double size0 = COST2(i,  i) + COST2(i2, i2);
538
0
                double sizeX = COST2(i, i2) + COST2(i2, i);
539
0
                if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
540
0
                    int j;
541
0
                    FFSWAP(int, stt[i], stt[i2]);
542
0
                    FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
543
0
                    FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
544
0
                    if (i != 256 - i2) {
545
0
                        FFSWAP(int, stt[256 - i], stt[256 - i2]);
546
0
                        FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
547
0
                        FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
548
0
                    }
549
0
                    for (j = 1; j < 256; j++) {
550
0
                        if (stt[j] == i)
551
0
                            stt[j] = i2;
552
0
                        else if (stt[j] == i2)
553
0
                            stt[j] = i;
554
0
                        if (i != 256 - i2) {
555
0
                            if (stt[256 - j] == 256 - i)
556
0
                                stt[256 - j] = 256 - i2;
557
0
                            else if (stt[256 - j] == 256 - i2)
558
0
                                stt[256 - j] = 256 - i;
559
0
                        }
560
0
                    }
561
0
                    print = changed = 1;
562
0
                }
563
0
            }
564
0
        }
565
0
    } while (changed);
566
0
    return print;
567
0
}
568
569
570
int ff_ffv1_encode_determine_slices(AVCodecContext *avctx)
571
4.83k
{
572
4.83k
    FFV1Context *s = avctx->priv_data;
573
4.83k
    int plane_count = 1 + 2*s->chroma_planes + s->bayer + s->transparency;
574
4.83k
    int max_h_slices = AV_CEIL_RSHIFT(avctx->width , s->bayer ? 1 : s->chroma_h_shift);
575
4.83k
    int max_v_slices = AV_CEIL_RSHIFT(avctx->height, s->bayer ? 1 : s->chroma_v_shift);
576
4.83k
    s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
577
4.83k
    s->num_v_slices = FFMIN(s->num_v_slices, max_v_slices);
578
5.67k
    for (; s->num_v_slices <= 32; s->num_v_slices++) {
579
17.0k
        for (s->num_h_slices = s->num_v_slices; s->num_h_slices <= 2*s->num_v_slices; s->num_h_slices++) {
580
16.1k
            int maxw = (avctx->width  + s->num_h_slices - 1) / s->num_h_slices;
581
16.1k
            int maxh = (avctx->height + s->num_v_slices - 1) / s->num_v_slices;
582
16.1k
            if (s->num_h_slices > max_h_slices || s->num_v_slices > max_v_slices)
583
8.43k
                continue;
584
7.76k
            if (maxw * maxh * (int64_t)(s->bits_per_raw_sample+1) * plane_count > 8<<24)
585
0
                continue;
586
7.76k
            if (s->version < 4)
587
4.05k
                if (  ff_need_new_slices(avctx->width , s->num_h_slices, s->chroma_h_shift)
588
3.19k
                    ||ff_need_new_slices(avctx->height, s->num_v_slices, s->chroma_v_shift))
589
2.91k
                    continue;
590
4.84k
            if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= MAX_SLICES)
591
0
                return 0;
592
4.84k
            if (maxw*maxh > 360*288)
593
26
                continue;
594
4.81k
            if (!avctx->slices)
595
4.81k
                return 0;
596
4.81k
        }
597
5.65k
    }
598
15
    av_log(avctx, AV_LOG_ERROR,
599
15
           "Unsupported number %d of slices requested, please specify a "
600
15
           "supported number with -slices (ex:4,6,9,12,16, ...)\n",
601
15
           avctx->slices);
602
15
    return AVERROR(ENOSYS);
603
4.83k
}
604
605
av_cold int ff_ffv1_encode_init(AVCodecContext *avctx)
606
4.83k
{
607
4.83k
    FFV1Context *s = avctx->priv_data;
608
4.83k
    int i, j, k, m, ret;
609
610
4.83k
    if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) ||
611
4.83k
        avctx->slices > 1)
612
0
        s->version = FFMAX(s->version, 2);
613
614
4.83k
    if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) && s->ac == AC_GOLOMB_RICE) {
615
0
        av_log(avctx, AV_LOG_ERROR, "2 Pass mode is not possible with golomb coding\n");
616
0
        return AVERROR(EINVAL);
617
0
    }
618
619
    // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
620
4.83k
    if (avctx->slices == 0 && avctx->level < 0 && avctx->width * avctx->height > 720*576)
621
0
        s->version = FFMAX(s->version, 2);
622
623
4.83k
    if (avctx->level <= 0 && s->version == 2) {
624
0
        s->version = 3;
625
0
    }
626
4.83k
    if (avctx->level >= 0 && avctx->level <= 4) {
627
0
        if (avctx->level < s->version) {
628
0
            av_log(avctx, AV_LOG_ERROR, "Version %d needed for requested features but %d requested\n", s->version, avctx->level);
629
0
            return AVERROR(EINVAL);
630
0
        }
631
0
        s->version = avctx->level;
632
4.83k
    } else if (s->version < 3)
633
1.14k
        s->version = 3;
634
635
4.83k
    if (s->ec < 0) {
636
0
        if (s->version >= 4) {
637
0
            s->ec = 2;
638
0
        } else if (s->version >= 3) {
639
0
            s->ec = 1;
640
0
        } else
641
0
            s->ec = 0;
642
0
    }
643
644
    // CRC requires version 3+
645
4.83k
    if (s->ec == 1)
646
2.06k
        s->version = FFMAX(s->version, 3);
647
4.83k
    if (s->ec == 2) {
648
0
        s->version = FFMAX(s->version, 4);
649
0
        s->crcref = 0x7a8c4079;
650
0
    }
651
652
4.83k
    if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
653
2
        av_log(avctx, AV_LOG_ERROR, "Version 2 or 4 needed for requested features but version 2 or 4 is experimental and not enabled\n");
654
2
        return AVERROR_INVALIDDATA;
655
2
    }
656
657
4.83k
    if (s->ac == AC_RANGE_CUSTOM_TAB) {
658
768k
        for (i = 1; i < 256; i++)
659
765k
            s->state_transition[i] = ver2_state[i];
660
3.00k
    } else {
661
1.82k
        RangeCoder c;
662
1.82k
        ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
663
468k
        for (i = 1; i < 256; i++)
664
466k
            s->state_transition[i] = c.one_state[i];
665
1.82k
    }
666
667
1.24M
    for (i = 0; i < 256; i++) {
668
1.23M
        s->quant_table_count = 2;
669
1.23M
        if ((s->qtable == -1 && s->bits_per_raw_sample <= 8) || s->qtable == 1) {
670
138k
            s->quant_tables[0][0][i]=           quant11[i];
671
138k
            s->quant_tables[0][1][i]=        11*quant11[i];
672
138k
            s->quant_tables[0][2][i]=     11*11*quant11[i];
673
138k
            s->quant_tables[1][0][i]=           quant11[i];
674
138k
            s->quant_tables[1][1][i]=        11*quant11[i];
675
138k
            s->quant_tables[1][2][i]=     11*11*quant5 [i];
676
138k
            s->quant_tables[1][3][i]=   5*11*11*quant5 [i];
677
138k
            s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
678
138k
            s->context_count[0] = (11 * 11 * 11        + 1) / 2;
679
138k
            s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
680
1.09M
        } else {
681
1.09M
            s->quant_tables[0][0][i]=           quant9_10bit[i];
682
1.09M
            s->quant_tables[0][1][i]=         9*quant9_10bit[i];
683
1.09M
            s->quant_tables[0][2][i]=       9*9*quant9_10bit[i];
684
1.09M
            s->quant_tables[1][0][i]=           quant9_10bit[i];
685
1.09M
            s->quant_tables[1][1][i]=         9*quant9_10bit[i];
686
1.09M
            s->quant_tables[1][2][i]=       9*9*quant5_10bit[i];
687
1.09M
            s->quant_tables[1][3][i]=     5*9*9*quant5_10bit[i];
688
1.09M
            s->quant_tables[1][4][i]=   5*5*9*9*quant5_10bit[i];
689
1.09M
            s->context_count[0] = (9 * 9 * 9         + 1) / 2;
690
1.09M
            s->context_count[1] = (9 * 9 * 5 * 5 * 5 + 1) / 2;
691
1.09M
        }
692
1.23M
    }
693
694
    /* Small context set: only the two nearest gradients, coarsely quantized.
695
     * With many slices there is too little data per slice for large context
696
     * sets to adapt, and this codes smaller while using a fraction of the
697
     * state. */
698
4.83k
    if (s->context_model == 2) {
699
0
        const int8_t *q5 = (s->qtable == -1 && s->bits_per_raw_sample <= 8) || s->qtable == 1 ?
700
0
                           quant5 : quant5_10bit;
701
0
        s->quant_table_count = 3;
702
0
        for (i = 0; i < 256; i++) {
703
0
            s->quant_tables[2][0][i] =   q5[i];
704
0
            s->quant_tables[2][1][i] = 5*q5[i];
705
0
        }
706
0
        s->context_count[2] = (5 * 5 + 1) / 2;
707
0
    }
708
709
4.83k
    if ((ret = ff_ffv1_allocate_initial_states(s)) < 0)
710
0
        return ret;
711
712
4.83k
    if (!s->transparency)
713
4.13k
        s->plane_count = 2;
714
4.83k
    if (!s->chroma_planes && s->version > 3)
715
340
        s->plane_count--;
716
4.83k
    if (s->bayer)
717
504
        s->plane_count = 3;
718
719
4.83k
    s->picture_number = 0;
720
721
4.83k
    if (avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
722
0
        for (i = 0; i < s->quant_table_count; i++) {
723
0
            s->rc_stat2[i] = av_mallocz(s->context_count[i] *
724
0
                                        sizeof(*s->rc_stat2[i]));
725
0
            if (!s->rc_stat2[i])
726
0
                return AVERROR(ENOMEM);
727
0
        }
728
0
    }
729
4.83k
    if (avctx->stats_in) {
730
0
        char *p = avctx->stats_in;
731
0
        uint8_t (*best_state)[256] = av_malloc_array(256, 256);
732
0
        int gob_count = 0;
733
0
        char *next;
734
0
        if (!best_state)
735
0
            return AVERROR(ENOMEM);
736
737
0
        av_assert0(s->version >= 2);
738
739
0
        for (;;) {
740
0
            for (j = 0; j < 256; j++)
741
0
                for (i = 0; i < 2; i++) {
742
0
                    s->rc_stat[j][i] = strtol(p, &next, 0);
743
0
                    if (next == p) {
744
0
                        av_log(avctx, AV_LOG_ERROR,
745
0
                               "2Pass file invalid at %d %d [%s]\n", j, i, p);
746
0
                        av_freep(&best_state);
747
0
                        return AVERROR_INVALIDDATA;
748
0
                    }
749
0
                    p = next;
750
0
                }
751
0
            for (i = 0; i < s->quant_table_count; i++)
752
0
                for (j = 0; j < s->context_count[i]; j++) {
753
0
                    for (k = 0; k < 32; k++)
754
0
                        for (m = 0; m < 2; m++) {
755
0
                            s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
756
0
                            if (next == p) {
757
0
                                av_log(avctx, AV_LOG_ERROR,
758
0
                                       "2Pass file invalid at %d %d %d %d [%s]\n",
759
0
                                       i, j, k, m, p);
760
0
                                av_freep(&best_state);
761
0
                                return AVERROR_INVALIDDATA;
762
0
                            }
763
0
                            p = next;
764
0
                        }
765
0
                }
766
0
            gob_count = strtol(p, &next, 0);
767
0
            if (next == p || gob_count <= 0) {
768
0
                av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
769
0
                av_freep(&best_state);
770
0
                return AVERROR_INVALIDDATA;
771
0
            }
772
0
            p = next;
773
0
            while (*p == '\n' || *p == ' ')
774
0
                p++;
775
0
            if (p[0] == 0)
776
0
                break;
777
0
        }
778
0
        if (s->ac == AC_RANGE_CUSTOM_TAB)
779
0
            sort_stt(s, s->state_transition);
780
781
0
        find_best_state(best_state, s->state_transition);
782
783
0
        for (i = 0; i < s->quant_table_count; i++) {
784
0
            for (k = 0; k < 32; k++) {
785
0
                double a=0, b=0;
786
0
                int jp = 0;
787
0
                for (j = 0; j < s->context_count[i]; j++) {
788
0
                    double p = 128;
789
0
                    if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
790
0
                        if (a+b)
791
0
                            p = 256.0 * b / (a + b);
792
0
                        s->initial_states[i][jp][k] =
793
0
                            best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
794
0
                        for(jp++; jp<j; jp++)
795
0
                            s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
796
0
                        a=b=0;
797
0
                    }
798
0
                    a += s->rc_stat2[i][j][k][0];
799
0
                    b += s->rc_stat2[i][j][k][1];
800
0
                    if (a+b) {
801
0
                        p = 256.0 * b / (a + b);
802
0
                    }
803
0
                    s->initial_states[i][j][k] =
804
0
                        best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
805
0
                }
806
0
            }
807
0
        }
808
0
        av_freep(&best_state);
809
0
    }
810
811
4.83k
    if (s->version <= 1) {
812
        /* Disable slices when the version doesn't support them */
813
0
        s->num_h_slices = 1;
814
0
        s->num_v_slices = 1;
815
0
    }
816
817
4.83k
    set_micro_version(s);
818
819
4.83k
    return 0;
820
4.83k
}
821
822
av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx,
823
                                            enum AVPixelFormat pix_fmt)
824
4.83k
{
825
4.83k
    FFV1Context *s = avctx->priv_data;
826
4.83k
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
827
828
4.83k
    s->bayer = 0;
829
4.83k
    s->plane_count = 3;
830
4.83k
    switch(pix_fmt) {
831
2
    case AV_PIX_FMT_GRAY9:
832
3
    case AV_PIX_FMT_YUV444P9:
833
5
    case AV_PIX_FMT_YUV422P9:
834
8
    case AV_PIX_FMT_YUV420P9:
835
9
    case AV_PIX_FMT_YUVA444P9:
836
13
    case AV_PIX_FMT_YUVA422P9:
837
20
    case AV_PIX_FMT_YUVA420P9:
838
20
        if (!avctx->bits_per_raw_sample)
839
20
            s->bits_per_raw_sample = 9;
840
20
        av_fallthrough;
841
21
    case AV_PIX_FMT_GRAY10:
842
26
    case AV_PIX_FMT_YUV444P10:
843
32
    case AV_PIX_FMT_YUV440P10:
844
34
    case AV_PIX_FMT_YUV420P10:
845
35
    case AV_PIX_FMT_YUV422P10:
846
39
    case AV_PIX_FMT_YUVA444P10:
847
42
    case AV_PIX_FMT_YUVA422P10:
848
46
    case AV_PIX_FMT_YUVA420P10:
849
46
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
850
26
            s->bits_per_raw_sample = 10;
851
46
        av_fallthrough;
852
66
    case AV_PIX_FMT_GRAY12:
853
71
    case AV_PIX_FMT_YUV444P12:
854
78
    case AV_PIX_FMT_YUV440P12:
855
79
    case AV_PIX_FMT_YUV420P12:
856
81
    case AV_PIX_FMT_YUV422P12:
857
83
    case AV_PIX_FMT_YUVA444P12:
858
86
    case AV_PIX_FMT_YUVA422P12:
859
86
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
860
40
            s->bits_per_raw_sample = 12;
861
86
        av_fallthrough;
862
91
    case AV_PIX_FMT_GRAY14:
863
97
    case AV_PIX_FMT_YUV444P14:
864
117
    case AV_PIX_FMT_YUV420P14:
865
122
    case AV_PIX_FMT_YUV422P14:
866
122
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
867
36
            s->bits_per_raw_sample = 14;
868
122
        s->packed_at_lsb = 1;
869
122
        av_fallthrough;
870
166
    case AV_PIX_FMT_GRAY16:
871
166
    case AV_PIX_FMT_P016:
872
166
    case AV_PIX_FMT_P216:
873
166
    case AV_PIX_FMT_P416:
874
176
    case AV_PIX_FMT_YUV444P16:
875
183
    case AV_PIX_FMT_YUV422P16:
876
187
    case AV_PIX_FMT_YUV420P16:
877
198
    case AV_PIX_FMT_YUVA444P16:
878
200
    case AV_PIX_FMT_YUVA422P16:
879
217
    case AV_PIX_FMT_YUVA420P16:
880
419
    case AV_PIX_FMT_GRAYF16:
881
558
    case AV_PIX_FMT_YAF16:
882
558
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
883
436
            s->bits_per_raw_sample = 16;
884
436
        } else if (!s->bits_per_raw_sample) {
885
0
            s->bits_per_raw_sample = avctx->bits_per_raw_sample;
886
0
        }
887
558
        if (s->bits_per_raw_sample <= 8) {
888
0
            av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
889
0
            return AVERROR_INVALIDDATA;
890
0
        }
891
558
        s->version = FFMAX(s->version, 1);
892
558
        av_fallthrough;
893
570
    case AV_PIX_FMT_GRAY8:
894
591
    case AV_PIX_FMT_YA8:
895
591
    case AV_PIX_FMT_NV12:
896
591
    case AV_PIX_FMT_NV16:
897
591
    case AV_PIX_FMT_NV24:
898
609
    case AV_PIX_FMT_YUV444P:
899
613
    case AV_PIX_FMT_YUV440P:
900
621
    case AV_PIX_FMT_YUV422P:
901
736
    case AV_PIX_FMT_YUV420P:
902
760
    case AV_PIX_FMT_YUV411P:
903
790
    case AV_PIX_FMT_YUV410P:
904
798
    case AV_PIX_FMT_YUVA444P:
905
809
    case AV_PIX_FMT_YUVA422P:
906
856
    case AV_PIX_FMT_YUVA420P:
907
856
        s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
908
856
        s->colorspace = 0;
909
856
        s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
910
856
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
911
298
            s->bits_per_raw_sample = 8;
912
558
        else if (!s->bits_per_raw_sample)
913
0
            s->bits_per_raw_sample = 8;
914
856
        break;
915
191
    case AV_PIX_FMT_RGB32:
916
191
        s->colorspace = 1;
917
191
        s->transparency = 1;
918
191
        s->chroma_planes = 1;
919
191
        s->bits_per_raw_sample = 8;
920
191
        break;
921
43
    case AV_PIX_FMT_RGBA64:
922
43
        s->colorspace = 1;
923
43
        s->transparency = 1;
924
43
        s->chroma_planes = 1;
925
43
        s->bits_per_raw_sample = 16;
926
43
        s->use32bit = 1;
927
43
        s->version = FFMAX(s->version, 1);
928
43
        break;
929
26
    case AV_PIX_FMT_RGB48:
930
26
        s->colorspace = 1;
931
26
        s->chroma_planes = 1;
932
26
        s->bits_per_raw_sample = 16;
933
26
        s->use32bit = 1;
934
26
        s->version = FFMAX(s->version, 1);
935
26
        break;
936
506
    case AV_PIX_FMT_BAYER_RGGB16:
937
506
        s->colorspace = 2;
938
506
        s->chroma_planes = 1;
939
506
        s->bits_per_raw_sample = 16;
940
506
        s->use32bit = 1;
941
506
        s->version = FFMAX(s->version, 4);
942
506
        s->bayer = 1;
943
506
        break;
944
0
    case AV_PIX_FMT_GBRP:
945
51
    case AV_PIX_FMT_0RGB32:
946
51
        s->colorspace = 1;
947
51
        s->chroma_planes = 1;
948
51
        s->bits_per_raw_sample = 8;
949
51
        break;
950
5
    case AV_PIX_FMT_GBRP9:
951
5
        if (!avctx->bits_per_raw_sample)
952
5
            s->bits_per_raw_sample = 9;
953
5
        av_fallthrough;
954
5
    case AV_PIX_FMT_X2BGR10:
955
5
    case AV_PIX_FMT_X2RGB10:
956
15
    case AV_PIX_FMT_GBRP10:
957
46
    case AV_PIX_FMT_GBRAP10:
958
46
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
959
41
            s->bits_per_raw_sample = 10;
960
46
        av_fallthrough;
961
57
    case AV_PIX_FMT_GBRP12:
962
84
    case AV_PIX_FMT_GBRAP12:
963
84
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
964
38
            s->bits_per_raw_sample = 12;
965
84
        av_fallthrough;
966
116
    case AV_PIX_FMT_GBRP14:
967
188
    case AV_PIX_FMT_GBRAP14:
968
188
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
969
104
            s->bits_per_raw_sample = 14;
970
188
        av_fallthrough;
971
269
    case AV_PIX_FMT_GBRP16:
972
316
    case AV_PIX_FMT_GBRAP16:
973
970
    case AV_PIX_FMT_GBRPF16:
974
970
    case AV_PIX_FMT_GBRAPF16:
975
970
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
976
782
            s->bits_per_raw_sample = 16;
977
970
        av_fallthrough;
978
3.16k
    case AV_PIX_FMT_GBRPF32:
979
3.16k
    case AV_PIX_FMT_GBRAPF32:
980
3.16k
        if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
981
2.19k
            s->bits_per_raw_sample = 32;
982
970
        else if (!s->bits_per_raw_sample)
983
0
            s->bits_per_raw_sample = avctx->bits_per_raw_sample;
984
3.16k
        s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
985
3.16k
        s->colorspace = 1;
986
3.16k
        s->chroma_planes = 1;
987
3.16k
        if (s->bits_per_raw_sample >= 16) {
988
2.97k
            s->use32bit = 1;
989
2.97k
        }
990
3.16k
        s->version = FFMAX(s->version, 1);
991
3.16k
        break;
992
0
    default:
993
0
        av_log(avctx, AV_LOG_ERROR, "format %s not supported\n",
994
0
               av_get_pix_fmt_name(pix_fmt));
995
0
        return AVERROR(ENOSYS);
996
4.83k
    }
997
4.83k
    s->flt = !!(desc->flags & AV_PIX_FMT_FLAG_FLOAT);
998
4.83k
    if (s->flt || s->remap_mode > 0)
999
3.18k
        s->version = FFMAX(s->version, 4);
1000
4.83k
    av_assert0(s->bits_per_raw_sample >= 8);
1001
1002
4.83k
    if (s->remap_mode < 0)
1003
4.83k
        s->remap_mode = s->flt ? 2 : 0;
1004
4.83k
    if (s->remap_mode == 0 && s->bits_per_raw_sample == 32) {
1005
0
        av_log(avctx, AV_LOG_ERROR, "32bit requires remap\n");
1006
0
        return AVERROR(EINVAL);
1007
0
    }
1008
4.83k
    if (s->remap_mode == 2 &&
1009
3.18k
        !((s->bits_per_raw_sample == 16 || s->bits_per_raw_sample == 32 || s->bits_per_raw_sample == 64) && s->flt)) {
1010
0
        av_log(avctx, AV_LOG_ERROR, "remap 2 is for float16/32/64 only\n");
1011
0
        return AVERROR(EINVAL);
1012
0
    }
1013
1014
4.83k
    return av_pix_fmt_get_chroma_sub_sample(pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
1015
4.83k
}
1016
1017
static av_cold int encode_init_internal(AVCodecContext *avctx)
1018
4.83k
{
1019
4.83k
    int ret;
1020
4.83k
    FFV1Context *s = avctx->priv_data;
1021
1022
4.83k
    if ((ret = ff_ffv1_common_init(avctx, s)) < 0)
1023
0
        return ret;
1024
1025
4.83k
    if (s->ac == 1) // Compatibility with common command line usage
1026
934
        s->ac = AC_RANGE_CUSTOM_TAB;
1027
3.90k
    else if (s->ac == AC_RANGE_DEFAULT_TAB_FORCE)
1028
685
        s->ac = AC_RANGE_DEFAULT_TAB;
1029
1030
4.83k
    ret = ff_ffv1_encode_setup_plane_info(avctx, avctx->pix_fmt);
1031
4.83k
    if (ret < 0)
1032
0
        return ret;
1033
1034
4.83k
    if (s->bayer && (avctx->width & 1 || avctx->height & 1)) {
1035
2
        av_log(avctx, AV_LOG_ERROR, "bayer requires even dimensions\n");
1036
2
        return AVERROR(EINVAL);
1037
2
    }
1038
1039
4.83k
    if (s->bits_per_raw_sample > (s->version > 3 ? 16 : 8) && !s->remap_mode) {
1040
602
        if (s->ac == AC_GOLOMB_RICE) {
1041
201
            av_log(avctx, AV_LOG_INFO,
1042
201
                    "high bits_per_raw_sample, forcing range coder\n");
1043
201
            s->ac = AC_RANGE_CUSTOM_TAB;
1044
201
        }
1045
602
    }
1046
1047
1048
4.83k
    ret = ff_ffv1_encode_init(avctx);
1049
4.83k
    if (ret < 0)
1050
2
        return ret;
1051
1052
4.83k
    if (s->version > 1) {
1053
4.83k
        if ((ret = ff_ffv1_encode_determine_slices(avctx)) < 0)
1054
15
            return ret;
1055
1056
4.81k
        if ((ret = ff_ffv1_write_extradata(avctx)) < 0)
1057
0
            return ret;
1058
4.81k
    }
1059
1060
4.81k
    if ((ret = ff_ffv1_init_slice_contexts(s)) < 0)
1061
0
        return ret;
1062
4.81k
    s->slice_count = s->max_slice_count;
1063
1064
27.5k
    for (int j = 0; j < s->slice_count; j++) {
1065
22.7k
        FFV1SliceContext *sc = &s->slices[j];
1066
1067
73.6k
        for (int i = 0; i < s->plane_count; i++) {
1068
50.8k
            PlaneContext *const p = &s->slices[j].plane[i];
1069
1070
50.8k
            p->quant_table_index = s->context_model;
1071
50.8k
            p->context_count     = s->context_count[p->quant_table_index];
1072
50.8k
        }
1073
22.7k
        av_assert0(s->remap_mode >= 0);
1074
22.7k
        if (s->remap_mode) {
1075
42.2k
            for (int p = 0; p < 1 + 2*s->chroma_planes + s->transparency ; p++) {
1076
31.1k
                if (s->bits_per_raw_sample == 32) {
1077
22.7k
                    sc->unit[p] = av_malloc_array(sc->slice_width, sc->slice_height * sizeof(**sc->unit));
1078
22.7k
                    if (!sc->unit[p])
1079
0
                        return AVERROR(ENOMEM);
1080
22.7k
                    sc->bitmap[p] = av_malloc_array(sc->slice_width * sc->slice_height, sizeof(*sc->bitmap[p]));
1081
22.7k
                    if (!sc->bitmap[p])
1082
0
                        return AVERROR(ENOMEM);
1083
22.7k
                } else {
1084
8.43k
                    sc->fltmap[p] = av_malloc_array(65536, sizeof(*sc->fltmap[p]));
1085
8.43k
                    if (!sc->fltmap[p])
1086
0
                        return AVERROR(ENOMEM);
1087
8.43k
                }
1088
31.1k
            }
1089
11.0k
        }
1090
1091
22.7k
        ff_build_rac_states(&s->slices[j].c, 0.05 * (1LL << 32), 256 - 8);
1092
1093
22.7k
        s->slices[j].remap = s->remap_mode;
1094
22.7k
    }
1095
1096
4.81k
    if ((ret = ff_ffv1_init_slices_state(s)) < 0)
1097
0
        return ret;
1098
1099
4.81k
#define STATS_OUT_SIZE 1024 * 1024 * 6
1100
4.81k
    if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1101
0
        avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
1102
0
        if (!avctx->stats_out)
1103
0
            return AVERROR(ENOMEM);
1104
0
        for (int i = 0; i < s->quant_table_count; i++)
1105
0
            for (int j = 0; j < s->max_slice_count; j++) {
1106
0
                FFV1SliceContext *sc = &s->slices[j];
1107
0
                av_assert0(!sc->rc_stat2[i]);
1108
0
                sc->rc_stat2[i] = av_mallocz(s->context_count[i] *
1109
0
                                             sizeof(*sc->rc_stat2[i]));
1110
0
                if (!sc->rc_stat2[i])
1111
0
                    return AVERROR(ENOMEM);
1112
0
            }
1113
0
    }
1114
1115
4.81k
    return 0;
1116
4.81k
}
1117
1118
static void encode_slice_header(FFV1Context *f, FFV1SliceContext *sc)
1119
121k
{
1120
121k
    RangeCoder *c = &sc->c;
1121
121k
    uint8_t state[CONTEXT_SIZE];
1122
121k
    int j;
1123
121k
    memset(state, 128, sizeof(state));
1124
1125
121k
    put_symbol(c, state, sc->sx, 0);
1126
121k
    put_symbol(c, state, sc->sy, 0);
1127
121k
    put_symbol(c, state, 0, 0);
1128
121k
    put_symbol(c, state, 0, 0);
1129
377k
    for (j=0; j<f->plane_count; j++) {
1130
256k
        put_symbol(c, state, sc->plane[j].quant_table_index, 0);
1131
256k
        av_assert0(sc->plane[j].quant_table_index == f->context_model);
1132
256k
    }
1133
121k
    if (!(f->cur_enc_frame->flags & AV_FRAME_FLAG_INTERLACED))
1134
121k
        put_symbol(c, state, 3, 0);
1135
0
    else
1136
0
        put_symbol(c, state, 1 + !(f->cur_enc_frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST), 0);
1137
121k
    put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.num, 0);
1138
121k
    put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.den, 0);
1139
121k
    if (f->version > 3) {
1140
79.3k
        put_rac(c, state, sc->slice_coding_mode == 1);
1141
79.3k
        if (sc->slice_coding_mode == 1)
1142
1.49k
            ff_ffv1_clear_slice_state(f, sc);
1143
79.3k
        put_symbol(c, state, sc->slice_coding_mode, 0);
1144
79.3k
        if (sc->slice_coding_mode != 1 && f->colorspace != 0) {
1145
59.1k
            put_symbol(c, state, sc->slice_rct_by_coef, 0);
1146
59.1k
            put_symbol(c, state, sc->slice_rct_ry_coef, 0);
1147
59.1k
        }
1148
79.3k
        put_symbol(c, state, sc->remap, 0);
1149
79.3k
    }
1150
121k
}
1151
1152
static void choose_rct_params(const FFV1Context *f, FFV1SliceContext *sc,
1153
                              const uint8_t *src[3], const int stride[3], int w, int h)
1154
45.6k
{
1155
1.51G
#define NB_Y_COEFF 15
1156
45.6k
    static const int rct_y_coeff[15][2] = {
1157
45.6k
        {0, 0}, //      4G
1158
45.6k
        {1, 1}, //  R + 2G + B
1159
45.6k
        {2, 2}, // 2R      + 2B
1160
45.6k
        {0, 2}, //      2G + 2B
1161
45.6k
        {2, 0}, // 2R + 2G
1162
45.6k
        {4, 0}, // 4R
1163
45.6k
        {0, 4}, //           4B
1164
1165
45.6k
        {0, 3}, //      1G + 3B
1166
45.6k
        {3, 0}, // 3R + 1G
1167
45.6k
        {3, 1}, // 3R      +  B
1168
45.6k
        {1, 3}, //  R      + 3B
1169
45.6k
        {1, 2}, //  R +  G + 2B
1170
45.6k
        {2, 1}, // 2R +  G +  B
1171
45.6k
        {0, 1}, //      3G +  B
1172
45.6k
        {1, 0}, //  R + 3G
1173
45.6k
    };
1174
1175
45.6k
    int stat[NB_Y_COEFF] = {0};
1176
45.6k
    int x, y, i, p, best;
1177
45.6k
    int16_t *sample[3];
1178
45.6k
    int lbd = f->bits_per_raw_sample <= 8;
1179
45.6k
    int packed = !src[1];
1180
45.6k
    int transparency = f->transparency;
1181
45.6k
    int packed_size = (3 + transparency)*2;
1182
1183
2.36M
    for (y = 0; y < h; y++) {
1184
2.31M
        int lastr=0, lastg=0, lastb=0;
1185
9.26M
        for (p = 0; p < 3; p++)
1186
6.95M
            sample[p] = sc->sample_buffer + p*w;
1187
1188
144M
        for (x = 0; x < w; x++) {
1189
141M
            int b, g, r;
1190
141M
            int ab, ag, ar;
1191
141M
            if (lbd) {
1192
0
                unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
1193
0
                b =  v        & 0xFF;
1194
0
                g = (v >>  8) & 0xFF;
1195
0
                r = (v >> 16) & 0xFF;
1196
141M
            } else if (packed) {
1197
0
                const uint16_t *p = ((const uint16_t*)(src[0] + x*packed_size + stride[0]*y));
1198
0
                r = p[0];
1199
0
                g = p[1];
1200
0
                b = p[2];
1201
141M
            } else if (f->use32bit || transparency) {
1202
141M
                g = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
1203
141M
                b = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
1204
141M
                r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
1205
141M
            } else {
1206
0
                b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
1207
0
                g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
1208
0
                r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
1209
0
            }
1210
1211
141M
            ar = r - lastr;
1212
141M
            ag = g - lastg;
1213
141M
            ab = b - lastb;
1214
141M
            if (x && y) {
1215
92.2M
                int bg = ag - sample[0][x];
1216
92.2M
                int bb = ab - sample[1][x];
1217
92.2M
                int br = ar - sample[2][x];
1218
1219
92.2M
                br -= bg;
1220
92.2M
                bb -= bg;
1221
1222
1.47G
                for (i = 0; i<NB_Y_COEFF; i++) {
1223
1.38G
                    stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
1224
1.38G
                }
1225
1226
92.2M
            }
1227
141M
            sample[0][x] = ag;
1228
141M
            sample[1][x] = ab;
1229
141M
            sample[2][x] = ar;
1230
1231
141M
            lastr = r;
1232
141M
            lastg = g;
1233
141M
            lastb = b;
1234
141M
        }
1235
2.31M
    }
1236
1237
45.6k
    best = 0;
1238
685k
    for (i=1; i<NB_Y_COEFF; i++) {
1239
639k
        if (stat[i] < stat[best])
1240
66.8k
            best = i;
1241
639k
    }
1242
1243
45.6k
    sc->slice_rct_by_coef = rct_y_coeff[best][1];
1244
45.6k
    sc->slice_rct_ry_coef = rct_y_coeff[best][0];
1245
45.6k
}
1246
1247
static void choose_rct_params_bayer(const FFV1Context *f, FFV1SliceContext *sc,
1248
                                    const uint8_t *src[4], const int stride[4],
1249
                                    int w, int h)
1250
13.4k
{
1251
13.4k
    static const int rct_y_coeff[NB_Y_COEFF][2] = {
1252
13.4k
        { 0, 0 }, { 1, 1 }, { 2, 2 }, { 0, 2 }, { 2, 0 }, { 4, 0 }, { 0, 4 }, { 0, 3 },
1253
13.4k
        { 3, 0 }, { 3, 1 }, { 1, 3 }, { 1, 2 }, { 2, 1 }, { 0, 1 }, { 1, 0 },
1254
13.4k
    };
1255
13.4k
    int stat[NB_Y_COEFF] = {0};
1256
13.4k
    int16_t *sample[3];
1257
13.4k
    int i, best;
1258
1259
    /* Walk in 2x2 blocks, build per-block gm/b/r, evaluate prediction-error */
1260
13.4k
    w >>= 1;
1261
53.8k
    for (i = 0; i < 3; i++)
1262
40.4k
        sample[i] = sc->sample_buffer + i*w;
1263
1264
157k
    for (int y = 0; y < h; y += 2) {
1265
144k
        int last_gm = 0, last_b = 0, last_r = 0;
1266
4.66M
        for (int x = 0; x < w; x++) {
1267
4.52M
            const uint16_t *l1 = (const uint16_t *)(src[0] + stride[0]*(y + 0) + x*2*2);
1268
4.52M
            const uint16_t *l2 = (const uint16_t *)(src[0] + stride[0]*(y + 1) + x*2*2);
1269
4.52M
            int r  = l1[0];
1270
4.52M
            int gr = l1[1];
1271
4.52M
            int gb = l2[0];
1272
4.52M
            int b  = l2[1];
1273
4.52M
            int gd = gr - gb;
1274
4.52M
            int gm = gb + (gd >> 1);
1275
1276
4.52M
            int agm = gm - last_gm;
1277
4.52M
            int ab  = b  - last_b;
1278
4.52M
            int ar  = r  - last_r;
1279
1280
4.52M
            if (x && y) {
1281
2.22M
                int bgm = agm - sample[0][x];
1282
2.22M
                int bb  = ab  - sample[1][x];
1283
2.22M
                int br  = ar  - sample[2][x];
1284
1285
2.22M
                br -= bgm;
1286
2.22M
                bb -= bgm;
1287
1288
35.6M
                for (i = 0; i < NB_Y_COEFF; i++)
1289
33.4M
                    stat[i] += FFABS(bgm + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1]) >> 2));
1290
2.22M
            }
1291
4.52M
            sample[0][x] = agm;
1292
4.52M
            sample[1][x] = ab;
1293
4.52M
            sample[2][x] = ar;
1294
1295
4.52M
            last_gm = gm;
1296
4.52M
            last_b  = b;
1297
4.52M
            last_r  = r;
1298
4.52M
        }
1299
144k
    }
1300
1301
13.4k
    best = 0;
1302
202k
    for (i = 1; i < NB_Y_COEFF; i++)
1303
188k
        if (stat[i] < stat[best])
1304
13.8k
            best = i;
1305
1306
13.4k
    sc->slice_rct_by_coef = rct_y_coeff[best][1];
1307
13.4k
    sc->slice_rct_ry_coef = rct_y_coeff[best][0];
1308
13.4k
}
1309
1310
static void encode_histogram_remap(FFV1Context *f, FFV1SliceContext *sc)
1311
33.0k
{
1312
33.0k
    int len = 1 << f->bits_per_raw_sample;
1313
33.0k
    int flip = sc->remap == 2 ? 0x7FFF : 0;
1314
1315
97.9k
    for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
1316
64.9k
        int j = 0;
1317
64.9k
        int lu = 0;
1318
64.9k
        uint8_t state[2][32];
1319
64.9k
        int run = 0;
1320
1321
64.9k
        memset(state, 128, sizeof(state));
1322
64.9k
        put_symbol(&sc->c, state[0], 0, 0);
1323
64.9k
        memset(state, 128, sizeof(state));
1324
4.25G
        for (int i= 0; i<len; i++) {
1325
4.25G
            int ri = i ^ ((i&0x8000) ? 0 : flip);
1326
4.25G
            int u = sc->fltmap[p][ri];
1327
4.25G
            sc->fltmap[p][ri] = j;
1328
4.25G
            j+= u;
1329
1330
4.25G
            if (lu == u) {
1331
4.24G
                run ++;
1332
4.24G
            } else {
1333
8.47M
                put_symbol_inline(&sc->c, state[lu], run, 0, NULL, NULL);
1334
8.47M
                if (run == 0)
1335
2.10M
                    lu = u;
1336
8.47M
                run = 0;
1337
8.47M
            }
1338
4.25G
        }
1339
64.9k
        if (run)
1340
49.8k
            put_symbol(&sc->c, state[lu], run, 0);
1341
64.9k
        sc->remap_count[p] = j;
1342
64.9k
    }
1343
33.0k
}
1344
1345
static void load_rgb_float32_frame(FFV1Context *f, FFV1SliceContext *sc,
1346
                                   const uint8_t *src[4],
1347
                                   int w, int h, const int stride[4])
1348
32.7k
{
1349
32.7k
    int x, y;
1350
32.7k
    int transparency = f->transparency;
1351
32.7k
    int i = 0;
1352
1353
1.81M
    for (y = 0; y < h; y++) {
1354
129M
        for (x = 0; x < w; x++) {
1355
127M
            int b, g, r, av_uninit(a);
1356
1357
127M
            g = *((const uint32_t *)(src[0] + x*4 + stride[0]*y));
1358
127M
            b = *((const uint32_t *)(src[1] + x*4 + stride[1]*y));
1359
127M
            r = *((const uint32_t *)(src[2] + x*4 + stride[2]*y));
1360
127M
            if (transparency)
1361
0
                a = *((const uint32_t *)(src[3] + x*4 + stride[3]*y));
1362
1363
127M
            if (sc->remap == 2) {
1364
382M
#define FLIP(f) (((f)&0x80000000) ? (f) : (f)^0x7FFFFFFF);
1365
127M
                g = FLIP(g);
1366
127M
                b = FLIP(b);
1367
127M
                r = FLIP(r);
1368
127M
            }
1369
            // We cannot build a histogram as we do for 16bit, we need a bit of magic here
1370
            // Its possible to reduce the memory needed at the cost of more dereferencing
1371
127M
            sc->unit[0][i].val = g;
1372
127M
            sc->unit[0][i].ndx = x + y*w;
1373
1374
127M
            sc->unit[1][i].val = b;
1375
127M
            sc->unit[1][i].ndx = x + y*w;
1376
1377
127M
            sc->unit[2][i].val = r;
1378
127M
            sc->unit[2][i].ndx = x + y*w;
1379
1380
127M
            if (transparency) {
1381
0
                sc->unit[3][i].val = a;
1382
0
                sc->unit[3][i].ndx = x + y*w;
1383
0
            }
1384
127M
            i++;
1385
127M
        }
1386
1.77M
    }
1387
1388
    //TODO switch to radix sort
1389
1.12G
#define CMP(A,B) ((A)->val - (int64_t)(B)->val)
1390
571M
    AV_QSORT(sc->unit[0], i, struct Unit, CMP);
1391
278M
    AV_QSORT(sc->unit[1], i, struct Unit, CMP);
1392
275M
    AV_QSORT(sc->unit[2], i, struct Unit, CMP);
1393
32.7k
    if (transparency)
1394
0
        AV_QSORT(sc->unit[3], i, struct Unit, CMP);
1395
32.7k
}
1396
1397
static int encode_float32_remap_segment(FFV1SliceContext *sc,
1398
                                        int p, int mul_count, int *mul_tab, int update, int final)
1399
294k
{
1400
294k
    const int pixel_num = sc->slice_width * sc->slice_height;
1401
294k
    uint8_t state[2][3][32];
1402
294k
    int mul[4096+1];
1403
294k
    RangeCoder rc = sc->c;
1404
294k
    int lu = 0;
1405
294k
    int run = 0;
1406
294k
    int64_t last_val = -1;
1407
294k
    int compact_index = -1;
1408
294k
    int i = 0;
1409
294k
    int current_mul_index = -1;
1410
294k
    int run1final = 0;
1411
294k
    int run1start_i;
1412
294k
    int run1start_last_val;
1413
294k
    int run1start_mul_index;
1414
1415
294k
    memcpy(mul, mul_tab, sizeof(*mul_tab)*(mul_count+1));
1416
294k
    memset(state, 128, sizeof(state));
1417
294k
    put_symbol(&rc, state[0][0], mul_count, 0);
1418
294k
    memset(state, 128, sizeof(state));
1419
1420
1.29G
    for (; i < pixel_num+1; i++) {
1421
1.29G
        int current_mul = current_mul_index < 0 ? 1 : FFABS(mul[current_mul_index]);
1422
1.29G
        int64_t val;
1423
1.29G
        if (i == pixel_num) {
1424
344k
            if (last_val == 0xFFFFFFFF && (!run || run1final)) {
1425
115k
                break;
1426
229k
            } else {
1427
229k
                val = last_val + ((1LL<<32) - last_val + current_mul - 1) / current_mul * current_mul;
1428
229k
                av_assert2(val >= (1LL<<32));
1429
229k
                val += lu * current_mul; //ensure a run1 ends
1430
229k
            }
1431
344k
        } else
1432
1.29G
            val = sc->unit[p][i].val;
1433
1434
1.29G
        if (last_val != val) {
1435
38.4M
            int64_t delta = val - last_val;
1436
38.4M
            int64_t step  = FFMAX(1, (delta + current_mul/2) / current_mul);
1437
38.4M
            av_assert2(last_val < val);
1438
38.4M
            av_assert2(current_mul > 0);
1439
1440
38.4M
            delta -= step*current_mul;
1441
38.4M
            av_assert2(delta <= current_mul/2);
1442
38.4M
            av_assert2(delta > -current_mul);
1443
1444
38.4M
            av_assert2(step > 0);
1445
38.4M
            if (lu) {
1446
8.68M
                if (!run) {
1447
4.47M
                    run1start_i        = i - 1;
1448
4.47M
                    run1start_last_val = last_val;
1449
4.47M
                    run1start_mul_index= current_mul_index;
1450
4.47M
                }
1451
8.68M
                if (step == 1) {
1452
4.20M
                    if (run1final) {
1453
1.79M
                        if (current_mul>1)
1454
1.75M
                            put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL);
1455
1.79M
                    }
1456
4.20M
                    run ++;
1457
4.20M
                    av_assert2(last_val + current_mul + delta == val);
1458
4.47M
                } else {
1459
4.47M
                    if (run1final) {
1460
2.23M
                        if (run == 0)
1461
1.63M
                            lu ^= 1;
1462
2.23M
                        i--; // we did not encode val so we need to backstep
1463
2.23M
                        last_val += current_mul;
1464
2.23M
                    } else {
1465
2.23M
                        put_symbol_inline(&rc, state[lu][0], run, 0, NULL, NULL);
1466
2.23M
                        i                 = run1start_i;
1467
2.23M
                        last_val          = run1start_last_val; // we could compute this instead of storing
1468
2.23M
                        current_mul_index = run1start_mul_index;
1469
2.23M
                    }
1470
4.47M
                    run1final ^= 1;
1471
1472
4.47M
                    run = 0;
1473
4.47M
                    continue;
1474
4.47M
                }
1475
29.8M
            } else {
1476
29.8M
                av_assert2(run == 0);
1477
29.8M
                av_assert2(run1final == 0);
1478
29.8M
                put_symbol_inline(&rc, state[lu][0], step - 1, 0, NULL, NULL);
1479
1480
29.8M
                if (current_mul > 1)
1481
27.3M
                    put_symbol_inline(&rc, state[lu][1], delta, 1, NULL, NULL);
1482
29.8M
                if (step == 1)
1483
1.67M
                    lu ^= 1;
1484
1485
29.8M
                av_assert2(last_val + step * current_mul + delta == val);
1486
29.8M
            }
1487
34.0M
            last_val = val;
1488
34.0M
            current_mul_index = ((last_val + 1) * mul_count) >> 32;
1489
34.0M
            if (!run || run1final) {
1490
31.6M
                av_assert2(mul[ current_mul_index ]);
1491
31.6M
                if (mul[ current_mul_index ] < 0) {
1492
2.27M
                    av_assert2(i < pixel_num);
1493
2.27M
                    mul[ current_mul_index ] *= -1;
1494
2.27M
                    put_symbol_inline(&rc, state[0][2], mul[ current_mul_index ], 0, NULL, NULL);
1495
2.27M
                }
1496
31.6M
                if (i < pixel_num)
1497
31.4M
                    compact_index ++;
1498
31.6M
            }
1499
34.0M
        }
1500
1.28G
        if (!run || run1final)
1501
1.14G
            if (final && i < pixel_num)
1502
382M
                sc->bitmap[p][sc->unit[p][i].ndx] = compact_index;
1503
1.28G
    }
1504
1505
294k
    if (update) {
1506
98.3k
        sc->c = rc;
1507
98.3k
        sc->remap_count[p] = compact_index + 1;
1508
98.3k
    }
1509
294k
    return get_rac_count(&rc);
1510
294k
}
1511
1512
static void encode_float32_remap(FFV1Context *f, FFV1SliceContext *sc,
1513
                                 const uint8_t *src[4])
1514
32.7k
{
1515
32.7k
    int pixel_num = sc->slice_width * sc->slice_height;
1516
32.7k
    const int max_log2_mul_count  = ((int[]){  1,  1,  1,  9,  9,  10})[f->remap_optimizer];
1517
32.7k
    const int log2_mul_count_step = ((int[]){  1,  1,  1,  9,  9,   1})[f->remap_optimizer];
1518
32.7k
    const int max_log2_mul        = ((int[]){  1,  8,  8,  9, 22,  22})[f->remap_optimizer];
1519
32.7k
    const int log2_mul_step       = ((int[]){  1,  8,  1,  1,  1,   1})[f->remap_optimizer];
1520
32.7k
    const int bruteforce_count    = ((int[]){  0,  0,  0,  1,  1,   1})[f->remap_optimizer];
1521
32.7k
    const int stair_mode          = ((int[]){  0,  0,  0,  1,  0,   0})[f->remap_optimizer];
1522
32.7k
    const int magic_log2          = ((int[]){  1,  1,  1,  1,  0,   0})[f->remap_optimizer];
1523
1524
131k
    for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
1525
98.3k
        int best_log2_mul_count = 0;
1526
98.3k
        float score_sum[11] = {0};
1527
98.3k
        int mul_all[11][1025];
1528
1529
294k
        for (int log2_mul_count= 0; log2_mul_count <= max_log2_mul_count; log2_mul_count += log2_mul_count_step) {
1530
196k
            float score_tab_all[1025][23] = {0};
1531
196k
            int64_t last_val = -1;
1532
196k
            int *mul_tab = mul_all[log2_mul_count];
1533
196k
            int last_mul_index = -1;
1534
196k
            int mul_count = 1 << log2_mul_count;
1535
1536
196k
            score_sum[log2_mul_count] = 2 * log2_mul_count;
1537
196k
            if (magic_log2)
1538
196k
                score_sum[log2_mul_count] = av_float2int((float)mul_count * mul_count);
1539
766M
            for (int i= 0; i<pixel_num; i++) {
1540
765M
                int64_t val = sc->unit[p][i].val;
1541
765M
                int mul_index = (val + 1LL)*mul_count >> 32;
1542
765M
                if (val != last_val) {
1543
20.9M
                    float *score_tab = score_tab_all[(last_val + 1LL)*mul_count >> 32];
1544
20.9M
                    av_assert2(last_val < val);
1545
230M
                    for(int si= 0; si <= max_log2_mul; si += log2_mul_step) {
1546
209M
                        int64_t delta = val - last_val;
1547
209M
                        int mul;
1548
209M
                        int64_t cost;
1549
1550
209M
                        if (last_val < 0) {
1551
1.96M
                            mul = 1;
1552
207M
                        } else if (stair_mode && mul_count == 512 && si == max_log2_mul ) {
1553
10.3M
                            if (mul_index >= 0x378/8 && mul_index <= 23 + 0x378/8) {
1554
561k
                                mul = (0x800080 >> (mul_index - 0x378/8));
1555
561k
                            } else
1556
9.81M
                                mul = 1;
1557
197M
                        } else {
1558
197M
                            mul = (0x10001LL)<<si >> 16;
1559
197M
                        }
1560
1561
209M
                        cost = FFMAX((delta + mul/2)  / mul, 1);
1562
209M
                        float score = 1;
1563
209M
                        if (mul > 1) {
1564
176M
                            score *= (FFABS(delta - cost*mul)+1);
1565
176M
                            if (mul_count > 1)
1566
83.5M
                                score *= score;
1567
176M
                        }
1568
209M
                        score *= cost;
1569
209M
                        score *= score;
1570
209M
                        if (mul_index != last_mul_index)
1571
21.3M
                            score *= mul;
1572
209M
                        if (magic_log2) {
1573
209M
                            score_tab[si] += av_float2int(score);
1574
209M
                        } else
1575
0
                            score_tab[si] += log2f(score);
1576
209M
                    }
1577
20.9M
                }
1578
765M
                last_val = val;
1579
765M
                last_mul_index = mul_index;
1580
765M
            }
1581
50.6M
            for(int i= 0; i<mul_count; i++) {
1582
50.4M
                int best_index = 0;
1583
50.4M
                float *score_tab = score_tab_all[i];
1584
554M
                for(int si= 0; si <= max_log2_mul; si += log2_mul_step) {
1585
504M
                    if (score_tab[si] < score_tab[ best_index ])
1586
4.95M
                        best_index = si;
1587
504M
                }
1588
50.4M
                if (stair_mode && mul_count == 512 && best_index == max_log2_mul ) {
1589
17.6k
                    if (i >= 0x378/8 && i <= 23 + 0x378/8) {
1590
16.4k
                        mul_tab[i] = -(0x800080 >> (i - 0x378/8));
1591
16.4k
                    } else
1592
1.23k
                        mul_tab[i] = -1;
1593
17.6k
                } else
1594
50.4M
                    mul_tab[i] = -((0x10001LL)<<best_index >> 16);
1595
50.4M
                score_sum[log2_mul_count] += score_tab[ best_index ];
1596
50.4M
            }
1597
196k
            mul_tab[mul_count] = 1;
1598
1599
196k
            if (bruteforce_count)
1600
196k
                score_sum[log2_mul_count] = encode_float32_remap_segment(sc, p, mul_count, mul_all[log2_mul_count], 0, 0);
1601
1602
196k
            if (score_sum[log2_mul_count] < score_sum[best_log2_mul_count])
1603
4.73k
                best_log2_mul_count = log2_mul_count;
1604
196k
        }
1605
1606
98.3k
        encode_float32_remap_segment(sc, p, 1<<best_log2_mul_count, mul_all[best_log2_mul_count], 1, 1);
1607
98.3k
    }
1608
32.7k
}
1609
1610
static int encode_float32_rgb_frame(FFV1Context *f, FFV1SliceContext *sc,
1611
                                    const uint8_t *src[4],
1612
                                    int w, int h, const int stride[4], int ac)
1613
32.7k
{
1614
32.7k
    int x, y, p, i;
1615
32.7k
    const int ring_size = f->context_model ? 3 : 2;
1616
32.7k
    int32_t *sample[4][3];
1617
32.7k
    const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
1618
32.7k
    int bits[4], offset;
1619
32.7k
    int transparency = f->transparency;
1620
1621
32.7k
    ff_ffv1_compute_bits_per_plane(f, sc, bits, &offset, NULL, f->bits_per_raw_sample);
1622
1623
32.7k
    sc->run_index = 0;
1624
1625
163k
    for (int p = 0; p < MAX_PLANES; ++p)
1626
131k
        sample[p][2] = sc->sample_buffer32; // dummy to avoid UB pointer arithmetic
1627
1628
32.7k
    memset(RENAME(sc->sample_buffer), 0, ring_size * MAX_PLANES *
1629
32.7k
           (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
1630
1631
1.80M
    for (y = 0; y < h; y++) {
1632
6.17M
        for (i = 0; i < ring_size; i++)
1633
22.0M
            for (p = 0; p < MAX_PLANES; p++)
1634
17.6M
                sample[p][i]= RENAME(sc->sample_buffer) + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
1635
1636
127M
        for (x = 0; x < w; x++) {
1637
125M
            int b, g, r, av_uninit(a);
1638
125M
            g = sc->bitmap[0][x + w*y];
1639
125M
            b = sc->bitmap[1][x + w*y];
1640
125M
            r = sc->bitmap[2][x + w*y];
1641
125M
            if (transparency)
1642
0
                a = sc->bitmap[3][x + w*y];
1643
1644
125M
            if (sc->slice_coding_mode != 1) {
1645
101M
                b -= g;
1646
101M
                r -= g;
1647
101M
                g += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
1648
101M
                b += offset;
1649
101M
                r += offset;
1650
101M
            }
1651
1652
125M
            sample[0][0][x] = g;
1653
125M
            sample[1][0][x] = b;
1654
125M
            sample[2][0][x] = r;
1655
125M
            sample[3][0][x] = a;
1656
125M
        }
1657
7.10M
        for (p = 0; p < 3 + transparency; p++) {
1658
5.33M
            int ret;
1659
5.33M
            sample[p][0][-1] = sample[p][1][0  ];
1660
5.33M
            sample[p][1][ w] = sample[p][1][w-1];
1661
5.33M
            ret = encode_line32(f, sc, f->avctx, w, sample[p], (p + 1) / 2,
1662
5.33M
                                bits[p], ac, pass1);
1663
5.33M
            if (ret < 0)
1664
844
                return ret;
1665
5.33M
        }
1666
1.77M
    }
1667
31.9k
    return 0;
1668
32.7k
}
1669
1670
static int encode_bayer_frame(FFV1Context *f, FFV1SliceContext *sc,
1671
                              const uint8_t *src[4],
1672
                              int w, int h, const int stride[4], int ac)
1673
13.5k
{
1674
13.5k
    const int pass1 = !!(f->avctx->flags & AV_CODEC_FLAG_PASS1);
1675
13.5k
    const int ring_size = f->context_model ? 3 : 2;
1676
13.5k
    TYPE *sample[4][3];
1677
1678
13.5k
    int bits[4], offset;
1679
13.5k
    ff_ffv1_compute_bits_per_plane(f, sc, bits, &offset, NULL, f->bits_per_raw_sample);
1680
1681
13.5k
    w >>= 1;
1682
1683
13.5k
    sc->run_index = 0;
1684
1685
67.6k
    for (int p = 0; p < MAX_PLANES; ++p)
1686
54.0k
        sample[p][2] = RENAME(sc->sample_buffer);
1687
1688
13.5k
    memset(RENAME(sc->sample_buffer), 0, ring_size * MAX_PLANES *
1689
13.5k
           (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
1690
1691
157k
    for (int y = 0; y < h; y += 2) {
1692
473k
        for (int i = 0; i < ring_size; i++)
1693
1.64M
            for (int p = 0; p < MAX_PLANES; p++)
1694
1.31M
                sample[p][i] = RENAME(sc->sample_buffer) + p*ring_size*(w+6) +
1695
1.31M
                               ((h+i-y/2) % ring_size)*(w+6) + 3;
1696
1697
5.05M
        for (int x = 0; x < w; x++) {
1698
4.90M
            const uint16_t *l1 = ((const uint16_t*)(src[0] + stride[0]*(y + 0) + x*2*2));
1699
4.90M
            const uint16_t *l2 = ((const uint16_t*)(src[0] + stride[0]*(y + 1) + x*2*2));
1700
1701
4.90M
            int r, gr, gb, b;
1702
4.90M
            r  = l1[0];
1703
4.90M
            gr = l1[1];
1704
4.90M
            gb = l2[0];
1705
4.90M
            b  = l2[1];
1706
1707
4.90M
            if (sc->slice_coding_mode != 1) {
1708
               /**
1709
                * Bayer 2x2 RCT, based on:
1710
                * "Reversible color transform for Bayer color filter array images", S. Poomrittigul et al,
1711
                * APSIPA Transactions on Signal and Information Processing (2013) 2 (1): 1-10,
1712
                * doi:10.1017/ATSIP.2013.6 */
1713
4.52M
               int gd = gr - gb;
1714
4.52M
               int gm = gb + (gd >> 1);
1715
1716
4.52M
                b -= gm;
1717
4.52M
                r -= gm;
1718
4.52M
                gm += (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
1719
4.52M
                b += offset;
1720
4.52M
                r += offset;
1721
4.52M
                gd += offset;
1722
1723
4.52M
                gr = gm;
1724
4.52M
                gb = gd;
1725
4.52M
            }
1726
1727
4.90M
            sample[0][0][x] = gr;
1728
4.90M
            sample[1][0][x] = gb;
1729
4.90M
            sample[2][0][x] = b;
1730
4.90M
            sample[3][0][x] = r;
1731
4.90M
        }
1732
1733
720k
        for (int p = 0; p < 4; p++) {
1734
576k
            int ret;
1735
576k
            sample[p][0][-1] = sample[p][1][0  ];
1736
576k
            sample[p][1][ w] = sample[p][1][w-1];
1737
            /* Plane contexts: gm=0 (luma), b-gm/r-gm=1 (chroma diff from
1738
             * green), gd=2 (own context - green-green diff has different
1739
             * statistics from both luma and chroma). */
1740
576k
            ret = RENAME(encode_line)(f, sc, f->avctx, w, sample[p],
1741
576k
                                      p == 1 ? 2 : (p > 1),
1742
576k
                                      bits[p], ac, pass1);
1743
576k
            if (ret < 0)
1744
50
                return ret;
1745
576k
        }
1746
144k
    }
1747
1748
13.4k
    return 0;
1749
13.5k
}
1750
1751
static int encode_slice(AVCodecContext *c, void *arg)
1752
119k
{
1753
119k
    FFV1SliceContext *sc = arg;
1754
119k
    FFV1Context *f   = c->priv_data;
1755
119k
    int width        = sc->slice_width;
1756
119k
    int height       = sc->slice_height;
1757
119k
    int x            = sc->slice_x;
1758
119k
    int y            = sc->slice_y;
1759
119k
    const AVFrame *const p = f->cur_enc_frame;
1760
119k
    const int ps     = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
1761
119k
    int ret;
1762
119k
    RangeCoder c_bak = sc->c;
1763
119k
    const int chroma_width  = AV_CEIL_RSHIFT(width,  f->chroma_h_shift);
1764
119k
    const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
1765
119k
    const uint8_t *planes[4] = {p->data[0] + ps*x + y*p->linesize[0],
1766
119k
                                p->data[1] ? p->data[1] + ps*x + y*p->linesize[1] : NULL,
1767
119k
                                p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL,
1768
119k
                                p->data[3] ? p->data[3] + ps*x + y*p->linesize[3] : NULL};
1769
119k
    int ac = f->ac;
1770
1771
119k
    sc->slice_coding_mode = 0;
1772
119k
    if (f->version > 3 && f->colorspace == 1) {
1773
45.6k
        choose_rct_params(f, sc, planes, p->linesize, width, height);
1774
73.8k
    } else if (f->bayer) {
1775
13.4k
        choose_rct_params_bayer(f, sc, planes, p->linesize, width, height);
1776
60.3k
    } else {
1777
60.3k
        sc->slice_rct_by_coef = 1;
1778
60.3k
        sc->slice_rct_ry_coef = 1;
1779
60.3k
    }
1780
1781
121k
retry:
1782
121k
    if (f->key_frame)
1783
30.4k
        ff_ffv1_clear_slice_state(f, sc);
1784
121k
    if (f->version > 2) {
1785
121k
        encode_slice_header(f, sc);
1786
121k
    }
1787
1788
121k
    if (sc->remap) {
1789
      //Both the 16bit and 32bit remap do exactly the same thing but with 16bits we can
1790
      //Implement this using a "histogram" while for 32bit that would be gb sized, thus a more
1791
      //complex implementation sorting pairs is used.
1792
65.8k
      if (f->bits_per_raw_sample != 32) {
1793
33.0k
        if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8 && c->pix_fmt != AV_PIX_FMT_YAF16) {
1794
15.2k
            const int cx            = x >> f->chroma_h_shift;
1795
15.2k
            const int cy            = y >> f->chroma_v_shift;
1796
1797
            //TODO decide on the order for the encoded remaps and loads. with golomb rice it
1798
            // easier to have all range coded ones together, otherwise it may be nicer to handle each plane as a whole?
1799
1800
15.2k
            load_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
1801
1802
15.2k
            if (f->chroma_planes) {
1803
0
                load_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
1804
0
                load_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 2, 1);
1805
0
            }
1806
15.2k
            if (f->transparency)
1807
0
                load_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 3, 1);
1808
17.8k
        } else if (c->pix_fmt == AV_PIX_FMT_YA8 || c->pix_fmt == AV_PIX_FMT_YAF16) {
1809
3.71k
            load_plane(f, sc, p->data[0] +           ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);
1810
3.71k
            load_plane(f, sc, p->data[0] + (ps>>1) + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2);
1811
14.0k
        } else if (f->use32bit) {
1812
14.0k
            load_rgb_frame32(f, sc, planes, width, height, p->linesize);
1813
14.0k
        } else
1814
0
            load_rgb_frame  (f, sc, planes, width, height, p->linesize);
1815
1816
33.0k
        encode_histogram_remap(f, sc);
1817
33.0k
      } else {
1818
32.7k
            load_rgb_float32_frame(f, sc, planes, width, height, p->linesize);
1819
32.7k
            encode_float32_remap(f, sc, planes);
1820
32.7k
      }
1821
65.8k
    }
1822
1823
121k
    if (ac == AC_GOLOMB_RICE) {
1824
44.7k
        sc->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&sc->c, f->version > 2) : 0;
1825
44.7k
        init_put_bits(&sc->pb,
1826
44.7k
                      sc->c.bytestream_start + sc->ac_byte_count,
1827
44.7k
                      sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count);
1828
44.7k
    }
1829
1830
121k
    if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8 && c->pix_fmt != AV_PIX_FMT_YAF16) {
1831
43.7k
        const int cx            = x >> f->chroma_h_shift;
1832
43.7k
        const int cy            = y >> f->chroma_v_shift;
1833
1834
43.7k
        ret = encode_plane(f, sc, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac);
1835
1836
43.7k
        if (f->chroma_planes) {
1837
13.4k
            ret |= encode_plane(f, sc, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, 1, ac);
1838
13.4k
            ret |= encode_plane(f, sc, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 2, 1, ac);
1839
13.4k
        }
1840
43.7k
        if (f->transparency)
1841
5.20k
            ret |= encode_plane(f, sc, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 3, 1, ac);
1842
77.2k
    } else if (c->pix_fmt == AV_PIX_FMT_YA8 || c->pix_fmt == AV_PIX_FMT_YAF16) {
1843
4.66k
        ret  = encode_plane(f, sc, p->data[0] +           ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 2, ac);
1844
4.66k
        ret |= encode_plane(f, sc, p->data[0] + (ps>>1) + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 1, 2, ac);
1845
72.6k
    } else if (f->bits_per_raw_sample == 32) {
1846
32.7k
        ret = encode_float32_rgb_frame(f, sc, planes, width, height, p->linesize, ac);
1847
39.8k
    } else if (f->bayer) {
1848
13.5k
        ret = encode_bayer_frame(f, sc, planes, width, height, p->linesize, ac);
1849
26.3k
    } else if (f->use32bit) {
1850
18.1k
        ret = encode_rgb_frame32(f, sc, planes, width, height, p->linesize, ac);
1851
18.1k
    } else {
1852
8.15k
        ret = encode_rgb_frame(f, sc, planes, width, height, p->linesize, ac);
1853
8.15k
    }
1854
1855
121k
    if (ac != AC_GOLOMB_RICE) {
1856
76.3k
        sc->ac_byte_count = ff_rac_terminate(&sc->c, 1);
1857
76.3k
    } else {
1858
44.7k
        flush_put_bits(&sc->pb); // FIXME: nicer padding
1859
44.7k
        sc->ac_byte_count += put_bytes_output(&sc->pb);
1860
44.7k
    }
1861
1862
121k
    if (ret < 0) {
1863
1.49k
        av_assert0(sc->slice_coding_mode == 0);
1864
1.49k
        if (f->version < 4) {
1865
0
            av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1866
0
            return ret;
1867
0
        }
1868
1.49k
        av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1869
1.49k
        ac = 1;
1870
1.49k
        sc->slice_coding_mode = 1;
1871
1.49k
        sc->c = c_bak;
1872
1.49k
        goto retry;
1873
1.49k
    }
1874
1875
119k
    return 0;
1876
121k
}
1877
1878
size_t ff_ffv1_encode_buffer_size(AVCodecContext *avctx)
1879
31.1k
{
1880
31.1k
    FFV1Context *f = avctx->priv_data;
1881
1882
31.1k
    int w = avctx->width  + f->num_h_slices;
1883
31.1k
    int h = avctx->height + f->num_v_slices;
1884
31.1k
    size_t maxsize = w*h * (1 + f->transparency);
1885
31.1k
    if (f->chroma_planes)
1886
22.3k
        maxsize += AV_CEIL_RSHIFT(w, f->chroma_h_shift) * AV_CEIL_RSHIFT(h, f->chroma_v_shift) * 2;
1887
31.1k
    maxsize += f->slice_count * 800; //for slice header
1888
31.1k
    if (f->version > 3) {
1889
21.1k
        maxsize *= f->bits_per_raw_sample + 1;
1890
21.1k
        if (f->remap_mode)
1891
17.6k
            maxsize += f->slice_count * 70000 * (1 + 2*f->chroma_planes + f->bayer + f->transparency);
1892
21.1k
    } else {
1893
9.95k
        maxsize += f->slice_count * 2 * (avctx->width + avctx->height); //for bug with slices that code some pixels more than once
1894
9.95k
        maxsize *= 8*(2*f->bits_per_raw_sample + 5);
1895
9.95k
    }
1896
31.1k
    maxsize >>= 3;
1897
31.1k
    maxsize += FF_INPUT_BUFFER_MIN_SIZE;
1898
1899
31.1k
    return maxsize;
1900
31.1k
}
1901
1902
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1903
                        const AVFrame *pict, int *got_packet)
1904
35.9k
{
1905
35.9k
    FFV1Context *f      = avctx->priv_data;
1906
35.9k
    RangeCoder *const c = &f->slices[0].c;
1907
35.9k
    uint8_t keystate    = 128;
1908
35.9k
    uint8_t *buf_p;
1909
35.9k
    int i, ret;
1910
35.9k
    int64_t maxsize;
1911
1912
35.9k
    if(!pict) {
1913
4.81k
        if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1914
0
            int j, k, m;
1915
0
            char *p   = avctx->stats_out;
1916
0
            char *end = p + STATS_OUT_SIZE;
1917
1918
0
            memset(f->rc_stat, 0, sizeof(f->rc_stat));
1919
0
            for (i = 0; i < f->quant_table_count; i++)
1920
0
                memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1921
1922
0
            av_assert0(f->slice_count == f->max_slice_count);
1923
0
            for (j = 0; j < f->slice_count; j++) {
1924
0
                const FFV1SliceContext *sc = &f->slices[j];
1925
0
                for (i = 0; i < 256; i++) {
1926
0
                    f->rc_stat[i][0] += sc->rc_stat[i][0];
1927
0
                    f->rc_stat[i][1] += sc->rc_stat[i][1];
1928
0
                }
1929
0
                for (i = 0; i < f->quant_table_count; i++) {
1930
0
                    for (k = 0; k < f->context_count[i]; k++)
1931
0
                        for (m = 0; m < 32; m++) {
1932
0
                            f->rc_stat2[i][k][m][0] += sc->rc_stat2[i][k][m][0];
1933
0
                            f->rc_stat2[i][k][m][1] += sc->rc_stat2[i][k][m][1];
1934
0
                        }
1935
0
                }
1936
0
            }
1937
1938
0
            for (j = 0; j < 256; j++) {
1939
0
                snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1940
0
                        f->rc_stat[j][0], f->rc_stat[j][1]);
1941
0
                p += strlen(p);
1942
0
            }
1943
0
            snprintf(p, end - p, "\n");
1944
1945
0
            for (i = 0; i < f->quant_table_count; i++) {
1946
0
                for (j = 0; j < f->context_count[i]; j++)
1947
0
                    for (m = 0; m < 32; m++) {
1948
0
                        snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1949
0
                                f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1950
0
                        p += strlen(p);
1951
0
                    }
1952
0
            }
1953
0
            snprintf(p, end - p, "%d\n", f->gob_count);
1954
0
        }
1955
4.81k
        return 0;
1956
4.81k
    }
1957
1958
    /* Maximum packet size */
1959
31.1k
    maxsize = ff_ffv1_encode_buffer_size(avctx);
1960
1961
31.1k
    if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
1962
0
        FFV1Context *f = avctx->priv_data;
1963
0
        if (!f->maxsize_warned) {
1964
0
            av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
1965
0
            f->maxsize_warned++;
1966
0
        }
1967
0
        maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
1968
0
    }
1969
1970
31.1k
    if ((ret = ff_alloc_packet(avctx, pkt, maxsize)) < 0)
1971
0
        return ret;
1972
1973
31.1k
    ff_init_range_encoder(c, pkt->data, pkt->size);
1974
31.1k
    ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1975
1976
31.1k
    f->cur_enc_frame = pict;
1977
1978
31.1k
    if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1979
6.91k
        put_rac(c, &keystate, 1);
1980
6.91k
        f->key_frame = 1;
1981
6.91k
        f->gob_count++;
1982
6.91k
        write_header(f);
1983
24.1k
    } else {
1984
24.1k
        put_rac(c, &keystate, 0);
1985
24.1k
        f->key_frame = 0;
1986
24.1k
    }
1987
1988
31.1k
    if (f->ac == AC_RANGE_CUSTOM_TAB) {
1989
14.9k
        int i;
1990
3.83M
        for (i = 1; i < 256; i++) {
1991
3.81M
            c->one_state[i]        = f->state_transition[i];
1992
3.81M
            c->zero_state[256 - i] = 256 - c->one_state[i];
1993
3.81M
        }
1994
14.9k
    }
1995
1996
150k
    for (i = 0; i < f->slice_count; i++) {
1997
119k
        FFV1SliceContext *sc = &f->slices[i];
1998
119k
        uint8_t *start  = pkt->data + pkt->size * (int64_t)i / f->slice_count;
1999
119k
        int len         = pkt->size / f->slice_count;
2000
119k
        if (i) {
2001
88.4k
            ff_init_range_encoder(&sc->c, start, len);
2002
88.4k
        } else {
2003
31.1k
            av_assert0(sc->c.bytestream_end >= sc->c.bytestream_start + len);
2004
31.1k
            av_assert0(sc->c.bytestream < sc->c.bytestream_start + len);
2005
31.1k
            sc->c.bytestream_end = sc->c.bytestream_start + len;
2006
31.1k
        }
2007
119k
    }
2008
31.1k
    avctx->execute(avctx, encode_slice, f->slices, NULL,
2009
31.1k
                   f->slice_count, sizeof(*f->slices));
2010
2011
31.1k
    buf_p = pkt->data;
2012
150k
    for (i = 0; i < f->slice_count; i++) {
2013
119k
        FFV1SliceContext *sc = &f->slices[i];
2014
119k
        int bytes = sc->ac_byte_count;
2015
119k
        if (i > 0 || f->version > 2) {
2016
119k
            av_assert0(bytes < pkt->size / f->slice_count);
2017
119k
            memmove(buf_p, sc->c.bytestream_start, bytes);
2018
119k
            av_assert0(bytes < (1 << 24));
2019
119k
            AV_WB24(buf_p + bytes, bytes);
2020
119k
            bytes += 3;
2021
119k
        }
2022
119k
        if (f->ec) {
2023
52.0k
            unsigned v;
2024
52.0k
            buf_p[bytes++] = 0;
2025
52.0k
            v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, buf_p, bytes) ^ (f->crcref ? 0x8CD88196 : 0);
2026
52.0k
            AV_WL32(buf_p + bytes, v);
2027
52.0k
            bytes += 4;
2028
52.0k
        }
2029
119k
        buf_p += bytes;
2030
119k
    }
2031
2032
31.1k
    if (avctx->flags & AV_CODEC_FLAG_PASS1)
2033
0
        avctx->stats_out[0] = '\0';
2034
2035
31.1k
    f->picture_number++;
2036
31.1k
    pkt->size   = buf_p - pkt->data;
2037
31.1k
    pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
2038
31.1k
    *got_packet = 1;
2039
2040
31.1k
    return 0;
2041
31.1k
}
2042
2043
static av_cold int encode_close(AVCodecContext *avctx)
2044
4.83k
{
2045
4.83k
    FFV1Context *const s = avctx->priv_data;
2046
2047
27.6k
    for (int j = 0; j < s->max_slice_count; j++) {
2048
22.7k
        FFV1SliceContext *sc = &s->slices[j];
2049
2050
113k
        for(int p = 0; p<4; p++) {
2051
91.1k
            av_freep(&sc->unit[p]);
2052
91.1k
            av_freep(&sc->bitmap[p]);
2053
91.1k
        }
2054
22.7k
    }
2055
2056
4.83k
    av_freep(&avctx->stats_out);
2057
4.83k
    ff_ffv1_close(s);
2058
2059
4.83k
    return 0;
2060
4.83k
}
2061
2062
#define OFFSET(x) offsetof(FFV1Context, x)
2063
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2064
static const AVOption options[] = {
2065
    { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE },
2066
    { "coder", "Coder type", OFFSET(ac), AV_OPT_TYPE_INT,
2067
            { .i64 = 0 }, -2, 2, VE, .unit = "coder" },
2068
        { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
2069
            { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
2070
        { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
2071
            { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, .unit = "coder" },
2072
        { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
2073
            { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, .unit = "coder" },
2074
        { "ac", "Range with custom table (the ac option exists for compatibility and is deprecated)", 0, AV_OPT_TYPE_CONST,
2075
            { .i64 = 1 }, INT_MIN, INT_MAX, VE, .unit = "coder" },
2076
    { "context", "Context model", OFFSET(context_model), AV_OPT_TYPE_INT,
2077
            { .i64 = 0 }, 0, 2, VE },
2078
    { "qtable", "Quantization table", OFFSET(qtable), AV_OPT_TYPE_INT,
2079
            { .i64 = -1 }, -1, 2, VE , .unit = "qtable"},
2080
        { "default", NULL, 0, AV_OPT_TYPE_CONST,
2081
            { .i64 = QTABLE_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
2082
        { "8bit", NULL, 0, AV_OPT_TYPE_CONST,
2083
            { .i64 = QTABLE_8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
2084
        { "greater8bit", NULL, 0, AV_OPT_TYPE_CONST,
2085
            { .i64 = QTABLE_GT8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" },
2086
    { "remap_mode", "Remap Mode", OFFSET(remap_mode), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE, .unit = "remap_mode" },
2087
        { "auto", "Automatic", 0, AV_OPT_TYPE_CONST,
2088
            { .i64 = -1 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
2089
        { "off", "Disabled", 0, AV_OPT_TYPE_CONST,
2090
            { .i64 =  0 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
2091
        { "dualrle", "Dual RLE", 0, AV_OPT_TYPE_CONST,
2092
            { .i64 =  1 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
2093
        { "flipdualrle", "Dual RLE", 0, AV_OPT_TYPE_CONST,
2094
            { .i64 =  2 }, INT_MIN, INT_MAX, VE, .unit = "remap_mode" },
2095
    { "remap_optimizer", "Remap Optimizer", OFFSET(remap_optimizer), AV_OPT_TYPE_INT, { .i64 = 3 }, 0, 5, VE, .unit = "remap_optimizer" },
2096
2097
    { NULL }
2098
};
2099
2100
static const AVClass ffv1_class = {
2101
    .class_name = "ffv1 encoder",
2102
    .item_name  = av_default_item_name,
2103
    .option     = options,
2104
    .version    = LIBAVUTIL_VERSION_INT,
2105
};
2106
2107
const FFCodec ff_ffv1_encoder = {
2108
    .p.name         = "ffv1",
2109
    CODEC_LONG_NAME("FFmpeg video codec #1"),
2110
    .p.type         = AVMEDIA_TYPE_VIDEO,
2111
    .p.id           = AV_CODEC_ID_FFV1,
2112
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
2113
                      AV_CODEC_CAP_SLICE_THREADS |
2114
                      AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
2115
    .priv_data_size = sizeof(FFV1Context),
2116
    .init           = encode_init_internal,
2117
    FF_CODEC_ENCODE_CB(encode_frame),
2118
    .close          = encode_close,
2119
    CODEC_PIXFMTS(
2120
        AV_PIX_FMT_YUV420P,   AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,  AV_PIX_FMT_YUV444P,
2121
        AV_PIX_FMT_YUVA444P,  AV_PIX_FMT_YUV440P,   AV_PIX_FMT_YUV422P,   AV_PIX_FMT_YUV411P,
2122
        AV_PIX_FMT_YUV410P,   AV_PIX_FMT_0RGB32,    AV_PIX_FMT_RGB32,     AV_PIX_FMT_YUV420P16,
2123
        AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9,  AV_PIX_FMT_YUV422P9,
2124
        AV_PIX_FMT_YUV420P9,  AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
2125
        AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
2126
        AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
2127
        AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA422P12,
2128
        AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
2129
        AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
2130
        AV_PIX_FMT_GRAY16,    AV_PIX_FMT_GRAY8,     AV_PIX_FMT_GBRP9,     AV_PIX_FMT_GBRP10,
2131
        AV_PIX_FMT_GBRP12,    AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRAP14,
2132
        AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12,
2133
        AV_PIX_FMT_YA8,
2134
        AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14,
2135
        AV_PIX_FMT_GBRP16, AV_PIX_FMT_RGB48,
2136
        AV_PIX_FMT_GBRAP16, AV_PIX_FMT_RGBA64,
2137
        AV_PIX_FMT_GRAY9,
2138
        AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
2139
        AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV440P12,
2140
        AV_PIX_FMT_YAF16,
2141
        AV_PIX_FMT_GRAYF16,
2142
        AV_PIX_FMT_GBRPF16, AV_PIX_FMT_GBRPF32,
2143
        AV_PIX_FMT_BAYER_RGGB16),
2144
    .color_ranges   = AVCOL_RANGE_MPEG,
2145
    .p.priv_class   = &ffv1_class,
2146
    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_EOF_FLUSH,
2147
};