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