]> git.sesse.net Git - ffmpeg/blob - libavcodec/ffv1enc.c
avcodec/cuvid: use capability check instead of dummy decoder
[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         if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
634             av_log(avctx, AV_LOG_ERROR, "16bit RGB is experimental and under development, only use it for experiments\n");
635             return AVERROR_INVALIDDATA;
636         }
637         break;
638     case AV_PIX_FMT_0RGB32:
639         s->colorspace = 1;
640         s->chroma_planes = 1;
641         s->bits_per_raw_sample = 8;
642         break;
643     case AV_PIX_FMT_GBRP9:
644         if (!avctx->bits_per_raw_sample)
645             s->bits_per_raw_sample = 9;
646     case AV_PIX_FMT_GBRP10:
647         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
648             s->bits_per_raw_sample = 10;
649     case AV_PIX_FMT_GBRP12:
650         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
651             s->bits_per_raw_sample = 12;
652     case AV_PIX_FMT_GBRP14:
653         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
654             s->bits_per_raw_sample = 14;
655     case AV_PIX_FMT_GBRP16:
656         if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
657             s->bits_per_raw_sample = 16;
658         else if (!s->bits_per_raw_sample)
659             s->bits_per_raw_sample = avctx->bits_per_raw_sample;
660         s->colorspace = 1;
661         s->chroma_planes = 1;
662         if (s->bits_per_raw_sample >= 16) {
663             s->use32bit = 1;
664             if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
665                 av_log(avctx, AV_LOG_ERROR, "16bit RGB is experimental and under development, only use it for experiments\n");
666                 return AVERROR_INVALIDDATA;
667             }
668         }
669         s->version = FFMAX(s->version, 1);
670         break;
671     default:
672         av_log(avctx, AV_LOG_ERROR, "format not supported\n");
673         return AVERROR(ENOSYS);
674     }
675     av_assert0(s->bits_per_raw_sample >= 8);
676
677     if (s->bits_per_raw_sample > 8) {
678         if (s->ac == AC_GOLOMB_RICE) {
679             av_log(avctx, AV_LOG_INFO,
680                     "bits_per_raw_sample > 8, forcing range coder\n");
681             s->ac = AC_RANGE_CUSTOM_TAB;
682         }
683     }
684     if (s->transparency) {
685         av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
686     }
687 #if FF_API_PRIVATE_OPT
688 FF_DISABLE_DEPRECATION_WARNINGS
689     if (avctx->context_model)
690         s->context_model = avctx->context_model;
691     if (avctx->context_model > 1U) {
692         av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
693         return AVERROR(EINVAL);
694     }
695 FF_ENABLE_DEPRECATION_WARNINGS
696 #endif
697
698     if (s->ac == AC_RANGE_CUSTOM_TAB) {
699         for (i = 1; i < 256; i++)
700             s->state_transition[i] = ver2_state[i];
701     } else {
702         RangeCoder c;
703         ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
704         for (i = 1; i < 256; i++)
705             s->state_transition[i] = c.one_state[i];
706     }
707
708     for (i = 0; i < 256; i++) {
709         s->quant_table_count = 2;
710         if (s->bits_per_raw_sample <= 8) {
711             s->quant_tables[0][0][i]=           quant11[i];
712             s->quant_tables[0][1][i]=        11*quant11[i];
713             s->quant_tables[0][2][i]=     11*11*quant11[i];
714             s->quant_tables[1][0][i]=           quant11[i];
715             s->quant_tables[1][1][i]=        11*quant11[i];
716             s->quant_tables[1][2][i]=     11*11*quant5 [i];
717             s->quant_tables[1][3][i]=   5*11*11*quant5 [i];
718             s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
719         } else {
720             s->quant_tables[0][0][i]=           quant9_10bit[i];
721             s->quant_tables[0][1][i]=        11*quant9_10bit[i];
722             s->quant_tables[0][2][i]=     11*11*quant9_10bit[i];
723             s->quant_tables[1][0][i]=           quant9_10bit[i];
724             s->quant_tables[1][1][i]=        11*quant9_10bit[i];
725             s->quant_tables[1][2][i]=     11*11*quant5_10bit[i];
726             s->quant_tables[1][3][i]=   5*11*11*quant5_10bit[i];
727             s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
728         }
729     }
730     s->context_count[0] = (11 * 11 * 11        + 1) / 2;
731     s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
732     memcpy(s->quant_table, s->quant_tables[s->context_model],
733            sizeof(s->quant_table));
734
735     for (i = 0; i < s->plane_count; i++) {
736         PlaneContext *const p = &s->plane[i];
737
738         memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
739         p->quant_table_index = s->context_model;
740         p->context_count     = s->context_count[p->quant_table_index];
741     }
742
743     if ((ret = ff_ffv1_allocate_initial_states(s)) < 0)
744         return ret;
745
746 #if FF_API_CODED_FRAME
747 FF_DISABLE_DEPRECATION_WARNINGS
748     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
749 FF_ENABLE_DEPRECATION_WARNINGS
750 #endif
751
752     if (!s->transparency)
753         s->plane_count = 2;
754     if (!s->chroma_planes && s->version > 3)
755         s->plane_count--;
756
757     avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
758     s->picture_number = 0;
759
760     if (avctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2)) {
761         for (i = 0; i < s->quant_table_count; i++) {
762             s->rc_stat2[i] = av_mallocz(s->context_count[i] *
763                                         sizeof(*s->rc_stat2[i]));
764             if (!s->rc_stat2[i])
765                 return AVERROR(ENOMEM);
766         }
767     }
768     if (avctx->stats_in) {
769         char *p = avctx->stats_in;
770         uint8_t (*best_state)[256] = av_malloc_array(256, 256);
771         int gob_count = 0;
772         char *next;
773         if (!best_state)
774             return AVERROR(ENOMEM);
775
776         av_assert0(s->version >= 2);
777
778         for (;;) {
779             for (j = 0; j < 256; j++)
780                 for (i = 0; i < 2; i++) {
781                     s->rc_stat[j][i] = strtol(p, &next, 0);
782                     if (next == p) {
783                         av_log(avctx, AV_LOG_ERROR,
784                                "2Pass file invalid at %d %d [%s]\n", j, i, p);
785                         av_freep(&best_state);
786                         return AVERROR_INVALIDDATA;
787                     }
788                     p = next;
789                 }
790             for (i = 0; i < s->quant_table_count; i++)
791                 for (j = 0; j < s->context_count[i]; j++) {
792                     for (k = 0; k < 32; k++)
793                         for (m = 0; m < 2; m++) {
794                             s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
795                             if (next == p) {
796                                 av_log(avctx, AV_LOG_ERROR,
797                                        "2Pass file invalid at %d %d %d %d [%s]\n",
798                                        i, j, k, m, p);
799                                 av_freep(&best_state);
800                                 return AVERROR_INVALIDDATA;
801                             }
802                             p = next;
803                         }
804                 }
805             gob_count = strtol(p, &next, 0);
806             if (next == p || gob_count <= 0) {
807                 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
808                 av_freep(&best_state);
809                 return AVERROR_INVALIDDATA;
810             }
811             p = next;
812             while (*p == '\n' || *p == ' ')
813                 p++;
814             if (p[0] == 0)
815                 break;
816         }
817         if (s->ac == AC_RANGE_CUSTOM_TAB)
818             sort_stt(s, s->state_transition);
819
820         find_best_state(best_state, s->state_transition);
821
822         for (i = 0; i < s->quant_table_count; i++) {
823             for (k = 0; k < 32; k++) {
824                 double a=0, b=0;
825                 int jp = 0;
826                 for (j = 0; j < s->context_count[i]; j++) {
827                     double p = 128;
828                     if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
829                         if (a+b)
830                             p = 256.0 * b / (a + b);
831                         s->initial_states[i][jp][k] =
832                             best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
833                         for(jp++; jp<j; jp++)
834                             s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
835                         a=b=0;
836                     }
837                     a += s->rc_stat2[i][j][k][0];
838                     b += s->rc_stat2[i][j][k][1];
839                     if (a+b) {
840                         p = 256.0 * b / (a + b);
841                     }
842                     s->initial_states[i][j][k] =
843                         best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
844                 }
845             }
846         }
847         av_freep(&best_state);
848     }
849
850     if (s->version > 1) {
851         s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
852         for (; s->num_v_slices < 9; s->num_v_slices++) {
853             for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
854                 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64 || !avctx->slices)
855                     goto slices_ok;
856             }
857         }
858         av_log(avctx, AV_LOG_ERROR,
859                "Unsupported number %d of slices requested, please specify a "
860                "supported number with -slices (ex:4,6,9,12,16, ...)\n",
861                avctx->slices);
862         return AVERROR(ENOSYS);
863 slices_ok:
864         if ((ret = write_extradata(s)) < 0)
865             return ret;
866     }
867
868     if ((ret = ff_ffv1_init_slice_contexts(s)) < 0)
869         return ret;
870     s->slice_count = s->max_slice_count;
871     if ((ret = ff_ffv1_init_slices_state(s)) < 0)
872         return ret;
873
874 #define STATS_OUT_SIZE 1024 * 1024 * 6
875     if (avctx->flags & AV_CODEC_FLAG_PASS1) {
876         avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
877         if (!avctx->stats_out)
878             return AVERROR(ENOMEM);
879         for (i = 0; i < s->quant_table_count; i++)
880             for (j = 0; j < s->max_slice_count; j++) {
881                 FFV1Context *sf = s->slice_context[j];
882                 av_assert0(!sf->rc_stat2[i]);
883                 sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
884                                              sizeof(*sf->rc_stat2[i]));
885                 if (!sf->rc_stat2[i])
886                     return AVERROR(ENOMEM);
887             }
888     }
889
890     return 0;
891 }
892
893 static void encode_slice_header(FFV1Context *f, FFV1Context *fs)
894 {
895     RangeCoder *c = &fs->c;
896     uint8_t state[CONTEXT_SIZE];
897     int j;
898     memset(state, 128, sizeof(state));
899
900     put_symbol(c, state, (fs->slice_x     +1)*f->num_h_slices / f->width   , 0);
901     put_symbol(c, state, (fs->slice_y     +1)*f->num_v_slices / f->height  , 0);
902     put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
903     put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
904     for (j=0; j<f->plane_count; j++) {
905         put_symbol(c, state, f->plane[j].quant_table_index, 0);
906         av_assert0(f->plane[j].quant_table_index == f->context_model);
907     }
908     if (!f->picture.f->interlaced_frame)
909         put_symbol(c, state, 3, 0);
910     else
911         put_symbol(c, state, 1 + !f->picture.f->top_field_first, 0);
912     put_symbol(c, state, f->picture.f->sample_aspect_ratio.num, 0);
913     put_symbol(c, state, f->picture.f->sample_aspect_ratio.den, 0);
914     if (f->version > 3) {
915         put_rac(c, state, fs->slice_coding_mode == 1);
916         if (fs->slice_coding_mode == 1)
917             ff_ffv1_clear_slice_state(f, fs);
918         put_symbol(c, state, fs->slice_coding_mode, 0);
919         if (fs->slice_coding_mode != 1) {
920             put_symbol(c, state, fs->slice_rct_by_coef, 0);
921             put_symbol(c, state, fs->slice_rct_ry_coef, 0);
922         }
923     }
924 }
925
926 static void choose_rct_params(FFV1Context *fs, const uint8_t *src[3], const int stride[3], int w, int h)
927 {
928 #define NB_Y_COEFF 15
929     static const int rct_y_coeff[15][2] = {
930         {0, 0}, //      4G
931         {1, 1}, //  R + 2G + B
932         {2, 2}, // 2R      + 2B
933         {0, 2}, //      2G + 2B
934         {2, 0}, // 2R + 2G
935         {4, 0}, // 4R
936         {0, 4}, //           4B
937
938         {0, 3}, //      1G + 3B
939         {3, 0}, // 3R + 1G
940         {3, 1}, // 3R      +  B
941         {1, 3}, //  R      + 3B
942         {1, 2}, //  R +  G + 2B
943         {2, 1}, // 2R +  G +  B
944         {0, 1}, //      3G +  B
945         {1, 0}, //  R + 3G
946     };
947
948     int stat[NB_Y_COEFF] = {0};
949     int x, y, i, p, best;
950     int16_t *sample[3];
951     int lbd = fs->bits_per_raw_sample <= 8;
952
953     for (y = 0; y < h; y++) {
954         int lastr=0, lastg=0, lastb=0;
955         for (p = 0; p < 3; p++)
956             sample[p] = fs->sample_buffer + p*w;
957
958         for (x = 0; x < w; x++) {
959             int b, g, r;
960             int ab, ag, ar;
961             if (lbd) {
962                 unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
963                 b =  v        & 0xFF;
964                 g = (v >>  8) & 0xFF;
965                 r = (v >> 16) & 0xFF;
966             } else {
967                 b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
968                 g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
969                 r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
970             }
971
972             ar = r - lastr;
973             ag = g - lastg;
974             ab = b - lastb;
975             if (x && y) {
976                 int bg = ag - sample[0][x];
977                 int bb = ab - sample[1][x];
978                 int br = ar - sample[2][x];
979
980                 br -= bg;
981                 bb -= bg;
982
983                 for (i = 0; i<NB_Y_COEFF; i++) {
984                     stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
985                 }
986
987             }
988             sample[0][x] = ag;
989             sample[1][x] = ab;
990             sample[2][x] = ar;
991
992             lastr = r;
993             lastg = g;
994             lastb = b;
995         }
996     }
997
998     best = 0;
999     for (i=1; i<NB_Y_COEFF; i++) {
1000         if (stat[i] < stat[best])
1001             best = i;
1002     }
1003
1004     fs->slice_rct_by_coef = rct_y_coeff[best][1];
1005     fs->slice_rct_ry_coef = rct_y_coeff[best][0];
1006 }
1007
1008 static int encode_slice(AVCodecContext *c, void *arg)
1009 {
1010     FFV1Context *fs  = *(void **)arg;
1011     FFV1Context *f   = fs->avctx->priv_data;
1012     int width        = fs->slice_width;
1013     int height       = fs->slice_height;
1014     int x            = fs->slice_x;
1015     int y            = fs->slice_y;
1016     const AVFrame *const p = f->picture.f;
1017     const int ps     = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
1018     int ret;
1019     RangeCoder c_bak = fs->c;
1020     const uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
1021                                 p->data[1] ? p->data[1] + ps*x + y*p->linesize[1] : NULL,
1022                                 p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL};
1023
1024     fs->slice_coding_mode = 0;
1025     if (f->version > 3) {
1026         choose_rct_params(fs, planes, p->linesize, width, height);
1027     } else {
1028         fs->slice_rct_by_coef = 1;
1029         fs->slice_rct_ry_coef = 1;
1030     }
1031
1032 retry:
1033     if (f->key_frame)
1034         ff_ffv1_clear_slice_state(f, fs);
1035     if (f->version > 2) {
1036         encode_slice_header(f, fs);
1037     }
1038     if (fs->ac == AC_GOLOMB_RICE) {
1039         if (f->version > 2)
1040             put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
1041         fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
1042         init_put_bits(&fs->pb,
1043                       fs->c.bytestream_start + fs->ac_byte_count,
1044                       fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
1045     }
1046
1047     if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8) {
1048         const int chroma_width  = AV_CEIL_RSHIFT(width,  f->chroma_h_shift);
1049         const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
1050         const int cx            = x >> f->chroma_h_shift;
1051         const int cy            = y >> f->chroma_v_shift;
1052
1053         ret = encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
1054
1055         if (f->chroma_planes) {
1056             ret |= encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
1057             ret |= encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
1058         }
1059         if (fs->transparency)
1060             ret |= encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1);
1061     } else if (c->pix_fmt == AV_PIX_FMT_YA8) {
1062         ret  = encode_plane(fs, p->data[0] +     ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);
1063         ret |= encode_plane(fs, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2);
1064     } else if (f->use32bit) {
1065         ret = encode_rgb_frame32(fs, planes, width, height, p->linesize);
1066     } else {
1067         ret = encode_rgb_frame(fs, planes, width, height, p->linesize);
1068     }
1069     emms_c();
1070
1071     if (ret < 0) {
1072         av_assert0(fs->slice_coding_mode == 0);
1073         if (fs->version < 4 || !fs->ac) {
1074             av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1075             return ret;
1076         }
1077         av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1078         fs->slice_coding_mode = 1;
1079         fs->c = c_bak;
1080         goto retry;
1081     }
1082
1083     return 0;
1084 }
1085
1086 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1087                         const AVFrame *pict, int *got_packet)
1088 {
1089     FFV1Context *f      = avctx->priv_data;
1090     RangeCoder *const c = &f->slice_context[0]->c;
1091     AVFrame *const p    = f->picture.f;
1092     uint8_t keystate    = 128;
1093     uint8_t *buf_p;
1094     int i, ret;
1095     int64_t maxsize =   AV_INPUT_BUFFER_MIN_SIZE
1096                       + avctx->width*avctx->height*37LL*4;
1097
1098     if(!pict) {
1099         if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1100             int j, k, m;
1101             char *p   = avctx->stats_out;
1102             char *end = p + STATS_OUT_SIZE;
1103
1104             memset(f->rc_stat, 0, sizeof(f->rc_stat));
1105             for (i = 0; i < f->quant_table_count; i++)
1106                 memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1107
1108             av_assert0(f->slice_count == f->max_slice_count);
1109             for (j = 0; j < f->slice_count; j++) {
1110                 FFV1Context *fs = f->slice_context[j];
1111                 for (i = 0; i < 256; i++) {
1112                     f->rc_stat[i][0] += fs->rc_stat[i][0];
1113                     f->rc_stat[i][1] += fs->rc_stat[i][1];
1114                 }
1115                 for (i = 0; i < f->quant_table_count; i++) {
1116                     for (k = 0; k < f->context_count[i]; k++)
1117                         for (m = 0; m < 32; m++) {
1118                             f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1119                             f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1120                         }
1121                 }
1122             }
1123
1124             for (j = 0; j < 256; j++) {
1125                 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1126                         f->rc_stat[j][0], f->rc_stat[j][1]);
1127                 p += strlen(p);
1128             }
1129             snprintf(p, end - p, "\n");
1130
1131             for (i = 0; i < f->quant_table_count; i++) {
1132                 for (j = 0; j < f->context_count[i]; j++)
1133                     for (m = 0; m < 32; m++) {
1134                         snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1135                                 f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1136                         p += strlen(p);
1137                     }
1138             }
1139             snprintf(p, end - p, "%d\n", f->gob_count);
1140         }
1141         return 0;
1142     }
1143
1144     if (f->version > 3)
1145         maxsize = AV_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
1146
1147     if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
1148         av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
1149         maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
1150     }
1151
1152     if ((ret = ff_alloc_packet2(avctx, pkt, maxsize, 0)) < 0)
1153         return ret;
1154
1155     ff_init_range_encoder(c, pkt->data, pkt->size);
1156     ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1157
1158     av_frame_unref(p);
1159     if ((ret = av_frame_ref(p, pict)) < 0)
1160         return ret;
1161 #if FF_API_CODED_FRAME
1162 FF_DISABLE_DEPRECATION_WARNINGS
1163     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
1164 FF_ENABLE_DEPRECATION_WARNINGS
1165 #endif
1166
1167     if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1168         put_rac(c, &keystate, 1);
1169         f->key_frame = 1;
1170         f->gob_count++;
1171         write_header(f);
1172     } else {
1173         put_rac(c, &keystate, 0);
1174         f->key_frame = 0;
1175     }
1176
1177     if (f->ac == AC_RANGE_CUSTOM_TAB) {
1178         int i;
1179         for (i = 1; i < 256; i++) {
1180             c->one_state[i]        = f->state_transition[i];
1181             c->zero_state[256 - i] = 256 - c->one_state[i];
1182         }
1183     }
1184
1185     for (i = 0; i < f->slice_count; i++) {
1186         FFV1Context *fs = f->slice_context[i];
1187         uint8_t *start  = pkt->data + pkt->size * (int64_t)i / f->slice_count;
1188         int len         = pkt->size / f->slice_count;
1189         if (i) {
1190             ff_init_range_encoder(&fs->c, start, len);
1191         } else {
1192             av_assert0(fs->c.bytestream_end >= fs->c.bytestream_start + len);
1193             av_assert0(fs->c.bytestream < fs->c.bytestream_start + len);
1194             fs->c.bytestream_end = fs->c.bytestream_start + len;
1195         }
1196     }
1197     avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
1198                    f->slice_count, sizeof(void *));
1199
1200     buf_p = pkt->data;
1201     for (i = 0; i < f->slice_count; i++) {
1202         FFV1Context *fs = f->slice_context[i];
1203         int bytes;
1204
1205         if (fs->ac != AC_GOLOMB_RICE) {
1206             uint8_t state = 129;
1207             put_rac(&fs->c, &state, 0);
1208             bytes = ff_rac_terminate(&fs->c);
1209         } else {
1210             flush_put_bits(&fs->pb); // FIXME: nicer padding
1211             bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7) / 8;
1212         }
1213         if (i > 0 || f->version > 2) {
1214             av_assert0(bytes < pkt->size / f->slice_count);
1215             memmove(buf_p, fs->c.bytestream_start, bytes);
1216             av_assert0(bytes < (1 << 24));
1217             AV_WB24(buf_p + bytes, bytes);
1218             bytes += 3;
1219         }
1220         if (f->ec) {
1221             unsigned v;
1222             buf_p[bytes++] = 0;
1223             v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1224             AV_WL32(buf_p + bytes, v);
1225             bytes += 4;
1226         }
1227         buf_p += bytes;
1228     }
1229
1230     if (avctx->flags & AV_CODEC_FLAG_PASS1)
1231         avctx->stats_out[0] = '\0';
1232
1233 #if FF_API_CODED_FRAME
1234 FF_DISABLE_DEPRECATION_WARNINGS
1235     avctx->coded_frame->key_frame = f->key_frame;
1236 FF_ENABLE_DEPRECATION_WARNINGS
1237 #endif
1238
1239     f->picture_number++;
1240     pkt->size   = buf_p - pkt->data;
1241     pkt->pts    =
1242     pkt->dts    = pict->pts;
1243     pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
1244     *got_packet = 1;
1245
1246     return 0;
1247 }
1248
1249 static av_cold int encode_close(AVCodecContext *avctx)
1250 {
1251     ff_ffv1_close(avctx);
1252     return 0;
1253 }
1254
1255 #define OFFSET(x) offsetof(FFV1Context, x)
1256 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1257 static const AVOption options[] = {
1258     { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },
1259     { "coder", "Coder type", OFFSET(ac), AV_OPT_TYPE_INT,
1260             { .i64 = 0 }, -2, 2, VE, "coder" },
1261         { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
1262             { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, "coder" },
1263         { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
1264             { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, "coder" },
1265         { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
1266             { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, "coder" },
1267         { "ac", "Range with custom table (the ac option exists for compatibility and is deprecated)", 0, AV_OPT_TYPE_CONST,
1268             { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" },
1269     { "context", "Context model", OFFSET(context_model), AV_OPT_TYPE_INT,
1270             { .i64 = 0 }, 0, 1, VE },
1271
1272     { NULL }
1273 };
1274
1275 static const AVClass ffv1_class = {
1276     .class_name = "ffv1 encoder",
1277     .item_name  = av_default_item_name,
1278     .option     = options,
1279     .version    = LIBAVUTIL_VERSION_INT,
1280 };
1281
1282 #if FF_API_CODER_TYPE
1283 static const AVCodecDefault ffv1_defaults[] = {
1284     { "coder", "-1" },
1285     { NULL },
1286 };
1287 #endif
1288
1289 AVCodec ff_ffv1_encoder = {
1290     .name           = "ffv1",
1291     .long_name      = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1292     .type           = AVMEDIA_TYPE_VIDEO,
1293     .id             = AV_CODEC_ID_FFV1,
1294     .priv_data_size = sizeof(FFV1Context),
1295     .init           = encode_init,
1296     .encode2        = encode_frame,
1297     .close          = encode_close,
1298     .capabilities   = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DELAY,
1299     .pix_fmts       = (const enum AVPixelFormat[]) {
1300         AV_PIX_FMT_YUV420P,   AV_PIX_FMT_YUVA420P,  AV_PIX_FMT_YUVA422P,  AV_PIX_FMT_YUV444P,
1301         AV_PIX_FMT_YUVA444P,  AV_PIX_FMT_YUV440P,   AV_PIX_FMT_YUV422P,   AV_PIX_FMT_YUV411P,
1302         AV_PIX_FMT_YUV410P,   AV_PIX_FMT_0RGB32,    AV_PIX_FMT_RGB32,     AV_PIX_FMT_YUV420P16,
1303         AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9,  AV_PIX_FMT_YUV422P9,
1304         AV_PIX_FMT_YUV420P9,  AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
1305         AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
1306         AV_PIX_FMT_YUVA444P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA420P16,
1307         AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA420P10,
1308         AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA420P9,
1309         AV_PIX_FMT_GRAY16,    AV_PIX_FMT_GRAY8,     AV_PIX_FMT_GBRP9,     AV_PIX_FMT_GBRP10,
1310         AV_PIX_FMT_GBRP12,    AV_PIX_FMT_GBRP14,
1311         AV_PIX_FMT_YA8,
1312         AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12,
1313         AV_PIX_FMT_GBRP16, AV_PIX_FMT_RGB48,
1314         AV_PIX_FMT_NONE
1315
1316     },
1317 #if FF_API_CODER_TYPE
1318     .defaults       = ffv1_defaults,
1319 #endif
1320     .priv_class     = &ffv1_class,
1321 };