FFmpeg
ffv1enc.c
Go to the documentation of this file.
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 
35 #include "avcodec.h"
36 #include "encode.h"
37 #include "codec_internal.h"
38 #include "put_bits.h"
39 #include "put_golomb.h"
40 #include "rangecoder.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  uint32_t l2tab[256];
144 
145  for (i = 1; i < 256; i++)
146  l2tab[i] = -log2(i / 256.0) * ((1U << 31) / 8);
147 
148  for (i = 0; i < 256; i++) {
149  uint64_t best_len[256];
150 
151  for (j = 0; j < 256; j++)
152  best_len[j] = UINT64_MAX;
153 
154  for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
155  uint32_t occ[256] = { 0 };
156  uint64_t len = 0;
157  occ[j] = UINT32_MAX;
158 
159  if (!one_state[j])
160  continue;
161 
162  for (k = 0; k < 256; k++) {
163  uint32_t newocc[256] = { 0 };
164  for (m = 1; m < 256; m++)
165  if (occ[m]) {
166  len += (occ[m]*(( i *(uint64_t)l2tab[ m]
167  + (256-i)*(uint64_t)l2tab[256-m])>>8)) >> 8;
168  }
169  if (len < best_len[k]) {
170  best_len[k] = len;
171  best_state[i][k] = j;
172  }
173  for (m = 1; m < 256; m++)
174  if (occ[m]) {
175  newocc[ one_state[ m]] += occ[m] * (uint64_t) i >> 8;
176  newocc[256 - one_state[256 - m]] += occ[m] * (uint64_t)(256 - i) >> 8;
177  }
178  memcpy(occ, newocc, sizeof(occ));
179  }
180  }
181  }
182 }
183 
185  uint8_t *state, int v,
186  int is_signed,
187  uint64_t rc_stat[256][2],
188  uint64_t rc_stat2[32][2])
189 {
190  int i;
191 
192 #define put_rac(C, S, B) \
193  do { \
194  if (rc_stat) { \
195  rc_stat[*(S)][B]++; \
196  rc_stat2[(S) - state][B]++; \
197  } \
198  put_rac(C, S, B); \
199  } while (0)
200 
201  if (v) {
202  const int a = FFABS(v);
203  const int e = av_log2(a);
204  put_rac(c, state + 0, 0);
205  if (e <= 9) {
206  for (i = 0; i < e; i++)
207  put_rac(c, state + 1 + i, 1); // 1..10
208  put_rac(c, state + 1 + i, 0);
209 
210  for (i = e - 1; i >= 0; i--)
211  put_rac(c, state + 22 + i, (a >> i) & 1); // 22..31
212 
213  if (is_signed)
214  put_rac(c, state + 11 + e, v < 0); // 11..21
215  } else {
216  for (i = 0; i < e; i++)
217  put_rac(c, state + 1 + FFMIN(i, 9), 1); // 1..10
218  put_rac(c, state + 1 + 9, 0);
219 
220  for (i = e - 1; i >= 0; i--)
221  put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1); // 22..31
222 
223  if (is_signed)
224  put_rac(c, state + 11 + 10, v < 0); // 11..21
225  }
226  } else {
227  put_rac(c, state + 0, 1);
228  }
229 #undef put_rac
230 }
231 
232 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
233  int v, int is_signed)
234 {
235  put_symbol_inline(c, state, v, is_signed, NULL, NULL);
236 }
237 
238 
239 static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
240  int v, int bits)
241 {
242  int i, k, code;
243  v = fold(v - state->bias, bits);
244 
245  i = state->count;
246  k = 0;
247  while (i < state->error_sum) { // FIXME: optimize
248  k++;
249  i += i;
250  }
251 
252  av_assert2(k <= 13);
253 
254  code = v ^ ((2 * state->drift + state->count) >> 31);
255 
256  ff_dlog(NULL, "v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code,
257  state->bias, state->error_sum, state->drift, state->count, k);
258  set_sr_golomb(pb, code, k, 12, bits);
259 
261 }
262 
263 #define TYPE int16_t
264 #define RENAME(name) name
265 #include "ffv1enc_template.c"
266 #undef TYPE
267 #undef RENAME
268 
269 #define TYPE int32_t
270 #define RENAME(name) name ## 32
271 #include "ffv1enc_template.c"
272 
273 static int encode_plane(FFV1Context *s, const uint8_t *src, int w, int h,
274  int stride, int plane_index, int pixel_stride)
275 {
276  int x, y, i, ret;
277  const int ring_size = s->context_model ? 3 : 2;
278  int16_t *sample[3];
279  s->run_index = 0;
280 
281  memset(s->sample_buffer, 0, ring_size * (w + 6) * sizeof(*s->sample_buffer));
282 
283  for (y = 0; y < h; y++) {
284  for (i = 0; i < ring_size; i++)
285  sample[i] = s->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
286 
287  sample[0][-1]= sample[1][0 ];
288  sample[1][ w]= sample[1][w-1];
289  if (s->bits_per_raw_sample <= 8) {
290  for (x = 0; x < w; x++)
291  sample[0][x] = src[x * pixel_stride + stride * y];
292  if((ret = encode_line(s, w, sample, plane_index, 8)) < 0)
293  return ret;
294  } else {
295  if (s->packed_at_lsb) {
296  for (x = 0; x < w; x++) {
297  sample[0][x] = ((uint16_t*)(src + stride*y))[x];
298  }
299  } else {
300  for (x = 0; x < w; x++) {
301  sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
302  }
303  }
304  if((ret = encode_line(s, w, sample, plane_index, s->bits_per_raw_sample)) < 0)
305  return ret;
306  }
307  }
308  return 0;
309 }
310 
311 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
312 {
313  int last = 0;
314  int i;
315  uint8_t state[CONTEXT_SIZE];
316  memset(state, 128, sizeof(state));
317 
318  for (i = 1; i < 128; i++)
319  if (quant_table[i] != quant_table[i - 1]) {
320  put_symbol(c, state, i - last - 1, 0);
321  last = i;
322  }
323  put_symbol(c, state, i - last - 1, 0);
324 }
325 
327  int16_t quant_table[MAX_CONTEXT_INPUTS][256])
328 {
329  int i;
330  for (i = 0; i < 5; i++)
332 }
333 
334 static int contains_non_128(uint8_t (*initial_state)[CONTEXT_SIZE],
335  int nb_contexts)
336 {
337  if (!initial_state)
338  return 0;
339  for (int i = 0; i < nb_contexts; i++)
340  for (int j = 0; j < CONTEXT_SIZE; j++)
341  if (initial_state[i][j] != 128)
342  return 1;
343  return 0;
344 }
345 
347 {
348  uint8_t state[CONTEXT_SIZE];
349  int i, j;
350  RangeCoder *const c = &f->slice_context[0]->c;
351 
352  memset(state, 128, sizeof(state));
353 
354  if (f->version < 2) {
355  put_symbol(c, state, f->version, 0);
356  put_symbol(c, state, f->ac, 0);
357  if (f->ac == AC_RANGE_CUSTOM_TAB) {
358  for (i = 1; i < 256; i++)
359  put_symbol(c, state,
360  f->state_transition[i] - c->one_state[i], 1);
361  }
362  put_symbol(c, state, f->colorspace, 0); //YUV cs type
363  if (f->version > 0)
364  put_symbol(c, state, f->bits_per_raw_sample, 0);
365  put_rac(c, state, f->chroma_planes);
366  put_symbol(c, state, f->chroma_h_shift, 0);
367  put_symbol(c, state, f->chroma_v_shift, 0);
368  put_rac(c, state, f->transparency);
369 
370  write_quant_tables(c, f->quant_table);
371  } else if (f->version < 3) {
372  put_symbol(c, state, f->slice_count, 0);
373  for (i = 0; i < f->slice_count; i++) {
374  FFV1Context *fs = f->slice_context[i];
375  put_symbol(c, state,
376  (fs->slice_x + 1) * f->num_h_slices / f->width, 0);
377  put_symbol(c, state,
378  (fs->slice_y + 1) * f->num_v_slices / f->height, 0);
379  put_symbol(c, state,
380  (fs->slice_width + 1) * f->num_h_slices / f->width - 1,
381  0);
382  put_symbol(c, state,
383  (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
384  0);
385  for (j = 0; j < f->plane_count; j++) {
386  put_symbol(c, state, f->plane[j].quant_table_index, 0);
387  av_assert0(f->plane[j].quant_table_index == f->context_model);
388  }
389  }
390  }
391 }
392 
394 {
395  RangeCoder *const c = &f->c;
396  uint8_t state[CONTEXT_SIZE];
397  int i, j, k;
398  uint8_t state2[32][CONTEXT_SIZE];
399  unsigned v;
400 
401  memset(state2, 128, sizeof(state2));
402  memset(state, 128, sizeof(state));
403 
404  f->avctx->extradata_size = 10000 + 4 +
405  (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
406  f->avctx->extradata = av_malloc(f->avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
407  if (!f->avctx->extradata)
408  return AVERROR(ENOMEM);
409  ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
410  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
411 
412  put_symbol(c, state, f->version, 0);
413  if (f->version > 2) {
414  if (f->version == 3) {
415  f->micro_version = 4;
416  } else if (f->version == 4)
417  f->micro_version = 2;
418  put_symbol(c, state, f->micro_version, 0);
419  }
420 
421  put_symbol(c, state, f->ac, 0);
422  if (f->ac == AC_RANGE_CUSTOM_TAB)
423  for (i = 1; i < 256; i++)
424  put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
425 
426  put_symbol(c, state, f->colorspace, 0); // YUV cs type
427  put_symbol(c, state, f->bits_per_raw_sample, 0);
428  put_rac(c, state, f->chroma_planes);
429  put_symbol(c, state, f->chroma_h_shift, 0);
430  put_symbol(c, state, f->chroma_v_shift, 0);
431  put_rac(c, state, f->transparency);
432  put_symbol(c, state, f->num_h_slices - 1, 0);
433  put_symbol(c, state, f->num_v_slices - 1, 0);
434 
435  put_symbol(c, state, f->quant_table_count, 0);
436  for (i = 0; i < f->quant_table_count; i++)
437  write_quant_tables(c, f->quant_tables[i]);
438 
439  for (i = 0; i < f->quant_table_count; i++) {
440  if (contains_non_128(f->initial_states[i], f->context_count[i])) {
441  put_rac(c, state, 1);
442  for (j = 0; j < f->context_count[i]; j++)
443  for (k = 0; k < CONTEXT_SIZE; k++) {
444  int pred = j ? f->initial_states[i][j - 1][k] : 128;
445  put_symbol(c, state2[k],
446  (int8_t)(f->initial_states[i][j][k] - pred), 1);
447  }
448  } else {
449  put_rac(c, state, 0);
450  }
451  }
452 
453  if (f->version > 2) {
454  put_symbol(c, state, f->ec, 0);
455  put_symbol(c, state, f->intra = (f->avctx->gop_size < 2), 0);
456  }
457 
458  f->avctx->extradata_size = ff_rac_terminate(c, 0);
459  v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
460  AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
461  f->avctx->extradata_size += 4;
462 
463  return 0;
464 }
465 
466 static int sort_stt(FFV1Context *s, uint8_t stt[256])
467 {
468  int i, i2, changed, print = 0;
469 
470  do {
471  changed = 0;
472  for (i = 12; i < 244; i++) {
473  for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
474 
475 #define COST(old, new) \
476  s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
477  s->rc_stat[old][1] * -log2((new) / 256.0)
478 
479 #define COST2(old, new) \
480  COST(old, new) + COST(256 - (old), 256 - (new))
481 
482  double size0 = COST2(i, i) + COST2(i2, i2);
483  double sizeX = COST2(i, i2) + COST2(i2, i);
484  if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
485  int j;
486  FFSWAP(int, stt[i], stt[i2]);
487  FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
488  FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
489  if (i != 256 - i2) {
490  FFSWAP(int, stt[256 - i], stt[256 - i2]);
491  FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
492  FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
493  }
494  for (j = 1; j < 256; j++) {
495  if (stt[j] == i)
496  stt[j] = i2;
497  else if (stt[j] == i2)
498  stt[j] = i;
499  if (i != 256 - i2) {
500  if (stt[256 - j] == 256 - i)
501  stt[256 - j] = 256 - i2;
502  else if (stt[256 - j] == 256 - i2)
503  stt[256 - j] = 256 - i;
504  }
505  }
506  print = changed = 1;
507  }
508  }
509  }
510  } while (changed);
511  return print;
512 }
513 
515 {
518  int i, j, k, m, ret;
519 
520  if ((ret = ff_ffv1_common_init(avctx)) < 0)
521  return ret;
522 
523  s->version = 0;
524 
526  avctx->slices > 1)
527  s->version = FFMAX(s->version, 2);
528 
529  // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
530  if (avctx->slices == 0 && avctx->level < 0 && avctx->width * avctx->height > 720*576)
531  s->version = FFMAX(s->version, 2);
532 
533  if (avctx->level <= 0 && s->version == 2) {
534  s->version = 3;
535  }
536  if (avctx->level >= 0 && avctx->level <= 4) {
537  if (avctx->level < s->version) {
538  av_log(avctx, AV_LOG_ERROR, "Version %d needed for requested features but %d requested\n", s->version, avctx->level);
539  return AVERROR(EINVAL);
540  }
541  s->version = avctx->level;
542  }
543 
544  if (s->ec < 0) {
545  s->ec = (s->version >= 3);
546  }
547 
548  // CRC requires version 3+
549  if (s->ec)
550  s->version = FFMAX(s->version, 3);
551 
552  if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
553  av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
554  return AVERROR_INVALIDDATA;
555  }
556 
557  if (s->ac == 1) // Compatbility with common command line usage
558  s->ac = AC_RANGE_CUSTOM_TAB;
559  else if (s->ac == AC_RANGE_DEFAULT_TAB_FORCE)
560  s->ac = AC_RANGE_DEFAULT_TAB;
561 
562  s->plane_count = 3;
563  switch(avctx->pix_fmt) {
564  case AV_PIX_FMT_GRAY9:
565  case AV_PIX_FMT_YUV444P9:
566  case AV_PIX_FMT_YUV422P9:
567  case AV_PIX_FMT_YUV420P9:
572  s->bits_per_raw_sample = 9;
573  case AV_PIX_FMT_GRAY10:
581  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
582  s->bits_per_raw_sample = 10;
583  case AV_PIX_FMT_GRAY12:
590  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
591  s->bits_per_raw_sample = 12;
592  case AV_PIX_FMT_GRAY14:
596  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
597  s->bits_per_raw_sample = 14;
598  s->packed_at_lsb = 1;
599  case AV_PIX_FMT_GRAY16:
606  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
607  s->bits_per_raw_sample = 16;
608  } else if (!s->bits_per_raw_sample) {
609  s->bits_per_raw_sample = avctx->bits_per_raw_sample;
610  }
611  if (s->bits_per_raw_sample <= 8) {
612  av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
613  return AVERROR_INVALIDDATA;
614  }
615  s->version = FFMAX(s->version, 1);
616  case AV_PIX_FMT_GRAY8:
617  case AV_PIX_FMT_YA8:
618  case AV_PIX_FMT_YUV444P:
619  case AV_PIX_FMT_YUV440P:
620  case AV_PIX_FMT_YUV422P:
621  case AV_PIX_FMT_YUV420P:
622  case AV_PIX_FMT_YUV411P:
623  case AV_PIX_FMT_YUV410P:
624  case AV_PIX_FMT_YUVA444P:
625  case AV_PIX_FMT_YUVA422P:
626  case AV_PIX_FMT_YUVA420P:
627  s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
628  s->colorspace = 0;
629  s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
630  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
631  s->bits_per_raw_sample = 8;
632  else if (!s->bits_per_raw_sample)
633  s->bits_per_raw_sample = 8;
634  break;
635  case AV_PIX_FMT_RGB32:
636  s->colorspace = 1;
637  s->transparency = 1;
638  s->chroma_planes = 1;
639  s->bits_per_raw_sample = 8;
640  break;
641  case AV_PIX_FMT_RGBA64:
642  s->colorspace = 1;
643  s->transparency = 1;
644  s->chroma_planes = 1;
645  s->bits_per_raw_sample = 16;
646  s->use32bit = 1;
647  s->version = FFMAX(s->version, 1);
648  break;
649  case AV_PIX_FMT_RGB48:
650  s->colorspace = 1;
651  s->chroma_planes = 1;
652  s->bits_per_raw_sample = 16;
653  s->use32bit = 1;
654  s->version = FFMAX(s->version, 1);
655  break;
656  case AV_PIX_FMT_0RGB32:
657  s->colorspace = 1;
658  s->chroma_planes = 1;
659  s->bits_per_raw_sample = 8;
660  break;
661  case AV_PIX_FMT_GBRP9:
663  s->bits_per_raw_sample = 9;
664  case AV_PIX_FMT_GBRP10:
665  case AV_PIX_FMT_GBRAP10:
666  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
667  s->bits_per_raw_sample = 10;
668  case AV_PIX_FMT_GBRP12:
669  case AV_PIX_FMT_GBRAP12:
670  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
671  s->bits_per_raw_sample = 12;
672  case AV_PIX_FMT_GBRP14:
673  case AV_PIX_FMT_GBRAP14:
674  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
675  s->bits_per_raw_sample = 14;
676  case AV_PIX_FMT_GBRP16:
677  case AV_PIX_FMT_GBRAP16:
678  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
679  s->bits_per_raw_sample = 16;
680  else if (!s->bits_per_raw_sample)
681  s->bits_per_raw_sample = avctx->bits_per_raw_sample;
682  s->transparency = !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA);
683  s->colorspace = 1;
684  s->chroma_planes = 1;
685  if (s->bits_per_raw_sample >= 16) {
686  s->use32bit = 1;
687  }
688  s->version = FFMAX(s->version, 1);
689  break;
690  default:
691  av_log(avctx, AV_LOG_ERROR, "format not supported\n");
692  return AVERROR(ENOSYS);
693  }
694  av_assert0(s->bits_per_raw_sample >= 8);
695 
696  if (s->bits_per_raw_sample > 8) {
697  if (s->ac == AC_GOLOMB_RICE) {
699  "bits_per_raw_sample > 8, forcing range coder\n");
700  s->ac = AC_RANGE_CUSTOM_TAB;
701  }
702  }
703 
704  if (s->ac == AC_RANGE_CUSTOM_TAB) {
705  for (i = 1; i < 256; i++)
706  s->state_transition[i] = ver2_state[i];
707  } else {
708  RangeCoder c;
709  ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
710  for (i = 1; i < 256; i++)
711  s->state_transition[i] = c.one_state[i];
712  }
713 
714  for (i = 0; i < 256; i++) {
715  s->quant_table_count = 2;
716  if (s->bits_per_raw_sample <= 8) {
717  s->quant_tables[0][0][i]= quant11[i];
718  s->quant_tables[0][1][i]= 11*quant11[i];
719  s->quant_tables[0][2][i]= 11*11*quant11[i];
720  s->quant_tables[1][0][i]= quant11[i];
721  s->quant_tables[1][1][i]= 11*quant11[i];
722  s->quant_tables[1][2][i]= 11*11*quant5 [i];
723  s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
724  s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
725  } else {
726  s->quant_tables[0][0][i]= quant9_10bit[i];
727  s->quant_tables[0][1][i]= 11*quant9_10bit[i];
728  s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
729  s->quant_tables[1][0][i]= quant9_10bit[i];
730  s->quant_tables[1][1][i]= 11*quant9_10bit[i];
731  s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
732  s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
733  s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
734  }
735  }
736  s->context_count[0] = (11 * 11 * 11 + 1) / 2;
737  s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
738  memcpy(s->quant_table, s->quant_tables[s->context_model],
739  sizeof(s->quant_table));
740 
741  for (i = 0; i < s->plane_count; i++) {
742  PlaneContext *const p = &s->plane[i];
743 
744  memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
745  p->quant_table_index = s->context_model;
746  p->context_count = s->context_count[p->quant_table_index];
747  }
748 
750  return ret;
751 
752  if (!s->transparency)
753  s->plane_count = 2;
754  if (!s->chroma_planes && s->version > 3)
755  s->plane_count--;
756 
757  ret = av_pix_fmt_get_chroma_sub_sample (avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
758  if (ret)
759  return ret;
760 
761  s->picture_number = 0;
762 
764  for (i = 0; i < s->quant_table_count; i++) {
765  s->rc_stat2[i] = av_mallocz(s->context_count[i] *
766  sizeof(*s->rc_stat2[i]));
767  if (!s->rc_stat2[i])
768  return AVERROR(ENOMEM);
769  }
770  }
771  if (avctx->stats_in) {
772  char *p = avctx->stats_in;
773  uint8_t (*best_state)[256] = av_malloc_array(256, 256);
774  int gob_count = 0;
775  char *next;
776  if (!best_state)
777  return AVERROR(ENOMEM);
778 
779  av_assert0(s->version >= 2);
780 
781  for (;;) {
782  for (j = 0; j < 256; j++)
783  for (i = 0; i < 2; i++) {
784  s->rc_stat[j][i] = strtol(p, &next, 0);
785  if (next == p) {
787  "2Pass file invalid at %d %d [%s]\n", j, i, p);
788  av_freep(&best_state);
789  return AVERROR_INVALIDDATA;
790  }
791  p = next;
792  }
793  for (i = 0; i < s->quant_table_count; i++)
794  for (j = 0; j < s->context_count[i]; j++) {
795  for (k = 0; k < 32; k++)
796  for (m = 0; m < 2; m++) {
797  s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
798  if (next == p) {
800  "2Pass file invalid at %d %d %d %d [%s]\n",
801  i, j, k, m, p);
802  av_freep(&best_state);
803  return AVERROR_INVALIDDATA;
804  }
805  p = next;
806  }
807  }
808  gob_count = strtol(p, &next, 0);
809  if (next == p || gob_count <= 0) {
810  av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
811  av_freep(&best_state);
812  return AVERROR_INVALIDDATA;
813  }
814  p = next;
815  while (*p == '\n' || *p == ' ')
816  p++;
817  if (p[0] == 0)
818  break;
819  }
820  if (s->ac == AC_RANGE_CUSTOM_TAB)
821  sort_stt(s, s->state_transition);
822 
823  find_best_state(best_state, s->state_transition);
824 
825  for (i = 0; i < s->quant_table_count; i++) {
826  for (k = 0; k < 32; k++) {
827  double a=0, b=0;
828  int jp = 0;
829  for (j = 0; j < s->context_count[i]; j++) {
830  double p = 128;
831  if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
832  if (a+b)
833  p = 256.0 * b / (a + b);
834  s->initial_states[i][jp][k] =
835  best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
836  for(jp++; jp<j; jp++)
837  s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
838  a=b=0;
839  }
840  a += s->rc_stat2[i][j][k][0];
841  b += s->rc_stat2[i][j][k][1];
842  if (a+b) {
843  p = 256.0 * b / (a + b);
844  }
845  s->initial_states[i][j][k] =
846  best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
847  }
848  }
849  }
850  av_freep(&best_state);
851  }
852 
853  if (s->version > 1) {
854  int plane_count = 1 + 2*s->chroma_planes + s->transparency;
855  int max_h_slices = AV_CEIL_RSHIFT(avctx->width , s->chroma_h_shift);
856  int max_v_slices = AV_CEIL_RSHIFT(avctx->height, s->chroma_v_shift);
857  s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
858 
859  s->num_v_slices = FFMIN(s->num_v_slices, max_v_slices);
860 
861  for (; s->num_v_slices < 32; s->num_v_slices++) {
862  for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
863  int maxw = (avctx->width + s->num_h_slices - 1) / s->num_h_slices;
864  int maxh = (avctx->height + s->num_v_slices - 1) / s->num_v_slices;
865  if (s->num_h_slices > max_h_slices || s->num_v_slices > max_v_slices)
866  continue;
867  if (maxw * maxh * (int64_t)(s->bits_per_raw_sample+1) * plane_count > 8<<24)
868  continue;
869  if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= MAX_SLICES || !avctx->slices)
870  goto slices_ok;
871  }
872  }
874  "Unsupported number %d of slices requested, please specify a "
875  "supported number with -slices (ex:4,6,9,12,16, ...)\n",
876  avctx->slices);
877  return AVERROR(ENOSYS);
878 slices_ok:
879  if ((ret = write_extradata(s)) < 0)
880  return ret;
881  }
882 
883  if ((ret = ff_ffv1_init_slice_contexts(s)) < 0)
884  return ret;
885  s->slice_count = s->max_slice_count;
886  if ((ret = ff_ffv1_init_slices_state(s)) < 0)
887  return ret;
888 
889 #define STATS_OUT_SIZE 1024 * 1024 * 6
892  if (!avctx->stats_out)
893  return AVERROR(ENOMEM);
894  for (i = 0; i < s->quant_table_count; i++)
895  for (j = 0; j < s->max_slice_count; j++) {
896  FFV1Context *sf = s->slice_context[j];
897  av_assert0(!sf->rc_stat2[i]);
898  sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
899  sizeof(*sf->rc_stat2[i]));
900  if (!sf->rc_stat2[i])
901  return AVERROR(ENOMEM);
902  }
903  }
904 
905  return 0;
906 }
907 
909 {
910  RangeCoder *c = &fs->c;
911  uint8_t state[CONTEXT_SIZE];
912  int j;
913  memset(state, 128, sizeof(state));
914 
915  put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
916  put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
917  put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
918  put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
919  for (j=0; j<f->plane_count; j++) {
920  put_symbol(c, state, f->plane[j].quant_table_index, 0);
921  av_assert0(f->plane[j].quant_table_index == f->context_model);
922  }
923  if (!(f->cur_enc_frame->flags & AV_FRAME_FLAG_INTERLACED))
924  put_symbol(c, state, 3, 0);
925  else
926  put_symbol(c, state, 1 + !(f->cur_enc_frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST), 0);
927  put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.num, 0);
928  put_symbol(c, state, f->cur_enc_frame->sample_aspect_ratio.den, 0);
929  if (f->version > 3) {
930  put_rac(c, state, fs->slice_coding_mode == 1);
931  if (fs->slice_coding_mode == 1)
933  put_symbol(c, state, fs->slice_coding_mode, 0);
934  if (fs->slice_coding_mode != 1) {
935  put_symbol(c, state, fs->slice_rct_by_coef, 0);
936  put_symbol(c, state, fs->slice_rct_ry_coef, 0);
937  }
938  }
939 }
940 
941 static void choose_rct_params(FFV1Context *fs, const uint8_t *src[3], const int stride[3], int w, int h)
942 {
943 #define NB_Y_COEFF 15
944  static const int rct_y_coeff[15][2] = {
945  {0, 0}, // 4G
946  {1, 1}, // R + 2G + B
947  {2, 2}, // 2R + 2B
948  {0, 2}, // 2G + 2B
949  {2, 0}, // 2R + 2G
950  {4, 0}, // 4R
951  {0, 4}, // 4B
952 
953  {0, 3}, // 1G + 3B
954  {3, 0}, // 3R + 1G
955  {3, 1}, // 3R + B
956  {1, 3}, // R + 3B
957  {1, 2}, // R + G + 2B
958  {2, 1}, // 2R + G + B
959  {0, 1}, // 3G + B
960  {1, 0}, // R + 3G
961  };
962 
963  int stat[NB_Y_COEFF] = {0};
964  int x, y, i, p, best;
965  int16_t *sample[3];
966  int lbd = fs->bits_per_raw_sample <= 8;
967 
968  for (y = 0; y < h; y++) {
969  int lastr=0, lastg=0, lastb=0;
970  for (p = 0; p < 3; p++)
971  sample[p] = fs->sample_buffer + p*w;
972 
973  for (x = 0; x < w; x++) {
974  int b, g, r;
975  int ab, ag, ar;
976  if (lbd) {
977  unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
978  b = v & 0xFF;
979  g = (v >> 8) & 0xFF;
980  r = (v >> 16) & 0xFF;
981  } else {
982  b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
983  g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
984  r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
985  }
986 
987  ar = r - lastr;
988  ag = g - lastg;
989  ab = b - lastb;
990  if (x && y) {
991  int bg = ag - sample[0][x];
992  int bb = ab - sample[1][x];
993  int br = ar - sample[2][x];
994 
995  br -= bg;
996  bb -= bg;
997 
998  for (i = 0; i<NB_Y_COEFF; i++) {
999  stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
1000  }
1001 
1002  }
1003  sample[0][x] = ag;
1004  sample[1][x] = ab;
1005  sample[2][x] = ar;
1006 
1007  lastr = r;
1008  lastg = g;
1009  lastb = b;
1010  }
1011  }
1012 
1013  best = 0;
1014  for (i=1; i<NB_Y_COEFF; i++) {
1015  if (stat[i] < stat[best])
1016  best = i;
1017  }
1018 
1019  fs->slice_rct_by_coef = rct_y_coeff[best][1];
1020  fs->slice_rct_ry_coef = rct_y_coeff[best][0];
1021 }
1022 
1023 static int encode_slice(AVCodecContext *c, void *arg)
1024 {
1025  FFV1Context *fs = *(void **)arg;
1026  FFV1Context *f = fs->avctx->priv_data;
1027  int width = fs->slice_width;
1028  int height = fs->slice_height;
1029  int x = fs->slice_x;
1030  int y = fs->slice_y;
1031  const AVFrame *const p = f->cur_enc_frame;
1032  const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
1033  int ret;
1034  RangeCoder c_bak = fs->c;
1035  const uint8_t *planes[4] = {p->data[0] + ps*x + y*p->linesize[0],
1036  p->data[1] ? p->data[1] + ps*x + y*p->linesize[1] : NULL,
1037  p->data[2] ? p->data[2] + ps*x + y*p->linesize[2] : NULL,
1038  p->data[3] ? p->data[3] + ps*x + y*p->linesize[3] : NULL};
1039 
1040  fs->slice_coding_mode = 0;
1041  if (f->version > 3) {
1043  } else {
1044  fs->slice_rct_by_coef = 1;
1045  fs->slice_rct_ry_coef = 1;
1046  }
1047 
1048 retry:
1049  if (f->key_frame)
1051  if (f->version > 2) {
1053  }
1054  if (fs->ac == AC_GOLOMB_RICE) {
1055  fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c, f->version > 2) : 0;
1056  init_put_bits(&fs->pb,
1057  fs->c.bytestream_start + fs->ac_byte_count,
1058  fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
1059  }
1060 
1061  if (f->colorspace == 0 && c->pix_fmt != AV_PIX_FMT_YA8) {
1062  const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
1063  const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
1064  const int cx = x >> f->chroma_h_shift;
1065  const int cy = y >> f->chroma_v_shift;
1066 
1067  ret = encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
1068 
1069  if (f->chroma_planes) {
1070  ret |= encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
1071  ret |= encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
1072  }
1073  if (fs->transparency)
1074  ret |= encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2, 1);
1075  } else if (c->pix_fmt == AV_PIX_FMT_YA8) {
1076  ret = encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 2);
1077  ret |= encode_plane(fs, p->data[0] + 1 + ps*x + y*p->linesize[0], width, height, p->linesize[0], 1, 2);
1078  } else if (f->use32bit) {
1079  ret = encode_rgb_frame32(fs, planes, width, height, p->linesize);
1080  } else {
1082  }
1083 
1084  if (ret < 0) {
1085  av_assert0(fs->slice_coding_mode == 0);
1086  if (fs->version < 4 || !fs->ac) {
1087  av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1088  return ret;
1089  }
1090  av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1091  fs->slice_coding_mode = 1;
1092  fs->c = c_bak;
1093  goto retry;
1094  }
1095 
1096  return 0;
1097 }
1098 
1100  const AVFrame *pict, int *got_packet)
1101 {
1103  RangeCoder *const c = &f->slice_context[0]->c;
1104  uint8_t keystate = 128;
1105  uint8_t *buf_p;
1106  int i, ret;
1107  int64_t maxsize = AV_INPUT_BUFFER_MIN_SIZE
1108  + avctx->width*avctx->height*37LL*4;
1109 
1110  if(!pict) {
1111  if (avctx->flags & AV_CODEC_FLAG_PASS1) {
1112  int j, k, m;
1113  char *p = avctx->stats_out;
1114  char *end = p + STATS_OUT_SIZE;
1115 
1116  memset(f->rc_stat, 0, sizeof(f->rc_stat));
1117  for (i = 0; i < f->quant_table_count; i++)
1118  memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1119 
1120  av_assert0(f->slice_count == f->max_slice_count);
1121  for (j = 0; j < f->slice_count; j++) {
1122  FFV1Context *fs = f->slice_context[j];
1123  for (i = 0; i < 256; i++) {
1124  f->rc_stat[i][0] += fs->rc_stat[i][0];
1125  f->rc_stat[i][1] += fs->rc_stat[i][1];
1126  }
1127  for (i = 0; i < f->quant_table_count; i++) {
1128  for (k = 0; k < f->context_count[i]; k++)
1129  for (m = 0; m < 32; m++) {
1130  f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1131  f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1132  }
1133  }
1134  }
1135 
1136  for (j = 0; j < 256; j++) {
1137  snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1138  f->rc_stat[j][0], f->rc_stat[j][1]);
1139  p += strlen(p);
1140  }
1141  snprintf(p, end - p, "\n");
1142 
1143  for (i = 0; i < f->quant_table_count; i++) {
1144  for (j = 0; j < f->context_count[i]; j++)
1145  for (m = 0; m < 32; m++) {
1146  snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1147  f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1148  p += strlen(p);
1149  }
1150  }
1151  snprintf(p, end - p, "%d\n", f->gob_count);
1152  }
1153  return 0;
1154  }
1155 
1156  if (f->version > 3)
1157  maxsize = AV_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
1158 
1159  if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
1160  av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
1161  maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
1162  }
1163 
1164  if ((ret = ff_alloc_packet(avctx, pkt, maxsize)) < 0)
1165  return ret;
1166 
1168  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1169 
1170  f->cur_enc_frame = pict;
1171 
1172  if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1173  put_rac(c, &keystate, 1);
1174  f->key_frame = 1;
1175  f->gob_count++;
1176  write_header(f);
1177  } else {
1178  put_rac(c, &keystate, 0);
1179  f->key_frame = 0;
1180  }
1181 
1182  if (f->ac == AC_RANGE_CUSTOM_TAB) {
1183  int i;
1184  for (i = 1; i < 256; i++) {
1185  c->one_state[i] = f->state_transition[i];
1186  c->zero_state[256 - i] = 256 - c->one_state[i];
1187  }
1188  }
1189 
1190  for (i = 0; i < f->slice_count; i++) {
1191  FFV1Context *fs = f->slice_context[i];
1192  uint8_t *start = pkt->data + pkt->size * (int64_t)i / f->slice_count;
1193  int len = pkt->size / f->slice_count;
1194  if (i) {
1195  ff_init_range_encoder(&fs->c, start, len);
1196  } else {
1197  av_assert0(fs->c.bytestream_end >= fs->c.bytestream_start + len);
1198  av_assert0(fs->c.bytestream < fs->c.bytestream_start + len);
1199  fs->c.bytestream_end = fs->c.bytestream_start + len;
1200  }
1201  }
1202  avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
1203  f->slice_count, sizeof(void *));
1204 
1205  buf_p = pkt->data;
1206  for (i = 0; i < f->slice_count; i++) {
1207  FFV1Context *fs = f->slice_context[i];
1208  int bytes;
1209 
1210  if (fs->ac != AC_GOLOMB_RICE) {
1211  bytes = ff_rac_terminate(&fs->c, 1);
1212  } else {
1213  flush_put_bits(&fs->pb); // FIXME: nicer padding
1214  bytes = fs->ac_byte_count + put_bytes_output(&fs->pb);
1215  }
1216  if (i > 0 || f->version > 2) {
1217  av_assert0(bytes < pkt->size / f->slice_count);
1218  memmove(buf_p, fs->c.bytestream_start, bytes);
1219  av_assert0(bytes < (1 << 24));
1220  AV_WB24(buf_p + bytes, bytes);
1221  bytes += 3;
1222  }
1223  if (f->ec) {
1224  unsigned v;
1225  buf_p[bytes++] = 0;
1226  v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1227  AV_WL32(buf_p + bytes, v);
1228  bytes += 4;
1229  }
1230  buf_p += bytes;
1231  }
1232 
1234  avctx->stats_out[0] = '\0';
1235 
1236  f->picture_number++;
1237  pkt->size = buf_p - pkt->data;
1238  pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
1239  *got_packet = 1;
1240 
1241  return 0;
1242 }
1243 
1244 #define OFFSET(x) offsetof(FFV1Context, x)
1245 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1246 static const AVOption options[] = {
1247  { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },
1248  { "coder", "Coder type", OFFSET(ac), AV_OPT_TYPE_INT,
1249  { .i64 = 0 }, -2, 2, VE, "coder" },
1250  { "rice", "Golomb rice", 0, AV_OPT_TYPE_CONST,
1251  { .i64 = AC_GOLOMB_RICE }, INT_MIN, INT_MAX, VE, "coder" },
1252  { "range_def", "Range with default table", 0, AV_OPT_TYPE_CONST,
1253  { .i64 = AC_RANGE_DEFAULT_TAB_FORCE }, INT_MIN, INT_MAX, VE, "coder" },
1254  { "range_tab", "Range with custom table", 0, AV_OPT_TYPE_CONST,
1255  { .i64 = AC_RANGE_CUSTOM_TAB }, INT_MIN, INT_MAX, VE, "coder" },
1256  { "ac", "Range with custom table (the ac option exists for compatibility and is deprecated)", 0, AV_OPT_TYPE_CONST,
1257  { .i64 = 1 }, INT_MIN, INT_MAX, VE, "coder" },
1258  { "context", "Context model", OFFSET(context_model), AV_OPT_TYPE_INT,
1259  { .i64 = 0 }, 0, 1, VE },
1260 
1261  { NULL }
1262 };
1263 
1264 static const AVClass ffv1_class = {
1265  .class_name = "ffv1 encoder",
1266  .item_name = av_default_item_name,
1267  .option = options,
1268  .version = LIBAVUTIL_VERSION_INT,
1269 };
1270 
1272  .p.name = "ffv1",
1273  CODEC_LONG_NAME("FFmpeg video codec #1"),
1274  .p.type = AVMEDIA_TYPE_VIDEO,
1275  .p.id = AV_CODEC_ID_FFV1,
1276  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |
1279  .priv_data_size = sizeof(FFV1Context),
1280  .init = encode_init,
1282  .close = ff_ffv1_close,
1283  .p.pix_fmts = (const enum AVPixelFormat[]) {
1305 
1306  },
1307  .p.priv_class = &ffv1_class,
1309 };
encode_slice_header
static void encode_slice_header(FFV1Context *f, FFV1Context *fs)
Definition: ffv1enc.c:908
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:512
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:491
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
av_clip
#define av_clip
Definition: common.h:96
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:157
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
r
const char * r
Definition: vf_curves.c:126
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:133
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:424
put_bytes_output
static int put_bytes_output(const PutBitContext *s)
Definition: put_bits.h:89
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2964
FFV1Context::ec
int ec
Definition: ffv1.h:111
FF_CODEC_CAP_EOF_FLUSH
#define FF_CODEC_CAP_EOF_FLUSH
The encoder has AV_CODEC_CAP_DELAY set, but does not actually have delay - it only wants to be flushe...
Definition: codec_internal.h:90
put_symbol_inline
static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2])
Definition: ffv1enc.c:184
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:62
encode_plane
static int encode_plane(FFV1Context *s, const uint8_t *src, int w, int h, int stride, int plane_index, int pixel_stride)
Definition: ffv1enc.c:273
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:504
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:340
pixdesc.h
ff_ffv1_common_init
av_cold int ff_ffv1_common_init(AVCodecContext *avctx)
Definition: ffv1.c:36
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:511
w
uint8_t w
Definition: llviddspenc.c:38
AC_RANGE_DEFAULT_TAB_FORCE
#define AC_RANGE_DEFAULT_TAB_FORCE
Definition: ffv1.h:53
AVPacket::data
uint8_t * data
Definition: packet.h:491
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:506
AVOption
AVOption.
Definition: opt.h:251
encode.h
b
#define b
Definition: input.c:41
rangecoder.h
AVComponentDescriptor::step
int step
Number of elements between 2 horizontally consecutive pixels.
Definition: pixdesc.h:40
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:468
FFCodec
Definition: codec_internal.h:127
write_quant_tables
static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256])
Definition: ffv1enc.c:326
contains_non_128
static int contains_non_128(uint8_t(*initial_state)[CONTEXT_SIZE], int nb_contexts)
Definition: ffv1enc.c:334
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:99
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: defs.h:62
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AC_RANGE_CUSTOM_TAB
#define AC_RANGE_CUSTOM_TAB
Definition: ffv1.h:52
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:507
ring_size
static int ring_size(RingBuffer *ring)
Definition: async.c:105
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:546
put_symbol
static av_noinline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed)
Definition: ffv1enc.c:232
AV_PIX_FMT_GRAY9
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:448
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:361
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
AV_FRAME_FLAG_TOP_FIELD_FIRST
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition: frame.h:641
crc.h
ff_ffv1_init_slices_state
av_cold int ff_ffv1_init_slices_state(FFV1Context *f)
Definition: ffv1.c:95
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:503
quant11
static const int8_t quant11[256]
Definition: ffv1enc.c:101
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: ffv1enc.c:514
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:486
ff_init_range_encoder
av_cold void ff_init_range_encoder(RangeCoder *c, uint8_t *buf, int buf_size)
Definition: rangecoder.c:42
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:484
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:513
choose_rct_params
static void choose_rct_params(FFV1Context *fs, const uint8_t *src[3], const int stride[3], int w, int h)
Definition: ffv1enc.c:941
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:466
encode_slice
static int encode_slice(AVCodecContext *c, void *arg)
Definition: ffv1enc.c:1023
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:521
av_pix_fmt_get_chroma_sub_sample
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition: pixdesc.c:2992
av_noinline
#define av_noinline
Definition: attributes.h:72
NB_Y_COEFF
#define NB_Y_COEFF
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:45
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:452
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:315
PlaneContext::context_count
int context_count
Definition: ffv1.h:65
ff_ffv1_clear_slice_state
void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1Context *fs)
Definition: ffv1.c:163
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:471
avassert.h
put_golomb.h
exp golomb vlc writing stuff
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:480
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:488
width
#define width
s
#define s(width, name)
Definition: cbs_vp9.c:198
AVCodecContext::stats_in
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
Definition: avcodec.h:1334
AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRAP14
Definition: pixfmt.h:490
AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:489
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:101
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:481
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:51
g
const char * g
Definition: vf_curves.c:127
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:159
bits
uint8_t bits
Definition: vp3data.h:128
AC_RANGE_DEFAULT_TAB
#define AC_RANGE_DEFAULT_TAB
Definition: ffv1.h:51
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
quant5
static const int8_t quant5[256]
Definition: ffv1enc.c:63
FFV1Context::rc_stat
uint64_t rc_stat[256][2]
Definition: ffv1.h:79
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:510
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1517
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:465
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:479
write_extradata
static int write_extradata(FFV1Context *f)
Definition: ffv1enc.c:393
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:451
fold
static av_always_inline int fold(int diff, int bits)
Definition: ffv1.h:146
AV_INPUT_BUFFER_MIN_SIZE
#define AV_INPUT_BUFFER_MIN_SIZE
Definition: avcodec.h:195
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:96
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:66
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:95
PutBitContext
Definition: put_bits.h:50
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
sort_stt
static int sort_stt(FFV1Context *s, uint8_t stt[256])
Definition: ffv1enc.c:466
ver2_state
static const uint8_t ver2_state[256]
Definition: ffv1enc.c:120
arg
const char * arg
Definition: jacosubdec.c:67
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:65
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:449
if
if(ret)
Definition: filter_design.txt:179
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: ffv1enc.c:1099
quant_table
static const int16_t quant_table[64]
Definition: intrax8.c:522
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:487
AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_RGBA64
Definition: pixfmt.h:458
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
AC_GOLOMB_RICE
#define AC_GOLOMB_RICE
Definition: ffv1.h:50
fs
#define fs(width, name, subs,...)
Definition: cbs_vp9.c:200
ff_rac_terminate
int ff_rac_terminate(RangeCoder *c, int version)
Terminates the range coder.
Definition: rangecoder.c:109
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AV_PIX_FMT_YUV440P10
#define AV_PIX_FMT_YUV440P10
Definition: pixfmt.h:470
mathops.h
PlaneContext
Definition: ffv1.h:62
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:469
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:74
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:483
AVCodecContext::level
int level
Encoding level descriptor.
Definition: avcodec.h:1740
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
VlcState
Definition: ffv1.h:55
VE
#define VE
Definition: ffv1enc.c:1245
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
options
static const AVOption options[]
Definition: ffv1enc.c:1246
AVCodecContext::stats_out
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:1326
AV_CODEC_ID_FFV1
@ AV_CODEC_ID_FFV1
Definition: codec_id.h:85
f
f
Definition: af_crystalizer.c:121
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:492
AVCodecContext::gop_size
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
Definition: avcodec.h:643
codec_internal.h
quant9_10bit
static const int8_t quant9_10bit[256]
Definition: ffv1enc.c:82
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
print
static void print(AVTreeNode *t, int depth)
Definition: tree.c:44
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:473
ff_ffv1_close
av_cold int ff_ffv1_close(AVCodecContext *avctx)
Definition: ffv1.c:191
sample
#define sample
Definition: flacdsp_template.c:44
AV_PIX_FMT_RGB48
#define AV_PIX_FMT_RGB48
Definition: pixfmt.h:454
size
int size
Definition: twinvq_data.h:10344
ff_build_rac_states
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition: rangecoder.c:68
STATS_OUT_SIZE
#define STATS_OUT_SIZE
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:475
encode_line
static av_always_inline int RENAME() encode_line(FFV1Context *s, int w, TYPE *sample[3], int plane_index, int bits)
Definition: ffv1enc_template.c:25
AV_WB24
#define AV_WB24(p, d)
Definition: intreadwrite.h:448
AV_CODEC_FLAG_PASS2
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
Definition: avcodec.h:310
height
#define height
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:441
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:167
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:114
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:508
find_best_state
static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256])
Definition: ffv1enc.c:139
attributes.h
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:497
PlaneContext::quant_table_index
int quant_table_index
Definition: ffv1.h:64
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:191
put_vlc_symbol
static void put_vlc_symbol(PutBitContext *pb, VlcState *const state, int v, int bits)
Definition: ffv1enc.c:239
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:67
FFV1Context::gob_count
int gob_count
Definition: ffv1.h:120
ffv1_class
static const AVClass ffv1_class
Definition: ffv1enc.c:1264
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
round
static av_always_inline av_const double round(double x)
Definition: libm.h:444
av_flatten
#define av_flatten
Definition: attributes.h:96
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:485
planes
static const struct @363 planes[]
av_always_inline
#define av_always_inline
Definition: attributes.h:49
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ffv1.h
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
len
int len
Definition: vorbis_enc_data.h:426
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
AVCodecContext::height
int height
Definition: avcodec.h:621
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:658
write_quant_table
static void write_quant_table(RangeCoder *c, int16_t *quant_table)
Definition: ffv1enc.c:311
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:636
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:467
MAX_CONTEXT_INPUTS
#define MAX_CONTEXT_INPUTS
Definition: ffv1.h:48
log2
#define log2(x)
Definition: libm.h:404
avcodec.h
stride
#define stride
Definition: h264pred_template.c:537
FFV1Context::avctx
AVCodecContext * avctx
Definition: ffv1.h:75
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
AV_PIX_FMT_0RGB32
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:445
quant5_10bit
static const int8_t quant5_10bit[256]
Definition: ffv1enc.c:44
AVCodecContext::strict_std_compliance
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:1371
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:505
set_sr_golomb
static void set_sr_golomb(PutBitContext *pb, int i, int k, int limit, int esc_len)
write signed golomb rice code (ffv1).
Definition: put_golomb.h:143
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:472
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
put_rac
#define put_rac(C, S, B)
U
#define U(x)
Definition: vpx_arith.h:37
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:477
FFV1Context::rc_stat2
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:80
ff_ffv1_allocate_initial_states
int ff_ffv1_allocate_initial_states(FFV1Context *f)
Definition: ffv1.c:148
AVCodecContext
main external API structure.
Definition: avcodec.h:441
MAX_SLICES
#define MAX_SLICES
Definition: dxva2_hevc.c:32
AVCodecContext::execute
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
Definition: avcodec.h:1562
FFV1Context::context_model
int context_model
Definition: ffv1.h:115
FFV1Context::pb
PutBitContext pb
Definition: ffv1.h:78
av_crc
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition: crc.c:392
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:509
OFFSET
#define OFFSET(x)
Definition: ffv1enc.c:1244
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
COST2
#define COST2(old, new)
state
static struct @362 state
av_clip_uint8
#define av_clip_uint8
Definition: common.h:102
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:71
ffv1enc_template.c
desc
const char * desc
Definition: libsvtav1.c:83
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:70
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:143
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FFV1Context
Definition: ffv1.h:73
AVCodecContext::slices
int slices
Number of slices.
Definition: avcodec.h:1055
AVPacket
This structure stores compressed data.
Definition: packet.h:468
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:468
encode_rgb_frame
static int RENAME() encode_rgb_frame(FFV1Context *s, const uint8_t *src[4], int w, int h, const int stride[4])
Definition: ffv1enc_template.c:127
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:244
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:73
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:621
ff_ffv1_init_slice_contexts
av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:106
imgutils.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:385
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:72
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:474
h
h
Definition: vp9dsp_template.c:2038
RangeCoder
Definition: mss3.c:62
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:478
ff_ffv1_encoder
const FFCodec ff_ffv1_encoder
Definition: ffv1enc.c:1271
write_header
static void write_header(FFV1Context *f)
Definition: ffv1enc.c:346
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:450
PlaneContext::quant_table
int16_t quant_table[MAX_CONTEXT_INPUTS][256]
Definition: ffv1.h:63
put_bits.h
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:234
snprintf
#define snprintf
Definition: snprintf.h:34
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
ff_alloc_packet
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
Definition: encode.c:61
AV_PIX_FMT_YUVA422P
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:166
AV_PIX_FMT_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:476
AV_CODEC_FLAG_PASS1
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
Definition: avcodec.h:306