]> git.sesse.net Git - ffmpeg/blob - libavcodec/ffv1enc.c
0778f84c9bbaa6b989523824627f260787bf0846
[ffmpeg] / libavcodec / ffv1enc.c
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/opt.h"
32 #include "libavutil/imgutils.h"
33 #include "libavutil/pixdesc.h"
34 #include "libavutil/timer.h"
35
36 #include "avcodec.h"
37 #include "internal.h"
38 #include "put_bits.h"
39 #include "rangecoder.h"
40 #include "golomb.h"
41 #include "mathops.h"
42 #include "ffv1.h"
43
44 static const int8_t quant5_10bit[256] = {
45      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
46      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  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,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
49      2,  2,  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, -1,
58     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -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, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
61 };
62
63 static const int8_t quant5[256] = {
64      0,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
65      2,  2,  2,  2,  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, -1, -1, -1,
80 };
81
82 static const int8_t quant9_10bit[256] = {
83      0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
84      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,
85      3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
86      3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
87      4,  4,  4,  4,  4,  4,  4,  4,  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, -3, -3, -3, -3, -3, -3, -3,
96     -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
97     -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
98     -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
99 };
100
101 static const int8_t quant11[256] = {
102      0,  1,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,
103      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
104      4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
105      5,  5,  5,  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, -4, -4,
116     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
117     -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
118 };
119
120 static const uint8_t ver2_state[256] = {
121       0,  10,  10,  10,  10,  16,  16,  16, 28,   16,  16,  29,  42,  49,  20,  49,
122      59,  25,  26,  26,  27,  31,  33,  33, 33,   34,  34,  37,  67,  38,  39,  39,
123      40,  40,  41,  79,  43,  44,  45,  45, 48,   48,  64,  50,  51,  52,  88,  52,
124      53,  74,  55,  57,  58,  58,  74,  60, 101,  61,  62,  84,  66,  66,  68,  69,
125      87,  82,  71,  97,  73,  73,  82,  75, 111,  77,  94,  78,  87,  81,  83,  97,
126      85,  83,  94,  86,  99,  89,  90,  99, 111,  92,  93,  134, 95,  98,  105, 98,
127     105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
128     115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
129     165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
130     147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
131     172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
132     175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
133     197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
134     209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
135     226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
136     241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
137 };
138
139 static void find_best_state(uint8_t best_state[256][256],
140                             const uint8_t one_state[256])
141 {
142     int i, j, k, m;
143     double l2tab[256];
144
145     for (i = 1; i < 256; i++)
146         l2tab[i] = log2(i / 256.0);
147
148     for (i = 0; i < 256; i++) {
149         double best_len[256];
150         double p = i / 256.0;
151
152         for (j = 0; j < 256; j++)
153             best_len[j] = 1 << 30;
154
155         for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
156             double occ[256] = { 0 };
157             double len      = 0;
158             occ[j] = 1.0;
159
160             if (!one_state[j])
161                 continue;
162
163             for (k = 0; k < 256; k++) {
164                 double newocc[256] = { 0 };
165                 for (m = 1; m < 256; m++)
166                     if (occ[m]) {
167                         len -=occ[m]*(     p *l2tab[    m]
168                                       + (1-p)*l2tab[256-m]);
169                     }
170                 if (len < best_len[k]) {
171                     best_len[k]      = len;
172                     best_state[i][k] = j;
173                 }
174                 for (m = 1; m < 256; m++)
175                     if (occ[m]) {
176                         newocc[      one_state[      m]] += occ[m] * p;
177                         newocc[256 - one_state[256 - m]] += occ[m] * (1 - p);
178                     }
179                 memcpy(occ, newocc, sizeof(occ));
180             }
181         }
182     }
183 }
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 {
191     int i;
192
193 #define put_rac(C, S, B)                        \
194     do {                                        \
195         if (rc_stat) {                          \
196             rc_stat[*(S)][B]++;                 \
197             rc_stat2[(S) - state][B]++;         \
198         }                                       \
199         put_rac(C, S, B);                       \
200     } while (0)
201
202     if (v) {
203         const int a = FFABS(v);
204         const int e = av_log2(a);
205         put_rac(c, state + 0, 0);
206         if (e <= 9) {
207             for (i = 0; i < e; i++)
208                 put_rac(c, state + 1 + i, 1);  // 1..10
209             put_rac(c, state + 1 + i, 0);
210
211             for (i = e - 1; i >= 0; i--)
212                 put_rac(c, state + 22 + i, (a >> i) & 1);  // 22..31
213
214             if (is_signed)
215                 put_rac(c, state + 11 + e, v < 0);  // 11..21
216         } else {
217             for (i = 0; i < e; i++)
218                 put_rac(c, state + 1 + FFMIN(i, 9), 1);  // 1..10
219             put_rac(c, state + 1 + 9, 0);
220
221             for (i = e - 1; i >= 0; i--)
222                 put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1);  // 22..31
223
224             if (is_signed)
225                 put_rac(c, state + 11 + 10, v < 0);  // 11..21
226         }
227     } else {
228         put_rac(c, state + 0, 1);
229     }
230 #undef put_rac
231 }
232
233 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
234                                    int v, int is_signed)
235 {
236     put_symbol_inline(c, state, v, is_signed, NULL, NULL);
237 }
238
239
240 static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
241                                   int v, int bits)
242 {
243     int i, k, code;
244     v = fold(v - state->bias, bits);
245
246     i = state->count;
247     k = 0;
248     while (i < state->error_sum) { // FIXME: optimize
249         k++;
250         i += i;
251     }
252
253     av_assert2(k <= 13);
254
255     code = v ^ ((2 * state->drift + state->count) >> 31);
256
257     ff_dlog(NULL, "v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code,
258             state->bias, state->error_sum, state->drift, state->count, k);
259     set_sr_golomb(pb, code, k, 12, bits);
260
261     update_vlc_state(state, v);
262 }
263
264 #define TYPE int16_t
265 #define RENAME(name) name
266 #include "ffv1enc_template.c"
267 #undef TYPE
268 #undef RENAME
269
270 #define TYPE int32_t
271 #define RENAME(name) name ## 32
272 #include "ffv1enc_template.c"
273
274 static int encode_plane(FFV1Context *s, uint8_t *src, int w, int h,
275                          int stride, int plane_index, int pixel_stride)
276 {
277     int x, y, i, ret;
278     const int ring_size = s->context_model ? 3 : 2;
279     int16_t *sample[3];
280     s->run_index = 0;
281
282     memset(s->sample_buffer, 0, ring_size * (w + 6) * sizeof(*s->sample_buffer));
283
284     for (y = 0; y < h; y++) {
285         for (i = 0; i < ring_size; i++)
286             sample[i] = s->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
287
288         sample[0][-1]= sample[1][0  ];
289         sample[1][ w]= sample[1][w-1];
290 // { START_TIMER
291         if (s->bits_per_raw_sample <= 8) {
292             for (x = 0; x < w; x++)
293                 sample[0][x] = src[x * pixel_stride + stride * y];
294             if((ret = encode_line(s, w, sample, plane_index, 8)) < 0)
295                 return ret;
296         } else {
297             if (s->packed_at_lsb) {
298                 for (x = 0; x < w; x++) {
299                     sample[0][x] = ((uint16_t*)(src + stride*y))[x];
300                 }
301             } else {
302                 for (x = 0; x < w; x++) {
303                     sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
304                 }
305             }
306             if((ret = encode_line(s, w, sample, plane_index, s->bits_per_raw_sample)) < 0)
307                 return ret;
308         }
309 // STOP_TIMER("encode line") }
310     }
311     return 0;
312 }
313
314 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
315 {
316     int last = 0;
317     int i;
318     uint8_t state[CONTEXT_SIZE];
319     memset(state, 128, sizeof(state));
320
321     for (i = 1; i < 128; i++)
322         if (quant_table[i] != quant_table[i - 1]) {
323             put_symbol(c, state, i - last - 1, 0);
324             last = i;
325         }
326     put_symbol(c, state, i - last - 1, 0);
327 }
328
329 static void write_quant_tables(RangeCoder *c,
330                                int16_t quant_table[MAX_CONTEXT_INPUTS][256])
331 {
332     int i;
333     for (i = 0; i < 5; i++)
334         write_quant_table(c, quant_table[i]);
335 }
336
337 static void write_header(FFV1Context *f)
338 {
339     uint8_t state[CONTEXT_SIZE];
340     int i, j;
341     RangeCoder *const c = &f->slice_context[0]->c;
342
343     memset(state, 128, sizeof(state));
344
345     if (f->version < 2) {
346         put_symbol(c, state, f->version, 0);
347         put_symbol(c, state, f->ac, 0);
348         if (f->ac == AC_RANGE_CUSTOM_TAB) {
349             for (i = 1; i < 256; i++)
350                 put_symbol(c, state,
351                            f->state_transition[i] - c->one_state[i], 1);
352         }
353         put_symbol(c, state, f->colorspace, 0); //YUV cs type
354         if (f->version > 0)
355             put_symbol(c, state, f->bits_per_raw_sample, 0);
356         put_rac(c, state, f->chroma_planes);
357         put_symbol(c, state, f->chroma_h_shift, 0);
358         put_symbol(c, state, f->chroma_v_shift, 0);
359         put_rac(c, state, f->transparency);
360
361         write_quant_tables(c, f->quant_table);
362     } else if (f->version < 3) {
363         put_symbol(c, state, f->slice_count, 0);
364         for (i = 0; i < f->slice_count; i++) {
365             FFV1Context *fs = f->slice_context[i];
366             put_symbol(c, state,
367                        (fs->slice_x      + 1) * f->num_h_slices / f->width, 0);
368             put_symbol(c, state,
369                        (fs->slice_y      + 1) * f->num_v_slices / f->height, 0);
370             put_symbol(c, state,
371                        (fs->slice_width  + 1) * f->num_h_slices / f->width - 1,
372                        0);
373             put_symbol(c, state,
374                        (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
375                        0);
376             for (j = 0; j < f->plane_count; j++) {
377                 put_symbol(c, state, f->plane[j].quant_table_index, 0);
378                 av_assert0(f->plane[j].quant_table_index == f->context_model);
379             }
380         }
381     }
382 }
383
384 static int write_extradata(FFV1Context *f)
385 {
386     RangeCoder *const c = &f->c;
387     uint8_t state[CONTEXT_SIZE];
388     int i, j, k;
389     uint8_t state2[32][CONTEXT_SIZE];
390     unsigned v;
391
392     memset(state2, 128, sizeof(state2));
393     memset(state, 128, sizeof(state));
394
395     f->avctx->extradata_size = 10000 + 4 +
396                                     (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
397     f->avctx->extradata = av_malloc(f->avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
398     if (!f->avctx->extradata)
399         return AVERROR(ENOMEM);
400     ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
401     ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
402
403     put_symbol(c, state, f->version, 0);
404     if (f->version > 2) {
405         if (f->version == 3) {
406             f->micro_version = 4;
407         } else if (f->version == 4)
408             f->micro_version = 2;
409         put_symbol(c, state, f->micro_version, 0);
410     }
411
412     put_symbol(c, state, f->ac, 0);
413     if (f->ac == AC_RANGE_CUSTOM_TAB)
414         for (i = 1; i < 256; i++)
415             put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
416
417     put_symbol(c, state, f->colorspace, 0); // YUV cs type
418     put_symbol(c, state, f->bits_per_raw_sample, 0);
419     put_rac(c, state, f->chroma_planes);
420     put_symbol(c, state, f->chroma_h_shift, 0);
421     put_symbol(c, state, f->chroma_v_shift, 0);
422     put_rac(c, state, f->transparency);
423     put_symbol(c, state, f->num_h_slices - 1, 0);
424     put_symbol(c, state, f->num_v_slices - 1, 0);
425
426     put_symbol(c, state, f->quant_table_count, 0);
427     for (i = 0; i < f->quant_table_count; i++)
428         write_quant_tables(c, f->quant_tables[i]);
429
430     for (i = 0; i < f->quant_table_count; i++) {
431         for (j = 0; j < f->context_count[i] * CONTEXT_SIZE; j++)
432             if (f->initial_states[i] && f->initial_states[i][0][j] != 128)
433                 break;
434         if (j < f->context_count[i] * CONTEXT_SIZE) {
435             put_rac(c, state, 1);
436             for (j = 0; j < f->context_count[i]; j++)
437                 for (k = 0; k < CONTEXT_SIZE; k++) {
438                     int pred = j ? f->initial_states[i][j - 1][k] : 128;
439                     put_symbol(c, state2[k],
440                                (int8_t)(f->initial_states[i][j][k] - pred), 1);
441                 }
442         } else {
443             put_rac(c, state, 0);
444         }
445     }
446
447     if (f->version > 2) {
448         put_symbol(c, state, f->ec, 0);
449         put_symbol(c, state, f->intra = (f->avctx->gop_size < 2), 0);
450     }
451
452     f->avctx->extradata_size = ff_rac_terminate(c);
453     v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
454     AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
455     f->avctx->extradata_size += 4;
456
457     return 0;
458 }
459
460 static int sort_stt(FFV1Context *s, uint8_t stt[256])
461 {
462     int i, i2, changed, print = 0;
463
464     do {
465         changed = 0;
466         for (i = 12; i < 244; i++) {
467             for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
468
469 #define COST(old, new)                                      \
470     s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) +     \
471     s->rc_stat[old][1] * -log2((new)         / 256.0)
472
473 #define COST2(old, new)                         \
474     COST(old, new) + COST(256 - (old), 256 - (new))
475
476                 double size0 = COST2(i,  i) + COST2(i2, i2);
477                 double sizeX = COST2(i, i2) + COST2(i2, i);
478                 if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
479                     int j;
480                     FFSWAP(int, stt[i], stt[i2]);
481                     FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
482                     FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
483                     if (i != 256 - i2) {
484                         FFSWAP(int, stt[256 - i], stt[256 - i2]);
485                         FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
486                         FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
487                     }
488                     for (j = 1; j < 256; j++) {
489                         if (stt[j] == i)
490                             stt[j] = i2;
491                         else if (stt[j] == i2)
492                             stt[j] = i;
493                         if (i != 256 - i2) {
494                             if (stt[256 - j] == 256 - i)
495                                 stt[256 - j] = 256 - i2;
496                             else if (stt[256 - j] == 256 - i2)
497                                 stt[256 - j] = 256 - i;
498                         }
499                     }
500                     print = changed = 1;
501                 }
502             }
503         }
504     } while (changed);
505     return print;
506 }
507
508 static av_cold int encode_init(AVCodecContext *avctx)
509 {
510     FFV1Context *s = avctx->priv_data;
511     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
512     int i, j, k, m, ret;
513
514     if ((ret = ff_ffv1_common_init(avctx)) < 0)
515         return ret;
516
517     s->version = 0;
518
519     if ((avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) ||
520         avctx->slices > 1)
521         s->version = FFMAX(s->version, 2);
522
523     // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
524     if (avctx->slices == 0 && avctx->level < 0 && avctx->width * avctx->height > 720*576)
525         s->version = FFMAX(s->version, 2);
526
527     if (avctx->level <= 0 && s->version == 2) {
528         s->version = 3;
529     }
530     if (avctx->level >= 0 && avctx->level <= 4) {
531         if (avctx->level < s->version) {
532             av_log(avctx, AV_LOG_ERROR, "Version %d needed for requested features but %d requested\n", s->version, avctx->level);
533             return AVERROR(EINVAL);
534         }
535         s->version = avctx->level;
536     }
537
538     if (s->ec < 0) {
539         s->ec = (s->version >= 3);
540     }
541
542     if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
543         av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
544         return AVERROR_INVALIDDATA;
545     }
546
547 #if FF_API_CODER_TYPE
548 FF_DISABLE_DEPRECATION_WARNINGS
549     if (avctx->coder_type != -1)
550         s->ac = avctx->coder_type > 0 ? AC_RANGE_CUSTOM_TAB : AC_GOLOMB_RICE;
551     else
552 FF_ENABLE_DEPRECATION_WARNINGS
553 #endif
554     if (s->ac == 1) // Compatbility with common command line usage
555         s->ac = AC_RANGE_CUSTOM_TAB;
556     else if (s->ac == AC_RANGE_DEFAULT_TAB_FORCE)
557         s->ac = AC_RANGE_DEFAULT_TAB;
558
559     s->plane_count = 3;
560     switch(avctx->pix_fmt) {
561     case AV_PIX_FMT_YUV444P9:
562     case AV_PIX_FMT_YUV422P9:
563     case AV_PIX_FMT_YUV420P9:
564     case AV_PIX_FMT_YUVA444P9:
565     case AV_PIX_FMT_YUVA422P9:
566     case AV_PIX_FMT_YUVA420P9:
567         if (!avctx->bits_per_raw_sample)
568             s->bits_per_raw_sample = 9;
569     case AV_PIX_FMT_GRAY10:
570     case AV_PIX_FMT_YUV444P10:
571     case AV_PIX_FMT_YUV420P10:
572     case AV_PIX_FMT_YUV422P10:
573     case AV_PIX_FMT_YUVA444P10:
574     case AV_PIX_FMT_YUVA422P10:
575     case AV_PIX_FMT_YUVA420P10:
576         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
577             s->bits_per_raw_sample = 10;
578     case AV_PIX_FMT_GRAY12:
579     case AV_PIX_FMT_YUV444P12:
580     case AV_PIX_FMT_YUV420P12:
581     case AV_PIX_FMT_YUV422P12:
582         s->packed_at_lsb = 1;
583         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
584             s->bits_per_raw_sample = 12;
585     case AV_PIX_FMT_GRAY16:
586     case AV_PIX_FMT_YUV444P16:
587     case AV_PIX_FMT_YUV422P16:
588     case AV_PIX_FMT_YUV420P16:
589     case AV_PIX_FMT_YUVA444P16:
590     case AV_PIX_FMT_YUVA422P16:
591     case AV_PIX_FMT_YUVA420P16:
592         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
593             s->bits_per_raw_sample = 16;
594         } else if (!s->bits_per_raw_sample) {
595             s->bits_per_raw_sample = avctx->bits_per_raw_sample;
596         }
597         if (s->bits_per_raw_sample <= 8) {
598             av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
599             return AVERROR_INVALIDDATA;
600         }
601         s->version = FFMAX(s->version, 1);
602     case AV_PIX_FMT_GRAY8:
603     case AV_PIX_FMT_YA8:
604     case AV_PIX_FMT_YUV444P:
605     case AV_PIX_FMT_YUV440P:
606     case AV_PIX_FMT_YUV422P:
607     case AV_PIX_FMT_YUV420P:
608     case AV_PIX_FMT_YUV411P:
609     case AV_PIX_FMT_YUV410P:
610     case AV_PIX_FMT_YUVA444P:
611     case AV_PIX_FMT_YUVA422P:
612     case AV_PIX_FMT_YUVA420P:
613         s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
614         s->colorspace = 0;
615         s->transparency = desc->nb_components == 4 || desc->nb_components == 2;
616         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
617             s->bits_per_raw_sample = 8;
618         else if (!s->bits_per_raw_sample)
619             s->bits_per_raw_sample = 8;
620         break;
621     case AV_PIX_FMT_RGB32:
622         s->colorspace = 1;
623         s->transparency = 1;
624         s->chroma_planes = 1;
625         s->bits_per_raw_sample = 8;
626         break;
627     case AV_PIX_FMT_RGB48:
628         s->colorspace = 1;
629         s->chroma_planes = 1;
630         s->bits_per_raw_sample = 16;
631         s->use32bit = 1;
632         s->version = FFMAX(s->version, 1);
633         break;
634     case AV_PIX_FMT_0RGB32:
635         s->colorspace = 1;
636         s->chroma_planes = 1;
637         s->bits_per_raw_sample = 8;
638         break;
639     case AV_PIX_FMT_GBRP9:
640         if (!avctx->bits_per_raw_sample)
641             s->bits_per_raw_sample = 9;
642     case AV_PIX_FMT_GBRP10:
643         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
644             s->bits_per_raw_sample = 10;
645     case AV_PIX_FMT_GBRP12:
646         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
647             s->bits_per_raw_sample = 12;
648     case AV_PIX_FMT_GBRP14:
649         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
650             s->bits_per_raw_sample = 14;
651     case AV_PIX_FMT_GBRP16:
652         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
653             s->bits_per_raw_sample = 16;
654         else if (!s->bits_per_raw_sample)
655             s->bits_per_raw_sample = avctx->bits_per_raw_sample;
656         s->colorspace = 1;
657         s->chroma_planes = 1;
658         if (s->bits_per_raw_sample >= 16) {
659             s->use32bit = 1;
660         }
661         s->version = FFMAX(s->version, 1);
662         break;
663     default:
664         av_log(avctx, AV_LOG_ERROR, "format not supported\n");
665         return AVERROR(ENOSYS);
666     }
667     av_assert0(s->bits_per_raw_sample >= 8);
668
669     if (s->bits_per_raw_sample > 8) {
670         if (s->ac == AC_GOLOMB_RICE) {
671             av_log(avctx, AV_LOG_INFO,
672                     "bits_per_raw_sample > 8, forcing range coder\n");
673             s->ac = AC_RANGE_CUSTOM_TAB;
674         }
675     }
676     if (s->transparency) {
677         av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
678     }
679 #if FF_API_PRIVATE_OPT
680 FF_DISABLE_DEPRECATION_WARNINGS
681     if (avctx->context_model)
682         s->context_model = avctx->context_model;
683     if (avctx->context_model > 1U) {
684         av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
685         return AVERROR(EINVAL);
686     }
687 FF_ENABLE_DEPRECATION_WARNINGS
688 #endif
689
690     if (s->ac == AC_RANGE_CUSTOM_TAB) {
691         for (i = 1; i < 256; i++)
692             s->state_transition[i] = ver2_state[i];
693     } else {
694         RangeCoder c;
695         ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
696         for (i = 1; i < 256; i++)
697             s->state_transition[i] = c.one_state[i];
698     }
699
700     for (i = 0; i < 256; i++) {
701         s->quant_table_count = 2;
702         if (s->bits_per_raw_sample <= 8) {
703             s->quant_tables[0][0][i]=           quant11[i];
704             s->quant_tables[0][1][i]=        11*quant11[i];
705             s->quant_tables[0][2][i]=     11*11*quant11[i];
706             s->quant_tables[1][0][i]=           quant11[i];
707             s->quant_tables[1][1][i]=        11*quant11[i];
708             s->quant_tables[1][2][i]=     11*11*quant5 [i];
709             s->quant_tables[1][3][i]=   5*11*11*quant5 [i];
710             s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
711         } else {
712             s->quant_tables[0][0][i]=           quant9_10bit[i];
713             s->quant_tables[0][1][i]=        11*quant9_10bit[i];
714             s->quant_tables[0][2][i]=     11*11*quant9_10bit[i];
715             s->quant_tables[1][0][i]=           quant9_10bit[i];
716             s->quant_tables[1][1][i]=        11*quant9_10bit[i];
717             s->quant_tables[1][2][i]=     11*11*quant5_10bit[i];
718             s->quant_tables[1][3][i]=   5*11*11*quant5_10bit[i];
719             s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
720         }
721     }
722     s->context_count[0] = (11 * 11 * 11        + 1) / 2;
723     s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
724     memcpy(s->quant_table, s->quant_tables[s->context_model],
725            sizeof(s->quant_table));
726
727     for (i = 0; i < s->plane_count; i++) {
728         PlaneContext *const p = &s->plane[i];
729
730         memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
731         p->quant_table_index = s->context_model;
732         p->context_count     = s->context_count[p->quant_table_index];
733     }
734
735     if ((ret = ff_ffv1_allocate_initial_states(s)) < 0)
736         return ret;
737
738 #if FF_API_CODED_FRAME
739 FF_DISABLE_DEPRECATION_WARNINGS
740     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
741 FF_ENABLE_DEPRECATION_WARNINGS
742 #endif
743
744     if (!s->transparency)
745         s->plane_count = 2;
746     if (!s->chroma_planes && s->version > 3)
747         s->plane_count--;
748
749     ret = av_pix_fmt_get_chroma_sub_sample (avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
750     if (ret)
751         return ret;
752
753     s->picture_number = 0;
754
755     if (avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
756         for (i = 0; i < s->quant_table_count; i++) {
757             s->rc_stat2[i] = av_mallocz(s->context_count[i] *
758                                         sizeof(*s->rc_stat2[i]));
759             if (!s->rc_stat2[i])
760                 return AVERROR(ENOMEM);
761         }
762     }
763     if (avctx->stats_in) {
764         char *p = avctx->stats_in;
765         uint8_t (*best_state)[256] = av_malloc_array(256, 256);
766         int gob_count = 0;
767         char *next;
768         if (!best_state)
769             return AVERROR(ENOMEM);
770
771         av_assert0(s->version >= 2);
772
773         for (;;) {
774             for (j = 0; j < 256; j++)
775                 for (i = 0; i < 2; i++) {
776                     s->rc_stat[j][i] = strtol(p, &next, 0);
777                     if (next == p) {
778                         av_log(avctx, AV_LOG_ERROR,
779                                "2Pass file invalid at %d %d [%s]\n", j, i, p);
780                         av_freep(&best_state);
781                         return AVERROR_INVALIDDATA;
782                     }
783                     p = next;
784                 }
785             for (i = 0; i < s->quant_table_count; i++)
786                 for (j = 0; j < s->context_count[i]; j++) {
787                     for (k = 0; k < 32; k++)
788                         for (m = 0; m < 2; m++) {
789                             s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
790                             if (next == p) {
791                                 av_log(avctx, AV_LOG_ERROR,
792                                        "2Pass file invalid at %d %d %d %d [%s]\n",
793                                        i, j, k, m, p);
794                                 av_freep(&best_state);
795                                 return AVERROR_INVALIDDATA;
796                             }
797                             p = next;
798                         }
799                 }
800             gob_count = strtol(p, &next, 0);
801             if (next == p || gob_count <= 0) {
802                 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
803                 av_freep(&best_state);
804                 return AVERROR_INVALIDDATA;
805             }
806             p = next;
807             while (*p == '\n' || *p == ' ')
808                 p++;
809             if (p[0] == 0)
810                 break;
811         }
812         if (s->ac == AC_RANGE_CUSTOM_TAB)
813             sort_stt(s, s->state_transition);
814
815         find_best_state(best_state, s->state_transition);
816
817         for (i = 0; i < s->quant_table_count; i++) {
818             for (k = 0; k < 32; k++) {
819                 double a=0, b=0;
820                 int jp = 0;
821                 for (j = 0; j < s->context_count[i]; j++) {
822                     double p = 128;
823                     if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
824                         if (a+b)
825                             p = 256.0 * b / (a + b);
826                         s->initial_states[i][jp][k] =
827                             best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
828                         for(jp++; jp<j; jp++)
829                             s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
830                         a=b=0;
831                     }
832                     a += s->rc_stat2[i][j][k][0];
833                     b += s->rc_stat2[i][j][k][1];
834                     if (a+b) {
835                         p = 256.0 * b / (a + b);
836                     }
837                     s->initial_states[i][j][k] =
838                         best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
839                 }
840             }
841         }
842         av_freep(&best_state);
843     }
844
845     if (s->version > 1) {
846         int plane_count = 1 + 2*s->chroma_planes + s->transparency;
847         int max_h_slices = AV_CEIL_RSHIFT(avctx->width , s->chroma_h_shift);
848         int max_v_slices = AV_CEIL_RSHIFT(avctx->height, s->chroma_v_shift);
849         s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
850
851         s->num_v_slices = FFMIN(s->num_v_slices, max_v_slices);
852
853         for (; s->num_v_slices < 32; s->num_v_slices++) {
854             for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
855                 int maxw = (avctx->width  + s->num_h_slices - 1) / s->num_h_slices;
856                 int maxh = (avctx->height + s->num_v_slices - 1) / s->num_v_slices;
857                 if (s->num_h_slices > max_h_slices || s->num_v_slices > max_v_slices)
858                     continue;
859                 if (maxw * maxh * (int64_t)(s->bits_per_raw_sample+1) * plane_count > 8<<24)
860                     continue;
861                 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= MAX_SLICES || !avctx->slices)
862                     goto slices_ok;
863             }
864         }
865         av_log(avctx, AV_LOG_ERROR,
866                "Unsupported number %d of slices requested, please specify a "
867                "supported number with -slices (ex:4,6,9,12,16, ...)\n",
868                avctx->slices);
869         return AVERROR(ENOSYS);
870 slices_ok:
871         if ((ret = write_extradata(s)) < 0)
872             return ret;
873     }
874
875     if ((ret = ff_ffv1_init_slice_contexts(s)) < 0)
876         return ret;
877     s->slice_count = s->max_slice_count;
878     if ((ret = ff_ffv1_init_slices_state(s)) < 0)
879         return ret;
880
881 #define STATS_OUT_SIZE 1024 * 1024 * 6
882     if (avctx->flags & AV_CODEC_FLAG_PASS1) {
883         avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
884         if (!avctx->stats_out)
885             return AVERROR(ENOMEM);
886         for (i = 0; i < s->quant_table_count; i++)
887             for (j = 0; j < s->max_slice_count; j++) {
888                 FFV1Context *sf = s->slice_context[j];
889                 av_assert0(!sf->rc_stat2[i]);
890                 sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
891                                              sizeof(*sf->rc_stat2[i]));
892                 if (!sf->rc_stat2[i])
893                     return AVERROR(ENOMEM);
894             }
895     }
896
897     return 0;
898 }
899
900 static void encode_slice_header(FFV1Context *f, FFV1Context *fs)
901 {
902     RangeCoder *c = &fs->c;
903     uint8_t state[CONTEXT_SIZE];
904     int j;
905     memset(state, 128, sizeof(state));
906
907     put_symbol(c, state, (fs->slice_x     +1)*f->num_h_slices / f->width   , 0);
908     put_symbol(c, state, (fs->slice_y     +1)*f->num_v_slices / f->height  , 0);
909     put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
910     put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
911     for (j=0; j<f->plane_count; j++) {
912         put_symbol(c, state, f->plane[j].quant_table_index, 0);
913         av_assert0(f->plane[j].quant_table_index == f->context_model);
914     }
915     if (!f->picture.f->interlaced_frame)
916         put_symbol(c, state, 3, 0);
917     else
918         put_symbol(c, state, 1 + !f->picture.f->top_field_first, 0);
919     put_symbol(c, state, f->picture.f->sample_aspect_ratio.num, 0);
920     put_symbol(c, state, f->picture.f->sample_aspect_ratio.den, 0);
921     if (f->version > 3) {
922         put_rac(c, state, fs->slice_coding_mode == 1);
923         if (fs->slice_coding_mode == 1)
924             ff_ffv1_clear_slice_state(f, fs);
925         put_symbol(c, state, fs->slice_coding_mode, 0);
926         if (fs->slice_coding_mode != 1) {
927             put_symbol(c, state, fs->slice_rct_by_coef, 0);
928             put_symbol(c, state, fs->slice_rct_ry_coef, 0);
929         }
930     }
931 }
932
933 static void choose_rct_params(FFV1Context *fs, const uint8_t *src[3], const int stride[3], int w, int h)
934 {
935 #define NB_Y_COEFF 15
936     static const int rct_y_coeff[15][2] = {
937         {0, 0}, //      4G
938         {1, 1}, //  R + 2G + B
939         {2, 2}, // 2R      + 2B
940         {0, 2}, //      2G + 2B
941         {2, 0}, // 2R + 2G
942         {4, 0}, // 4R
943         {0, 4}, //           4B
944
945         {0, 3}, //      1G + 3B
946         {3, 0}, // 3R + 1G
947         {3, 1}, // 3R      +  B
948         {1, 3}, //  R      + 3B
949         {1, 2}, //  R +  G + 2B
950         {2, 1}, // 2R +  G +  B
951         {0, 1}, //      3G +  B
952         {1, 0}, //  R + 3G
953     };
954
955     int stat[NB_Y_COEFF] = {0};
956     int x, y, i, p, best;
957     int16_t *sample[3];
958     int lbd = fs->bits_per_raw_sample <= 8;
959
960     for (y = 0; y < h; y++) {
961         int lastr=0, lastg=0, lastb=0;
962         for (p = 0; p < 3; p++)
963             sample[p] = fs->sample_buffer + p*w;
964
965         for (x = 0; x < w; x++) {
966             int b, g, r;
967             int ab, ag, ar;
968             if (lbd) {
969                 unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
970                 b =  v        & 0xFF;
971                 g = (v >>  8) & 0xFF;
972                 r = (v >> 16) & 0xFF;
973             } else {
974                 b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
975                 g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
976                 r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
977             }
978
979             ar = r - lastr;
980             ag = g - lastg;
981             ab = b - lastb;
982             if (x && y) {
983                 int bg = ag - sample[0][x];
984                 int bb = ab - sample[1][x];
985                 int br = ar - sample[2][x];
986
987                 br -= bg;
988                 bb -= bg;
989
990                 for (i = 0; i<NB_Y_COEFF; i++) {
991                     stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
992                 }
993
994             }
995             sample[0][x] = ag;
996             sample[1][x] = ab;
997             sample[2][x] = ar;
998
999             lastr = r;
1000             lastg = g;
1001             lastb = b;
1002         }
1003     }
1004
1005     best = 0;
1006     for (i=1; i<NB_Y_COEFF; i++) {
1007         if (stat[i] < stat[best])
1008             best = i;
1009     }
1010
1011     fs->slice_rct_by_coef = rct_y_coeff[best][1];
1012     fs->slice_rct_ry_coef = rct_y_coeff[best][0];
1013 }
1014
1015 static int encode_slice(AVCodecContext *c, void *arg)
1016 {
1017     FFV1Context *fs  = *(void **)arg;
1018     FFV1Context *f   = fs->avctx->priv_data;
1019     int width        = fs->slice_width;
1020     int height       = fs->slice_height;
1021     int x            = fs->slice_x;
1022     int y            = fs->slice_y;
1023     const AVFrame *const p = f->picture.f;
1024     const int ps     = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
1025     int ret;
1026     RangeCoder c_bak = fs->c;
1027     const uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
1028                                 p->data[1] ? p->data[1] + ps*x + y*p->linesize[1] : NULL,
1029                                 p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL};
1030
1031     fs->slice_coding_mode = 0;
1032     if (f->version > 3) {
1033         choose_rct_params(fs, planes, p->linesize, width, height);
1034     } else {
1035         fs->slice_rct_by_coef = 1;
1036         fs->slice_rct_ry_coef = 1;
1037     }
1038
1039 retry:
1040     if (f->key_frame)
1041         ff_ffv1_clear_slice_state(f, fs);
1042     if (f->version > 2) {
1043         encode_slice_header(f, fs);
1044     }
1045     if (fs->ac == AC_GOLOMB_RICE) {
1046         if (f->version > 2)
1047             put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
1048         fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
1049         init_put_bits(&fs->pb,
1050                       fs->c.bytestream_start + fs->ac_byte_count,
1051                       fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
1052     }
1053
1054     if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8) {
1055         const int chroma_width  = AV_CEIL_RSHIFT(width,  f->chroma_h_shift);
1056         const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
1057         const int cx            = x >> f->chroma_h_shift;
1058         const int cy            = y >> f->chroma_v_shift;
1059
1060         ret = encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
1061
1062         if (f->chroma_planes) {
1063             ret |= encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
1064             ret |= encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
1065         }
1066         if (fs->transparency)
1067             ret |= encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1);
1068     } else if (c->pix_fmt == AV_PIX_FMT_YA8) {
1069         ret  = encode_plane(fs, p->data[0] +     ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);
1070         ret |= encode_plane(fs, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2);
1071     } else if (f->use32bit) {
1072         ret = encode_rgb_frame32(fs, planes, width, height, p->linesize);
1073     } else {
1074         ret = encode_rgb_frame(fs, planes, width, height, p->linesize);
1075     }
1076     emms_c();
1077
1078     if (ret < 0) {
1079         av_assert0(fs->slice_coding_mode == 0);
1080         if (fs->version < 4 || !fs->ac) {
1081             av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1082             return ret;
1083         }
1084         av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1085         fs->slice_coding_mode = 1;
1086         fs->c = c_bak;
1087         goto retry;
1088     }
1089
1090     return 0;
1091 }
1092
1093 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1094                         const AVFrame *pict, int *got_packet)
1095 {
1096     FFV1Context *f      = avctx->priv_data;
1097     RangeCoder *const c = &f->slice_context[0]->c;
1098     AVFrame *const p    = f->picture.f;
1099     uint8_t keystate    = 128;
1100     uint8_t *buf_p;
1101     int i, ret;
1102     int64_t maxsize =   AV_INPUT_BUFFER_MIN_SIZE
1103                       + avctx->width*avctx->height*37LL*4;
1104
1105     if(!pict) {
1106         if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1107             int j, k, m;
1108             char *p   = avctx->stats_out;
1109             char *end = p + STATS_OUT_SIZE;
1110
1111             memset(f->rc_stat, 0, sizeof(f->rc_stat));
1112             for (i = 0; i < f->quant_table_count; i++)
1113                 memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1114
1115             av_assert0(f->slice_count == f->max_slice_count);
1116             for (j = 0; j < f->slice_count; j++) {
1117                 FFV1Context *fs = f->slice_context[j];
1118                 for (i = 0; i < 256; i++) {
1119                     f->rc_stat[i][0] += fs->rc_stat[i][0];
1120                     f->rc_stat[i][1] += fs->rc_stat[i][1];
1121                 }
1122                 for (i = 0; i < f->quant_table_count; i++) {
1123                     for (k = 0; k < f->context_count[i]; k++)
1124                         for (m = 0; m < 32; m++) {
1125                             f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1126                             f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1127                         }
1128                 }
1129             }
1130
1131             for (j = 0; j < 256; j++) {
1132                 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1133                         f->rc_stat[j][0], f->rc_stat[j][1]);
1134                 p += strlen(p);
1135             }
1136             snprintf(p, end - p, "\n");
1137
1138             for (i = 0; i < f->quant_table_count; i++) {
1139                 for (j = 0; j < f->context_count[i]; j++)
1140                     for (m = 0; m < 32; m++) {
1141                         snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1142                                 f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1143                         p += strlen(p);
1144                     }
1145             }
1146             snprintf(p, end - p, "%d\n", f->gob_count);
1147         }
1148         return 0;
1149     }
1150
1151     if (f->version > 3)
1152         maxsize = AV_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
1153
1154     if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
1155         av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
1156         maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
1157     }
1158
1159     if ((ret = ff_alloc_packet2(avctx, pkt, maxsize, 0)) < 0)
1160         return ret;
1161
1162     ff_init_range_encoder(c, pkt->data, pkt->size);
1163     ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1164
1165     av_frame_unref(p);
1166     if ((ret = av_frame_ref(p, pict)) < 0)
1167         return ret;
1168 #if FF_API_CODED_FRAME
1169 FF_DISABLE_DEPRECATION_WARNINGS
1170     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
1171 FF_ENABLE_DEPRECATION_WARNINGS
1172 #endif
1173
1174     if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1175         put_rac(c, &keystate, 1);
1176         f->key_frame = 1;
1177         f->gob_count++;
1178         write_header(f);
1179     } else {
1180         put_rac(c, &keystate, 0);
1181         f->key_frame = 0;
1182     }
1183
1184     if (f->ac == AC_RANGE_CUSTOM_TAB) {
1185         int i;
1186         for (i = 1; i < 256; i++) {
1187             c->one_state[i]        = f->state_transition[i];
1188             c->zero_state[256 - i] = 256 - c->one_state[i];
1189         }
1190     }
1191
1192     for (i = 0; i < f->slice_count; i++) {
1193         FFV1Context *fs = f->slice_context[i];
1194         uint8_t *start  = pkt->data + pkt->size * (int64_t)i / f->slice_count;
1195         int len         = pkt->size / f->slice_count;
1196         if (i) {
1197             ff_init_range_encoder(&fs->c, start, len);
1198         } else {
1199             av_assert0(fs->c.bytestream_end >= fs->c.bytestream_start + len);
1200             av_assert0(fs->c.bytestream < fs->c.bytestream_start + len);
1201             fs->c.bytestream_end = fs->c.bytestream_start + len;
1202         }
1203     }
1204     avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
1205                    f->slice_count, sizeof(void *));
1206
1207     buf_p = pkt->data;
1208     for (i = 0; i < f->slice_count; i++) {
1209         FFV1Context *fs = f->slice_context[i];
1210         int bytes;
1211
1212         if (fs->ac != AC_GOLOMB_RICE) {
1213             uint8_t state = 129;
1214             put_rac(&fs->c, &state, 0);
1215             bytes = ff_rac_terminate(&fs->c);
1216         } else {
1217             flush_put_bits(&fs->pb); // FIXME: nicer padding
1218             bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7) / 8;
1219         }
1220         if (i > 0 || f->version > 2) {
1221             av_assert0(bytes < pkt->size / f->slice_count);
1222             memmove(buf_p, fs->c.bytestream_start, bytes);
1223             av_assert0(bytes < (1 << 24));
1224             AV_WB24(buf_p + bytes, bytes);
1225             bytes += 3;
1226         }
1227         if (f->ec) {
1228             unsigned v;
1229             buf_p[bytes++] = 0;
1230             v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1231             AV_WL32(buf_p + bytes, v);
1232             bytes += 4;
1233         }
1234         buf_p += bytes;
1235     }
1236
1237     if (avctx->flags & AV_CODEC_FLAG_PASS1)
1238         avctx->stats_out[0] = '\0';
1239
1240 #if FF_API_CODED_FRAME
1241 FF_DISABLE_DEPRECATION_WARNINGS
1242     avctx->coded_frame->key_frame = f->key_frame;
1243 FF_ENABLE_DEPRECATION_WARNINGS
1244 #endif
1245
1246     f->picture_number++;
1247     pkt->size   = buf_p - pkt->data;
1248     pkt->pts    =
1249     pkt->dts    = pict->pts;
1250     pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
1251     *got_packet = 1;
1252
1253     return 0;
1254 }
1255
1256 static av_cold int encode_close(AVCodecContext *avctx)
1257 {
1258     ff_ffv1_close(avctx);
1259     return 0;
1260 }
1261
1262 #define OFFSET(x) offsetof(FFV1Context, x)
1263 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1264 static const AVOption options[] = {
1265     { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },
1266     { "coder", "Coder type", OFFSET(ac), AV_OPT_TYPE_INT,
1267             { .i64 = 0 }, -2, 2, VE, "coder" },
1268         { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
1269             { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, "coder" },
1270         { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
1271             { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, "coder" },
1272         { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
1273             { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, "coder" },
1274         { "ac", "Range with custom table (the ac option exists for compatibility and is deprecated)", 0, AV_OPT_TYPE_CONST,
1275             { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" },
1276     { "context", "Context model", OFFSET(context_model), AV_OPT_TYPE_INT,
1277             { .i64 = 0 }, 0, 1, VE },
1278
1279     { NULL }
1280 };
1281
1282 static const AVClass ffv1_class = {
1283     .class_name = "ffv1 encoder",
1284     .item_name  = av_default_item_name,
1285     .option     = options,
1286     .version    = LIBAVUTIL_VERSION_INT,
1287 };
1288
1289 #if FF_API_CODER_TYPE
1290 static const AVCodecDefault ffv1_defaults[] = {
1291     { "coder", "-1" },
1292     { NULL },
1293 };
1294 #endif
1295
1296 AVCodec ff_ffv1_encoder = {
1297     .name           = "ffv1",
1298     .long_name      = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1299     .type           = AVMEDIA_TYPE_VIDEO,
1300     .id             = AV_CODEC_ID_FFV1,
1301     .priv_data_size = sizeof(FFV1Context),
1302     .init           = encode_init,
1303     .encode2        = encode_frame,
1304     .close          = encode_close,
1305     .capabilities   = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DELAY,
1306     .pix_fmts       = (const enum AVPixelFormat[]) {
1307         AV_PIX_FMT_YUV420P,   AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,  AV_PIX_FMT_YUV444P,
1308         AV_PIX_FMT_YUVA444P,  AV_PIX_FMT_YUV440P,   AV_PIX_FMT_YUV422P,   AV_PIX_FMT_YUV411P,
1309         AV_PIX_FMT_YUV410P,   AV_PIX_FMT_0RGB32,    AV_PIX_FMT_RGB32,     AV_PIX_FMT_YUV420P16,
1310         AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9,  AV_PIX_FMT_YUV422P9,
1311         AV_PIX_FMT_YUV420P9,  AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
1312         AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
1313         AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
1314         AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
1315         AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
1316         AV_PIX_FMT_GRAY16,    AV_PIX_FMT_GRAY8,     AV_PIX_FMT_GBRP9,     AV_PIX_FMT_GBRP10,
1317         AV_PIX_FMT_GBRP12,    AV_PIX_FMT_GBRP14,
1318         AV_PIX_FMT_YA8,
1319         AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12,
1320         AV_PIX_FMT_GBRP16, AV_PIX_FMT_RGB48,
1321         AV_PIX_FMT_NONE
1322
1323     },
1324 #if FF_API_CODER_TYPE
1325     .defaults       = ffv1_defaults,
1326 #endif
1327     .priv_class     = &ffv1_class,
1328 };