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/pixdesc.h"
36 #include "libavutil/avassert.h"
39 #define CONTEXT_SIZE 32
41 #define MAX_QUANT_TABLES 8
42 #define MAX_CONTEXT_INPUTS 5
44 extern const uint8_t ff_log2_run[41];
46 static const int8_t quant5_10bit[256]={
47 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50 1, 1, 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,-2,
59 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
62 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
65 static const int8_t quant5[256]={
66 0, 1, 1, 1, 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,-2,-2,-2,
81 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
84 static const int8_t quant9_10bit[256]={
85 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
87 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
88 3, 3, 3, 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,-4,-4,-4,
97 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
98 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
99 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
100 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
103 static const int8_t quant11[256]={
104 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
105 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
106 4, 4, 4, 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,-5,-5,
117 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
118 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
119 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
122 static const uint8_t ver2_state[256]= {
123 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
124 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
125 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
126 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
127 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
128 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
129 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
130 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
131 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
132 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
133 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
134 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
135 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
136 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
137 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
138 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
141 typedef struct VlcState{
148 typedef struct PlaneContext{
149 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
150 int quant_table_index;
152 uint8_t (*state)[CONTEXT_SIZE];
154 uint8_t interlace_bit_state[2];
157 #define MAX_SLICES 256
159 typedef struct FFV1Context{
160 AVCodecContext *avctx;
164 uint64_t rc_stat[256][2];
165 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
168 int chroma_h_shift, chroma_v_shift;
175 int ac; ///< 1=range coder <-> 0=golomb rice
176 PlaneContext plane[MAX_PLANES];
177 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
178 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
179 int context_count[MAX_QUANT_TABLES];
180 uint8_t state_transition[256];
181 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
184 int16_t *sample_buffer;
188 int quant_table_count;
192 struct FFV1Context *slice_context[MAX_SLICES];
200 int bits_per_raw_sample;
203 static av_always_inline int fold(int diff, int bits){
215 static inline int predict(int16_t *src, int16_t *last)
217 const int LT= last[-1];
218 const int T= last[ 0];
219 const int L = src[-1];
221 return mid_pred(L, L + T - LT, T);
224 static inline int get_context(PlaneContext *p, int16_t *src,
225 int16_t *last, int16_t *last2)
227 const int LT= last[-1];
228 const int T= last[ 0];
229 const int RT= last[ 1];
230 const int L = src[-1];
232 if(p->quant_table[3][127]){
233 const int TT= last2[0];
234 const int LL= src[-2];
235 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
236 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
238 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
241 static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
246 l2tab[i]= log2(i/256.0);
248 for(i=0; i<256; i++){
249 double best_len[256];
255 for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
259 for(k=0; k<256; k++){
260 double newocc[256]={0};
261 for(m=0; m<256; m++){
263 len -=occ[m]*( p *l2tab[ m]
264 + (1-p)*l2tab[256-m]);
267 if(len < best_len[k]){
271 for(m=0; m<256; m++){
273 newocc[ one_state[ m]] += occ[m]* p ;
274 newocc[256-one_state[256-m]] += occ[m]*(1-p);
277 memcpy(occ, newocc, sizeof(occ));
283 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]){
286 #define put_rac(C,S,B) \
290 rc_stat2[(S)-state][B]++;\
296 const int a= FFABS(v);
297 const int e= av_log2(a);
298 put_rac(c, state+0, 0);
301 put_rac(c, state+1+i, 1); //1..10
303 put_rac(c, state+1+i, 0);
305 for(i=e-1; i>=0; i--){
306 put_rac(c, state+22+i, (a>>i)&1); //22..31
310 put_rac(c, state+11 + e, v < 0); //11..21
313 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
315 put_rac(c, state+1+9, 0);
317 for(i=e-1; i>=0; i--){
318 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
322 put_rac(c, state+11 + 10, v < 0); //11..21
325 put_rac(c, state+0, 1);
330 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
331 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
334 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
335 if(get_rac(c, state+0))
340 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
345 for(i=e-1; i>=0; i--){
346 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
349 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
354 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
355 return get_symbol_inline(c, state, is_signed);
358 static inline void update_vlc_state(VlcState * const state, const int v){
359 int drift= state->drift;
360 int count= state->count;
361 state->error_sum += FFABS(v);
364 if(count == 128){ //FIXME variable
367 state->error_sum >>= 1;
372 if(state->bias > -128) state->bias--;
378 if(state->bias < 127) state->bias++;
389 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
391 //printf("final: %d ", v);
392 v = fold(v - state->bias, bits);
396 while(i < state->error_sum){ //FIXME optimize
404 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
407 code= v ^ ((2*state->drift + state->count)>>31);
410 //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);
411 set_sr_golomb(pb, code, k, 12, bits);
413 update_vlc_state(state, v);
416 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
421 while(i < state->error_sum){ //FIXME optimize
428 v= get_sr_golomb(gb, k, 12, bits);
429 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
432 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
434 v ^= ((2*state->drift + state->count)>>31);
437 ret= fold(v + state->bias, bits);
439 update_vlc_state(state, v);
440 //printf("final: %d\n", ret);
444 #if CONFIG_FFV1_ENCODER
445 static av_always_inline int encode_line(FFV1Context *s, int w,
447 int plane_index, int bits)
449 PlaneContext * const p= &s->plane[plane_index];
450 RangeCoder * const c= &s->c;
452 int run_index= s->run_index;
457 if(c->bytestream_end - c->bytestream < w*20){
458 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
462 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
463 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
471 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
472 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
479 diff= fold(diff, bits);
482 if(s->flags & CODEC_FLAG_PASS1){
483 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
485 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
488 if(context == 0) run_mode=1;
493 while(run_count >= 1<<ff_log2_run[run_index]){
494 run_count -= 1<<ff_log2_run[run_index];
496 put_bits(&s->pb, 1, 1);
499 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
500 if(run_index) run_index--;
509 // 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));
512 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
516 while(run_count >= 1<<ff_log2_run[run_index]){
517 run_count -= 1<<ff_log2_run[run_index];
519 put_bits(&s->pb, 1, 1);
523 put_bits(&s->pb, 1, 1);
525 s->run_index= run_index;
530 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
532 const int ring_size= s->avctx->context_model ? 3 : 2;
536 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
539 for(i=0; i<ring_size; i++)
540 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
542 sample[0][-1]= sample[1][0 ];
543 sample[1][ w]= sample[1][w-1];
545 if(s->bits_per_raw_sample<=8){
547 sample[0][x]= src[x + stride*y];
549 encode_line(s, w, sample, plane_index, 8);
551 if(s->packed_at_lsb){
553 sample[0][x]= ((uint16_t*)(src + stride*y))[x];
557 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
560 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
562 //STOP_TIMER("encode line")}
566 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
568 const int ring_size= s->avctx->context_model ? 3 : 2;
569 int16_t *sample[4][3];
572 memset(s->sample_buffer, 0, ring_size*4*(w+6)*sizeof(*s->sample_buffer));
575 for(i=0; i<ring_size; i++)
577 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
580 unsigned v= src[x + stride*y];
592 // assert(g>=0 && b>=0 && r>=0);
593 // assert(g<256 && b<512 && r<512);
599 for(p=0; p<3 + s->transparency; p++){
600 sample[p][0][-1]= sample[p][1][0 ];
601 sample[p][1][ w]= sample[p][1][w-1];
602 encode_line(s, w, sample[p], (p+1)/2, 9);
607 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
610 uint8_t state[CONTEXT_SIZE];
611 memset(state, 128, sizeof(state));
613 for(i=1; i<128 ; i++){
614 if(quant_table[i] != quant_table[i-1]){
615 put_symbol(c, state, i-last-1, 0);
619 put_symbol(c, state, i-last-1, 0);
622 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
625 write_quant_table(c, quant_table[i]);
628 static void write_header(FFV1Context *f){
629 uint8_t state[CONTEXT_SIZE];
631 RangeCoder * const c= &f->slice_context[0]->c;
633 memset(state, 128, sizeof(state));
636 put_symbol(c, state, f->version, 0);
637 put_symbol(c, state, f->ac, 0);
639 for(i=1; i<256; i++){
640 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
643 put_symbol(c, state, f->colorspace, 0); //YUV cs type
645 put_symbol(c, state, f->bits_per_raw_sample, 0);
646 put_rac(c, state, f->chroma_planes);
647 put_symbol(c, state, f->chroma_h_shift, 0);
648 put_symbol(c, state, f->chroma_v_shift, 0);
649 put_rac(c, state, f->transparency);
651 write_quant_tables(c, f->quant_table);
653 put_symbol(c, state, f->slice_count, 0);
654 for(i=0; i<f->slice_count; i++){
655 FFV1Context *fs= f->slice_context[i];
656 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
657 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
658 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
659 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
660 for(j=0; j<f->plane_count; j++){
661 put_symbol(c, state, f->plane[j].quant_table_index, 0);
662 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
667 #endif /* CONFIG_FFV1_ENCODER */
669 static av_cold int common_init(AVCodecContext *avctx){
670 FFV1Context *s = avctx->priv_data;
673 s->flags= avctx->flags;
675 avcodec_get_frame_defaults(&s->picture);
677 ff_dsputil_init(&s->dsp, avctx);
679 s->width = avctx->width;
680 s->height= avctx->height;
682 assert(s->width && s->height);
691 static int init_slice_state(FFV1Context *f){
694 for(i=0; i<f->slice_count; i++){
695 FFV1Context *fs= f->slice_context[i];
696 fs->plane_count= f->plane_count;
697 fs->transparency= f->transparency;
698 for(j=0; j<f->plane_count; j++){
699 PlaneContext * const p= &fs->plane[j];
702 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
704 return AVERROR(ENOMEM);
706 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
708 return AVERROR(ENOMEM);
713 //FIXME only redo if state_transition changed
714 for(j=1; j<256; j++){
715 fs->c.one_state [ j]= fs->state_transition[j];
716 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
724 static av_cold int init_slice_contexts(FFV1Context *f){
727 f->slice_count= f->num_h_slices * f->num_v_slices;
729 for(i=0; i<f->slice_count; i++){
730 FFV1Context *fs= av_mallocz(sizeof(*fs));
731 int sx= i % f->num_h_slices;
732 int sy= i / f->num_h_slices;
733 int sxs= f->avctx->width * sx / f->num_h_slices;
734 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
735 int sys= f->avctx->height* sy / f->num_v_slices;
736 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
737 f->slice_context[i]= fs;
738 memcpy(fs, f, sizeof(*fs));
739 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
741 fs->slice_width = sxe - sxs;
742 fs->slice_height= sye - sys;
746 fs->sample_buffer = av_malloc(3*4 * (fs->width+6) * sizeof(*fs->sample_buffer));
747 if (!fs->sample_buffer)
748 return AVERROR(ENOMEM);
753 static int allocate_initial_states(FFV1Context *f){
756 for(i=0; i<f->quant_table_count; i++){
757 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
758 if(!f->initial_states[i])
759 return AVERROR(ENOMEM);
760 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
765 #if CONFIG_FFV1_ENCODER
766 static int write_extra_header(FFV1Context *f){
767 RangeCoder * const c= &f->c;
768 uint8_t state[CONTEXT_SIZE];
770 uint8_t state2[32][CONTEXT_SIZE];
772 memset(state2, 128, sizeof(state2));
773 memset(state, 128, sizeof(state));
775 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
776 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
777 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
779 put_symbol(c, state, f->version, 0);
780 put_symbol(c, state, f->ac, 0);
782 for(i=1; i<256; i++){
783 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
786 put_symbol(c, state, f->colorspace, 0); //YUV cs type
787 put_symbol(c, state, f->bits_per_raw_sample, 0);
788 put_rac(c, state, f->chroma_planes);
789 put_symbol(c, state, f->chroma_h_shift, 0);
790 put_symbol(c, state, f->chroma_v_shift, 0);
791 put_rac(c, state, f->transparency);
792 put_symbol(c, state, f->num_h_slices-1, 0);
793 put_symbol(c, state, f->num_v_slices-1, 0);
795 put_symbol(c, state, f->quant_table_count, 0);
796 for(i=0; i<f->quant_table_count; i++)
797 write_quant_tables(c, f->quant_tables[i]);
799 for(i=0; i<f->quant_table_count; i++){
800 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
801 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
803 if(j<f->context_count[i]*CONTEXT_SIZE){
804 put_rac(c, state, 1);
805 for(j=0; j<f->context_count[i]; j++){
806 for(k=0; k<CONTEXT_SIZE; k++){
807 int pred= j ? f->initial_states[i][j-1][k] : 128;
808 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
812 put_rac(c, state, 0);
816 f->avctx->extradata_size= ff_rac_terminate(c);
821 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
822 int i,i2,changed,print=0;
826 for(i=12; i<244; i++){
827 for(i2=i+1; i2<245 && i2<i+4; i2++){
828 #define COST(old, new) \
829 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
830 +s->rc_stat[old][1]*-log2( (new) /256.0)
832 #define COST2(old, new) \
834 +COST(256-(old), 256-(new))
836 double size0= COST2(i, i ) + COST2(i2, i2);
837 double sizeX= COST2(i, i2) + COST2(i2, i );
838 if(sizeX < size0 && i!=128 && i2!=128){
840 FFSWAP(int, stt[ i], stt[ i2]);
841 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
842 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
844 FFSWAP(int, stt[256-i], stt[256-i2]);
845 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
846 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
848 for(j=1; j<256; j++){
849 if (stt[j] == i ) stt[j] = i2;
850 else if(stt[j] == i2) stt[j] = i ;
852 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
853 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
864 static av_cold int encode_init(AVCodecContext *avctx)
866 FFV1Context *s = avctx->priv_data;
872 s->ac= avctx->coder_type ? 2:0;
876 s->state_transition[i]=ver2_state[i];
879 switch(avctx->pix_fmt){
880 case PIX_FMT_YUV420P9:
881 if (!avctx->bits_per_raw_sample)
882 s->bits_per_raw_sample = 9;
883 case PIX_FMT_YUV420P10:
884 case PIX_FMT_YUV422P10:
885 s->packed_at_lsb = 1;
886 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
887 s->bits_per_raw_sample = 10;
889 case PIX_FMT_YUV444P16:
890 case PIX_FMT_YUV422P16:
891 case PIX_FMT_YUV420P16:
892 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
893 s->bits_per_raw_sample = 16;
894 } else if (!s->bits_per_raw_sample){
895 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
897 if(s->bits_per_raw_sample <=8){
898 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
902 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
905 s->version= FFMAX(s->version, 1);
907 case PIX_FMT_YUV444P:
908 case PIX_FMT_YUV440P:
909 case PIX_FMT_YUV422P:
910 case PIX_FMT_YUV420P:
911 case PIX_FMT_YUV411P:
912 case PIX_FMT_YUV410P:
913 s->chroma_planes= av_pix_fmt_descriptors[avctx->pix_fmt].nb_components < 3 ? 0 : 1;
916 case PIX_FMT_YUVA444P:
917 case PIX_FMT_YUVA420P:
930 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
933 if (s->transparency) {
934 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
937 for(i=0; i<256; i++){
938 s->quant_table_count=2;
939 if(s->bits_per_raw_sample <=8){
940 s->quant_tables[0][0][i]= quant11[i];
941 s->quant_tables[0][1][i]= 11*quant11[i];
942 s->quant_tables[0][2][i]= 11*11*quant11[i];
943 s->quant_tables[1][0][i]= quant11[i];
944 s->quant_tables[1][1][i]= 11*quant11[i];
945 s->quant_tables[1][2][i]= 11*11*quant5 [i];
946 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
947 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
949 s->quant_tables[0][0][i]= quant9_10bit[i];
950 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
951 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
952 s->quant_tables[1][0][i]= quant9_10bit[i];
953 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
954 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
955 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
956 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
959 s->context_count[0]= (11*11*11+1)/2;
960 s->context_count[1]= (11*11*5*5*5+1)/2;
961 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
963 for(i=0; i<s->plane_count; i++){
964 PlaneContext * const p= &s->plane[i];
966 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
967 p->quant_table_index= avctx->context_model;
968 p->context_count= s->context_count[p->quant_table_index];
971 if(allocate_initial_states(s) < 0)
972 return AVERROR(ENOMEM);
974 avctx->coded_frame= &s->picture;
977 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
981 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
982 for(i=0; i<s->quant_table_count; i++){
983 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
985 return AVERROR(ENOMEM);
989 char *p= avctx->stats_in;
990 uint8_t best_state[256][256];
994 av_assert0(s->version>=2);
997 for(j=0; j<256; j++){
999 s->rc_stat[j][i]= strtol(p, &next, 0);
1001 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1007 for(i=0; i<s->quant_table_count; i++){
1008 for(j=0; j<s->context_count[i]; j++){
1009 for(k=0; k<32; k++){
1011 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1013 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1021 gob_count= strtol(p, &next, 0);
1022 if(next==p || gob_count <0){
1023 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1027 while(*p=='\n' || *p==' ') p++;
1030 sort_stt(s, s->state_transition);
1032 find_best_state(best_state, s->state_transition);
1034 for(i=0; i<s->quant_table_count; i++){
1035 for(j=0; j<s->context_count[i]; j++){
1036 for(k=0; k<32; k++){
1038 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1039 p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1041 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)];
1050 write_extra_header(s);
1053 if(init_slice_contexts(s) < 0)
1055 if(init_slice_state(s) < 0)
1058 #define STATS_OUT_SIZE 1024*1024*6
1059 if(avctx->flags & CODEC_FLAG_PASS1){
1060 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1061 for(i=0; i<s->quant_table_count; i++){
1062 for(j=0; j<s->slice_count; j++){
1063 FFV1Context *sf= s->slice_context[j];
1064 av_assert0(!sf->rc_stat2[i]);
1065 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1066 if(!sf->rc_stat2[i])
1067 return AVERROR(ENOMEM);
1074 #endif /* CONFIG_FFV1_ENCODER */
1077 static void clear_state(FFV1Context *f){
1080 for(si=0; si<f->slice_count; si++){
1081 FFV1Context *fs= f->slice_context[si];
1082 for(i=0; i<f->plane_count; i++){
1083 PlaneContext *p= &fs->plane[i];
1085 p->interlace_bit_state[0]= 128;
1086 p->interlace_bit_state[1]= 128;
1089 if(f->initial_states[p->quant_table_index]){
1090 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1092 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1094 for(j=0; j<p->context_count; j++){
1095 p->vlc_state[j].drift= 0;
1096 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1097 p->vlc_state[j].bias= 0;
1098 p->vlc_state[j].count= 1;
1105 #if CONFIG_FFV1_ENCODER
1106 static int encode_slice(AVCodecContext *c, void *arg){
1107 FFV1Context *fs= *(void**)arg;
1108 FFV1Context *f= fs->avctx->priv_data;
1109 int width = fs->slice_width;
1110 int height= fs->slice_height;
1113 AVFrame * const p= &f->picture;
1114 const int ps= (f->bits_per_raw_sample>8)+1;
1116 if(f->colorspace==0){
1117 const int chroma_width = -((-width )>>f->chroma_h_shift);
1118 const int chroma_height= -((-height)>>f->chroma_v_shift);
1119 const int cx= x>>f->chroma_h_shift;
1120 const int cy= y>>f->chroma_v_shift;
1122 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1124 if (f->chroma_planes){
1125 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1126 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1128 if (fs->transparency)
1129 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1131 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1138 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1139 const AVFrame *pict, int *got_packet)
1141 FFV1Context *f = avctx->priv_data;
1142 RangeCoder * const c= &f->slice_context[0]->c;
1143 AVFrame * const p= &f->picture;
1145 uint8_t keystate=128;
1150 (ret = av_new_packet(pkt, avctx->width*avctx->height*((8*2+1+1)*4)/8
1151 + FF_MIN_BUFFER_SIZE)) < 0) {
1152 av_log(avctx, AV_LOG_ERROR, "Error getting output packet.\n");
1156 ff_init_range_encoder(c, pkt->data, pkt->size);
1157 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1160 p->pict_type= AV_PICTURE_TYPE_I;
1162 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1163 put_rac(c, &keystate, 1);
1169 put_rac(c, &keystate, 0);
1174 used_count += ff_rac_terminate(c);
1175 //printf("pos=%d\n", used_count);
1176 init_put_bits(&f->slice_context[0]->pb, pkt->data + used_count, pkt->size - used_count);
1179 for(i=1; i<256; i++){
1180 c->one_state[i]= f->state_transition[i];
1181 c->zero_state[256-i]= 256-c->one_state[i];
1185 for(i=1; i<f->slice_count; i++){
1186 FFV1Context *fs= f->slice_context[i];
1187 uint8_t *start = pkt->data + (pkt->size-used_count)*i/f->slice_count;
1188 int len = pkt->size/f->slice_count;
1191 ff_init_range_encoder(&fs->c, start, len);
1193 init_put_bits(&fs->pb, start, len);
1196 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1199 for(i=0; i<f->slice_count; i++){
1200 FFV1Context *fs= f->slice_context[i];
1205 put_rac(&fs->c, &state, 0);
1206 bytes= ff_rac_terminate(&fs->c);
1208 flush_put_bits(&fs->pb); //nicer padding FIXME
1209 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1213 av_assert0(bytes < pkt->size/f->slice_count);
1214 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1215 av_assert0(bytes < (1<<24));
1216 AV_WB24(buf_p+bytes, bytes);
1222 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1224 char *p= avctx->stats_out;
1225 char *end= p + STATS_OUT_SIZE;
1227 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1228 for(i=0; i<f->quant_table_count; i++)
1229 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1231 for(j=0; j<f->slice_count; j++){
1232 FFV1Context *fs= f->slice_context[j];
1233 for(i=0; i<256; i++){
1234 f->rc_stat[i][0] += fs->rc_stat[i][0];
1235 f->rc_stat[i][1] += fs->rc_stat[i][1];
1237 for(i=0; i<f->quant_table_count; i++){
1238 for(k=0; k<f->context_count[i]; k++){
1239 for(m=0; m<32; m++){
1240 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1241 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1247 for(j=0; j<256; j++){
1248 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1251 snprintf(p, end-p, "\n");
1253 for(i=0; i<f->quant_table_count; i++){
1254 for(j=0; j<f->context_count[i]; j++){
1255 for(m=0; m<32; m++){
1256 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1261 snprintf(p, end-p, "%d\n", f->gob_count);
1262 } else if(avctx->flags&CODEC_FLAG_PASS1)
1263 avctx->stats_out[0] = '\0';
1265 f->picture_number++;
1266 pkt->size = buf_p - pkt->data;
1267 pkt->flags |= AV_PKT_FLAG_KEY*p->key_frame;
1272 #endif /* CONFIG_FFV1_ENCODER */
1274 static av_cold int common_end(AVCodecContext *avctx){
1275 FFV1Context *s = avctx->priv_data;
1278 if (avctx->codec->decode && s->picture.data[0])
1279 avctx->release_buffer(avctx, &s->picture);
1281 for(j=0; j<s->slice_count; j++){
1282 FFV1Context *fs= s->slice_context[j];
1283 for(i=0; i<s->plane_count; i++){
1284 PlaneContext *p= &fs->plane[i];
1286 av_freep(&p->state);
1287 av_freep(&p->vlc_state);
1289 av_freep(&fs->sample_buffer);
1292 av_freep(&avctx->stats_out);
1293 for(j=0; j<s->quant_table_count; j++){
1294 av_freep(&s->initial_states[j]);
1295 for(i=0; i<s->slice_count; i++){
1296 FFV1Context *sf= s->slice_context[i];
1297 av_freep(&sf->rc_stat2[j]);
1299 av_freep(&s->rc_stat2[j]);
1302 for(i=0; i<s->slice_count; i++){
1303 av_freep(&s->slice_context[i]);
1309 static av_always_inline void decode_line(FFV1Context *s, int w,
1311 int plane_index, int bits)
1313 PlaneContext * const p= &s->plane[plane_index];
1314 RangeCoder * const c= &s->c;
1318 int run_index= s->run_index;
1321 int diff, context, sign;
1323 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1330 av_assert2(context < p->context_count);
1333 diff= get_symbol_inline(c, p->state[context], 1);
1335 if(context == 0 && run_mode==0) run_mode=1;
1338 if(run_count==0 && run_mode==1){
1339 if(get_bits1(&s->gb)){
1340 run_count = 1<<ff_log2_run[run_index];
1341 if(x + run_count <= w) run_index++;
1343 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1345 if(run_index) run_index--;
1353 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1358 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1360 // 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));
1363 if(sign) diff= -diff;
1365 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1367 s->run_index= run_index;
1370 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1373 sample[0]=s->sample_buffer +3;
1374 sample[1]=s->sample_buffer+w+6+3;
1378 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1381 int16_t *temp = sample[0]; //FIXME try a normal buffer
1383 sample[0]= sample[1];
1386 sample[1][-1]= sample[0][0 ];
1387 sample[0][ w]= sample[0][w-1];
1390 if(s->avctx->bits_per_raw_sample <= 8){
1391 decode_line(s, w, sample, plane_index, 8);
1393 src[x + stride*y]= sample[1][x];
1396 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1397 if(s->packed_at_lsb){
1399 ((uint16_t*)(src + stride*y))[x]= sample[1][x];
1403 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1407 //STOP_TIMER("decode-line")}
1411 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1413 int16_t *sample[4][2];
1415 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1416 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1421 memset(s->sample_buffer, 0, 8*(w+6)*sizeof(*s->sample_buffer));
1424 for(p=0; p<3 + s->transparency; p++){
1425 int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1427 sample[p][0]= sample[p][1];
1430 sample[p][1][-1]= sample[p][0][0 ];
1431 sample[p][0][ w]= sample[p][0][w-1];
1432 decode_line(s, w, sample[p], (p+1)/2, 9);
1435 int g= sample[0][1][x];
1436 int b= sample[1][1][x];
1437 int r= sample[2][1][x];
1438 int a= sample[3][1][x];
1440 // assert(g>=0 && b>=0 && r>=0);
1441 // assert(g<256 && b<512 && r<512);
1449 src[x + stride*y]= b + (g<<8) + (r<<16) + (a<<24);
1454 static int decode_slice(AVCodecContext *c, void *arg){
1455 FFV1Context *fs= *(void**)arg;
1456 FFV1Context *f= fs->avctx->priv_data;
1457 int width = fs->slice_width;
1458 int height= fs->slice_height;
1461 const int ps= (c->bits_per_raw_sample>8)+1;
1462 AVFrame * const p= &f->picture;
1464 av_assert1(width && height);
1465 if(f->colorspace==0){
1466 const int chroma_width = -((-width )>>f->chroma_h_shift);
1467 const int chroma_height= -((-height)>>f->chroma_v_shift);
1468 const int cx= x>>f->chroma_h_shift;
1469 const int cy= y>>f->chroma_v_shift;
1470 decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1472 if (f->chroma_planes){
1473 decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1474 decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1476 if (fs->transparency)
1477 decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1479 decode_rgb_frame(fs, (uint32_t*)p->data[0] + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1487 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1490 uint8_t state[CONTEXT_SIZE];
1492 memset(state, 128, sizeof(state));
1494 for(v=0; i<128 ; v++){
1495 int len= get_symbol(c, state, 0) + 1;
1497 if(len + i > 128) return -1;
1500 quant_table[i] = scale*v;
1503 //if(i%16==0) printf("\n");
1507 for(i=1; i<128; i++){
1508 quant_table[256-i]= -quant_table[i];
1510 quant_table[128]= -quant_table[127];
1515 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1517 int context_count=1;
1520 context_count*= read_quant_table(c, quant_table[i], context_count);
1521 if(context_count > 32768U){
1525 return (context_count+1)/2;
1528 static int read_extra_header(FFV1Context *f){
1529 RangeCoder * const c= &f->c;
1530 uint8_t state[CONTEXT_SIZE];
1532 uint8_t state2[32][CONTEXT_SIZE];
1534 memset(state2, 128, sizeof(state2));
1535 memset(state, 128, sizeof(state));
1537 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1538 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1540 f->version= get_symbol(c, state, 0);
1541 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1543 for(i=1; i<256; i++){
1544 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1547 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1548 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1549 get_rac(c, state); //no chroma = false
1550 f->chroma_h_shift= get_symbol(c, state, 0);
1551 f->chroma_v_shift= get_symbol(c, state, 0);
1552 f->transparency= get_rac(c, state);
1553 f->plane_count= 2 + f->transparency;
1554 f->num_h_slices= 1 + get_symbol(c, state, 0);
1555 f->num_v_slices= 1 + get_symbol(c, state, 0);
1556 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1557 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1561 f->quant_table_count= get_symbol(c, state, 0);
1562 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1564 for(i=0; i<f->quant_table_count; i++){
1565 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1566 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1571 if(allocate_initial_states(f) < 0)
1572 return AVERROR(ENOMEM);
1574 for(i=0; i<f->quant_table_count; i++){
1575 if(get_rac(c, state)){
1576 for(j=0; j<f->context_count[i]; j++){
1577 for(k=0; k<CONTEXT_SIZE; k++){
1578 int pred= j ? f->initial_states[i][j-1][k] : 128;
1579 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1588 static int read_header(FFV1Context *f){
1589 uint8_t state[CONTEXT_SIZE];
1590 int i, j, context_count;
1591 RangeCoder * const c= &f->slice_context[0]->c;
1593 memset(state, 128, sizeof(state));
1596 f->version= get_symbol(c, state, 0);
1597 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1599 for(i=1; i<256; i++){
1600 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1603 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1605 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1606 f->chroma_planes= get_rac(c, state);
1607 f->chroma_h_shift= get_symbol(c, state, 0);
1608 f->chroma_v_shift= get_symbol(c, state, 0);
1609 f->transparency= get_rac(c, state);
1610 f->plane_count= 2 + f->transparency;
1613 if(f->colorspace==0){
1614 if(!f->transparency && !f->chroma_planes){
1615 if (f->avctx->bits_per_raw_sample<=8)
1616 f->avctx->pix_fmt= PIX_FMT_GRAY8;
1618 f->avctx->pix_fmt= PIX_FMT_GRAY16;
1619 }else if(f->avctx->bits_per_raw_sample<=8 && !f->transparency){
1620 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1621 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1622 case 0x01: f->avctx->pix_fmt= PIX_FMT_YUV440P; break;
1623 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1624 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1625 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1626 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1628 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1631 }else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
1632 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1633 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
1634 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
1636 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1639 }else if(f->avctx->bits_per_raw_sample==9) {
1640 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1641 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1642 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1643 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P9 ; f->packed_at_lsb=1; break;
1645 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1648 }else if(f->avctx->bits_per_raw_sample==10) {
1649 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1650 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1651 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P10; f->packed_at_lsb=1; break;
1652 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P10; f->packed_at_lsb=1; break;
1654 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1658 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1659 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1660 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1661 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1663 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1667 }else if(f->colorspace==1){
1668 if(f->chroma_h_shift || f->chroma_v_shift){
1669 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1672 if(f->transparency) f->avctx->pix_fmt= PIX_FMT_RGB32;
1673 else f->avctx->pix_fmt= PIX_FMT_0RGB32;
1675 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1679 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1681 context_count= read_quant_tables(c, f->quant_table);
1682 if(context_count < 0){
1683 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1687 f->slice_count= get_symbol(c, state, 0);
1688 if(f->slice_count > (unsigned)MAX_SLICES)
1692 for(j=0; j<f->slice_count; j++){
1693 FFV1Context *fs= f->slice_context[j];
1695 fs->packed_at_lsb= f->packed_at_lsb;
1697 if(f->version >= 2){
1698 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1699 fs->slice_y = get_symbol(c, state, 0) *f->height;
1700 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1701 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1703 fs->slice_x /= f->num_h_slices;
1704 fs->slice_y /= f->num_v_slices;
1705 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1706 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1707 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1709 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1710 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1714 for(i=0; i<f->plane_count; i++){
1715 PlaneContext * const p= &fs->plane[i];
1717 if(f->version >= 2){
1718 int idx=get_symbol(c, state, 0);
1719 if(idx > (unsigned)f->quant_table_count){
1720 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1723 p->quant_table_index= idx;
1724 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1725 context_count= f->context_count[idx];
1727 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1730 if(p->context_count < context_count){
1731 av_freep(&p->state);
1732 av_freep(&p->vlc_state);
1734 p->context_count= context_count;
1741 static av_cold int decode_init(AVCodecContext *avctx)
1743 FFV1Context *f = avctx->priv_data;
1747 if(avctx->extradata && read_extra_header(f) < 0)
1750 if(init_slice_contexts(f) < 0)
1756 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1757 const uint8_t *buf = avpkt->data;
1758 int buf_size = avpkt->size;
1759 FFV1Context *f = avctx->priv_data;
1760 RangeCoder * const c= &f->slice_context[0]->c;
1761 AVFrame * const p= &f->picture;
1763 uint8_t keystate= 128;
1764 const uint8_t *buf_p;
1766 AVFrame *picture = data;
1768 /* release previously stored data */
1770 avctx->release_buffer(avctx, p);
1772 ff_init_range_decoder(c, buf, buf_size);
1773 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1776 p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1777 if(get_rac(c, &keystate)){
1779 if(read_header(f) < 0)
1781 if(init_slice_state(f) < 0)
1790 for(i=1; i<256; i++){
1791 c->one_state[i]= f->state_transition[i];
1792 c->zero_state[256-i]= 256-c->one_state[i];
1797 if(avctx->get_buffer(avctx, p) < 0){
1798 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1802 if(avctx->debug&FF_DEBUG_PICT_INFO)
1803 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1806 bytes_read = c->bytestream - c->bytestream_start - 1;
1807 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1808 //printf("pos=%d\n", bytes_read);
1809 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, (buf_size - bytes_read) * 8);
1811 bytes_read = 0; /* avoid warning */
1814 buf_p= buf + buf_size;
1815 for(i=f->slice_count-1; i>0; i--){
1816 FFV1Context *fs= f->slice_context[i];
1817 int v= AV_RB24(buf_p-3)+3;
1818 if(buf_p - buf <= v){
1819 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1824 ff_init_range_decoder(&fs->c, buf_p, v);
1826 init_get_bits(&fs->gb, buf_p, v * 8);
1830 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1831 f->picture_number++;
1834 *data_size = sizeof(AVFrame);
1839 AVCodec ff_ffv1_decoder = {
1841 .type = AVMEDIA_TYPE_VIDEO,
1842 .id = CODEC_ID_FFV1,
1843 .priv_data_size = sizeof(FFV1Context),
1844 .init = decode_init,
1845 .close = common_end,
1846 .decode = decode_frame,
1847 .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ | CODEC_CAP_SLICE_THREADS,
1848 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1851 #if CONFIG_FFV1_ENCODER
1852 AVCodec ff_ffv1_encoder = {
1854 .type = AVMEDIA_TYPE_VIDEO,
1855 .id = CODEC_ID_FFV1,
1856 .priv_data_size = sizeof(FFV1Context),
1857 .init = encode_init,
1858 .encode2 = encode_frame,
1859 .close = common_end,
1860 .capabilities = CODEC_CAP_SLICE_THREADS,
1861 .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_GRAY8, PIX_FMT_NONE},
1862 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),