FFmpeg  2.6.9
 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 = 1; 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, const uint8_t *src[3],
409  int w, int h, const int stride[3])
410 {
411  int x, y, p, i;
412  const int ring_size = s->avctx->context_model ? 3 : 2;
413  int16_t *sample[4][3];
414  int lbd = s->bits_per_raw_sample <= 8;
415  int bits = s->bits_per_raw_sample > 0 ? s->bits_per_raw_sample : 8;
416  int offset = 1 << bits;
417 
418  s->run_index = 0;
419 
420  memset(s->sample_buffer, 0, ring_size * MAX_PLANES *
421  (w + 6) * sizeof(*s->sample_buffer));
422 
423  for (y = 0; y < h; y++) {
424  for (i = 0; i < ring_size; i++)
425  for (p = 0; p < MAX_PLANES; p++)
426  sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
427 
428  for (x = 0; x < w; x++) {
429  int b, g, r, av_uninit(a);
430  if (lbd) {
431  unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
432  b = v & 0xFF;
433  g = (v >> 8) & 0xFF;
434  r = (v >> 16) & 0xFF;
435  a = v >> 24;
436  } else {
437  b = *((const uint16_t *)(src[0] + x*2 + stride[0]*y));
438  g = *((const uint16_t *)(src[1] + x*2 + stride[1]*y));
439  r = *((const uint16_t *)(src[2] + x*2 + stride[2]*y));
440  }
441 
442  if (s->slice_coding_mode != 1) {
443  b -= g;
444  r -= g;
445  g += (b * s->slice_rct_by_coef + r * s->slice_rct_ry_coef) >> 2;
446  b += offset;
447  r += offset;
448  }
449 
450  sample[0][0][x] = g;
451  sample[1][0][x] = b;
452  sample[2][0][x] = r;
453  sample[3][0][x] = a;
454  }
455  for (p = 0; p < 3 + s->transparency; p++) {
456  int ret;
457  sample[p][0][-1] = sample[p][1][0 ];
458  sample[p][1][ w] = sample[p][1][w-1];
459  if (lbd && s->slice_coding_mode == 0)
460  ret = encode_line(s, w, sample[p], (p + 1) / 2, 9);
461  else
462  ret = encode_line(s, w, sample[p], (p + 1) / 2, bits + (s->slice_coding_mode != 1));
463  if (ret < 0)
464  return ret;
465  }
466  }
467  return 0;
468 }
469 
470 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
471 {
472  int last = 0;
473  int i;
475  memset(state, 128, sizeof(state));
476 
477  for (i = 1; i < 128; i++)
478  if (quant_table[i] != quant_table[i - 1]) {
479  put_symbol(c, state, i - last - 1, 0);
480  last = i;
481  }
482  put_symbol(c, state, i - last - 1, 0);
483 }
484 
486  int16_t quant_table[MAX_CONTEXT_INPUTS][256])
487 {
488  int i;
489  for (i = 0; i < 5; i++)
491 }
492 
493 static void write_header(FFV1Context *f)
494 {
496  int i, j;
497  RangeCoder *const c = &f->slice_context[0]->c;
498 
499  memset(state, 128, sizeof(state));
500 
501  if (f->version < 2) {
502  put_symbol(c, state, f->version, 0);
503  put_symbol(c, state, f->ac, 0);
504  if (f->ac > 1) {
505  for (i = 1; i < 256; i++)
506  put_symbol(c, state,
507  f->state_transition[i] - c->one_state[i], 1);
508  }
509  put_symbol(c, state, f->colorspace, 0); //YUV cs type
510  if (f->version > 0)
511  put_symbol(c, state, f->bits_per_raw_sample, 0);
512  put_rac(c, state, f->chroma_planes);
513  put_symbol(c, state, f->chroma_h_shift, 0);
514  put_symbol(c, state, f->chroma_v_shift, 0);
515  put_rac(c, state, f->transparency);
516 
518  } else if (f->version < 3) {
519  put_symbol(c, state, f->slice_count, 0);
520  for (i = 0; i < f->slice_count; i++) {
521  FFV1Context *fs = f->slice_context[i];
522  put_symbol(c, state,
523  (fs->slice_x + 1) * f->num_h_slices / f->width, 0);
524  put_symbol(c, state,
525  (fs->slice_y + 1) * f->num_v_slices / f->height, 0);
526  put_symbol(c, state,
527  (fs->slice_width + 1) * f->num_h_slices / f->width - 1,
528  0);
529  put_symbol(c, state,
530  (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
531  0);
532  for (j = 0; j < f->plane_count; j++) {
533  put_symbol(c, state, f->plane[j].quant_table_index, 0);
535  }
536  }
537  }
538 }
539 
541 {
542  RangeCoder *const c = &f->c;
544  int i, j, k;
545  uint8_t state2[32][CONTEXT_SIZE];
546  unsigned v;
547 
548  memset(state2, 128, sizeof(state2));
549  memset(state, 128, sizeof(state));
550 
551  f->avctx->extradata_size = 10000 + 4 +
552  (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
554  if (!f->avctx->extradata)
555  return AVERROR(ENOMEM);
557  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
558 
559  put_symbol(c, state, f->version, 0);
560  if (f->version > 2) {
561  if (f->version == 3) {
562  f->micro_version = 4;
563  } else if (f->version == 4)
564  f->micro_version = 2;
565  put_symbol(c, state, f->micro_version, 0);
566  }
567 
568  put_symbol(c, state, f->ac, 0);
569  if (f->ac > 1)
570  for (i = 1; i < 256; i++)
571  put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
572 
573  put_symbol(c, state, f->colorspace, 0); // YUV cs type
574  put_symbol(c, state, f->bits_per_raw_sample, 0);
575  put_rac(c, state, f->chroma_planes);
576  put_symbol(c, state, f->chroma_h_shift, 0);
577  put_symbol(c, state, f->chroma_v_shift, 0);
578  put_rac(c, state, f->transparency);
579  put_symbol(c, state, f->num_h_slices - 1, 0);
580  put_symbol(c, state, f->num_v_slices - 1, 0);
581 
582  put_symbol(c, state, f->quant_table_count, 0);
583  for (i = 0; i < f->quant_table_count; i++)
585 
586  for (i = 0; i < f->quant_table_count; i++) {
587  for (j = 0; j < f->context_count[i] * CONTEXT_SIZE; j++)
588  if (f->initial_states[i] && f->initial_states[i][0][j] != 128)
589  break;
590  if (j < f->context_count[i] * CONTEXT_SIZE) {
591  put_rac(c, state, 1);
592  for (j = 0; j < f->context_count[i]; j++)
593  for (k = 0; k < CONTEXT_SIZE; k++) {
594  int pred = j ? f->initial_states[i][j - 1][k] : 128;
595  put_symbol(c, state2[k],
596  (int8_t)(f->initial_states[i][j][k] - pred), 1);
597  }
598  } else {
599  put_rac(c, state, 0);
600  }
601  }
602 
603  if (f->version > 2) {
604  put_symbol(c, state, f->ec, 0);
605  put_symbol(c, state, f->intra = (f->avctx->gop_size < 2), 0);
606  }
607 
611  f->avctx->extradata_size += 4;
612 
613  return 0;
614 }
615 
616 static int sort_stt(FFV1Context *s, uint8_t stt[256])
617 {
618  int i, i2, changed, print = 0;
619 
620  do {
621  changed = 0;
622  for (i = 12; i < 244; i++) {
623  for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
624 
625 #define COST(old, new) \
626  s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
627  s->rc_stat[old][1] * -log2((new) / 256.0)
628 
629 #define COST2(old, new) \
630  COST(old, new) + COST(256 - (old), 256 - (new))
631 
632  double size0 = COST2(i, i) + COST2(i2, i2);
633  double sizeX = COST2(i, i2) + COST2(i2, i);
634  if (size0 - sizeX > size0*(1e-14) && i != 128 && i2 != 128) {
635  int j;
636  FFSWAP(int, stt[i], stt[i2]);
637  FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
638  FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
639  if (i != 256 - i2) {
640  FFSWAP(int, stt[256 - i], stt[256 - i2]);
641  FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
642  FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
643  }
644  for (j = 1; j < 256; j++) {
645  if (stt[j] == i)
646  stt[j] = i2;
647  else if (stt[j] == i2)
648  stt[j] = i;
649  if (i != 256 - i2) {
650  if (stt[256 - j] == 256 - i)
651  stt[256 - j] = 256 - i2;
652  else if (stt[256 - j] == 256 - i2)
653  stt[256 - j] = 256 - i;
654  }
655  }
656  print = changed = 1;
657  }
658  }
659  }
660  } while (changed);
661  return print;
662 }
663 
665 {
666  FFV1Context *s = avctx->priv_data;
667  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
668  int i, j, k, m, ret;
669 
670  if ((ret = ffv1_common_init(avctx)) < 0)
671  return ret;
672 
673  s->version = 0;
674 
675  if ((avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) || avctx->slices>1)
676  s->version = FFMAX(s->version, 2);
677 
678  // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
679  if (avctx->slices == 0 && avctx->level < 0 && avctx->width * avctx->height > 720*576)
680  s->version = FFMAX(s->version, 2);
681 
682  if (avctx->level <= 0 && s->version == 2) {
683  s->version = 3;
684  }
685  if (avctx->level >= 0 && avctx->level <= 4)
686  s->version = FFMAX(s->version, avctx->level);
687 
688  if (s->ec < 0) {
689  s->ec = (s->version >= 3);
690  }
691 
692  if ((s->version == 2 || s->version>3) && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
693  av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
694  return AVERROR_INVALIDDATA;
695  }
696 
697  s->ac = avctx->coder_type > 0 ? 2 : 0;
698 
699  s->plane_count = 3;
700  switch(avctx->pix_fmt) {
701  case AV_PIX_FMT_YUV444P9:
702  case AV_PIX_FMT_YUV422P9:
703  case AV_PIX_FMT_YUV420P9:
707  if (!avctx->bits_per_raw_sample)
708  s->bits_per_raw_sample = 9;
715  s->packed_at_lsb = 1;
716  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
717  s->bits_per_raw_sample = 10;
718  case AV_PIX_FMT_GRAY16:
725  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
726  s->bits_per_raw_sample = 16;
727  } else if (!s->bits_per_raw_sample) {
729  }
730  if (s->bits_per_raw_sample <= 8) {
731  av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
732  return AVERROR_INVALIDDATA;
733  }
734  if (!s->ac && avctx->coder_type == -1) {
735  av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
736  s->ac = 2;
737  }
738  if (!s->ac) {
739  av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
740  return AVERROR(ENOSYS);
741  }
742  s->version = FFMAX(s->version, 1);
743  case AV_PIX_FMT_GRAY8:
744  case AV_PIX_FMT_YUV444P:
745  case AV_PIX_FMT_YUV440P:
746  case AV_PIX_FMT_YUV422P:
747  case AV_PIX_FMT_YUV420P:
748  case AV_PIX_FMT_YUV411P:
749  case AV_PIX_FMT_YUV410P:
750  case AV_PIX_FMT_YUVA444P:
751  case AV_PIX_FMT_YUVA422P:
752  case AV_PIX_FMT_YUVA420P:
753  s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
754  s->colorspace = 0;
755  s->transparency = desc->nb_components == 4;
756  break;
757  case AV_PIX_FMT_RGB32:
758  s->colorspace = 1;
759  s->transparency = 1;
760  s->chroma_planes = 1;
761  break;
762  case AV_PIX_FMT_0RGB32:
763  s->colorspace = 1;
764  s->chroma_planes = 1;
765  break;
766  case AV_PIX_FMT_GBRP9:
767  if (!avctx->bits_per_raw_sample)
768  s->bits_per_raw_sample = 9;
769  case AV_PIX_FMT_GBRP10:
770  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
771  s->bits_per_raw_sample = 10;
772  case AV_PIX_FMT_GBRP12:
773  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
774  s->bits_per_raw_sample = 12;
775  case AV_PIX_FMT_GBRP14:
776  if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
777  s->bits_per_raw_sample = 14;
778  else if (!s->bits_per_raw_sample)
780  s->colorspace = 1;
781  s->chroma_planes = 1;
782  s->version = FFMAX(s->version, 1);
783  if (!s->ac) {
784  av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
785  return AVERROR(ENOSYS);
786  }
787  break;
788  default:
789  av_log(avctx, AV_LOG_ERROR, "format not supported\n");
790  return AVERROR(ENOSYS);
791  }
792  if (s->transparency) {
793  av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
794  }
795  if (avctx->context_model > 1U) {
796  av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
797  return AVERROR(EINVAL);
798  }
799 
800  if (s->ac > 1)
801  for (i = 1; i < 256; i++)
802  s->state_transition[i] = ver2_state[i];
803 
804  for (i = 0; i < 256; i++) {
805  s->quant_table_count = 2;
806  if (s->bits_per_raw_sample <= 8) {
807  s->quant_tables[0][0][i]= quant11[i];
808  s->quant_tables[0][1][i]= 11*quant11[i];
809  s->quant_tables[0][2][i]= 11*11*quant11[i];
810  s->quant_tables[1][0][i]= quant11[i];
811  s->quant_tables[1][1][i]= 11*quant11[i];
812  s->quant_tables[1][2][i]= 11*11*quant5 [i];
813  s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
814  s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
815  } else {
816  s->quant_tables[0][0][i]= quant9_10bit[i];
817  s->quant_tables[0][1][i]= 11*quant9_10bit[i];
818  s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
819  s->quant_tables[1][0][i]= quant9_10bit[i];
820  s->quant_tables[1][1][i]= 11*quant9_10bit[i];
821  s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
822  s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
823  s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
824  }
825  }
826  s->context_count[0] = (11 * 11 * 11 + 1) / 2;
827  s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
828  memcpy(s->quant_table, s->quant_tables[avctx->context_model],
829  sizeof(s->quant_table));
830 
831  for (i = 0; i < s->plane_count; i++) {
832  PlaneContext *const p = &s->plane[i];
833 
834  memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
835  p->quant_table_index = avctx->context_model;
837  }
838 
839  if ((ret = ffv1_allocate_initial_states(s)) < 0)
840  return ret;
841 
842  avctx->coded_frame = av_frame_alloc();
843  if (!avctx->coded_frame)
844  return AVERROR(ENOMEM);
845 
847 
848  if (!s->transparency)
849  s->plane_count = 2;
850  if (!s->chroma_planes && s->version > 3)
851  s->plane_count--;
852 
854  s->picture_number = 0;
855 
856  if (avctx->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
857  for (i = 0; i < s->quant_table_count; i++) {
858  s->rc_stat2[i] = av_mallocz(s->context_count[i] *
859  sizeof(*s->rc_stat2[i]));
860  if (!s->rc_stat2[i])
861  return AVERROR(ENOMEM);
862  }
863  }
864  if (avctx->stats_in) {
865  char *p = avctx->stats_in;
866  uint8_t (*best_state)[256] = av_malloc_array(256, 256);
867  int gob_count = 0;
868  char *next;
869  if (!best_state)
870  return AVERROR(ENOMEM);
871 
872  av_assert0(s->version >= 2);
873 
874  for (;;) {
875  for (j = 0; j < 256; j++)
876  for (i = 0; i < 2; i++) {
877  s->rc_stat[j][i] = strtol(p, &next, 0);
878  if (next == p) {
879  av_log(avctx, AV_LOG_ERROR,
880  "2Pass file invalid at %d %d [%s]\n", j, i, p);
881  av_freep(&best_state);
882  return AVERROR_INVALIDDATA;
883  }
884  p = next;
885  }
886  for (i = 0; i < s->quant_table_count; i++)
887  for (j = 0; j < s->context_count[i]; j++) {
888  for (k = 0; k < 32; k++)
889  for (m = 0; m < 2; m++) {
890  s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
891  if (next == p) {
892  av_log(avctx, AV_LOG_ERROR,
893  "2Pass file invalid at %d %d %d %d [%s]\n",
894  i, j, k, m, p);
895  av_freep(&best_state);
896  return AVERROR_INVALIDDATA;
897  }
898  p = next;
899  }
900  }
901  gob_count = strtol(p, &next, 0);
902  if (next == p || gob_count <= 0) {
903  av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
904  av_freep(&best_state);
905  return AVERROR_INVALIDDATA;
906  }
907  p = next;
908  while (*p == '\n' || *p == ' ')
909  p++;
910  if (p[0] == 0)
911  break;
912  }
913  sort_stt(s, s->state_transition);
914 
915  find_best_state(best_state, s->state_transition);
916 
917  for (i = 0; i < s->quant_table_count; i++) {
918  for (k = 0; k < 32; k++) {
919  double a=0, b=0;
920  int jp = 0;
921  for (j = 0; j < s->context_count[i]; j++) {
922  double p = 128;
923  if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1] > 200 && j || a+b > 200) {
924  if (a+b)
925  p = 256.0 * b / (a + b);
926  s->initial_states[i][jp][k] =
927  best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
928  for(jp++; jp<j; jp++)
929  s->initial_states[i][jp][k] = s->initial_states[i][jp-1][k];
930  a=b=0;
931  }
932  a += s->rc_stat2[i][j][k][0];
933  b += s->rc_stat2[i][j][k][1];
934  if (a+b) {
935  p = 256.0 * b / (a + b);
936  }
937  s->initial_states[i][j][k] =
938  best_state[av_clip(round(p), 1, 255)][av_clip_uint8((a + b) / gob_count)];
939  }
940  }
941  }
942  av_freep(&best_state);
943  }
944 
945  if (s->version > 1) {
946  s->num_v_slices = (avctx->width > 352 || avctx->height > 288 || !avctx->slices) ? 2 : 1;
947  for (; s->num_v_slices < 9; s->num_v_slices++) {
948  for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
949  if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64 || !avctx->slices)
950  goto slices_ok;
951  }
952  }
953  av_log(avctx, AV_LOG_ERROR,
954  "Unsupported number %d of slices requested, please specify a "
955  "supported number with -slices (ex:4,6,9,12,16, ...)\n",
956  avctx->slices);
957  return AVERROR(ENOSYS);
958 slices_ok:
959  if ((ret = write_extradata(s)) < 0)
960  return ret;
961  }
962 
963  if ((ret = ffv1_init_slice_contexts(s)) < 0)
964  return ret;
966  if ((ret = ffv1_init_slices_state(s)) < 0)
967  return ret;
968 
969 #define STATS_OUT_SIZE 1024 * 1024 * 6
970  if (avctx->flags & CODEC_FLAG_PASS1) {
972  if (!avctx->stats_out)
973  return AVERROR(ENOMEM);
974  for (i = 0; i < s->quant_table_count; i++)
975  for (j = 0; j < s->max_slice_count; j++) {
976  FFV1Context *sf = s->slice_context[j];
977  av_assert0(!sf->rc_stat2[i]);
978  sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
979  sizeof(*sf->rc_stat2[i]));
980  if (!sf->rc_stat2[i])
981  return AVERROR(ENOMEM);
982  }
983  }
984 
985  return 0;
986 }
987 
989 {
990  RangeCoder *c = &fs->c;
992  int j;
993  memset(state, 128, sizeof(state));
994 
995  put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
996  put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
997  put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
998  put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
999  for (j=0; j<f->plane_count; j++) {
1000  put_symbol(c, state, f->plane[j].quant_table_index, 0);
1002  }
1003  if (!f->picture.f->interlaced_frame)
1004  put_symbol(c, state, 3, 0);
1005  else
1006  put_symbol(c, state, 1 + !f->picture.f->top_field_first, 0);
1007  put_symbol(c, state, f->picture.f->sample_aspect_ratio.num, 0);
1008  put_symbol(c, state, f->picture.f->sample_aspect_ratio.den, 0);
1009  if (f->version > 3) {
1010  put_rac(c, state, fs->slice_coding_mode == 1);
1011  if (fs->slice_coding_mode == 1)
1012  ffv1_clear_slice_state(f, fs);
1013  put_symbol(c, state, fs->slice_coding_mode, 0);
1014  if (fs->slice_coding_mode != 1) {
1015  put_symbol(c, state, fs->slice_rct_by_coef, 0);
1016  put_symbol(c, state, fs->slice_rct_ry_coef, 0);
1017  }
1018  }
1019 }
1020 
1021 static void choose_rct_params(FFV1Context *fs, const uint8_t *src[3], const int stride[3], int w, int h)
1022 {
1023 #define NB_Y_COEFF 15
1024  static const int rct_y_coeff[15][2] = {
1025  {0, 0}, // 4G
1026  {1, 1}, // R + 2G + B
1027  {2, 2}, // 2R + 2B
1028  {0, 2}, // 2G + 2B
1029  {2, 0}, // 2R + 2G
1030  {4, 0}, // 4R
1031  {0, 4}, // 4B
1032 
1033  {0, 3}, // 1G + 3B
1034  {3, 0}, // 3R + 1G
1035  {3, 1}, // 3R + B
1036  {1, 3}, // R + 3B
1037  {1, 2}, // R + G + 2B
1038  {2, 1}, // 2R + G + B
1039  {0, 1}, // 3G + B
1040  {1, 0}, // R + 3G
1041  };
1042 
1043  int stat[NB_Y_COEFF] = {0};
1044  int x, y, i, p, best;
1045  int16_t *sample[3];
1046  int lbd = fs->bits_per_raw_sample <= 8;
1047 
1048  for (y = 0; y < h; y++) {
1049  int lastr=0, lastg=0, lastb=0;
1050  for (p = 0; p < 3; p++)
1051  sample[p] = fs->sample_buffer + p*w;
1052 
1053  for (x = 0; x < w; x++) {
1054  int b, g, r;
1055  int ab, ag, ar;
1056  if (lbd) {
1057  unsigned v = *((const uint32_t*)(src[0] + x*4 + stride[0]*y));
1058  b = v & 0xFF;
1059  g = (v >> 8) & 0xFF;
1060  r = (v >> 16) & 0xFF;
1061  } else {
1062  b = *((const uint16_t*)(src[0] + x*2 + stride[0]*y));
1063  g = *((const uint16_t*)(src[1] + x*2 + stride[1]*y));
1064  r = *((const uint16_t*)(src[2] + x*2 + stride[2]*y));
1065  }
1066 
1067  ar = r - lastr;
1068  ag = g - lastg;
1069  ab = b - lastb;
1070  if (x && y) {
1071  int bg = ag - sample[0][x];
1072  int bb = ab - sample[1][x];
1073  int br = ar - sample[2][x];
1074 
1075  br -= bg;
1076  bb -= bg;
1077 
1078  for (i = 0; i<NB_Y_COEFF; i++) {
1079  stat[i] += FFABS(bg + ((br*rct_y_coeff[i][0] + bb*rct_y_coeff[i][1])>>2));
1080  }
1081 
1082  }
1083  sample[0][x] = ag;
1084  sample[1][x] = ab;
1085  sample[2][x] = ar;
1086 
1087  lastr = r;
1088  lastg = g;
1089  lastb = b;
1090  }
1091  }
1092 
1093  best = 0;
1094  for (i=1; i<NB_Y_COEFF; i++) {
1095  if (stat[i] < stat[best])
1096  best = i;
1097  }
1098 
1099  fs->slice_rct_by_coef = rct_y_coeff[best][1];
1100  fs->slice_rct_ry_coef = rct_y_coeff[best][0];
1101 }
1102 
1103 static int encode_slice(AVCodecContext *c, void *arg)
1104 {
1105  FFV1Context *fs = *(void **)arg;
1106  FFV1Context *f = fs->avctx->priv_data;
1107  int width = fs->slice_width;
1108  int height = fs->slice_height;
1109  int x = fs->slice_x;
1110  int y = fs->slice_y;
1111  const AVFrame *const p = f->picture.f;
1112  const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step_minus1 + 1;
1113  int ret;
1114  RangeCoder c_bak = fs->c;
1115  const uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
1116  p->data[1] + ps*x + y*p->linesize[1],
1117  p->data[2] + ps*x + y*p->linesize[2]};
1118 
1119  fs->slice_coding_mode = 0;
1120  if (f->version > 3) {
1121  choose_rct_params(fs, planes, p->linesize, width, height);
1122  } else {
1123  fs->slice_rct_by_coef = 1;
1124  fs->slice_rct_ry_coef = 1;
1125  }
1126 
1127 retry:
1128  if (c->coded_frame->key_frame)
1129  ffv1_clear_slice_state(f, fs);
1130  if (f->version > 2) {
1131  encode_slice_header(f, fs);
1132  }
1133  if (!fs->ac) {
1134  if (f->version > 2)
1135  put_rac(&fs->c, (uint8_t[]) { 129 }, 0);
1136  fs->ac_byte_count = f->version > 2 || (!x && !y) ? ff_rac_terminate(&fs->c) : 0;
1137  init_put_bits(&fs->pb,
1138  fs->c.bytestream_start + fs->ac_byte_count,
1139  fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
1140  }
1141 
1142  if (f->colorspace == 0) {
1143  const int chroma_width = FF_CEIL_RSHIFT(width, f->chroma_h_shift);
1144  const int chroma_height = FF_CEIL_RSHIFT(height, f->chroma_v_shift);
1145  const int cx = x >> f->chroma_h_shift;
1146  const int cy = y >> f->chroma_v_shift;
1147 
1148  ret = encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1149 
1150  if (f->chroma_planes) {
1151  ret |= encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1152  ret |= encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1153  }
1154  if (fs->transparency)
1155  ret |= encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1156  } else {
1157  ret = encode_rgb_frame(fs, planes, width, height, p->linesize);
1158  }
1159  emms_c();
1160 
1161  if (ret < 0) {
1162  av_assert0(fs->slice_coding_mode == 0);
1163  if (fs->version < 4 || !fs->ac) {
1164  av_log(c, AV_LOG_ERROR, "Buffer too small\n");
1165  return ret;
1166  }
1167  av_log(c, AV_LOG_DEBUG, "Coding slice as PCM\n");
1168  fs->slice_coding_mode = 1;
1169  fs->c = c_bak;
1170  goto retry;
1171  }
1172 
1173  return 0;
1174 }
1175 
1177  const AVFrame *pict, int *got_packet)
1178 {
1179  FFV1Context *f = avctx->priv_data;
1180  RangeCoder *const c = &f->slice_context[0]->c;
1181  AVFrame *const p = f->picture.f;
1182  int used_count = 0;
1183  uint8_t keystate = 128;
1184  uint8_t *buf_p;
1185  int i, ret;
1186  int64_t maxsize = FF_MIN_BUFFER_SIZE
1187  + avctx->width*avctx->height*35LL*4;
1188 
1189  if(!pict) {
1190  if (avctx->flags & CODEC_FLAG_PASS1) {
1191  int j, k, m;
1192  char *p = avctx->stats_out;
1193  char *end = p + STATS_OUT_SIZE;
1194 
1195  memset(f->rc_stat, 0, sizeof(f->rc_stat));
1196  for (i = 0; i < f->quant_table_count; i++)
1197  memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1198 
1200  for (j = 0; j < f->slice_count; j++) {
1201  FFV1Context *fs = f->slice_context[j];
1202  for (i = 0; i < 256; i++) {
1203  f->rc_stat[i][0] += fs->rc_stat[i][0];
1204  f->rc_stat[i][1] += fs->rc_stat[i][1];
1205  }
1206  for (i = 0; i < f->quant_table_count; i++) {
1207  for (k = 0; k < f->context_count[i]; k++)
1208  for (m = 0; m < 32; m++) {
1209  f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1210  f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1211  }
1212  }
1213  }
1214 
1215  for (j = 0; j < 256; j++) {
1216  snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1217  f->rc_stat[j][0], f->rc_stat[j][1]);
1218  p += strlen(p);
1219  }
1220  snprintf(p, end - p, "\n");
1221 
1222  for (i = 0; i < f->quant_table_count; i++) {
1223  for (j = 0; j < f->context_count[i]; j++)
1224  for (m = 0; m < 32; m++) {
1225  snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1226  f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1227  p += strlen(p);
1228  }
1229  }
1230  snprintf(p, end - p, "%d\n", f->gob_count);
1231  }
1232  return 0;
1233  }
1234 
1235  if (f->version > 3)
1236  maxsize = FF_MIN_BUFFER_SIZE + avctx->width*avctx->height*3LL*4;
1237 
1238  if ((ret = ff_alloc_packet2(avctx, pkt, maxsize)) < 0)
1239  return ret;
1240 
1241  ff_init_range_encoder(c, pkt->data, pkt->size);
1242  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
1243 
1244  av_frame_unref(p);
1245  if ((ret = av_frame_ref(p, pict)) < 0)
1246  return ret;
1248 
1249  if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
1250  put_rac(c, &keystate, 1);
1251  avctx->coded_frame->key_frame = 1;
1252  f->gob_count++;
1253  write_header(f);
1254  } else {
1255  put_rac(c, &keystate, 0);
1256  avctx->coded_frame->key_frame = 0;
1257  }
1258 
1259  if (f->ac > 1) {
1260  int i;
1261  for (i = 1; i < 256; i++) {
1262  c->one_state[i] = f->state_transition[i];
1263  c->zero_state[256 - i] = 256 - c->one_state[i];
1264  }
1265  }
1266 
1267  for (i = 1; i < f->slice_count; i++) {
1268  FFV1Context *fs = f->slice_context[i];
1269  uint8_t *start = pkt->data + (pkt->size - used_count) * (int64_t)i / f->slice_count;
1270  int len = pkt->size / f->slice_count;
1271  ff_init_range_encoder(&fs->c, start, len);
1272  }
1273  avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
1274  f->slice_count, sizeof(void *));
1275 
1276  buf_p = pkt->data;
1277  for (i = 0; i < f->slice_count; i++) {
1278  FFV1Context *fs = f->slice_context[i];
1279  int bytes;
1280 
1281  if (fs->ac) {
1282  uint8_t state = 129;
1283  put_rac(&fs->c, &state, 0);
1284  bytes = ff_rac_terminate(&fs->c);
1285  } else {
1286  flush_put_bits(&fs->pb); // FIXME: nicer padding
1287  bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7) / 8;
1288  }
1289  if (i > 0 || f->version > 2) {
1290  av_assert0(bytes < pkt->size / f->slice_count);
1291  memmove(buf_p, fs->c.bytestream_start, bytes);
1292  av_assert0(bytes < (1 << 24));
1293  AV_WB24(buf_p + bytes, bytes);
1294  bytes += 3;
1295  }
1296  if (f->ec) {
1297  unsigned v;
1298  buf_p[bytes++] = 0;
1299  v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1300  AV_WL32(buf_p + bytes, v);
1301  bytes += 4;
1302  }
1303  buf_p += bytes;
1304  }
1305 
1306  if (avctx->flags & CODEC_FLAG_PASS1)
1307  avctx->stats_out[0] = '\0';
1308 
1309  f->picture_number++;
1310  pkt->size = buf_p - pkt->data;
1311  pkt->pts =
1312  pkt->dts = pict->pts;
1313  pkt->flags |= AV_PKT_FLAG_KEY * avctx->coded_frame->key_frame;
1314  *got_packet = 1;
1315 
1316  return 0;
1317 }
1318 
1320 {
1321  av_frame_free(&avctx->coded_frame);
1322  ffv1_close(avctx);
1323  return 0;
1324 }
1325 
1326 #define OFFSET(x) offsetof(FFV1Context, x)
1327 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1328 static const AVOption options[] = {
1329  { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
1330  { NULL }
1331 };
1332 
1333 static const AVClass ffv1_class = {
1334  .class_name = "ffv1 encoder",
1335  .item_name = av_default_item_name,
1336  .option = options,
1337  .version = LIBAVUTIL_VERSION_INT,
1338 };
1339 
1340 static const AVCodecDefault ffv1_defaults[] = {
1341  { "coder", "-1" },
1342  { NULL },
1343 };
1344 
1346  .name = "ffv1",
1347  .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1348  .type = AVMEDIA_TYPE_VIDEO,
1349  .id = AV_CODEC_ID_FFV1,
1350  .priv_data_size = sizeof(FFV1Context),
1351  .init = encode_init,
1352  .encode2 = encode_frame,
1353  .close = encode_close,
1354  .capabilities = CODEC_CAP_SLICE_THREADS | CODEC_CAP_DELAY,
1355  .pix_fmts = (const enum AVPixelFormat[]) {
1367 
1368  },
1369  .defaults = ffv1_defaults,
1370  .priv_class = &ffv1_class,
1371 };