2 * FFV1 codec for libavcodec
4 * Copyright (c) 2003 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)
33 #include "rangecoder.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/avassert.h"
38 #include "libavutil/crc.h"
39 #include "libavutil/opt.h"
41 #ifdef __INTEL_COMPILER
47 #define CONTEXT_SIZE 32
49 #define MAX_QUANT_TABLES 8
50 #define MAX_CONTEXT_INPUTS 5
52 extern const uint8_t ff_log2_run[41];
54 static const int8_t quant5_10bit[256]={
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
57 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
58 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
59 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
63 -2,-2,-2,-2,-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,-1,
68 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
69 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
70 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
73 static const int8_t quant5[256]={
74 0, 1, 1, 1, 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, 2, 2, 2,
80 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
83 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
84 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
85 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
86 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
92 static const int8_t quant9_10bit[256]={
93 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
99 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
100 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
101 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-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,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
108 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
111 static const int8_t quant11[256]={
112 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
114 4, 4, 4, 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, 5, 5,
116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
117 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
118 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
119 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
120 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
124 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
125 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
126 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
127 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
130 static const uint8_t ver2_state[256]= {
131 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
132 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
133 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
134 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
135 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
136 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
137 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
138 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
139 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
140 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
141 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
142 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
143 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
144 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
145 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
146 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
149 typedef struct VlcState{
156 typedef struct PlaneContext{
157 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
158 int quant_table_index;
160 uint8_t (*state)[CONTEXT_SIZE];
162 uint8_t interlace_bit_state[2];
165 #define MAX_SLICES 256
167 typedef struct FFV1Context{
169 AVCodecContext *avctx;
173 uint64_t rc_stat[256][2];
174 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
178 int chroma_h_shift, chroma_v_shift;
184 AVFrame last_picture;
186 int ac; ///< 1=range coder <-> 0=golomb rice
187 int ac_byte_count; ///< number of bytes used for AC coding
188 PlaneContext plane[MAX_PLANES];
189 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
190 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
191 int context_count[MAX_QUANT_TABLES];
192 uint8_t state_transition[256];
193 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
196 int16_t *sample_buffer;
202 int quant_table_count;
206 struct FFV1Context *slice_context[MAX_SLICES];
214 int bits_per_raw_sample;
217 static av_always_inline int fold(int diff, int bits){
229 static inline int predict(int16_t *src, int16_t *last)
231 const int LT= last[-1];
232 const int T= last[ 0];
233 const int L = src[-1];
235 return mid_pred(L, L + T - LT, T);
238 static inline int get_context(PlaneContext *p, int16_t *src,
239 int16_t *last, int16_t *last2)
241 const int LT= last[-1];
242 const int T= last[ 0];
243 const int RT= last[ 1];
244 const int L = src[-1];
246 if(p->quant_table[3][127]){
247 const int TT= last2[0];
248 const int LL= src[-2];
249 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
250 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
252 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
255 static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
260 l2tab[i]= log2(i/256.0);
262 for(i=0; i<256; i++){
263 double best_len[256];
269 for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
273 for(k=0; k<256; k++){
274 double newocc[256]={0};
275 for(m=0; m<256; m++){
277 len -=occ[m]*( p *l2tab[ m]
278 + (1-p)*l2tab[256-m]);
281 if(len < best_len[k]){
285 for(m=0; m<256; m++){
287 newocc[ one_state[ m]] += occ[m]* p ;
288 newocc[256-one_state[256-m]] += occ[m]*(1-p);
291 memcpy(occ, newocc, sizeof(occ));
297 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2]){
300 #define put_rac(C,S,B) \
304 rc_stat2[(S)-state][B]++;\
310 const int a= FFABS(v);
311 const int e= av_log2(a);
312 put_rac(c, state+0, 0);
315 put_rac(c, state+1+i, 1); //1..10
317 put_rac(c, state+1+i, 0);
319 for(i=e-1; i>=0; i--){
320 put_rac(c, state+22+i, (a>>i)&1); //22..31
324 put_rac(c, state+11 + e, v < 0); //11..21
327 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
329 put_rac(c, state+1+9, 0);
331 for(i=e-1; i>=0; i--){
332 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
336 put_rac(c, state+11 + 10, v < 0); //11..21
339 put_rac(c, state+0, 1);
344 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
345 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
348 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
349 if(get_rac(c, state+0))
354 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
359 for(i=e-1; i>=0; i--){
360 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
363 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
368 static av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
369 return get_symbol_inline(c, state, is_signed);
372 static inline void update_vlc_state(VlcState * const state, const int v){
373 int drift= state->drift;
374 int count= state->count;
375 state->error_sum += FFABS(v);
378 if(count == 128){ //FIXME variable
381 state->error_sum >>= 1;
386 if(state->bias > -128) state->bias--;
392 if(state->bias < 127) state->bias++;
403 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
405 //printf("final: %d ", v);
406 v = fold(v - state->bias, bits);
410 while(i < state->error_sum){ //FIXME optimize
418 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
421 code= v ^ ((2*state->drift + state->count)>>31);
424 //printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k);
425 set_sr_golomb(pb, code, k, 12, bits);
427 update_vlc_state(state, v);
430 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
435 while(i < state->error_sum){ //FIXME optimize
442 v= get_sr_golomb(gb, k, 12, bits);
443 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
446 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
448 v ^= ((2*state->drift + state->count)>>31);
451 ret= fold(v + state->bias, bits);
453 update_vlc_state(state, v);
454 //printf("final: %d\n", ret);
458 #if CONFIG_FFV1_ENCODER
459 static av_always_inline int encode_line(FFV1Context *s, int w,
461 int plane_index, int bits)
463 PlaneContext * const p= &s->plane[plane_index];
464 RangeCoder * const c= &s->c;
466 int run_index= s->run_index;
471 if(c->bytestream_end - c->bytestream < w*20){
472 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
476 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
477 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
485 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
486 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
493 diff= fold(diff, bits);
496 if(s->flags & CODEC_FLAG_PASS1){
497 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
499 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
502 if(context == 0) run_mode=1;
507 while(run_count >= 1<<ff_log2_run[run_index]){
508 run_count -= 1<<ff_log2_run[run_index];
510 put_bits(&s->pb, 1, 1);
513 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
514 if(run_index) run_index--;
523 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)put_bits_count(&s->pb));
526 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
530 while(run_count >= 1<<ff_log2_run[run_index]){
531 run_count -= 1<<ff_log2_run[run_index];
533 put_bits(&s->pb, 1, 1);
537 put_bits(&s->pb, 1, 1);
539 s->run_index= run_index;
544 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
546 const int ring_size= s->avctx->context_model ? 3 : 2;
550 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
553 for(i=0; i<ring_size; i++)
554 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
556 sample[0][-1]= sample[1][0 ];
557 sample[1][ w]= sample[1][w-1];
559 if(s->bits_per_raw_sample<=8){
561 sample[0][x]= src[x + stride*y];
563 encode_line(s, w, sample, plane_index, 8);
565 if(s->packed_at_lsb){
567 sample[0][x]= ((uint16_t*)(src + stride*y))[x];
571 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
574 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
576 //STOP_TIMER("encode line")}
580 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
582 const int ring_size= s->avctx->context_model ? 3 : 2;
583 int16_t *sample[4][3];
586 memset(s->sample_buffer, 0, ring_size*4*(w+6)*sizeof(*s->sample_buffer));
589 for(i=0; i<ring_size; i++)
591 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
594 unsigned v= src[x + stride*y];
606 // assert(g>=0 && b>=0 && r>=0);
607 // assert(g<256 && b<512 && r<512);
613 for(p=0; p<3 + s->transparency; p++){
614 sample[p][0][-1]= sample[p][1][0 ];
615 sample[p][1][ w]= sample[p][1][w-1];
616 encode_line(s, w, sample[p], (p+1)/2, 9);
621 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
624 uint8_t state[CONTEXT_SIZE];
625 memset(state, 128, sizeof(state));
627 for(i=1; i<128 ; i++){
628 if(quant_table[i] != quant_table[i-1]){
629 put_symbol(c, state, i-last-1, 0);
633 put_symbol(c, state, i-last-1, 0);
636 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
639 write_quant_table(c, quant_table[i]);
642 static void write_header(FFV1Context *f){
643 uint8_t state[CONTEXT_SIZE];
645 RangeCoder * const c= &f->slice_context[0]->c;
647 memset(state, 128, sizeof(state));
650 put_symbol(c, state, f->version, 0);
651 put_symbol(c, state, f->ac, 0);
653 for(i=1; i<256; i++){
654 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
657 put_symbol(c, state, f->colorspace, 0); //YUV cs type
659 put_symbol(c, state, f->bits_per_raw_sample, 0);
660 put_rac(c, state, f->chroma_planes);
661 put_symbol(c, state, f->chroma_h_shift, 0);
662 put_symbol(c, state, f->chroma_v_shift, 0);
663 put_rac(c, state, f->transparency);
665 write_quant_tables(c, f->quant_table);
666 }else if(f->version < 3){
667 put_symbol(c, state, f->slice_count, 0);
668 for(i=0; i<f->slice_count; i++){
669 FFV1Context *fs= f->slice_context[i];
670 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
671 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
672 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
673 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
674 for(j=0; j<f->plane_count; j++){
675 put_symbol(c, state, f->plane[j].quant_table_index, 0);
676 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
681 #endif /* CONFIG_FFV1_ENCODER */
683 static av_cold int common_init(AVCodecContext *avctx){
684 FFV1Context *s = avctx->priv_data;
687 s->flags= avctx->flags;
689 avcodec_get_frame_defaults(&s->picture);
691 ff_dsputil_init(&s->dsp, avctx);
693 s->width = avctx->width;
694 s->height= avctx->height;
696 assert(s->width && s->height);
705 static int init_slice_state(FFV1Context *f, FFV1Context *fs){
708 fs->plane_count= f->plane_count;
709 fs->transparency= f->transparency;
710 for(j=0; j<f->plane_count; j++){
711 PlaneContext * const p= &fs->plane[j];
714 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
716 return AVERROR(ENOMEM);
718 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
720 return AVERROR(ENOMEM);
725 //FIXME only redo if state_transition changed
726 for(j=1; j<256; j++){
727 fs->c.one_state [ j]= f->state_transition[j];
728 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
735 static int init_slices_state(FFV1Context *f){
737 for(i=0; i<f->slice_count; i++){
738 FFV1Context *fs= f->slice_context[i];
739 if(init_slice_state(f, fs) < 0)
745 static av_cold int init_slice_contexts(FFV1Context *f){
748 f->slice_count= f->num_h_slices * f->num_v_slices;
750 for(i=0; i<f->slice_count; i++){
751 FFV1Context *fs= av_mallocz(sizeof(*fs));
752 int sx= i % f->num_h_slices;
753 int sy= i / f->num_h_slices;
754 int sxs= f->avctx->width * sx / f->num_h_slices;
755 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
756 int sys= f->avctx->height* sy / f->num_v_slices;
757 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
758 f->slice_context[i]= fs;
759 memcpy(fs, f, sizeof(*fs));
760 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
762 fs->slice_width = sxe - sxs;
763 fs->slice_height= sye - sys;
767 fs->sample_buffer = av_malloc(3*4 * (fs->width+6) * sizeof(*fs->sample_buffer));
768 if (!fs->sample_buffer)
769 return AVERROR(ENOMEM);
774 static int allocate_initial_states(FFV1Context *f){
777 for(i=0; i<f->quant_table_count; i++){
778 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
779 if(!f->initial_states[i])
780 return AVERROR(ENOMEM);
781 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
786 #if CONFIG_FFV1_ENCODER
787 static int write_extra_header(FFV1Context *f){
788 RangeCoder * const c= &f->c;
789 uint8_t state[CONTEXT_SIZE];
791 uint8_t state2[32][CONTEXT_SIZE];
794 memset(state2, 128, sizeof(state2));
795 memset(state, 128, sizeof(state));
797 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
798 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
799 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
801 put_symbol(c, state, f->version, 0);
803 put_symbol(c, state, f->minor_version, 0);
804 put_symbol(c, state, f->ac, 0);
806 for(i=1; i<256; i++){
807 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
810 put_symbol(c, state, f->colorspace, 0); //YUV cs type
811 put_symbol(c, state, f->bits_per_raw_sample, 0);
812 put_rac(c, state, f->chroma_planes);
813 put_symbol(c, state, f->chroma_h_shift, 0);
814 put_symbol(c, state, f->chroma_v_shift, 0);
815 put_rac(c, state, f->transparency);
816 put_symbol(c, state, f->num_h_slices-1, 0);
817 put_symbol(c, state, f->num_v_slices-1, 0);
819 put_symbol(c, state, f->quant_table_count, 0);
820 for(i=0; i<f->quant_table_count; i++)
821 write_quant_tables(c, f->quant_tables[i]);
823 for(i=0; i<f->quant_table_count; i++){
824 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
825 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
827 if(j<f->context_count[i]*CONTEXT_SIZE){
828 put_rac(c, state, 1);
829 for(j=0; j<f->context_count[i]; j++){
830 for(k=0; k<CONTEXT_SIZE; k++){
831 int pred= j ? f->initial_states[i][j-1][k] : 128;
832 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
836 put_rac(c, state, 0);
841 put_symbol(c, state, f->ec, 0);
844 f->avctx->extradata_size= ff_rac_terminate(c);
845 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
846 AV_WL32(f->avctx->extradata + f->avctx->extradata_size, v);
847 f->avctx->extradata_size += 4;
852 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
853 int i,i2,changed,print=0;
857 for(i=12; i<244; i++){
858 for(i2=i+1; i2<245 && i2<i+4; i2++){
859 #define COST(old, new) \
860 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
861 +s->rc_stat[old][1]*-log2( (new) /256.0)
863 #define COST2(old, new) \
865 +COST(256-(old), 256-(new))
867 double size0= COST2(i, i ) + COST2(i2, i2);
868 double sizeX= COST2(i, i2) + COST2(i2, i );
869 if(sizeX < size0 && i!=128 && i2!=128){
871 FFSWAP(int, stt[ i], stt[ i2]);
872 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
873 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
875 FFSWAP(int, stt[256-i], stt[256-i2]);
876 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
877 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
879 for(j=1; j<256; j++){
880 if (stt[j] == i ) stt[j] = i2;
881 else if(stt[j] == i2) stt[j] = i ;
883 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
884 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
895 static av_cold int encode_init(AVCodecContext *avctx)
897 FFV1Context *s = avctx->priv_data;
904 if((avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) || avctx->slices>1)
905 s->version = FFMAX(s->version, 2);
907 if(avctx->level == 3){
912 s->ec = (s->version >= 3);
915 if(s->version >= 2 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
916 av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
917 return AVERROR_INVALIDDATA;
920 s->ac= avctx->coder_type > 0 ? 2 : 0;
923 switch(avctx->pix_fmt){
924 case PIX_FMT_YUV444P9:
925 case PIX_FMT_YUV422P9:
926 case PIX_FMT_YUV420P9:
927 if (!avctx->bits_per_raw_sample)
928 s->bits_per_raw_sample = 9;
929 case PIX_FMT_YUV444P10:
930 case PIX_FMT_YUV420P10:
931 case PIX_FMT_YUV422P10:
932 s->packed_at_lsb = 1;
933 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
934 s->bits_per_raw_sample = 10;
936 case PIX_FMT_YUV444P16:
937 case PIX_FMT_YUV422P16:
938 case PIX_FMT_YUV420P16:
939 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
940 s->bits_per_raw_sample = 16;
941 } else if (!s->bits_per_raw_sample){
942 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
944 if(s->bits_per_raw_sample <=8){
945 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
946 return AVERROR_INVALIDDATA;
948 if(!s->ac && avctx->coder_type == -1) {
949 av_log(avctx, AV_LOG_INFO, "bits_per_raw_sample > 8, forcing coder 1\n");
953 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
954 return AVERROR_INVALIDDATA;
956 s->version= FFMAX(s->version, 1);
958 case PIX_FMT_YUV444P:
959 case PIX_FMT_YUV440P:
960 case PIX_FMT_YUV422P:
961 case PIX_FMT_YUV420P:
962 case PIX_FMT_YUV411P:
963 case PIX_FMT_YUV410P:
964 s->chroma_planes= av_pix_fmt_descriptors[avctx->pix_fmt].nb_components < 3 ? 0 : 1;
967 case PIX_FMT_YUVA444P:
968 case PIX_FMT_YUVA422P:
969 case PIX_FMT_YUVA420P:
982 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
983 return AVERROR_INVALIDDATA;
985 if (s->transparency) {
986 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
988 if (avctx->context_model > 1U) {
989 av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
990 return AVERROR(EINVAL);
995 s->state_transition[i]=ver2_state[i];
997 for(i=0; i<256; i++){
998 s->quant_table_count=2;
999 if(s->bits_per_raw_sample <=8){
1000 s->quant_tables[0][0][i]= quant11[i];
1001 s->quant_tables[0][1][i]= 11*quant11[i];
1002 s->quant_tables[0][2][i]= 11*11*quant11[i];
1003 s->quant_tables[1][0][i]= quant11[i];
1004 s->quant_tables[1][1][i]= 11*quant11[i];
1005 s->quant_tables[1][2][i]= 11*11*quant5 [i];
1006 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
1007 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
1009 s->quant_tables[0][0][i]= quant9_10bit[i];
1010 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
1011 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
1012 s->quant_tables[1][0][i]= quant9_10bit[i];
1013 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
1014 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
1015 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
1016 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
1019 s->context_count[0]= (11*11*11+1)/2;
1020 s->context_count[1]= (11*11*5*5*5+1)/2;
1021 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
1023 for(i=0; i<s->plane_count; i++){
1024 PlaneContext * const p= &s->plane[i];
1026 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
1027 p->quant_table_index= avctx->context_model;
1028 p->context_count= s->context_count[p->quant_table_index];
1031 if(allocate_initial_states(s) < 0)
1032 return AVERROR(ENOMEM);
1034 avctx->coded_frame= &s->picture;
1035 if(!s->transparency)
1037 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
1039 s->picture_number=0;
1041 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
1042 for(i=0; i<s->quant_table_count; i++){
1043 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
1045 return AVERROR(ENOMEM);
1048 if(avctx->stats_in){
1049 char *p= avctx->stats_in;
1050 uint8_t best_state[256][256];
1054 av_assert0(s->version>=2);
1057 for(j=0; j<256; j++){
1059 s->rc_stat[j][i]= strtol(p, &next, 0);
1061 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1067 for(i=0; i<s->quant_table_count; i++){
1068 for(j=0; j<s->context_count[i]; j++){
1069 for(k=0; k<32; k++){
1071 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1073 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1074 return AVERROR_INVALIDDATA;
1081 gob_count= strtol(p, &next, 0);
1082 if(next==p || gob_count <0){
1083 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1084 return AVERROR_INVALIDDATA;
1087 while(*p=='\n' || *p==' ') p++;
1090 sort_stt(s, s->state_transition);
1092 find_best_state(best_state, s->state_transition);
1094 for(i=0; i<s->quant_table_count; i++){
1095 for(j=0; j<s->context_count[i]; j++){
1096 for(k=0; k<32; k++){
1098 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1099 p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1101 s->initial_states[i][j][k]= best_state[av_clip(round(p), 1, 255)][av_clip((s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1])/gob_count, 0, 255)];
1108 for(s->num_v_slices=2; s->num_v_slices<9; s->num_v_slices++){
1109 for(s->num_h_slices=s->num_v_slices; s->num_h_slices<2*s->num_v_slices; s->num_h_slices++){
1110 if(avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64 || !avctx->slices)
1114 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);
1117 write_extra_header(s);
1120 if(init_slice_contexts(s) < 0)
1122 if(init_slices_state(s) < 0)
1125 #define STATS_OUT_SIZE 1024*1024*6
1126 if(avctx->flags & CODEC_FLAG_PASS1){
1127 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1128 for(i=0; i<s->quant_table_count; i++){
1129 for(j=0; j<s->slice_count; j++){
1130 FFV1Context *sf= s->slice_context[j];
1131 av_assert0(!sf->rc_stat2[i]);
1132 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1133 if(!sf->rc_stat2[i])
1134 return AVERROR(ENOMEM);
1141 #endif /* CONFIG_FFV1_ENCODER */
1144 static void clear_slice_state(FFV1Context *f, FFV1Context *fs){
1147 for(i=0; i<f->plane_count; i++){
1148 PlaneContext *p= &fs->plane[i];
1150 p->interlace_bit_state[0]= 128;
1151 p->interlace_bit_state[1]= 128;
1154 if(f->initial_states[p->quant_table_index]){
1155 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1157 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1159 for(j=0; j<p->context_count; j++){
1160 p->vlc_state[j].drift= 0;
1161 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1162 p->vlc_state[j].bias= 0;
1163 p->vlc_state[j].count= 1;
1169 #if CONFIG_FFV1_ENCODER
1171 static void encode_slice_header(FFV1Context *f, FFV1Context *fs){
1172 RangeCoder *c = &fs->c;
1173 uint8_t state[CONTEXT_SIZE];
1175 memset(state, 128, sizeof(state));
1177 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
1178 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
1179 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
1180 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
1181 for(j=0; j<f->plane_count; j++){
1182 put_symbol(c, state, f->plane[j].quant_table_index, 0);
1183 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
1185 if(!f->picture.interlaced_frame) put_symbol(c, state, 3, 0);
1186 else put_symbol(c, state, 1 + !f->picture.top_field_first, 0);
1187 put_symbol(c, state, f->picture.sample_aspect_ratio.num, 0);
1188 put_symbol(c, state, f->picture.sample_aspect_ratio.den, 0);
1191 static int encode_slice(AVCodecContext *c, void *arg){
1192 FFV1Context *fs= *(void**)arg;
1193 FFV1Context *f= fs->avctx->priv_data;
1194 int width = fs->slice_width;
1195 int height= fs->slice_height;
1198 AVFrame * const p= &f->picture;
1199 const int ps= (f->bits_per_raw_sample>8)+1;
1202 clear_slice_state(f, fs);
1204 encode_slice_header(f, fs);
1207 fs->ac_byte_count = f->version > 2 || (!x&&!y) ? ff_rac_terminate(&fs->c) : 0;
1208 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);
1211 if(f->colorspace==0){
1212 const int chroma_width = -((-width )>>f->chroma_h_shift);
1213 const int chroma_height= -((-height)>>f->chroma_v_shift);
1214 const int cx= x>>f->chroma_h_shift;
1215 const int cy= y>>f->chroma_v_shift;
1217 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1219 if (f->chroma_planes){
1220 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1221 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1223 if (fs->transparency)
1224 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1226 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1233 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1234 const AVFrame *pict, int *got_packet)
1236 FFV1Context *f = avctx->priv_data;
1237 RangeCoder * const c= &f->slice_context[0]->c;
1238 AVFrame * const p= &f->picture;
1240 uint8_t keystate=128;
1244 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*((8*2+1+1)*4)/8
1245 + FF_MIN_BUFFER_SIZE)) < 0)
1248 ff_init_range_encoder(c, pkt->data, pkt->size);
1249 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1252 p->pict_type= AV_PICTURE_TYPE_I;
1254 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1255 put_rac(c, &keystate, 1);
1260 put_rac(c, &keystate, 0);
1266 for(i=1; i<256; i++){
1267 c->one_state[i]= f->state_transition[i];
1268 c->zero_state[256-i]= 256-c->one_state[i];
1272 for(i=1; i<f->slice_count; i++){
1273 FFV1Context *fs= f->slice_context[i];
1274 uint8_t *start = pkt->data + (pkt->size-used_count)*i/f->slice_count;
1275 int len = pkt->size/f->slice_count;
1277 ff_init_range_encoder(&fs->c, start, len);
1279 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1282 for(i=0; i<f->slice_count; i++){
1283 FFV1Context *fs= f->slice_context[i];
1288 put_rac(&fs->c, &state, 0);
1289 bytes= ff_rac_terminate(&fs->c);
1291 flush_put_bits(&fs->pb); //nicer padding FIXME
1292 bytes= fs->ac_byte_count + (put_bits_count(&fs->pb)+7)/8;
1294 if(i>0 || f->version>2){
1295 av_assert0(bytes < pkt->size/f->slice_count);
1296 memmove(buf_p, fs->c.bytestream_start, bytes);
1297 av_assert0(bytes < (1<<24));
1298 AV_WB24(buf_p+bytes, bytes);
1304 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, bytes);
1305 AV_WL32(buf_p + bytes, v); bytes += 4;
1310 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1312 char *p= avctx->stats_out;
1313 char *end= p + STATS_OUT_SIZE;
1315 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1316 for(i=0; i<f->quant_table_count; i++)
1317 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1319 for(j=0; j<f->slice_count; j++){
1320 FFV1Context *fs= f->slice_context[j];
1321 for(i=0; i<256; i++){
1322 f->rc_stat[i][0] += fs->rc_stat[i][0];
1323 f->rc_stat[i][1] += fs->rc_stat[i][1];
1325 for(i=0; i<f->quant_table_count; i++){
1326 for(k=0; k<f->context_count[i]; k++){
1327 for(m=0; m<32; m++){
1328 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1329 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1335 for(j=0; j<256; j++){
1336 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1339 snprintf(p, end-p, "\n");
1341 for(i=0; i<f->quant_table_count; i++){
1342 for(j=0; j<f->context_count[i]; j++){
1343 for(m=0; m<32; m++){
1344 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1349 snprintf(p, end-p, "%d\n", f->gob_count);
1350 } else if(avctx->flags&CODEC_FLAG_PASS1)
1351 avctx->stats_out[0] = '\0';
1353 f->picture_number++;
1354 pkt->size = buf_p - pkt->data;
1355 pkt->flags |= AV_PKT_FLAG_KEY*p->key_frame;
1360 #endif /* CONFIG_FFV1_ENCODER */
1362 static av_cold int common_end(AVCodecContext *avctx){
1363 FFV1Context *s = avctx->priv_data;
1366 if (avctx->codec->decode && s->picture.data[0])
1367 avctx->release_buffer(avctx, &s->picture);
1368 if (avctx->codec->decode && s->last_picture.data[0])
1369 avctx->release_buffer(avctx, &s->last_picture);
1371 for(j=0; j<s->slice_count; j++){
1372 FFV1Context *fs= s->slice_context[j];
1373 for(i=0; i<s->plane_count; i++){
1374 PlaneContext *p= &fs->plane[i];
1376 av_freep(&p->state);
1377 av_freep(&p->vlc_state);
1379 av_freep(&fs->sample_buffer);
1382 av_freep(&avctx->stats_out);
1383 for(j=0; j<s->quant_table_count; j++){
1384 av_freep(&s->initial_states[j]);
1385 for(i=0; i<s->slice_count; i++){
1386 FFV1Context *sf= s->slice_context[i];
1387 av_freep(&sf->rc_stat2[j]);
1389 av_freep(&s->rc_stat2[j]);
1392 for(i=0; i<s->slice_count; i++){
1393 av_freep(&s->slice_context[i]);
1399 static av_always_inline void decode_line(FFV1Context *s, int w,
1401 int plane_index, int bits)
1403 PlaneContext * const p= &s->plane[plane_index];
1404 RangeCoder * const c= &s->c;
1408 int run_index= s->run_index;
1411 int diff, context, sign;
1413 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1420 av_assert2(context < p->context_count);
1423 diff= get_symbol_inline(c, p->state[context], 1);
1425 if(context == 0 && run_mode==0) run_mode=1;
1428 if(run_count==0 && run_mode==1){
1429 if(get_bits1(&s->gb)){
1430 run_count = 1<<ff_log2_run[run_index];
1431 if(x + run_count <= w) run_index++;
1433 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1435 if(run_index) run_index--;
1443 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1448 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1450 // printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb));
1453 if(sign) diff= -diff;
1455 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1457 s->run_index= run_index;
1460 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1463 sample[0]=s->sample_buffer +3;
1464 sample[1]=s->sample_buffer+w+6+3;
1468 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1471 int16_t *temp = sample[0]; //FIXME try a normal buffer
1473 sample[0]= sample[1];
1476 sample[1][-1]= sample[0][0 ];
1477 sample[0][ w]= sample[0][w-1];
1480 if(s->avctx->bits_per_raw_sample <= 8){
1481 decode_line(s, w, sample, plane_index, 8);
1483 src[x + stride*y]= sample[1][x];
1486 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1487 if(s->packed_at_lsb){
1489 ((uint16_t*)(src + stride*y))[x]= sample[1][x];
1493 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1497 //STOP_TIMER("decode-line")}
1501 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1503 int16_t *sample[4][2];
1505 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1506 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1511 memset(s->sample_buffer, 0, 8*(w+6)*sizeof(*s->sample_buffer));
1514 for(p=0; p<3 + s->transparency; p++){
1515 int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1517 sample[p][0]= sample[p][1];
1520 sample[p][1][-1]= sample[p][0][0 ];
1521 sample[p][0][ w]= sample[p][0][w-1];
1522 decode_line(s, w, sample[p], (p+1)/2, 9);
1525 int g= sample[0][1][x];
1526 int b= sample[1][1][x];
1527 int r= sample[2][1][x];
1528 int a= sample[3][1][x];
1530 // assert(g>=0 && b>=0 && r>=0);
1531 // assert(g<256 && b<512 && r<512);
1539 src[x + stride*y]= b + (g<<8) + (r<<16) + (a<<24);
1544 static int decode_slice_header(FFV1Context *f, FFV1Context *fs){
1545 RangeCoder *c = &fs->c;
1546 uint8_t state[CONTEXT_SIZE];
1547 unsigned ps, i, context_count;
1548 memset(state, 128, sizeof(state));
1550 av_assert0(f->version > 2);
1552 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1553 fs->slice_y = get_symbol(c, state, 0) *f->height;
1554 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1555 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1557 fs->slice_x /= f->num_h_slices;
1558 fs->slice_y /= f->num_v_slices;
1559 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1560 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1561 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1563 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1564 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1567 for(i=0; i<f->plane_count; i++){
1568 PlaneContext * const p= &fs->plane[i];
1569 int idx=get_symbol(c, state, 0);
1570 if(idx > (unsigned)f->quant_table_count){
1571 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1574 p->quant_table_index= idx;
1575 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1576 context_count= f->context_count[idx];
1578 if(p->context_count < context_count){
1579 av_freep(&p->state);
1580 av_freep(&p->vlc_state);
1582 p->context_count= context_count;
1585 ps = get_symbol(c, state, 0);
1587 f->picture.interlaced_frame = 1;
1588 f->picture.top_field_first = 1;
1590 f->picture.interlaced_frame = 1;
1591 f->picture.top_field_first = 0;
1593 f->picture.interlaced_frame = 0;
1595 f->picture.sample_aspect_ratio.num = get_symbol(c, state, 0);
1596 f->picture.sample_aspect_ratio.den = get_symbol(c, state, 0);
1601 static int decode_slice(AVCodecContext *c, void *arg){
1602 FFV1Context *fs= *(void**)arg;
1603 FFV1Context *f= fs->avctx->priv_data;
1604 int width, height, x, y;
1605 const int ps= (c->bits_per_raw_sample>8)+1;
1606 AVFrame * const p= &f->picture;
1609 if(init_slice_state(f, fs) < 0)
1610 return AVERROR(ENOMEM);
1611 if(decode_slice_header(f, fs) < 0)
1612 return AVERROR_INVALIDDATA;
1614 if(init_slice_state(f, fs) < 0)
1615 return AVERROR(ENOMEM);
1616 if(f->picture.key_frame)
1617 clear_slice_state(f, fs);
1618 width = fs->slice_width;
1619 height= fs->slice_height;
1624 fs->ac_byte_count = f->version > 2 || (!x&&!y) ? fs->c.bytestream - fs->c.bytestream_start - 1 : 0;
1625 init_get_bits(&fs->gb,
1626 fs->c.bytestream_start + fs->ac_byte_count,
1627 (fs->c.bytestream_end - fs->c.bytestream_start - fs->ac_byte_count) * 8);
1630 av_assert1(width && height);
1631 if(f->colorspace==0){
1632 const int chroma_width = -((-width )>>f->chroma_h_shift);
1633 const int chroma_height= -((-height)>>f->chroma_v_shift);
1634 const int cx= x>>f->chroma_h_shift;
1635 const int cy= y>>f->chroma_v_shift;
1636 decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1638 if (f->chroma_planes){
1639 decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1640 decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1642 if (fs->transparency)
1643 decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1645 decode_rgb_frame(fs, (uint32_t*)p->data[0] + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1653 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1656 uint8_t state[CONTEXT_SIZE];
1658 memset(state, 128, sizeof(state));
1660 for(v=0; i<128 ; v++){
1661 unsigned len= get_symbol(c, state, 0) + 1;
1663 if(len > 128 - i) return -1;
1666 quant_table[i] = scale*v;
1669 //if(i%16==0) printf("\n");
1673 for(i=1; i<128; i++){
1674 quant_table[256-i]= -quant_table[i];
1676 quant_table[128]= -quant_table[127];
1681 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1683 int context_count=1;
1686 context_count*= read_quant_table(c, quant_table[i], context_count);
1687 if(context_count > 32768U){
1691 return (context_count+1)/2;
1694 static int read_extra_header(FFV1Context *f){
1695 RangeCoder * const c= &f->c;
1696 uint8_t state[CONTEXT_SIZE];
1698 uint8_t state2[32][CONTEXT_SIZE];
1700 memset(state2, 128, sizeof(state2));
1701 memset(state, 128, sizeof(state));
1703 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1704 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1706 f->version= get_symbol(c, state, 0);
1707 if(f->version > 2) {
1708 c->bytestream_end -= 4;
1709 f->minor_version= get_symbol(c, state, 0);
1711 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1713 for(i=1; i<256; i++){
1714 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1717 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1718 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1719 f->chroma_planes= get_rac(c, state);
1720 f->chroma_h_shift= get_symbol(c, state, 0);
1721 f->chroma_v_shift= get_symbol(c, state, 0);
1722 f->transparency= get_rac(c, state);
1723 f->plane_count= 2 + f->transparency;
1724 f->num_h_slices= 1 + get_symbol(c, state, 0);
1725 f->num_v_slices= 1 + get_symbol(c, state, 0);
1726 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1727 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1731 f->quant_table_count= get_symbol(c, state, 0);
1732 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1734 for(i=0; i<f->quant_table_count; i++){
1735 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1736 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1741 if(allocate_initial_states(f) < 0)
1742 return AVERROR(ENOMEM);
1744 for(i=0; i<f->quant_table_count; i++){
1745 if(get_rac(c, state)){
1746 for(j=0; j<f->context_count[i]; j++){
1747 for(k=0; k<CONTEXT_SIZE; k++){
1748 int pred= j ? f->initial_states[i][j-1][k] : 128;
1749 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1756 f->ec = get_symbol(c, state, 0);
1761 v = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, f->avctx->extradata, f->avctx->extradata_size);
1763 av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!\n", v);
1764 return AVERROR_INVALIDDATA;
1771 static int read_header(FFV1Context *f){
1772 uint8_t state[CONTEXT_SIZE];
1773 int i, j, context_count;
1774 RangeCoder * const c= &f->slice_context[0]->c;
1776 memset(state, 128, sizeof(state));
1779 unsigned v= get_symbol(c, state, 0);
1781 av_log(f->avctx, AV_LOG_ERROR, "invalid version %d in ver01 header\n", v);
1782 return AVERROR_INVALIDDATA;
1785 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1787 for(i=1; i<256; i++){
1788 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1791 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1793 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1794 f->chroma_planes= get_rac(c, state);
1795 f->chroma_h_shift= get_symbol(c, state, 0);
1796 f->chroma_v_shift= get_symbol(c, state, 0);
1797 f->transparency= get_rac(c, state);
1798 f->plane_count= 2 + f->transparency;
1801 if(f->colorspace==0){
1802 if(!f->transparency && !f->chroma_planes){
1803 if (f->avctx->bits_per_raw_sample<=8)
1804 f->avctx->pix_fmt= PIX_FMT_GRAY8;
1806 f->avctx->pix_fmt= PIX_FMT_GRAY16;
1807 }else if(f->avctx->bits_per_raw_sample<=8 && !f->transparency){
1808 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1809 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1810 case 0x01: f->avctx->pix_fmt= PIX_FMT_YUV440P; break;
1811 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1812 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1813 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1814 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1816 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1819 }else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
1820 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1821 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
1822 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUVA422P; break;
1823 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
1825 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1828 }else if(f->avctx->bits_per_raw_sample==9) {
1830 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1831 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P9; break;
1832 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P9; break;
1833 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P9; break;
1835 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1838 }else if(f->avctx->bits_per_raw_sample==10) {
1840 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1841 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P10; break;
1842 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P10; break;
1843 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P10; break;
1845 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1849 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1850 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1851 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1852 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1854 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1858 }else if(f->colorspace==1){
1859 if(f->chroma_h_shift || f->chroma_v_shift){
1860 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1863 if(f->transparency) f->avctx->pix_fmt= PIX_FMT_RGB32;
1864 else f->avctx->pix_fmt= PIX_FMT_0RGB32;
1866 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1870 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1872 context_count= read_quant_tables(c, f->quant_table);
1873 if(context_count < 0){
1874 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1877 }else if(f->version < 3){
1878 f->slice_count= get_symbol(c, state, 0);
1880 const uint8_t *p= c->bytestream_end;
1881 for(f->slice_count = 0; f->slice_count < MAX_SLICES && 3 < p - c->bytestream_start; f->slice_count++){
1882 int trailer = 3 + 5*!!f->ec;
1883 int size = AV_RB24(p-trailer);
1884 if(size + trailer > p - c->bytestream_start)
1886 p -= size + trailer;
1889 if(f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0){
1890 av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid\n", f->slice_count);
1894 for(j=0; j<f->slice_count; j++){
1895 FFV1Context *fs= f->slice_context[j];
1897 fs->packed_at_lsb= f->packed_at_lsb;
1899 if(f->version == 2){
1900 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1901 fs->slice_y = get_symbol(c, state, 0) *f->height;
1902 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1903 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1905 fs->slice_x /= f->num_h_slices;
1906 fs->slice_y /= f->num_v_slices;
1907 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1908 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1909 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1911 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1912 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1916 for(i=0; i<f->plane_count; i++){
1917 PlaneContext * const p= &fs->plane[i];
1919 if(f->version == 2){
1920 int idx=get_symbol(c, state, 0);
1921 if(idx > (unsigned)f->quant_table_count){
1922 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1925 p->quant_table_index= idx;
1926 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1927 context_count= f->context_count[idx];
1929 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1932 if(f->version <= 2){
1933 if(p->context_count < context_count){
1934 av_freep(&p->state);
1935 av_freep(&p->vlc_state);
1937 p->context_count= context_count;
1944 static av_cold int decode_init(AVCodecContext *avctx)
1946 FFV1Context *f = avctx->priv_data;
1950 if(avctx->extradata && read_extra_header(f) < 0)
1953 if(init_slice_contexts(f) < 0)
1959 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1960 const uint8_t *buf = avpkt->data;
1961 int buf_size = avpkt->size;
1962 FFV1Context *f = avctx->priv_data;
1963 RangeCoder * const c= &f->slice_context[0]->c;
1964 AVFrame * const p= &f->picture;
1966 uint8_t keystate= 128;
1967 const uint8_t *buf_p;
1969 AVFrame *picture = data;
1971 /* release previously stored data */
1973 avctx->release_buffer(avctx, p);
1975 ff_init_range_decoder(c, buf, buf_size);
1976 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1979 p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1980 if(get_rac(c, &keystate)){
1982 f->key_frame_ok = 0;
1983 if(read_header(f) < 0)
1985 f->key_frame_ok = 1;
1987 if (!f->key_frame_ok) {
1988 av_log(avctx, AV_LOG_ERROR, "Cant decode non keyframe without valid keyframe\n");
1989 return AVERROR_INVALIDDATA;
1994 p->reference= 3; //for error concealment
1995 if(avctx->get_buffer(avctx, p) < 0){
1996 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2000 if(avctx->debug&FF_DEBUG_PICT_INFO)
2001 av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d\n",
2002 f->version, p->key_frame, f->ac, f->ec, f->slice_count);
2004 buf_p= buf + buf_size;
2005 for(i=f->slice_count-1; i>=0; i--){
2006 FFV1Context *fs= f->slice_context[i];
2007 int trailer = 3 + 5*!!f->ec;
2010 if(i || f->version>2) v = AV_RB24(buf_p-trailer)+trailer;
2011 else v = buf_p - c->bytestream_start;
2012 if(buf_p - c->bytestream_start < v){
2013 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
2019 unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, v);
2021 int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
2022 av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!", crc);
2023 if(ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
2024 av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n",ts*av_q2d(avctx->pkt_timebase));
2025 } else if(ts != AV_NOPTS_VALUE) {
2026 av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts);
2028 av_log(f->avctx, AV_LOG_ERROR, "\n");
2034 ff_init_range_decoder(&fs->c, buf_p, v);
2038 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
2039 f->picture_number++;
2042 *data_size = sizeof(AVFrame);
2044 FFSWAP(AVFrame, f->picture, f->last_picture);
2049 AVCodec ff_ffv1_decoder = {
2051 .type = AVMEDIA_TYPE_VIDEO,
2052 .id = CODEC_ID_FFV1,
2053 .priv_data_size = sizeof(FFV1Context),
2054 .init = decode_init,
2055 .close = common_end,
2056 .decode = decode_frame,
2057 .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ |
2058 CODEC_CAP_SLICE_THREADS,
2059 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
2062 #if CONFIG_FFV1_ENCODER
2064 #define OFFSET(x) offsetof(FFV1Context, x)
2065 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
2066 static const AVOption options[] = {
2067 { "slicecrc", "Protect slices with CRCs", OFFSET(ec), AV_OPT_TYPE_INT, {-1}, -1, 1, VE},
2071 static const AVClass class = {
2072 .class_name = "ffv1 encoder",
2073 .item_name = av_default_item_name,
2075 .version = LIBAVUTIL_VERSION_INT,
2078 static const AVCodecDefault ffv1_defaults[] = {
2083 AVCodec ff_ffv1_encoder = {
2085 .type = AVMEDIA_TYPE_VIDEO,
2086 .id = CODEC_ID_FFV1,
2087 .priv_data_size = sizeof(FFV1Context),
2088 .init = encode_init,
2089 .encode2 = encode_frame,
2090 .close = common_end,
2091 .capabilities = CODEC_CAP_SLICE_THREADS,
2092 .defaults = ffv1_defaults,
2093 .pix_fmts = (const enum PixelFormat[]){
2094 PIX_FMT_YUV420P, PIX_FMT_YUVA420P, PIX_FMT_YUVA422P, PIX_FMT_YUV444P,
2095 PIX_FMT_YUVA444P, PIX_FMT_YUV440P, PIX_FMT_YUV422P, PIX_FMT_YUV411P,
2096 PIX_FMT_YUV410P, PIX_FMT_0RGB32, PIX_FMT_RGB32, PIX_FMT_YUV420P16,
2097 PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_YUV444P9, PIX_FMT_YUV422P9,
2098 PIX_FMT_YUV420P9, PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_YUV444P10,
2099 PIX_FMT_GRAY16, PIX_FMT_GRAY8,
2102 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
2103 .priv_class = &class,