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)
32 #include "rangecoder.h"
35 #include "libavutil/avassert.h"
38 #define CONTEXT_SIZE 32
40 #define MAX_QUANT_TABLES 8
41 #define MAX_CONTEXT_INPUTS 5
43 extern const uint8_t ff_log2_run[41];
45 static const int8_t quant5_10bit[256]={
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49 1, 1, 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,-2,
58 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
64 static const int8_t quant5[256]={
65 0, 1, 1, 1, 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,-2,-2,-2,
80 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
83 static const int8_t quant9_10bit[256]={
84 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
86 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
87 3, 3, 3, 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,-4,-4,-4,
96 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
97 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
98 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
99 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
102 static const int8_t quant11[256]={
103 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 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,-5,-5,
116 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
117 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
118 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
121 static const uint8_t ver2_state[256]= {
122 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
123 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
124 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
125 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
126 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
127 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
128 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
129 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
130 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
131 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
132 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
133 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
134 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
135 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
136 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
137 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
140 typedef struct VlcState{
147 typedef struct PlaneContext{
148 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
149 int quant_table_index;
151 uint8_t (*state)[CONTEXT_SIZE];
153 uint8_t interlace_bit_state[2];
156 #define MAX_SLICES 256
158 typedef struct FFV1Context{
159 AVCodecContext *avctx;
163 uint64_t rc_stat[256][2];
164 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
167 int chroma_h_shift, chroma_v_shift;
174 int ac; ///< 1=range coder <-> 0=golomb rice
175 PlaneContext plane[MAX_PLANES];
176 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
177 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
178 int context_count[MAX_QUANT_TABLES];
179 uint8_t state_transition[256];
180 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
183 int16_t *sample_buffer;
187 int quant_table_count;
191 struct FFV1Context *slice_context[MAX_SLICES];
199 int bits_per_raw_sample;
202 static av_always_inline int fold(int diff, int bits){
214 static inline int predict(int16_t *src, int16_t *last)
216 const int LT= last[-1];
217 const int T= last[ 0];
218 const int L = src[-1];
220 return mid_pred(L, L + T - LT, T);
223 static inline int get_context(PlaneContext *p, int16_t *src,
224 int16_t *last, int16_t *last2)
226 const int LT= last[-1];
227 const int T= last[ 0];
228 const int RT= last[ 1];
229 const int L = src[-1];
231 if(p->quant_table[3][127]){
232 const int TT= last2[0];
233 const int LL= src[-2];
234 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
235 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
237 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
240 static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
245 l2tab[i]= log2(i/256.0);
247 for(i=0; i<256; i++){
248 double best_len[256];
254 for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
258 for(k=0; k<256; k++){
259 double newocc[256]={0};
260 for(m=0; m<256; m++){
262 len -=occ[m]*( p *l2tab[ m]
263 + (1-p)*l2tab[256-m]);
266 if(len < best_len[k]){
270 for(m=0; m<256; m++){
272 newocc[ one_state[ m]] += occ[m]* p ;
273 newocc[256-one_state[256-m]] += occ[m]*(1-p);
276 memcpy(occ, newocc, sizeof(occ));
282 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]){
285 #define put_rac(C,S,B) \
289 rc_stat2[(S)-state][B]++;\
295 const int a= FFABS(v);
296 const int e= av_log2(a);
297 put_rac(c, state+0, 0);
300 put_rac(c, state+1+i, 1); //1..10
302 put_rac(c, state+1+i, 0);
304 for(i=e-1; i>=0; i--){
305 put_rac(c, state+22+i, (a>>i)&1); //22..31
309 put_rac(c, state+11 + e, v < 0); //11..21
312 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
314 put_rac(c, state+1+9, 0);
316 for(i=e-1; i>=0; i--){
317 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
321 put_rac(c, state+11 + 10, v < 0); //11..21
324 put_rac(c, state+0, 1);
329 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
330 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
333 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
334 if(get_rac(c, state+0))
339 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
344 for(i=e-1; i>=0; i--){
345 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
348 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
353 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
354 return get_symbol_inline(c, state, is_signed);
357 static inline void update_vlc_state(VlcState * const state, const int v){
358 int drift= state->drift;
359 int count= state->count;
360 state->error_sum += FFABS(v);
363 if(count == 128){ //FIXME variable
366 state->error_sum >>= 1;
371 if(state->bias > -128) state->bias--;
377 if(state->bias < 127) state->bias++;
388 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
390 //printf("final: %d ", v);
391 v = fold(v - state->bias, bits);
395 while(i < state->error_sum){ //FIXME optimize
403 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
406 code= v ^ ((2*state->drift + state->count)>>31);
409 //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);
410 set_sr_golomb(pb, code, k, 12, bits);
412 update_vlc_state(state, v);
415 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
420 while(i < state->error_sum){ //FIXME optimize
427 v= get_sr_golomb(gb, k, 12, bits);
428 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
431 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
433 v ^= ((2*state->drift + state->count)>>31);
436 ret= fold(v + state->bias, bits);
438 update_vlc_state(state, v);
439 //printf("final: %d\n", ret);
443 #if CONFIG_FFV1_ENCODER
444 static av_always_inline int encode_line(FFV1Context *s, int w,
446 int plane_index, int bits)
448 PlaneContext * const p= &s->plane[plane_index];
449 RangeCoder * const c= &s->c;
451 int run_index= s->run_index;
456 if(c->bytestream_end - c->bytestream < w*20){
457 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
461 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
462 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
470 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
471 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
478 diff= fold(diff, bits);
481 if(s->flags & CODEC_FLAG_PASS1){
482 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
484 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
487 if(context == 0) run_mode=1;
492 while(run_count >= 1<<ff_log2_run[run_index]){
493 run_count -= 1<<ff_log2_run[run_index];
495 put_bits(&s->pb, 1, 1);
498 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
499 if(run_index) run_index--;
508 // 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));
511 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
515 while(run_count >= 1<<ff_log2_run[run_index]){
516 run_count -= 1<<ff_log2_run[run_index];
518 put_bits(&s->pb, 1, 1);
522 put_bits(&s->pb, 1, 1);
524 s->run_index= run_index;
529 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
531 const int ring_size= s->avctx->context_model ? 3 : 2;
535 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
538 for(i=0; i<ring_size; i++)
539 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
541 sample[0][-1]= sample[1][0 ];
542 sample[1][ w]= sample[1][w-1];
544 if(s->bits_per_raw_sample<=8){
546 sample[0][x]= src[x + stride*y];
548 encode_line(s, w, sample, plane_index, 8);
550 if(s->packed_at_lsb){
552 sample[0][x]= ((uint16_t*)(src + stride*y))[x];
556 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
559 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
561 //STOP_TIMER("encode line")}
565 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
567 const int ring_size= s->avctx->context_model ? 3 : 2;
568 int16_t *sample[4][3];
571 memset(s->sample_buffer, 0, ring_size*4*(w+6)*sizeof(*s->sample_buffer));
574 for(i=0; i<ring_size; i++)
576 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
579 unsigned v= src[x + stride*y];
591 // assert(g>=0 && b>=0 && r>=0);
592 // assert(g<256 && b<512 && r<512);
598 for(p=0; p<3 + s->transparency; p++){
599 sample[p][0][-1]= sample[p][1][0 ];
600 sample[p][1][ w]= sample[p][1][w-1];
601 encode_line(s, w, sample[p], (p+1)/2, 9);
606 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
609 uint8_t state[CONTEXT_SIZE];
610 memset(state, 128, sizeof(state));
612 for(i=1; i<128 ; i++){
613 if(quant_table[i] != quant_table[i-1]){
614 put_symbol(c, state, i-last-1, 0);
618 put_symbol(c, state, i-last-1, 0);
621 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
624 write_quant_table(c, quant_table[i]);
627 static void write_header(FFV1Context *f){
628 uint8_t state[CONTEXT_SIZE];
630 RangeCoder * const c= &f->slice_context[0]->c;
632 memset(state, 128, sizeof(state));
635 put_symbol(c, state, f->version, 0);
636 put_symbol(c, state, f->ac, 0);
638 for(i=1; i<256; i++){
639 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
642 put_symbol(c, state, f->colorspace, 0); //YUV cs type
644 put_symbol(c, state, f->bits_per_raw_sample, 0);
645 put_rac(c, state, f->chroma_planes);
646 put_symbol(c, state, f->chroma_h_shift, 0);
647 put_symbol(c, state, f->chroma_v_shift, 0);
648 put_rac(c, state, f->transparency);
650 write_quant_tables(c, f->quant_table);
652 put_symbol(c, state, f->slice_count, 0);
653 for(i=0; i<f->slice_count; i++){
654 FFV1Context *fs= f->slice_context[i];
655 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
656 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
657 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
658 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
659 for(j=0; j<f->plane_count; j++){
660 put_symbol(c, state, f->plane[j].quant_table_index, 0);
661 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
666 #endif /* CONFIG_FFV1_ENCODER */
668 static av_cold int common_init(AVCodecContext *avctx){
669 FFV1Context *s = avctx->priv_data;
672 s->flags= avctx->flags;
674 avcodec_get_frame_defaults(&s->picture);
676 dsputil_init(&s->dsp, avctx);
678 s->width = avctx->width;
679 s->height= avctx->height;
681 assert(s->width && s->height);
690 static int init_slice_state(FFV1Context *f){
693 for(i=0; i<f->slice_count; i++){
694 FFV1Context *fs= f->slice_context[i];
695 fs->plane_count= f->plane_count;
696 fs->transparency= f->transparency;
697 for(j=0; j<f->plane_count; j++){
698 PlaneContext * const p= &fs->plane[j];
701 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
703 return AVERROR(ENOMEM);
705 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
707 return AVERROR(ENOMEM);
712 //FIXME only redo if state_transition changed
713 for(j=1; j<256; j++){
714 fs->c.one_state [ j]= fs->state_transition[j];
715 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
723 static av_cold int init_slice_contexts(FFV1Context *f){
726 f->slice_count= f->num_h_slices * f->num_v_slices;
728 for(i=0; i<f->slice_count; i++){
729 FFV1Context *fs= av_mallocz(sizeof(*fs));
730 int sx= i % f->num_h_slices;
731 int sy= i / f->num_h_slices;
732 int sxs= f->avctx->width * sx / f->num_h_slices;
733 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
734 int sys= f->avctx->height* sy / f->num_v_slices;
735 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
736 f->slice_context[i]= fs;
737 memcpy(fs, f, sizeof(*fs));
738 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
740 fs->slice_width = sxe - sxs;
741 fs->slice_height= sye - sys;
745 fs->sample_buffer = av_malloc(3*4 * (fs->width+6) * sizeof(*fs->sample_buffer));
746 if (!fs->sample_buffer)
747 return AVERROR(ENOMEM);
752 static int allocate_initial_states(FFV1Context *f){
755 for(i=0; i<f->quant_table_count; i++){
756 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
757 if(!f->initial_states[i])
758 return AVERROR(ENOMEM);
759 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
764 #if CONFIG_FFV1_ENCODER
765 static int write_extra_header(FFV1Context *f){
766 RangeCoder * const c= &f->c;
767 uint8_t state[CONTEXT_SIZE];
769 uint8_t state2[32][CONTEXT_SIZE];
771 memset(state2, 128, sizeof(state2));
772 memset(state, 128, sizeof(state));
774 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
775 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
776 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
778 put_symbol(c, state, f->version, 0);
779 put_symbol(c, state, f->ac, 0);
781 for(i=1; i<256; i++){
782 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
785 put_symbol(c, state, f->colorspace, 0); //YUV cs type
786 put_symbol(c, state, f->bits_per_raw_sample, 0);
787 put_rac(c, state, f->chroma_planes);
788 put_symbol(c, state, f->chroma_h_shift, 0);
789 put_symbol(c, state, f->chroma_v_shift, 0);
790 put_rac(c, state, f->transparency);
791 put_symbol(c, state, f->num_h_slices-1, 0);
792 put_symbol(c, state, f->num_v_slices-1, 0);
794 put_symbol(c, state, f->quant_table_count, 0);
795 for(i=0; i<f->quant_table_count; i++)
796 write_quant_tables(c, f->quant_tables[i]);
798 for(i=0; i<f->quant_table_count; i++){
799 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
800 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
802 if(j<f->context_count[i]*CONTEXT_SIZE){
803 put_rac(c, state, 1);
804 for(j=0; j<f->context_count[i]; j++){
805 for(k=0; k<CONTEXT_SIZE; k++){
806 int pred= j ? f->initial_states[i][j-1][k] : 128;
807 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
811 put_rac(c, state, 0);
815 f->avctx->extradata_size= ff_rac_terminate(c);
820 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
821 int i,i2,changed,print=0;
825 for(i=12; i<244; i++){
826 for(i2=i+1; i2<245 && i2<i+4; i2++){
827 #define COST(old, new) \
828 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
829 +s->rc_stat[old][1]*-log2( (new) /256.0)
831 #define COST2(old, new) \
833 +COST(256-(old), 256-(new))
835 double size0= COST2(i, i ) + COST2(i2, i2);
836 double sizeX= COST2(i, i2) + COST2(i2, i );
837 if(sizeX < size0 && i!=128 && i2!=128){
839 FFSWAP(int, stt[ i], stt[ i2]);
840 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
841 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
843 FFSWAP(int, stt[256-i], stt[256-i2]);
844 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
845 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
847 for(j=1; j<256; j++){
848 if (stt[j] == i ) stt[j] = i2;
849 else if(stt[j] == i2) stt[j] = i ;
851 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
852 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
863 static av_cold int encode_init(AVCodecContext *avctx)
865 FFV1Context *s = avctx->priv_data;
871 s->ac= avctx->coder_type ? 2:0;
875 s->state_transition[i]=ver2_state[i];
878 switch(avctx->pix_fmt){
879 case PIX_FMT_YUV420P9:
880 if (!avctx->bits_per_raw_sample)
881 s->bits_per_raw_sample = 9;
882 case PIX_FMT_YUV420P10:
883 case PIX_FMT_YUV422P10:
884 s->packed_at_lsb = 1;
885 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
886 s->bits_per_raw_sample = 10;
888 case PIX_FMT_YUV444P16:
889 case PIX_FMT_YUV422P16:
890 case PIX_FMT_YUV420P16:
891 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
892 s->bits_per_raw_sample = 16;
893 } else if (!s->bits_per_raw_sample){
894 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
896 if(s->bits_per_raw_sample <=8){
897 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
901 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
904 s->version= FFMAX(s->version, 1);
905 case PIX_FMT_YUV444P:
906 case PIX_FMT_YUV440P:
907 case PIX_FMT_YUV422P:
908 case PIX_FMT_YUV420P:
909 case PIX_FMT_YUV411P:
910 case PIX_FMT_YUV410P:
911 s->chroma_planes= avctx->pix_fmt == PIX_FMT_GRAY16 ? 0 : 1;
914 case PIX_FMT_YUVA444P:
915 case PIX_FMT_YUVA420P:
928 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
931 for(i=0; i<256; i++){
932 s->quant_table_count=2;
933 if(s->bits_per_raw_sample <=8){
934 s->quant_tables[0][0][i]= quant11[i];
935 s->quant_tables[0][1][i]= 11*quant11[i];
936 s->quant_tables[0][2][i]= 11*11*quant11[i];
937 s->quant_tables[1][0][i]= quant11[i];
938 s->quant_tables[1][1][i]= 11*quant11[i];
939 s->quant_tables[1][2][i]= 11*11*quant5 [i];
940 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
941 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
943 s->quant_tables[0][0][i]= quant9_10bit[i];
944 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
945 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
946 s->quant_tables[1][0][i]= quant9_10bit[i];
947 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
948 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
949 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
950 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
953 s->context_count[0]= (11*11*11+1)/2;
954 s->context_count[1]= (11*11*5*5*5+1)/2;
955 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
957 for(i=0; i<s->plane_count; i++){
958 PlaneContext * const p= &s->plane[i];
960 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
961 p->quant_table_index= avctx->context_model;
962 p->context_count= s->context_count[p->quant_table_index];
965 if(allocate_initial_states(s) < 0)
966 return AVERROR(ENOMEM);
968 avctx->coded_frame= &s->picture;
971 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
975 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
976 for(i=0; i<s->quant_table_count; i++){
977 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
979 return AVERROR(ENOMEM);
983 char *p= avctx->stats_in;
984 uint8_t best_state[256][256];
988 av_assert0(s->version>=2);
991 for(j=0; j<256; j++){
993 s->rc_stat[j][i]= strtol(p, &next, 0);
995 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1001 for(i=0; i<s->quant_table_count; i++){
1002 for(j=0; j<s->context_count[i]; j++){
1003 for(k=0; k<32; k++){
1005 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1007 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1015 gob_count= strtol(p, &next, 0);
1016 if(next==p || gob_count <0){
1017 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1021 while(*p=='\n' || *p==' ') p++;
1024 sort_stt(s, s->state_transition);
1026 find_best_state(best_state, s->state_transition);
1028 for(i=0; i<s->quant_table_count; i++){
1029 for(j=0; j<s->context_count[i]; j++){
1030 for(k=0; k<32; k++){
1032 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1033 p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1035 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)];
1044 write_extra_header(s);
1047 if(init_slice_contexts(s) < 0)
1049 if(init_slice_state(s) < 0)
1052 #define STATS_OUT_SIZE 1024*1024*6
1053 if(avctx->flags & CODEC_FLAG_PASS1){
1054 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1055 for(i=0; i<s->quant_table_count; i++){
1056 for(j=0; j<s->slice_count; j++){
1057 FFV1Context *sf= s->slice_context[j];
1058 av_assert0(!sf->rc_stat2[i]);
1059 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1060 if(!sf->rc_stat2[i])
1061 return AVERROR(ENOMEM);
1068 #endif /* CONFIG_FFV1_ENCODER */
1071 static void clear_state(FFV1Context *f){
1074 for(si=0; si<f->slice_count; si++){
1075 FFV1Context *fs= f->slice_context[si];
1076 for(i=0; i<f->plane_count; i++){
1077 PlaneContext *p= &fs->plane[i];
1079 p->interlace_bit_state[0]= 128;
1080 p->interlace_bit_state[1]= 128;
1083 if(f->initial_states[p->quant_table_index]){
1084 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1086 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1088 for(j=0; j<p->context_count; j++){
1089 p->vlc_state[j].drift= 0;
1090 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1091 p->vlc_state[j].bias= 0;
1092 p->vlc_state[j].count= 1;
1099 #if CONFIG_FFV1_ENCODER
1100 static int encode_slice(AVCodecContext *c, void *arg){
1101 FFV1Context *fs= *(void**)arg;
1102 FFV1Context *f= fs->avctx->priv_data;
1103 int width = fs->slice_width;
1104 int height= fs->slice_height;
1107 AVFrame * const p= &f->picture;
1108 const int ps= (f->bits_per_raw_sample>8)+1;
1110 if(f->colorspace==0){
1111 const int chroma_width = -((-width )>>f->chroma_h_shift);
1112 const int chroma_height= -((-height)>>f->chroma_v_shift);
1113 const int cx= x>>f->chroma_h_shift;
1114 const int cy= y>>f->chroma_v_shift;
1116 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1118 if (f->chroma_planes){
1119 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1120 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1122 if (fs->transparency)
1123 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1125 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1132 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1133 FFV1Context *f = avctx->priv_data;
1134 RangeCoder * const c= &f->slice_context[0]->c;
1135 AVFrame *pict = data;
1136 AVFrame * const p= &f->picture;
1138 uint8_t keystate=128;
1142 ff_init_range_encoder(c, buf, buf_size);
1143 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1146 p->pict_type= AV_PICTURE_TYPE_I;
1148 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1149 put_rac(c, &keystate, 1);
1155 put_rac(c, &keystate, 0);
1160 used_count += ff_rac_terminate(c);
1161 //printf("pos=%d\n", used_count);
1162 init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1165 for(i=1; i<256; i++){
1166 c->one_state[i]= f->state_transition[i];
1167 c->zero_state[256-i]= 256-c->one_state[i];
1171 for(i=1; i<f->slice_count; i++){
1172 FFV1Context *fs= f->slice_context[i];
1173 uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1174 int len= buf_size/f->slice_count;
1177 ff_init_range_encoder(&fs->c, start, len);
1179 init_put_bits(&fs->pb, start, len);
1182 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1185 for(i=0; i<f->slice_count; i++){
1186 FFV1Context *fs= f->slice_context[i];
1191 put_rac(&fs->c, &state, 0);
1192 bytes= ff_rac_terminate(&fs->c);
1194 flush_put_bits(&fs->pb); //nicer padding FIXME
1195 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1199 av_assert0(bytes < buf_size/f->slice_count);
1200 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1201 av_assert0(bytes < (1<<24));
1202 AV_WB24(buf_p+bytes, bytes);
1208 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1210 char *p= avctx->stats_out;
1211 char *end= p + STATS_OUT_SIZE;
1213 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1214 for(i=0; i<f->quant_table_count; i++)
1215 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1217 for(j=0; j<f->slice_count; j++){
1218 FFV1Context *fs= f->slice_context[j];
1219 for(i=0; i<256; i++){
1220 f->rc_stat[i][0] += fs->rc_stat[i][0];
1221 f->rc_stat[i][1] += fs->rc_stat[i][1];
1223 for(i=0; i<f->quant_table_count; i++){
1224 for(k=0; k<f->context_count[i]; k++){
1225 for(m=0; m<32; m++){
1226 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1227 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1233 for(j=0; j<256; j++){
1234 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1237 snprintf(p, end-p, "\n");
1239 for(i=0; i<f->quant_table_count; i++){
1240 for(j=0; j<f->context_count[i]; j++){
1241 for(m=0; m<32; m++){
1242 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1247 snprintf(p, end-p, "%d\n", f->gob_count);
1248 } else if(avctx->flags&CODEC_FLAG_PASS1)
1249 avctx->stats_out[0] = '\0';
1251 f->picture_number++;
1254 #endif /* CONFIG_FFV1_ENCODER */
1256 static av_cold int common_end(AVCodecContext *avctx){
1257 FFV1Context *s = avctx->priv_data;
1260 if (avctx->codec->decode && s->picture.data[0])
1261 avctx->release_buffer(avctx, &s->picture);
1263 for(j=0; j<s->slice_count; j++){
1264 FFV1Context *fs= s->slice_context[j];
1265 for(i=0; i<s->plane_count; i++){
1266 PlaneContext *p= &fs->plane[i];
1268 av_freep(&p->state);
1269 av_freep(&p->vlc_state);
1271 av_freep(&fs->sample_buffer);
1274 av_freep(&avctx->stats_out);
1275 for(j=0; j<s->quant_table_count; j++){
1276 av_freep(&s->initial_states[j]);
1277 for(i=0; i<s->slice_count; i++){
1278 FFV1Context *sf= s->slice_context[i];
1279 av_freep(&sf->rc_stat2[j]);
1281 av_freep(&s->rc_stat2[j]);
1284 for(i=0; i<s->slice_count; i++){
1285 av_freep(&s->slice_context[i]);
1291 static av_always_inline void decode_line(FFV1Context *s, int w,
1293 int plane_index, int bits)
1295 PlaneContext * const p= &s->plane[plane_index];
1296 RangeCoder * const c= &s->c;
1300 int run_index= s->run_index;
1303 int diff, context, sign;
1305 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1312 av_assert2(context < p->context_count);
1315 diff= get_symbol_inline(c, p->state[context], 1);
1317 if(context == 0 && run_mode==0) run_mode=1;
1320 if(run_count==0 && run_mode==1){
1321 if(get_bits1(&s->gb)){
1322 run_count = 1<<ff_log2_run[run_index];
1323 if(x + run_count <= w) run_index++;
1325 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1327 if(run_index) run_index--;
1335 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1340 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1342 // 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));
1345 if(sign) diff= -diff;
1347 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1349 s->run_index= run_index;
1352 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1355 sample[0]=s->sample_buffer +3;
1356 sample[1]=s->sample_buffer+w+6+3;
1360 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1363 int16_t *temp = sample[0]; //FIXME try a normal buffer
1365 sample[0]= sample[1];
1368 sample[1][-1]= sample[0][0 ];
1369 sample[0][ w]= sample[0][w-1];
1372 if(s->avctx->bits_per_raw_sample <= 8){
1373 decode_line(s, w, sample, plane_index, 8);
1375 src[x + stride*y]= sample[1][x];
1378 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1379 if(s->packed_at_lsb){
1381 ((uint16_t*)(src + stride*y))[x]= sample[1][x];
1385 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1389 //STOP_TIMER("decode-line")}
1393 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1395 int16_t *sample[4][2];
1397 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1398 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1403 memset(s->sample_buffer, 0, 8*(w+6)*sizeof(*s->sample_buffer));
1406 for(p=0; p<3 + s->transparency; p++){
1407 int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1409 sample[p][0]= sample[p][1];
1412 sample[p][1][-1]= sample[p][0][0 ];
1413 sample[p][0][ w]= sample[p][0][w-1];
1414 decode_line(s, w, sample[p], (p+1)/2, 9);
1417 int g= sample[0][1][x];
1418 int b= sample[1][1][x];
1419 int r= sample[2][1][x];
1420 int a= sample[3][1][x];
1422 // assert(g>=0 && b>=0 && r>=0);
1423 // assert(g<256 && b<512 && r<512);
1431 src[x + stride*y]= b + (g<<8) + (r<<16) + (a<<24);
1436 static int decode_slice(AVCodecContext *c, void *arg){
1437 FFV1Context *fs= *(void**)arg;
1438 FFV1Context *f= fs->avctx->priv_data;
1439 int width = fs->slice_width;
1440 int height= fs->slice_height;
1443 const int ps= (c->bits_per_raw_sample>8)+1;
1444 AVFrame * const p= &f->picture;
1446 av_assert1(width && height);
1447 if(f->colorspace==0){
1448 const int chroma_width = -((-width )>>f->chroma_h_shift);
1449 const int chroma_height= -((-height)>>f->chroma_v_shift);
1450 const int cx= x>>f->chroma_h_shift;
1451 const int cy= y>>f->chroma_v_shift;
1452 decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1454 if (f->chroma_planes){
1455 decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1456 decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1458 if (fs->transparency)
1459 decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1461 decode_rgb_frame(fs, (uint32_t*)p->data[0] + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1469 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1472 uint8_t state[CONTEXT_SIZE];
1474 memset(state, 128, sizeof(state));
1476 for(v=0; i<128 ; v++){
1477 int len= get_symbol(c, state, 0) + 1;
1479 if(len + i > 128) return -1;
1482 quant_table[i] = scale*v;
1485 //if(i%16==0) printf("\n");
1489 for(i=1; i<128; i++){
1490 quant_table[256-i]= -quant_table[i];
1492 quant_table[128]= -quant_table[127];
1497 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1499 int context_count=1;
1502 context_count*= read_quant_table(c, quant_table[i], context_count);
1503 if(context_count > 32768U){
1507 return (context_count+1)/2;
1510 static int read_extra_header(FFV1Context *f){
1511 RangeCoder * const c= &f->c;
1512 uint8_t state[CONTEXT_SIZE];
1514 uint8_t state2[32][CONTEXT_SIZE];
1516 memset(state2, 128, sizeof(state2));
1517 memset(state, 128, sizeof(state));
1519 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1520 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1522 f->version= get_symbol(c, state, 0);
1523 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1525 for(i=1; i<256; i++){
1526 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1529 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1530 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1531 get_rac(c, state); //no chroma = false
1532 f->chroma_h_shift= get_symbol(c, state, 0);
1533 f->chroma_v_shift= get_symbol(c, state, 0);
1534 f->transparency= get_rac(c, state);
1535 f->plane_count= 2 + f->transparency;
1536 f->num_h_slices= 1 + get_symbol(c, state, 0);
1537 f->num_v_slices= 1 + get_symbol(c, state, 0);
1538 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1539 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1543 f->quant_table_count= get_symbol(c, state, 0);
1544 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1546 for(i=0; i<f->quant_table_count; i++){
1547 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1548 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1553 if(allocate_initial_states(f) < 0)
1554 return AVERROR(ENOMEM);
1556 for(i=0; i<f->quant_table_count; i++){
1557 if(get_rac(c, state)){
1558 for(j=0; j<f->context_count[i]; j++){
1559 for(k=0; k<CONTEXT_SIZE; k++){
1560 int pred= j ? f->initial_states[i][j-1][k] : 128;
1561 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1570 static int read_header(FFV1Context *f){
1571 uint8_t state[CONTEXT_SIZE];
1572 int i, j, context_count;
1573 RangeCoder * const c= &f->slice_context[0]->c;
1575 memset(state, 128, sizeof(state));
1578 f->version= get_symbol(c, state, 0);
1579 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1581 for(i=1; i<256; i++){
1582 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1585 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1587 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1588 f->chroma_planes= get_rac(c, state);
1589 f->chroma_h_shift= get_symbol(c, state, 0);
1590 f->chroma_v_shift= get_symbol(c, state, 0);
1591 f->transparency= get_rac(c, state);
1592 f->plane_count= 2 + f->transparency;
1595 if(f->colorspace==0){
1596 if(f->avctx->bits_per_raw_sample>8 && !f->transparency && !f->chroma_planes){
1597 f->avctx->pix_fmt= PIX_FMT_GRAY16;
1598 }else if(f->avctx->bits_per_raw_sample<=8 && !f->transparency){
1599 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1600 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1601 case 0x01: f->avctx->pix_fmt= PIX_FMT_YUV440P; break;
1602 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1603 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1604 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1605 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1607 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1610 }else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
1611 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1612 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
1613 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
1615 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1618 }else if(f->avctx->bits_per_raw_sample==9) {
1619 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1620 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1621 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1622 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P9 ; f->packed_at_lsb=1; break;
1624 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1627 }else if(f->avctx->bits_per_raw_sample==10) {
1628 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1629 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1630 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P10; f->packed_at_lsb=1; break;
1631 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P10; f->packed_at_lsb=1; break;
1633 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1637 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1638 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1639 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1640 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1642 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1646 }else if(f->colorspace==1){
1647 if(f->chroma_h_shift || f->chroma_v_shift){
1648 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1651 if(f->transparency) f->avctx->pix_fmt= PIX_FMT_RGB32;
1652 else f->avctx->pix_fmt= PIX_FMT_0RGB32;
1654 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1658 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1660 context_count= read_quant_tables(c, f->quant_table);
1661 if(context_count < 0){
1662 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1666 f->slice_count= get_symbol(c, state, 0);
1667 if(f->slice_count > (unsigned)MAX_SLICES)
1671 for(j=0; j<f->slice_count; j++){
1672 FFV1Context *fs= f->slice_context[j];
1674 fs->packed_at_lsb= f->packed_at_lsb;
1676 if(f->version >= 2){
1677 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1678 fs->slice_y = get_symbol(c, state, 0) *f->height;
1679 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1680 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1682 fs->slice_x /= f->num_h_slices;
1683 fs->slice_y /= f->num_v_slices;
1684 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1685 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1686 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1688 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1689 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1693 for(i=0; i<f->plane_count; i++){
1694 PlaneContext * const p= &fs->plane[i];
1696 if(f->version >= 2){
1697 int idx=get_symbol(c, state, 0);
1698 if(idx > (unsigned)f->quant_table_count){
1699 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1702 p->quant_table_index= idx;
1703 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1704 context_count= f->context_count[idx];
1706 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1709 if(p->context_count < context_count){
1710 av_freep(&p->state);
1711 av_freep(&p->vlc_state);
1713 p->context_count= context_count;
1720 static av_cold int decode_init(AVCodecContext *avctx)
1722 FFV1Context *f = avctx->priv_data;
1726 if(avctx->extradata && read_extra_header(f) < 0)
1729 if(init_slice_contexts(f) < 0)
1735 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1736 const uint8_t *buf = avpkt->data;
1737 int buf_size = avpkt->size;
1738 FFV1Context *f = avctx->priv_data;
1739 RangeCoder * const c= &f->slice_context[0]->c;
1740 AVFrame * const p= &f->picture;
1742 uint8_t keystate= 128;
1743 const uint8_t *buf_p;
1745 AVFrame *picture = data;
1747 /* release previously stored data */
1749 avctx->release_buffer(avctx, p);
1751 ff_init_range_decoder(c, buf, buf_size);
1752 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1755 p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1756 if(get_rac(c, &keystate)){
1758 if(read_header(f) < 0)
1760 if(init_slice_state(f) < 0)
1769 for(i=1; i<256; i++){
1770 c->one_state[i]= f->state_transition[i];
1771 c->zero_state[256-i]= 256-c->one_state[i];
1776 if(avctx->get_buffer(avctx, p) < 0){
1777 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1781 if(avctx->debug&FF_DEBUG_PICT_INFO)
1782 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1785 bytes_read = c->bytestream - c->bytestream_start - 1;
1786 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1787 //printf("pos=%d\n", bytes_read);
1788 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, (buf_size - bytes_read) * 8);
1790 bytes_read = 0; /* avoid warning */
1793 buf_p= buf + buf_size;
1794 for(i=f->slice_count-1; i>0; i--){
1795 FFV1Context *fs= f->slice_context[i];
1796 int v= AV_RB24(buf_p-3)+3;
1797 if(buf_p - buf <= v){
1798 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1803 ff_init_range_decoder(&fs->c, buf_p, v);
1805 init_get_bits(&fs->gb, buf_p, v * 8);
1809 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1810 f->picture_number++;
1813 *data_size = sizeof(AVFrame);
1818 AVCodec ff_ffv1_decoder = {
1820 .type = AVMEDIA_TYPE_VIDEO,
1821 .id = CODEC_ID_FFV1,
1822 .priv_data_size = sizeof(FFV1Context),
1823 .init = decode_init,
1824 .close = common_end,
1825 .decode = decode_frame,
1826 .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ | CODEC_CAP_SLICE_THREADS,
1827 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1830 #if CONFIG_FFV1_ENCODER
1831 AVCodec ff_ffv1_encoder = {
1833 .type = AVMEDIA_TYPE_VIDEO,
1834 .id = CODEC_ID_FFV1,
1835 .priv_data_size = sizeof(FFV1Context),
1836 .init = encode_init,
1837 .encode = encode_frame,
1838 .close = common_end,
1839 .capabilities = CODEC_CAP_SLICE_THREADS,
1840 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUVA420P, PIX_FMT_YUV444P, PIX_FMT_YUVA444P, PIX_FMT_YUV440P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_0RGB32, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_YUV420P9, PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_GRAY16, PIX_FMT_NONE},
1841 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),