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
34
43
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
49 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
50 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
51 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
52 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
53 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
54 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
55 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
56 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
57 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1,
58 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
59 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
60 -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
61 };
62
64 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
70 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
71 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
72 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
73 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
74 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
75 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
76 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
77 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
78 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
79 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
80 };
81
83 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
85 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
86 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
87 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
88 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
89 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
91 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
92 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
93 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
94 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
95 -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
96 -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
97 -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
98 -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
99 };
100
102 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
103 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
104 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
105 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
106 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
107 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
108 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
109 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
110 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
111 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
112 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
113 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
114 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
115 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
116 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
117 -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
118 };
119
121 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
122 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
123 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
124 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
125 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
126 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
127 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
128 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
129 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
130 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
131 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
132 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
133 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
134 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
135 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
136 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
137 };
138
140 const uint8_t one_state[256])
141 {
143 double l2tab[256];
144
145 for (
i = 1;
i < 256;
i++)
146 l2tab[
i] =
log2(
i / 256.0);
147
148 for (
i = 0;
i < 256;
i++) {
149 double best_len[256];
150 double p =
i / 256.0;
151
152 for (j = 0; j < 256; j++)
153 best_len[j] = 1 << 30;
154
155 for (j =
FFMAX(
i - 10, 1); j <
FFMIN(
i + 11, 256); j++) {
156 double occ[256] = { 0 };
158 occ[j] = 1.0;
159
160 if (!one_state[j])
161 continue;
162
163 for (k = 0; k < 256; k++) {
164 double newocc[256] = { 0 };
165 for (m = 1; m < 256; m++)
166 if (occ[m]) {
167 len -=occ[m]*( p *l2tab[ m]
168 + (1-p)*l2tab[256-m]);
169 }
170 if (
len < best_len[k]) {
172 best_state[
i][k] = j;
173 }
174 for (m = 1; m < 256; m++)
175 if (occ[m]) {
176 newocc[ one_state[ m]] += occ[m] * p;
177 newocc[256 - one_state[256 - m]] += occ[m] * (1 - p);
178 }
179 memcpy(occ, newocc, sizeof(occ));
180 }
181 }
182 }
183 }
184
186 uint8_t *
state,
int v,
187 int is_signed,
190 {
192
193 #define put_rac(C, S, B) \
194 do { \
195 if (rc_stat) { \
196 rc_stat[*(S)][B]++; \
197 rc_stat2[(S) - state][B]++; \
198 } \
199 put_rac(C, S, B); \
200 } while (0)
201
202 if (v) {
206 if (e <= 9) {
207 for (
i = 0;
i < e;
i++)
210
211 for (
i = e - 1;
i >= 0;
i--)
213
214 if (is_signed)
216 } else {
217 for (
i = 0;
i < e;
i++)
220
221 for (
i = e - 1;
i >= 0;
i--)
223
224 if (is_signed)
226 }
227 } else {
229 }
230 #undef put_rac
231 }
232
234 int v, int is_signed)
235 {
237 }
238
239
242 {
245
247 k = 0;
248 while (i < state->error_sum) { // FIXME: optimize
249 k++;
251 }
252
254
256
257 ff_dlog(
NULL,
"v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v,
code,
260
262 }
263
264 #define TYPE int16_t
265 #define RENAME(name) name
267 #undef TYPE
268 #undef RENAME
269
271 #define RENAME(name) name ## 32
273
275 int stride,
int plane_index,
int pixel_stride)
276 {
278 const int ring_size =
s->context_model ? 3 : 2;
281
282 memset(
s->sample_buffer, 0,
ring_size * (
w + 6) *
sizeof(*
s->sample_buffer));
283
284 for (y = 0; y <
h; y++) {
287
290 if (
s->bits_per_raw_sample <= 8) {
291 for (x = 0; x <
w; x++)
293 if((
ret = encode_line(
s,
w,
sample, plane_index, 8)) < 0)
295 } else {
296 if (
s->packed_at_lsb) {
297 for (x = 0; x <
w; x++) {
299 }
300 } else {
301 for (x = 0; x <
w; x++) {
302 sample[0][x] = ((uint16_t*)(
src +
stride*y))[x] >> (16 -
s->bits_per_raw_sample);
303 }
304 }
305 if((
ret = encode_line(
s,
w,
sample, plane_index,
s->bits_per_raw_sample)) < 0)
307 }
308 }
309 return 0;
310 }
311
313 {
314 int last = 0;
318
319 for (
i = 1;
i < 128;
i++)
323 }
325 }
326
329 {
331 for (
i = 0;
i < 5;
i++)
333 }
334
336 int nb_contexts)
337 {
338 if (!initial_state)
339 return 0;
340 for (
int i = 0;
i < nb_contexts;
i++)
342 if (initial_state[
i][j] != 128)
343 return 1;
344 return 0;
345 }
346
348 {
352
354
355 if (
f->version < 2) {
359 for (
i = 1;
i < 256;
i++)
361 f->state_transition[
i] -
c->one_state[
i], 1);
362 }
370
372 }
else if (
f->version < 3) {
374 for (
i = 0;
i <
f->slice_count;
i++) {
377 (
fs->slice_x + 1) *
f->num_h_slices /
f->width, 0);
379 (
fs->slice_y + 1) *
f->num_v_slices /
f->height, 0);
381 (
fs->slice_width + 1) *
f->num_h_slices /
f->width - 1,
382 0);
384 (
fs->slice_height + 1) *
f->num_v_slices /
f->height - 1,
385 0);
386 for (j = 0; j <
f->plane_count; j++) {
388 av_assert0(
f->plane[j].quant_table_index ==
f->context_model);
389 }
390 }
391 }
392 }
393
395 {
400 unsigned v;
401
402 memset(state2, 128, sizeof(state2));
404
405 f->avctx->extradata_size = 10000 + 4 +
406 (11 * 11 * 5 * 5 * 5 + 11 * 11 * 11) * 32;
408 if (!
f->avctx->extradata)
412
414 if (
f->version > 2) {
415 if (
f->version == 3) {
416 f->micro_version = 4;
417 }
else if (
f->version == 4)
418 f->micro_version = 2;
420 }
421
424 for (
i = 1;
i < 256;
i++)
426
435
437 for (
i = 0;
i <
f->quant_table_count;
i++)
439
440 for (
i = 0;
i <
f->quant_table_count;
i++) {
443 for (j = 0; j <
f->context_count[
i]; j++)
445 int pred = j ?
f->initial_states[
i][j - 1][k] : 128;
447 (int8_t)(
f->initial_states[
i][j][k] -
pred), 1);
448 }
449 } else {
451 }
452 }
453
454 if (
f->version > 2) {
457 }
458
461 AV_WL32(
f->avctx->extradata +
f->avctx->extradata_size, v);
462 f->avctx->extradata_size += 4;
463
464 return 0;
465 }
466
468 {
469 int i, i2, changed,
print = 0;
470
471 do {
472 changed = 0;
473 for (
i = 12;
i < 244;
i++) {
474 for (i2 =
i + 1; i2 < 245 && i2 <
i + 4; i2++) {
475
476 #define COST(old, new) \
477 s->rc_stat[old][0] * -log2((256 - (new)) / 256.0) + \
478 s->rc_stat[old][1] * -log2((new) / 256.0)
479
480 #define COST2(old, new) \
481 COST(old, new) + COST(256 - (old), 256 - (new))
482
485 if (size0 - sizeX > size0*(1e-14) &&
i != 128 && i2 != 128) {
486 int j;
488 FFSWAP(
int,
s->rc_stat[
i][0],
s->rc_stat[i2][0]);
489 FFSWAP(
int,
s->rc_stat[
i][1],
s->rc_stat[i2][1]);
491 FFSWAP(
int, stt[256 -
i], stt[256 - i2]);
492 FFSWAP(
int,
s->rc_stat[256 -
i][0],
s->rc_stat[256 - i2][0]);
493 FFSWAP(
int,
s->rc_stat[256 -
i][1],
s->rc_stat[256 - i2][1]);
494 }
495 for (j = 1; j < 256; j++) {
497 stt[j] = i2;
498 else if (stt[j] == i2)
501 if (stt[256 - j] == 256 -
i)
502 stt[256 - j] = 256 - i2;
503 else if (stt[256 - j] == 256 - i2)
504 stt[256 - j] = 256 -
i;
505 }
506 }
508 }
509 }
510 }
511 } while (changed);
513 }
514
516 {
520
523
525
528 s->version =
FFMAX(
s->version, 2);
529
530 // Unspecified level & slices, we choose version 1.2+ to ensure multithreaded decodability
532 s->version =
FFMAX(
s->version, 2);
533
536 }
541 }
543 }
544
546 s->ec = (
s->version >= 3);
547 }
548
549 // CRC requires version 3+
551 s->version =
FFMAX(
s->version, 3);
552
554 av_log(
avctx,
AV_LOG_ERROR,
"Version 2 needed for requested features but version 2 is experimental and not enabled\n");
556 }
557
558 if (
s->ac == 1)
// Compatbility with common command line usage
562
573 s->bits_per_raw_sample = 9;
583 s->bits_per_raw_sample = 10;
590 s->bits_per_raw_sample = 12;
595 s->bits_per_raw_sample = 14;
596 s->packed_at_lsb = 1;
605 s->bits_per_raw_sample = 16;
606 }
else if (!
s->bits_per_raw_sample) {
608 }
609 if (
s->bits_per_raw_sample <= 8) {
612 }
613 s->version =
FFMAX(
s->version, 1);
625 s->chroma_planes =
desc->nb_components < 3 ? 0 : 1;
629 s->bits_per_raw_sample = 8;
630 else if (!
s->bits_per_raw_sample)
631 s->bits_per_raw_sample = 8;
632 break;
636 s->chroma_planes = 1;
637 s->bits_per_raw_sample = 8;
638 break;
642 s->chroma_planes = 1;
643 s->bits_per_raw_sample = 16;
645 s->version =
FFMAX(
s->version, 1);
646 break;
649 s->chroma_planes = 1;
650 s->bits_per_raw_sample = 16;
652 s->version =
FFMAX(
s->version, 1);
653 break;
656 s->chroma_planes = 1;
657 s->bits_per_raw_sample = 8;
658 break;
661 s->bits_per_raw_sample = 9;
665 s->bits_per_raw_sample = 10;
669 s->bits_per_raw_sample = 12;
672 s->bits_per_raw_sample = 14;
676 s->bits_per_raw_sample = 16;
677 else if (!
s->bits_per_raw_sample)
681 s->chroma_planes = 1;
682 if (
s->bits_per_raw_sample >= 16) {
684 }
685 s->version =
FFMAX(
s->version, 1);
686 break;
687 default:
690 }
692
693 if (
s->bits_per_raw_sample > 8) {
696 "bits_per_raw_sample > 8, forcing range coder\n");
698 }
699 }
700
702 for (
i = 1;
i < 256;
i++)
704 } else {
707 for (
i = 1;
i < 256;
i++)
708 s->state_transition[
i] =
c.one_state[
i];
709 }
710
711 for (
i = 0;
i < 256;
i++) {
712 s->quant_table_count = 2;
713 if (
s->bits_per_raw_sample <= 8) {
719 s->quant_tables[1][2][
i]= 11*11*
quant5 [
i];
720 s->quant_tables[1][3][
i]= 5*11*11*
quant5 [
i];
721 s->quant_tables[1][4][
i]= 5*5*11*11*
quant5 [
i];
722 } else {
731 }
732 }
733 s->context_count[0] = (11 * 11 * 11 + 1) / 2;
734 s->context_count[1] = (11 * 11 * 5 * 5 * 5 + 1) / 2;
735 memcpy(
s->quant_table,
s->quant_tables[
s->context_model],
736 sizeof(
s->quant_table));
737
738 for (
i = 0;
i <
s->plane_count;
i++) {
740
744 }
745
748
749 if (!
s->transparency)
751 if (!
s->chroma_planes &&
s->version > 3)
753
757
758 s->picture_number = 0;
759
761 for (
i = 0;
i <
s->quant_table_count;
i++) {
763 sizeof(*
s->rc_stat2[
i]));
766 }
767 }
772 char *next;
773 if (!best_state)
775
777
778 for (;;) {
779 for (j = 0; j < 256; j++)
780 for (
i = 0;
i < 2;
i++) {
781 s->rc_stat[j][
i] = strtol(p, &next, 0);
782 if (next == p) {
784 "2Pass file invalid at %d %d [%s]\n", j,
i, p);
787 }
788 p = next;
789 }
790 for (
i = 0;
i <
s->quant_table_count;
i++)
791 for (j = 0; j <
s->context_count[
i]; j++) {
792 for (k = 0; k < 32; k++)
793 for (m = 0; m < 2; m++) {
794 s->rc_stat2[
i][j][k][m] = strtol(p, &next, 0);
795 if (next == p) {
797 "2Pass file invalid at %d %d %d %d [%s]\n",
801 }
802 p = next;
803 }
804 }
810 }
811 p = next;
812 while (*p == '\n' || *p == ' ')
813 p++;
814 if (p[0] == 0)
815 break;
816 }
819
821
822 for (
i = 0;
i <
s->quant_table_count;
i++) {
823 for (k = 0; k < 32; k++) {
825 int jp = 0;
826 for (j = 0; j <
s->context_count[
i]; j++) {
827 double p = 128;
828 if (
s->rc_stat2[
i][j][k][0] +
s->rc_stat2[
i][j][k][1] > 200 && j ||
a+
b > 200) {
830 p = 256.0 *
b / (
a +
b);
831 s->initial_states[
i][jp][k] =
833 for(jp++; jp<j; jp++)
834 s->initial_states[
i][jp][k] =
s->initial_states[
i][jp-1][k];
836 }
837 a +=
s->rc_stat2[
i][j][k][0];
838 b +=
s->rc_stat2[
i][j][k][1];
840 p = 256.0 *
b / (
a +
b);
841 }
842 s->initial_states[
i][j][k] =
844 }
845 }
846 }
848 }
849
850 if (
s->version > 1) {
855
856 s->num_v_slices =
FFMIN(
s->num_v_slices, max_v_slices);
857
858 for (;
s->num_v_slices < 32;
s->num_v_slices++) {
859 for (
s->num_h_slices =
s->num_v_slices;
s->num_h_slices < 2*
s->num_v_slices;
s->num_h_slices++) {
860 int maxw = (
avctx->
width +
s->num_h_slices - 1) /
s->num_h_slices;
861 int maxh = (
avctx->
height +
s->num_v_slices - 1) /
s->num_v_slices;
862 if (
s->num_h_slices > max_h_slices ||
s->num_v_slices > max_v_slices)
863 continue;
864 if (maxw * maxh * (int64_t)(
s->bits_per_raw_sample+1) *
plane_count > 8<<24)
865 continue;
867 goto slices_ok;
868 }
869 }
871 "Unsupported number %d of slices requested, please specify a "
872 "supported number with -slices (ex:4,6,9,12,16, ...)\n",
875 slices_ok:
878 }
879
882 s->slice_count =
s->max_slice_count;
885
886 #define STATS_OUT_SIZE 1024 * 1024 * 6
891 for (
i = 0;
i <
s->quant_table_count;
i++)
892 for (j = 0; j <
s->max_slice_count; j++) {
899 }
900 }
901
902 return 0;
903 }
904
906 {
909 int j;
911
916 for (j=0; j<
f->plane_count; j++) {
918 av_assert0(
f->plane[j].quant_table_index ==
f->context_model);
919 }
920 if (!
f->picture.f->interlaced_frame)
922 else
926 if (
f->version > 3) {
928 if (
fs->slice_coding_mode == 1)
931 if (
fs->slice_coding_mode != 1) {
934 }
935 }
936 }
937
939 {
940 #define NB_Y_COEFF 15
941 static const int rct_y_coeff[15][2] = {
942 {0, 0}, // 4G
943 {1, 1}, // R + 2G + B
944 {2, 2}, // 2R + 2B
945 {0, 2}, // 2G + 2B
946 {2, 0}, // 2R + 2G
947 {4, 0}, // 4R
948 {0, 4}, // 4B
949
950 {0, 3}, // 1G + 3B
951 {3, 0}, // 3R + 1G
952 {3, 1}, // 3R + B
953 {1, 3}, // R + 3B
954 {1, 2}, // R + G + 2B
955 {2, 1}, // 2R + G + B
956 {0, 1}, // 3G + B
957 {1, 0}, // R + 3G
958 };
959
961 int x, y,
i, p, best;
963 int lbd =
fs->bits_per_raw_sample <= 8;
964
965 for (y = 0; y <
h; y++) {
966 int lastr=0, lastg=0, lastb=0;
967 for (p = 0; p < 3; p++)
969
970 for (x = 0; x <
w; x++) {
972 int ab, ag, ar;
973 if (lbd) {
974 unsigned v = *((
const uint32_t*)(
src[0] + x*4 +
stride[0]*y));
977 r = (v >> 16) & 0xFF;
978 } else {
979 b = *((
const uint16_t*)(
src[0] + x*2 +
stride[0]*y));
980 g = *((
const uint16_t*)(
src[1] + x*2 +
stride[1]*y));
981 r = *((
const uint16_t*)(
src[2] + x*2 +
stride[2]*y));
982 }
983
987 if (x && y) {
988 int bg = ag -
sample[0][x];
989 int bb = ab -
sample[1][x];
990 int br = ar -
sample[2][x];
991
992 br -= bg;
993 bb -= bg;
994
996 stat[
i] +=
FFABS(bg + ((br*rct_y_coeff[
i][0] + bb*rct_y_coeff[
i][1])>>2));
997 }
998
999 }
1003
1007 }
1008 }
1009
1010 best = 0;
1012 if (stat[
i] < stat[best])
1014 }
1015
1016 fs->slice_rct_by_coef = rct_y_coeff[best][1];
1017 fs->slice_rct_ry_coef = rct_y_coeff[best][0];
1018 }
1019
1021 {
1026 int x =
fs->slice_x;
1027 int y =
fs->slice_y;
1028 const AVFrame *
const p =
f->picture.f;
1036
1037 fs->slice_coding_mode = 0;
1038 if (
f->version > 3) {
1040 } else {
1041 fs->slice_rct_by_coef = 1;
1042 fs->slice_rct_ry_coef = 1;
1043 }
1044
1045 retry:
1048 if (
f->version > 2) {
1050 }
1054 fs->c.bytestream_start +
fs->ac_byte_count,
1055 fs->c.bytestream_end -
fs->c.bytestream_start -
fs->ac_byte_count);
1056 }
1057
1061 const int cx = x >>
f->chroma_h_shift;
1062 const int cy = y >>
f->chroma_v_shift;
1063
1065
1066 if (
f->chroma_planes) {
1069 }
1070 if (
fs->transparency)
1075 }
else if (
f->use32bit) {
1077 } else {
1079 }
1080 emms_c();
1081
1084 if (
fs->version < 4 || !
fs->ac) {
1087 }
1089 fs->slice_coding_mode = 1;
1091 goto retry;
1092 }
1093
1094 return 0;
1095 }
1096
1098 const AVFrame *pict,
int *got_packet)
1099 {
1103 uint8_t keystate = 128;
1104 uint8_t *buf_p;
1108
1109 if(!pict) {
1111 int j, k, m;
1114
1115 memset(
f->rc_stat, 0,
sizeof(
f->rc_stat));
1116 for (
i = 0;
i <
f->quant_table_count;
i++)
1117 memset(
f->rc_stat2[
i], 0,
f->context_count[
i] *
sizeof(*
f->rc_stat2[
i]));
1118
1120 for (j = 0; j <
f->slice_count; j++) {
1122 for (
i = 0;
i < 256;
i++) {
1123 f->rc_stat[
i][0] +=
fs->rc_stat[
i][0];
1124 f->rc_stat[
i][1] +=
fs->rc_stat[
i][1];
1125 }
1126 for (
i = 0;
i <
f->quant_table_count;
i++) {
1127 for (k = 0; k <
f->context_count[
i]; k++)
1128 for (m = 0; m < 32; m++) {
1129 f->rc_stat2[
i][k][m][0] +=
fs->rc_stat2[
i][k][m][0];
1130 f->rc_stat2[
i][k][m][1] +=
fs->rc_stat2[
i][k][m][1];
1131 }
1132 }
1133 }
1134
1135 for (j = 0; j < 256; j++) {
1136 snprintf(p, end - p,
"%" PRIu64
" %" PRIu64
" ",
1137 f->rc_stat[j][0],
f->rc_stat[j][1]);
1138 p += strlen(p);
1139 }
1141
1142 for (
i = 0;
i <
f->quant_table_count;
i++) {
1143 for (j = 0; j <
f->context_count[
i]; j++)
1144 for (m = 0; m < 32; m++) {
1145 snprintf(p, end - p,
"%" PRIu64
" %" PRIu64
" ",
1146 f->rc_stat2[
i][j][m][0],
f->rc_stat2[
i][j][m][1]);
1147 p += strlen(p);
1148 }
1149 }
1150 snprintf(p, end - p,
"%d\n",
f->gob_count);
1151 }
1152 return 0;
1153 }
1154
1157
1161 }
1162
1165
1168
1172
1178 } else {
1181 }
1182
1185 for (
i = 1;
i < 256;
i++) {
1186 c->one_state[
i] =
f->state_transition[
i];
1187 c->zero_state[256 -
i] = 256 -
c->one_state[
i];
1188 }
1189 }
1190
1191 for (
i = 0;
i <
f->slice_count;
i++) {
1197 } else {
1200 fs->c.bytestream_end =
fs->c.bytestream_start +
len;
1201 }
1202 }
1204 f->slice_count,
sizeof(
void *));
1205
1207 for (
i = 0;
i <
f->slice_count;
i++) {
1209 int bytes;
1210
1213 } else {
1216 }
1217 if (
i > 0 ||
f->version > 2) {
1219 memmove(buf_p,
fs->c.bytestream_start, bytes);
1221 AV_WB24(buf_p + bytes, bytes);
1222 bytes += 3;
1223 }
1225 unsigned v;
1226 buf_p[bytes++] = 0;
1229 bytes += 4;
1230 }
1231 buf_p += bytes;
1232 }
1233
1236
1237 f->picture_number++;
1242 *got_packet = 1;
1243
1244 return 0;
1245 }
1246
1248 {
1250 return 0;
1251 }
1252
1253 #define OFFSET(x) offsetof(FFV1Context, x)
1254 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1258 { .i64 = 0 }, -2, 2,
VE,
"coder" },
1265 {
"ac",
"Range with custom table (the ac option exists for compatibility and is deprecated)", 0,
AV_OPT_TYPE_CONST,
1266 { .i64 = 1 }, INT_MIN, INT_MAX,
VE,
"coder" },
1268 { .i64 = 0 }, 0, 1,
VE },
1269
1271 };
1272
1278 };
1279
1311
1312 },
1315 };