4 * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
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.
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.
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
25 * FF Video Codec 1 (a lossless codec) encoder
28 #include "libavutil/avassert.h"
29 #include "libavutil/crc.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/pixdesc.h"
33 #include "libavutil/timer.h"
38 #include "rangecoder.h"
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,
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,
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,
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,
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,
138 static void find_best_state(uint8_t best_state[256][256],
139 const uint8_t one_state[256])
144 for (i = 1; i < 256; i++)
145 l2tab[i] = log2(i / 256.0);
147 for (i = 0; i < 256; i++) {
148 double best_len[256];
149 double p = i / 256.0;
151 for (j = 0; j < 256; j++)
152 best_len[j] = 1 << 30;
154 for (j = FFMAX(i - 10, 1); j < FFMIN(i + 11, 256); j++) {
155 double occ[256] = { 0 };
158 for (k = 0; k < 256; k++) {
159 double newocc[256] = { 0 };
160 for (m = 1; m < 256; m++)
162 len -=occ[m]*( p *l2tab[ m]
163 + (1-p)*l2tab[256-m]);
165 if (len < best_len[k]) {
167 best_state[i][k] = j;
169 for (m = 0; m < 256; m++)
171 newocc[ one_state[ m]] += occ[m] * p;
172 newocc[256 - one_state[256 - m]] += occ[m] * (1 - p);
174 memcpy(occ, newocc, sizeof(occ));
180 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c,
181 uint8_t *state, int v,
183 uint64_t rc_stat[256][2],
184 uint64_t rc_stat2[32][2])
188 #define put_rac(C, S, B) \
191 rc_stat[*(S)][B]++; \
192 rc_stat2[(S) - state][B]++; \
198 const int a = FFABS(v);
199 const int e = av_log2(a);
200 put_rac(c, state + 0, 0);
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);
206 for (i = e - 1; i >= 0; i--)
207 put_rac(c, state + 22 + i, (a >> i) & 1); // 22..31
210 put_rac(c, state + 11 + e, v < 0); // 11..21
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);
216 for (i = e - 1; i >= 0; i--)
217 put_rac(c, state + 22 + FFMIN(i, 9), (a >> i) & 1); // 22..31
220 put_rac(c, state + 11 + 10, v < 0); // 11..21
223 put_rac(c, state + 0, 1);
228 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state,
229 int v, int is_signed)
231 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
235 static inline void put_vlc_symbol(PutBitContext *pb, VlcState *const state,
239 v = fold(v - state->bias, bits);
243 while (i < state->error_sum) { // FIXME: optimize
251 if (k == 0 && 2 * state->drift <= -state->count)
256 code = v ^ ((2 * state->drift + state->count) >> 31);
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);
263 update_vlc_state(state, v);
266 static av_always_inline int encode_line(FFV1Context *s, int w,
268 int plane_index, int bits)
270 PlaneContext *const p = &s->plane[plane_index];
271 RangeCoder *const c = &s->c;
273 int run_index = s->run_index;
278 if (c->bytestream_end - c->bytestream < w * 20) {
279 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
280 return AVERROR_INVALIDDATA;
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;
289 for (x = 0; x < w; x++) {
292 context = get_context(p, sample[0] + x, sample[1] + x, sample[2] + x);
293 diff = sample[0][x] - predict(sample[0] + x, sample[1] + x);
300 diff = fold(diff, bits);
303 if (s->flags & CODEC_FLAG_PASS1) {
304 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat,
305 s->rc_stat2[p->quant_table_index][context]);
307 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
315 while (run_count >= 1 << ff_log2_run[run_index]) {
316 run_count -= 1 << ff_log2_run[run_index];
318 put_bits(&s->pb, 1, 1);
321 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
333 av_dlog(s->avctx, "count:%d index:%d, mode:%d, x:%d pos:%d\n",
334 run_count, run_index, run_mode, x,
335 (int)put_bits_count(&s->pb));
338 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
342 while (run_count >= 1 << ff_log2_run[run_index]) {
343 run_count -= 1 << ff_log2_run[run_index];
345 put_bits(&s->pb, 1, 1);
349 put_bits(&s->pb, 1, 1);
351 s->run_index = run_index;
356 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h,
357 int stride, int plane_index)
360 const int ring_size = s->avctx->context_model ? 3 : 2;
364 memset(s->sample_buffer, 0, ring_size * (w + 6) * sizeof(*s->sample_buffer));
366 for (y = 0; y < h; y++) {
367 for (i = 0; i < ring_size; i++)
368 sample[i] = s->sample_buffer + (w + 6) * ((h + i - y) % ring_size) + 3;
370 sample[0][-1]= sample[1][0 ];
371 sample[1][ w]= sample[1][w-1];
373 if (s->bits_per_raw_sample <= 8) {
374 for (x = 0; x < w; x++)
375 sample[0][x] = src[x + stride * y];
376 encode_line(s, w, sample, plane_index, 8);
378 if (s->packed_at_lsb) {
379 for (x = 0; x < w; x++) {
380 sample[0][x] = ((uint16_t*)(src + stride*y))[x];
383 for (x = 0; x < w; x++) {
384 sample[0][x] = ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
387 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
389 // STOP_TIMER("encode line") }
393 static void encode_rgb_frame(FFV1Context *s, uint8_t *src[3], int w, int h, int stride[3])
396 const int ring_size = s->avctx->context_model ? 3 : 2;
397 int16_t *sample[4][3];
398 int lbd = s->avctx->bits_per_raw_sample <= 8;
399 int bits = s->avctx->bits_per_raw_sample > 0 ? s->avctx->bits_per_raw_sample : 8;
400 int offset = 1 << bits;
403 memset(s->sample_buffer, 0, ring_size * 4 * (w + 6) * sizeof(*s->sample_buffer));
405 for (y = 0; y < h; y++) {
406 for (i = 0; i < ring_size; i++)
407 for (p = 0; p < 4; p++)
408 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
410 for (x = 0; x < w; x++) {
411 int b, g, r, av_uninit(a);
413 unsigned v = *((uint32_t*)(src[0] + x*4 + stride[0]*y));
416 r = (v >> 16) & 0xFF;
419 b = *((uint16_t*)(src[0] + x*2 + stride[0]*y));
420 g = *((uint16_t*)(src[1] + x*2 + stride[1]*y));
421 r = *((uint16_t*)(src[2] + x*2 + stride[2]*y));
435 for (p = 0; p < 3 + s->transparency; p++) {
436 sample[p][0][-1] = sample[p][1][0 ];
437 sample[p][1][ w] = sample[p][1][w-1];
439 encode_line(s, w, sample[p], (p+1)/2, 9);
441 encode_line(s, w, sample[p], (p+1)/2, bits+1);
446 static void write_quant_table(RangeCoder *c, int16_t *quant_table)
450 uint8_t state[CONTEXT_SIZE];
451 memset(state, 128, sizeof(state));
453 for (i = 1; i < 128; i++)
454 if (quant_table[i] != quant_table[i - 1]) {
455 put_symbol(c, state, i - last - 1, 0);
458 put_symbol(c, state, i - last - 1, 0);
461 static void write_quant_tables(RangeCoder *c,
462 int16_t quant_table[MAX_CONTEXT_INPUTS][256])
465 for (i = 0; i < 5; i++)
466 write_quant_table(c, quant_table[i]);
469 static void write_header(FFV1Context *f)
471 uint8_t state[CONTEXT_SIZE];
473 RangeCoder *const c = &f->slice_context[0]->c;
475 memset(state, 128, sizeof(state));
477 if (f->version < 2) {
478 put_symbol(c, state, f->version, 0);
479 put_symbol(c, state, f->ac, 0);
481 for (i = 1; i < 256; i++)
483 f->state_transition[i] - c->one_state[i], 1);
485 put_symbol(c, state, f->colorspace, 0); //YUV cs type
487 put_symbol(c, state, f->bits_per_raw_sample, 0);
488 put_rac(c, state, f->chroma_planes);
489 put_symbol(c, state, f->chroma_h_shift, 0);
490 put_symbol(c, state, f->chroma_v_shift, 0);
491 put_rac(c, state, f->transparency);
493 write_quant_tables(c, f->quant_table);
494 } else if (f->version < 3) {
495 put_symbol(c, state, f->slice_count, 0);
496 for (i = 0; i < f->slice_count; i++) {
497 FFV1Context *fs = f->slice_context[i];
499 (fs->slice_x + 1) * f->num_h_slices / f->width, 0);
501 (fs->slice_y + 1) * f->num_v_slices / f->height, 0);
503 (fs->slice_width + 1) * f->num_h_slices / f->width - 1,
506 (fs->slice_height + 1) * f->num_v_slices / f->height - 1,
508 for (j = 0; j < f->plane_count; j++) {
509 put_symbol(c, state, f->plane[j].quant_table_index, 0);
510 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
516 static int write_extra_header(FFV1Context *f)
518 RangeCoder *const c = &f->c;
519 uint8_t state[CONTEXT_SIZE];
521 uint8_t state2[32][CONTEXT_SIZE];
524 memset(state2, 128, sizeof(state2));
525 memset(state, 128, sizeof(state));
527 f->avctx->extradata = av_malloc(f->avctx->extradata_size = 10000 +
528 (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32);
529 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
530 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
532 put_symbol(c, state, f->version, 0);
533 if (f->version > 2) {
535 f->minor_version = 2;
536 put_symbol(c, state, f->minor_version, 0);
538 put_symbol(c, state, f->ac, 0);
540 for (i = 1; i < 256; i++)
541 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
542 put_symbol(c, state, f->colorspace, 0); // YUV cs type
543 put_symbol(c, state, f->bits_per_raw_sample, 0);
544 put_rac(c, state, f->chroma_planes);
545 put_symbol(c, state, f->chroma_h_shift, 0);
546 put_symbol(c, state, f->chroma_v_shift, 0);
547 put_rac(c, state, f->transparency);
548 put_symbol(c, state, f->num_h_slices - 1, 0);
549 put_symbol(c, state, f->num_v_slices - 1, 0);
551 put_symbol(c, state, f->quant_table_count, 0);
552 for (i = 0; i < f->quant_table_count; i++)
553 write_quant_tables(c, f->quant_tables[i]);
555 for (i = 0; i < f->quant_table_count; i++) {
556 for (j = 0; j < f->context_count[i] * CONTEXT_SIZE; j++)
557 if (f->initial_states[i] && f->initial_states[i][0][j] != 128)
559 if (j < f->context_count[i] * CONTEXT_SIZE) {
560 put_rac(c, state, 1);
561 for (j = 0; j < f->context_count[i]; j++)
562 for (k = 0; k < CONTEXT_SIZE; k++) {
563 int pred = j ? f->initial_states[i][j - 1][k] : 128;
564 put_symbol(c, state2[k],
565 (int8_t)(f->initial_states[i][j][k] - pred), 1);
568 put_rac(c, state, 0);
572 if (f->version > 2) {
573 put_symbol(c, state, f->ec, 0);
576 f->avctx->extradata_size = ff_rac_terminate(c);
577 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
578 AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
579 f->avctx->extradata_size += 4;
584 static int sort_stt(FFV1Context *s, uint8_t stt[256])
586 int i, i2, changed, print = 0;
590 for (i = 12; i < 244; i++) {
591 for (i2 = i + 1; i2 < 245 && i2 < i + 4; i2++) {
593 #define COST(old, new) \
594 s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
595 s->rc_stat[old][1] * -log2((new) / 256.0)
597 #define COST2(old, new) \
598 COST(old, new) + COST(256 - (old), 256 - (new))
600 double size0 = COST2(i, i) + COST2(i2, i2);
601 double sizeX = COST2(i, i2) + COST2(i2, i);
602 if (sizeX < size0 && i != 128 && i2 != 128) {
604 FFSWAP(int, stt[i], stt[i2]);
605 FFSWAP(int, s->rc_stat[i][0], s->rc_stat[i2][0]);
606 FFSWAP(int, s->rc_stat[i][1], s->rc_stat[i2][1]);
608 FFSWAP(int, stt[256 - i], stt[256 - i2]);
609 FFSWAP(int, s->rc_stat[256 - i][0], s->rc_stat[256 - i2][0]);
610 FFSWAP(int, s->rc_stat[256 - i][1], s->rc_stat[256 - i2][1]);
612 for (j = 1; j < 256; j++) {
615 else if (stt[j] == i2)
618 if (stt[256 - j] == 256 - i)
619 stt[256 - j] = 256 - i2;
620 else if (stt[256 - j] == 256 - i2)
621 stt[256 - j] = 256 - i;
632 static av_cold int encode_init(AVCodecContext *avctx)
634 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
635 FFV1Context *s = avctx->priv_data;
638 ffv1_common_init(avctx);
642 if ((avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) || avctx->slices>1)
643 s->version = FFMAX(s->version, 2);
645 if (avctx->level == 3) {
650 s->ec = (s->version >= 3);
653 if (s->version >= 2 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
654 av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
655 return AVERROR_INVALIDDATA;
658 s->ac = avctx->coder_type > 0 ? 2 : 0;
661 switch(avctx->pix_fmt) {
662 case AV_PIX_FMT_YUV444P9:
663 case AV_PIX_FMT_YUV422P9:
664 case AV_PIX_FMT_YUV420P9:
665 if (!avctx->bits_per_raw_sample)
666 s->bits_per_raw_sample = 9;
667 case AV_PIX_FMT_YUV444P10:
668 case AV_PIX_FMT_YUV420P10:
669 case AV_PIX_FMT_YUV422P10:
670 s->packed_at_lsb = 1;
671 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
672 s->bits_per_raw_sample = 10;
673 case AV_PIX_FMT_GRAY16:
674 case AV_PIX_FMT_YUV444P16:
675 case AV_PIX_FMT_YUV422P16:
676 case AV_PIX_FMT_YUV420P16:
677 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
678 s->bits_per_raw_sample = 16;
679 } else if (!s->bits_per_raw_sample) {
680 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
682 if (s->bits_per_raw_sample <= 8) {
683 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
684 return AVERROR_INVALIDDATA;
686 if (!s->ac && avctx->coder_type == -1) {
687 av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
691 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
692 return AVERROR(ENOSYS);
694 s->version = FFMAX(s->version, 1);
695 case AV_PIX_FMT_GRAY8:
696 case AV_PIX_FMT_YUV444P:
697 case AV_PIX_FMT_YUV440P:
698 case AV_PIX_FMT_YUV422P:
699 case AV_PIX_FMT_YUV420P:
700 case AV_PIX_FMT_YUV411P:
701 case AV_PIX_FMT_YUV410P:
702 s->chroma_planes = desc->nb_components < 3 ? 0 : 1;
705 case AV_PIX_FMT_YUVA444P:
706 case AV_PIX_FMT_YUVA422P:
707 case AV_PIX_FMT_YUVA420P:
708 s->chroma_planes = 1;
712 case AV_PIX_FMT_RGB32:
716 case AV_PIX_FMT_0RGB32:
719 case AV_PIX_FMT_GBRP9:
720 if (!avctx->bits_per_raw_sample)
721 s->bits_per_raw_sample = 9;
722 case AV_PIX_FMT_GBRP10:
723 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
724 s->bits_per_raw_sample = 10;
725 case AV_PIX_FMT_GBRP12:
726 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
727 s->bits_per_raw_sample = 12;
728 case AV_PIX_FMT_GBRP14:
729 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
730 s->bits_per_raw_sample = 14;
731 else if (!s->bits_per_raw_sample)
732 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
734 s->chroma_planes = 1;
735 s->version = FFMAX(s->version, 1);
738 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
739 return AVERROR(ENOSYS);
741 if (s->transparency) {
742 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
744 if (avctx->context_model > 1U) {
745 av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
746 return AVERROR(EINVAL);
750 for (i = 1; i < 256; i++)
751 s->state_transition[i] = ver2_state[i];
753 for (i = 0; i < 256; i++) {
754 s->quant_table_count = 2;
755 if (s->bits_per_raw_sample <= 8) {
756 s->quant_tables[0][0][i]= quant11[i];
757 s->quant_tables[0][1][i]= 11*quant11[i];
758 s->quant_tables[0][2][i]= 11*11*quant11[i];
759 s->quant_tables[1][0][i]= quant11[i];
760 s->quant_tables[1][1][i]= 11*quant11[i];
761 s->quant_tables[1][2][i]= 11*11*quant5 [i];
762 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
763 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
765 s->quant_tables[0][0][i]= quant9_10bit[i];
766 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
767 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
768 s->quant_tables[1][0][i]= quant9_10bit[i];
769 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
770 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
771 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
772 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
775 s->context_count[0] = (11 * 11 * 11 + 1) / 2;
776 s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
777 memcpy(s->quant_table, s->quant_tables[avctx->context_model],
778 sizeof(s->quant_table));
780 for (i = 0; i < s->plane_count; i++) {
781 PlaneContext *const p = &s->plane[i];
783 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
784 p->quant_table_index = avctx->context_model;
785 p->context_count = s->context_count[p->quant_table_index];
788 if (ffv1_allocate_initial_states(s) < 0)
789 return AVERROR(ENOMEM);
791 avctx->coded_frame = &s->picture;
792 if (!s->transparency)
794 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
795 s->picture_number = 0;
797 if (avctx->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
798 for (i = 0; i < s->quant_table_count; i++) {
799 s->rc_stat2[i] = av_mallocz(s->context_count[i] *
800 sizeof(*s->rc_stat2[i]));
802 return AVERROR(ENOMEM);
805 if (avctx->stats_in) {
806 char *p = avctx->stats_in;
807 uint8_t best_state[256][256];
811 av_assert0(s->version >= 2);
814 for (j = 0; j < 256; j++)
815 for (i = 0; i < 2; i++) {
816 s->rc_stat[j][i] = strtol(p, &next, 0);
818 av_log(avctx, AV_LOG_ERROR,
819 "2Pass file invalid at %d %d [%s]\n", j, i, p);
820 return AVERROR_INVALIDDATA;
824 for (i = 0; i < s->quant_table_count; i++)
825 for (j = 0; j < s->context_count[i]; j++) {
826 for (k = 0; k < 32; k++)
827 for (m = 0; m < 2; m++) {
828 s->rc_stat2[i][j][k][m] = strtol(p, &next, 0);
830 av_log(avctx, AV_LOG_ERROR,
831 "2Pass file invalid at %d %d %d %d [%s]\n",
833 return AVERROR_INVALIDDATA;
838 gob_count = strtol(p, &next, 0);
839 if (next == p || gob_count <= 0) {
840 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
841 return AVERROR_INVALIDDATA;
844 while (*p == '\n' || *p == ' ')
849 sort_stt(s, s->state_transition);
851 find_best_state(best_state, s->state_transition);
853 for (i = 0; i < s->quant_table_count; i++) {
854 for (j = 0; j < s->context_count[i]; j++)
855 for (k = 0; k < 32; k++) {
857 if (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1]) {
858 p = 256.0 * s->rc_stat2[i][j][k][1] /
859 (s->rc_stat2[i][j][k][0] + s->rc_stat2[i][j][k][1]);
861 s->initial_states[i][j][k] =
862 best_state[av_clip(round(p), 1, 255)][av_clip((s->rc_stat2[i][j][k][0] +
863 s->rc_stat2[i][j][k][1]) /
869 if (s->version > 1) {
870 for (s->num_v_slices = 2; s->num_v_slices < 9; s->num_v_slices++) {
871 for (s->num_h_slices = s->num_v_slices; s->num_h_slices < 2*s->num_v_slices; s->num_h_slices++) {
872 if (avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64 || !avctx->slices)
876 av_log(avctx, AV_LOG_ERROR, "Unsupported number %d of slices requested, please specify a supported number with -slices (ex:4,6,9,12,16, ...)\n", avctx->slices);
879 write_extra_header(s);
882 if ((ret = ffv1_init_slice_contexts(s)) < 0)
884 if ((ret = ffv1_init_slices_state(s)) < 0)
887 #define STATS_OUT_SIZE 1024 * 1024 * 6
888 if (avctx->flags & CODEC_FLAG_PASS1) {
889 avctx->stats_out = av_mallocz(STATS_OUT_SIZE);
890 for (i = 0; i < s->quant_table_count; i++)
891 for (j = 0; j < s->slice_count; j++) {
892 FFV1Context *sf = s->slice_context[j];
893 av_assert0(!sf->rc_stat2[i]);
894 sf->rc_stat2[i] = av_mallocz(s->context_count[i] *
895 sizeof(*sf->rc_stat2[i]));
896 if (!sf->rc_stat2[i])
897 return AVERROR(ENOMEM);
904 static void encode_slice_header(FFV1Context *f, FFV1Context *fs)
906 RangeCoder *c = &fs->c;
907 uint8_t state[CONTEXT_SIZE];
909 memset(state, 128, sizeof(state));
911 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
912 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
913 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
914 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
915 for (j=0; j<f->plane_count; j++) {
916 put_symbol(c, state, f->plane[j].quant_table_index, 0);
917 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
919 if (!f->picture.interlaced_frame) put_symbol(c, state, 3, 0);
920 else put_symbol(c, state, 1 + !f->picture.top_field_first, 0);
921 put_symbol(c, state, f->picture.sample_aspect_ratio.num, 0);
922 put_symbol(c, state, f->picture.sample_aspect_ratio.den, 0);
925 static int encode_slice(AVCodecContext *c, void *arg)
927 FFV1Context *fs = *(void **)arg;
928 FFV1Context *f = fs->avctx->priv_data;
929 int width = fs->slice_width;
930 int height = fs->slice_height;
933 AVFrame *const p = &f->picture;
934 const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step_minus1 + 1;
937 ffv1_clear_slice_state(f, fs);
938 if (f->version > 2) {
939 encode_slice_header(f, fs);
943 put_rac(&fs->c, (uint8_t[]) {129}, 0);
944 fs->ac_byte_count = f->version > 2 || (!x&&!y) ? ff_rac_terminate(&fs->c) : 0;
945 init_put_bits(&fs->pb, fs->c.bytestream_start + fs->ac_byte_count, fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count);
948 if (f->colorspace == 0) {
949 const int chroma_width = -((-width) >> f->chroma_h_shift);
950 const int chroma_height = -((-height) >> f->chroma_v_shift);
951 const int cx = x >> f->chroma_h_shift;
952 const int cy = y >> f->chroma_v_shift;
954 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
956 if (f->chroma_planes) {
957 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
958 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
960 if (fs->transparency)
961 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
963 uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
964 p->data[1] + ps*x + y*p->linesize[1],
965 p->data[2] + ps*x + y*p->linesize[2]};
966 encode_rgb_frame(fs, planes, width, height, p->linesize);
973 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
974 const AVFrame *pict, int *got_packet)
976 FFV1Context *f = avctx->priv_data;
977 RangeCoder *const c = &f->slice_context[0]->c;
978 AVFrame *const p = &f->picture;
980 uint8_t keystate = 128;
984 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*((8*2+1+1)*4)/8
985 + FF_MIN_BUFFER_SIZE)) < 0)
988 ff_init_range_encoder(c, pkt->data, pkt->size);
989 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
992 p->pict_type = AV_PICTURE_TYPE_I;
994 if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
995 put_rac(c, &keystate, 1);
1000 put_rac(c, &keystate, 0);
1006 for (i = 1; i < 256; i++) {
1007 c->one_state[i] = f->state_transition[i];
1008 c->zero_state[256 - i] = 256 - c->one_state[i];
1012 for (i = 1; i < f->slice_count; i++) {
1013 FFV1Context *fs = f->slice_context[i];
1014 uint8_t *start = pkt->data + (pkt->size - used_count) * (int64_t)i / f->slice_count;
1015 int len = pkt->size / f->slice_count;
1016 ff_init_range_encoder(&fs->c, start, len);
1018 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
1019 f->slice_count, sizeof(void *));
1022 for (i = 0; i < f->slice_count; i++) {
1023 FFV1Context *fs = f->slice_context[i];
1028 put_rac(&fs->c, &state, 0);
1029 bytes = ff_rac_terminate(&fs->c);
1031 flush_put_bits(&fs->pb); // FIXME: nicer padding
1032 bytes = fs->ac_byte_count + (put_bits_count(&fs->pb) + 7)/8;
1034 if (i > 0 || f->version > 2) {
1035 av_assert0(bytes < pkt->size / f->slice_count);
1036 memmove(buf_p, fs->c.bytestream_start, bytes);
1037 av_assert0(bytes < (1 << 24));
1038 AV_WB24(buf_p + bytes, bytes);
1044 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1045 AV_WL32(buf_p + bytes, v); bytes += 4;
1050 if ((avctx->flags & CODEC_FLAG_PASS1) && (f->picture_number & 31) == 0) {
1052 char *p = avctx->stats_out;
1053 char *end = p + STATS_OUT_SIZE;
1055 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1056 for (i = 0; i < f->quant_table_count; i++)
1057 memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
1059 for (j = 0; j < f->slice_count; j++) {
1060 FFV1Context *fs = f->slice_context[j];
1061 for (i = 0; i < 256; i++) {
1062 f->rc_stat[i][0] += fs->rc_stat[i][0];
1063 f->rc_stat[i][1] += fs->rc_stat[i][1];
1065 for (i = 0; i < f->quant_table_count; i++) {
1066 for (k = 0; k < f->context_count[i]; k++)
1067 for (m = 0; m < 32; m++) {
1068 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1069 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1074 for (j = 0; j < 256; j++) {
1075 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1076 f->rc_stat[j][0], f->rc_stat[j][1]);
1079 snprintf(p, end - p, "\n");
1081 for (i = 0; i < f->quant_table_count; i++) {
1082 for (j = 0; j < f->context_count[i]; j++)
1083 for (m = 0; m < 32; m++) {
1084 snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
1085 f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1089 snprintf(p, end - p, "%d\n", f->gob_count);
1090 } else if (avctx->flags & CODEC_FLAG_PASS1)
1091 avctx->stats_out[0] = '\0';
1093 f->picture_number++;
1094 pkt->size = buf_p - pkt->data;
1095 pkt->flags |= AV_PKT_FLAG_KEY * p->key_frame;
1101 #define OFFSET(x) offsetof(FFV1Context, x)
1102 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1103 static const AVOption options[] = {
1104 { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE},
1108 static const AVClass class = {
1109 .class_name = "ffv1 encoder",
1110 .item_name = av_default_item_name,
1112 .version = LIBAVUTIL_VERSION_INT,
1115 static const AVCodecDefault ffv1_defaults[] = {
1120 AVCodec ff_ffv1_encoder = {
1122 .type = AVMEDIA_TYPE_VIDEO,
1123 .id = AV_CODEC_ID_FFV1,
1124 .priv_data_size = sizeof(FFV1Context),
1125 .init = encode_init,
1126 .encode2 = encode_frame,
1127 .close = ffv1_close,
1128 .capabilities = CODEC_CAP_SLICE_THREADS,
1129 .defaults = ffv1_defaults,
1130 .pix_fmts = (const enum AVPixelFormat[]) {
1131 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV444P,
1132 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV411P,
1133 AV_PIX_FMT_YUV410P, AV_PIX_FMT_0RGB32, AV_PIX_FMT_RGB32, AV_PIX_FMT_YUV420P16,
1134 AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUV422P9,
1135 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
1136 AV_PIX_FMT_GRAY16, AV_PIX_FMT_GRAY8, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
1137 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14,
1140 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1141 .priv_class = &class,