2 * FFV1 codec for libavcodec
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * FF Video Codec 1 (an experimental lossless codec)
34 #define CONTEXT_SIZE 32
36 static const int8_t quant3[256]={
37 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47 -1,-1,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
54 static const int8_t quant5[256]={
55 0, 1, 1, 1, 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, 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,-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,-1,-1,-1,
72 static const int8_t quant7[256]={
73 0, 1, 1, 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, 3, 3, 3, 3, 3, 3, 3, 3,
76 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
77 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
78 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
79 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
81 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
82 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
83 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
84 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-1,-1,
90 static const int8_t quant9[256]={
91 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
92 3, 3, 3, 3, 3, 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, 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,-4,-4,-4,-3,-3,-3,-3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
108 static const int8_t quant11[256]={
109 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
110 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
111 4, 4, 4, 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,-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,-4,-4,
123 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
124 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
126 static const int8_t quant13[256]={
127 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
128 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
129 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
131 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
132 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
133 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
134 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
135 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
136 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
137 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
138 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
140 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
145 static const uint8_t log2_run[32]={
146 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
147 4, 4, 5, 5, 6, 6, 7, 7,
148 8, 9,10,11,12,13,14,15,
151 typedef struct VlcState{
158 typedef struct PlaneContext{
160 uint8_t (*state)[CONTEXT_SIZE];
162 uint8_t interlace_bit_state[2];
165 typedef struct FFV1Context{
166 AVCodecContext *avctx;
172 int chroma_h_shift, chroma_v_shift;
177 int ac; ///< 1-> CABAC 0-> golomb rice
178 PlaneContext plane[MAX_PLANES];
179 int16_t quant_table[5][256];
186 static always_inline int fold(int diff, int bits){
198 static inline int predict(int_fast16_t *src, int_fast16_t *last){
199 const int LT= last[-1];
200 const int T= last[ 0];
201 const int L = src[-1];
203 return mid_pred(L, L + T - LT, T);
206 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
207 const int LT= last[-1];
208 const int T= last[ 0];
209 const int RT= last[ 1];
210 const int L = src[-1];
212 if(f->quant_table[3][127]){
213 const int TT= last2[0];
214 const int LL= src[-2];
215 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
216 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
218 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
224 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed, int max_exp){
229 const int e= av_log2(a);
231 put_cabac(c, state+0, 0);
234 put_cabac(c, state+1+i, 1); //1..8
238 put_cabac(c, state+1+i, 0); //1..8
240 for(i=e-1; i>=0; i--){
241 put_cabac(c, state+16+e+i, (a>>i)&1); //17..29
244 put_cabac(c, state+9 + e, v < 0); //9..16
247 put_cabac(c, state+0, 1);
251 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed, int max_exp){
252 if(get_cabac(c, state+0))
257 for(e=0; e<max_exp; e++){
260 if(get_cabac(c, state + 1 + e)==0){ // 1..8
261 for(i=e-1; i>=0; i--){
262 a += get_cabac(c, state+16+e+i)<<i; //17..29
265 if(is_signed && get_cabac(c, state+9 + e)) //9..16
275 static inline void update_vlc_state(VlcState * const state, const int v){
276 int drift= state->drift;
277 int count= state->count;
278 state->error_sum += ABS(v);
281 if(count == 128){ //FIXME variable
284 state->error_sum >>= 1;
289 if(state->bias > -128) state->bias--;
295 if(state->bias < 127) state->bias++;
306 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
308 //printf("final: %d ", v);
309 v = fold(v - state->bias, bits);
313 while(i < state->error_sum){ //FIXME optimize
321 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
324 code= v ^ ((2*state->drift + state->count)>>31);
329 //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);
330 set_ur_golomb(pb, code, k, 12, bits);
332 update_vlc_state(state, v);
335 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
340 while(i < state->error_sum){ //FIXME optimize
347 v= get_ur_golomb(gb, k, 12, bits);
348 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
355 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
357 v ^= ((2*state->drift + state->count)>>31);
360 ret= fold(v + state->bias, bits);
362 update_vlc_state(state, v);
363 //printf("final: %d\n", ret);
367 static inline void encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
368 PlaneContext * const p= &s->plane[plane_index];
369 CABACContext * const c= &s->c;
371 int run_index= s->run_index;
378 context= get_context(s, sample[1]+x, sample[0]+x, sample[2]+x);
379 diff= sample[1][x] - predict(sample[1]+x, sample[0]+x);
386 diff= fold(diff, bits);
389 put_symbol(c, p->state[context], diff, 1, bits-1);
391 if(context == 0) run_mode=1;
396 while(run_count >= 1<<log2_run[run_index]){
397 run_count -= 1<<log2_run[run_index];
399 put_bits(&s->pb, 1, 1);
402 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
403 if(run_index) run_index--;
412 // 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));
415 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
419 while(run_count >= 1<<log2_run[run_index]){
420 run_count -= 1<<log2_run[run_index];
422 put_bits(&s->pb, 1, 1);
426 put_bits(&s->pb, 1, 1);
428 s->run_index= run_index;
431 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
433 int_fast16_t sample_buffer[3][w+6];
434 int_fast16_t *sample[3]= {sample_buffer[0]+3, sample_buffer[1]+3, sample_buffer[2]+3};
437 memset(sample_buffer, 0, sizeof(sample_buffer));
440 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
442 sample[0]= sample[1];
443 sample[1]= sample[2];
446 sample[1][-1]= sample[0][0 ];
447 sample[0][ w]= sample[0][w-1];
450 sample[1][x]= src[x + stride*y];
452 encode_line(s, w, sample, plane_index, 8);
453 //STOP_TIMER("encode line")}
457 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
459 int_fast16_t sample_buffer[3][2][w+6];
460 int_fast16_t *sample[3][2]= {
461 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
462 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
463 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
466 memset(sample_buffer, 0, sizeof(sample_buffer));
470 int v= src[x + stride*y];
481 // assert(g>=0 && b>=0 && r>=0);
482 // assert(g<256 && b<512 && r<512);
488 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
490 sample[p][0]= sample[p][1];
493 sample[p][1][-1]= sample[p][0][0 ];
494 sample[p][0][ w]= sample[p][0][w-1];
495 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
500 static void write_quant_table(CABACContext *c, int16_t *quant_table){
503 uint8_t state[CONTEXT_SIZE]={0};
505 for(i=1; i<128 ; i++){
506 if(quant_table[i] != quant_table[i-1]){
507 put_symbol(c, state, i-last-1, 0, 7);
511 put_symbol(c, state, i-last-1, 0, 7);
514 static void write_header(FFV1Context *f){
515 uint8_t state[CONTEXT_SIZE]={0};
517 CABACContext * const c= &f->c;
519 put_symbol(c, state, f->version, 0, 7);
520 put_symbol(c, state, f->avctx->coder_type, 0, 7);
521 put_symbol(c, state, f->colorspace, 0, 7); //YUV cs type
522 put_cabac(c, state, 1); //chroma planes
523 put_symbol(c, state, f->chroma_h_shift, 0, 7);
524 put_symbol(c, state, f->chroma_v_shift, 0, 7);
525 put_cabac(c, state, 0); //no transparency plane
528 write_quant_table(c, f->quant_table[i]);
531 static int common_init(AVCodecContext *avctx){
532 FFV1Context *s = avctx->priv_data;
536 s->flags= avctx->flags;
538 dsputil_init(&s->dsp, avctx);
540 width= s->width= avctx->width;
541 height= s->height= avctx->height;
543 assert(width && height);
548 static int encode_init(AVCodecContext *avctx)
550 FFV1Context *s = avctx->priv_data;
556 s->ac= avctx->coder_type;
559 for(i=0; i<256; i++){
560 s->quant_table[0][i]= quant11[i];
561 s->quant_table[1][i]= 11*quant11[i];
562 if(avctx->context_model==0){
563 s->quant_table[2][i]= 11*11*quant11[i];
564 s->quant_table[3][i]=
565 s->quant_table[4][i]=0;
567 s->quant_table[2][i]= 11*11*quant5 [i];
568 s->quant_table[3][i]= 5*11*11*quant5 [i];
569 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
573 for(i=0; i<s->plane_count; i++){
574 PlaneContext * const p= &s->plane[i];
576 if(avctx->context_model==0){
577 p->context_count= (11*11*11+1)/2;
579 p->context_count= (11*11*5*5*5+1)/2;
583 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
585 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
589 avctx->coded_frame= &s->picture;
590 switch(avctx->pix_fmt){
591 case PIX_FMT_YUV444P:
592 case PIX_FMT_YUV422P:
593 case PIX_FMT_YUV420P:
594 case PIX_FMT_YUV411P:
595 case PIX_FMT_YUV410P:
602 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
605 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
613 static void clear_state(FFV1Context *f){
616 for(i=0; i<f->plane_count; i++){
617 PlaneContext *p= &f->plane[i];
619 p->interlace_bit_state[0]= 0;
620 p->interlace_bit_state[1]= 0;
622 for(j=0; j<p->context_count; j++){
624 memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE);
625 p->state[j][7] = 2*62;
627 p->vlc_state[j].drift= 0;
628 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
629 p->vlc_state[j].bias= 0;
630 p->vlc_state[j].count= 1;
636 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
637 FFV1Context *f = avctx->priv_data;
638 CABACContext * const c= &f->c;
639 AVFrame *pict = data;
640 const int width= f->width;
641 const int height= f->height;
642 AVFrame * const p= &f->picture;
645 if(avctx->strict_std_compliance >= 0){
646 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
647 "use vstrict=-1 to use it anyway\n");
651 ff_init_cabac_encoder(c, buf, buf_size);
652 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
657 p->pict_type= FF_I_TYPE;
659 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
660 put_cabac_bypass(c, 1);
665 put_cabac_bypass(c, 0);
670 used_count += put_cabac_terminate(c, 1);
671 //printf("pos=%d\n", used_count);
672 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
675 if(f->colorspace==0){
676 const int chroma_width = -((-width )>>f->chroma_h_shift);
677 const int chroma_height= -((-height)>>f->chroma_v_shift);
679 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
681 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
682 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
684 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
691 return put_cabac_terminate(c, 1);
693 flush_put_bits(&f->pb); //nicer padding FIXME
694 return used_count + (put_bits_count(&f->pb)+7)/8;
698 static void common_end(FFV1Context *s){
701 for(i=0; i<s->plane_count; i++){
702 PlaneContext *p= &s->plane[i];
708 static int encode_end(AVCodecContext *avctx)
710 FFV1Context *s = avctx->priv_data;
717 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
718 PlaneContext * const p= &s->plane[plane_index];
719 CABACContext * const c= &s->c;
723 int run_index= s->run_index;
726 int diff, context, sign;
728 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
737 diff= get_symbol(c, p->state[context], 1, bits-1);
739 if(context == 0 && run_mode==0) run_mode=1;
742 if(run_count==0 && run_mode==1){
743 if(get_bits1(&s->gb)){
744 run_count = 1<<log2_run[run_index];
745 if(x + run_count <= w) run_index++;
747 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
749 if(run_index) run_index--;
757 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
762 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
764 // 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));
767 if(sign) diff= -diff;
769 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
771 s->run_index= run_index;
774 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
776 int_fast16_t sample_buffer[2][w+6];
777 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
781 memset(sample_buffer, 0, sizeof(sample_buffer));
784 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
786 sample[0]= sample[1];
789 sample[1][-1]= sample[0][0 ];
790 sample[0][ w]= sample[0][w-1];
793 decode_line(s, w, sample, plane_index, 8);
795 src[x + stride*y]= sample[1][x];
797 //STOP_TIMER("decode-line")}
801 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
803 int_fast16_t sample_buffer[3][2][w+6];
804 int_fast16_t *sample[3][2]= {
805 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
806 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
807 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
811 memset(sample_buffer, 0, sizeof(sample_buffer));
815 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
817 sample[p][0]= sample[p][1];
820 sample[p][1][-1]= sample[p][0][0 ];
821 sample[p][0][ w]= sample[p][0][w-1];
822 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
825 int g= sample[0][1][x];
826 int b= sample[1][1][x];
827 int r= sample[2][1][x];
829 // assert(g>=0 && b>=0 && r>=0);
830 // assert(g<256 && b<512 && r<512);
838 src[x + stride*y]= b + (g<<8) + (r<<16);
843 static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
846 uint8_t state[CONTEXT_SIZE]={0};
848 for(v=0; i<128 ; v++){
849 int len= get_symbol(c, state, 0, 7) + 1;
851 if(len + i > 128) return -1;
854 quant_table[i] = scale*v;
857 //if(i%16==0) printf("\n");
861 for(i=1; i<128; i++){
862 quant_table[256-i]= -quant_table[i];
864 quant_table[128]= -quant_table[127];
869 static int read_header(FFV1Context *f){
870 uint8_t state[CONTEXT_SIZE]={0};
871 int i, context_count;
872 CABACContext * const c= &f->c;
874 f->version= get_symbol(c, state, 0, 7);
875 f->ac= f->avctx->coder_type= get_symbol(c, state, 0, 7);
876 f->colorspace= get_symbol(c, state, 0, 7); //YUV cs type
877 get_cabac(c, state); //no chroma = false
878 f->chroma_h_shift= get_symbol(c, state, 0, 7);
879 f->chroma_v_shift= get_symbol(c, state, 0, 7);
880 get_cabac(c, state); //transparency plane
883 if(f->colorspace==0){
884 switch(16*f->chroma_h_shift + f->chroma_v_shift){
885 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
886 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
887 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
888 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
889 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
891 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
894 }else if(f->colorspace==1){
895 if(f->chroma_h_shift || f->chroma_v_shift){
896 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
899 f->avctx->pix_fmt= PIX_FMT_RGBA32;
901 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
905 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
909 context_count*= read_quant_table(c, f->quant_table[i], context_count);
910 if(context_count < 0){
911 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
915 context_count= (context_count+1)/2;
917 for(i=0; i<f->plane_count; i++){
918 PlaneContext * const p= &f->plane[i];
920 p->context_count= context_count;
923 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
925 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
932 static int decode_init(AVCodecContext *avctx)
934 // FFV1Context *s = avctx->priv_data;
941 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
942 FFV1Context *f = avctx->priv_data;
943 CABACContext * const c= &f->c;
944 const int width= f->width;
945 const int height= f->height;
946 AVFrame * const p= &f->picture;
949 AVFrame *picture = data;
953 /* no supplementary picture */
957 ff_init_cabac_decoder(c, buf, buf_size);
958 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
963 p->pict_type= FF_I_TYPE; //FIXME I vs. P
964 if(get_cabac_bypass(c)){
973 if(avctx->get_buffer(avctx, p) < 0){
974 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
978 if(avctx->debug&FF_DEBUG_PICT_INFO)
979 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
982 bytes_read = get_cabac_terminate(c);
983 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n");
984 //printf("pos=%d\n", bytes_read);
985 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
987 bytes_read = 0; /* avoid warning */
990 if(f->colorspace==0){
991 const int chroma_width = -((-width )>>f->chroma_h_shift);
992 const int chroma_height= -((-height)>>f->chroma_v_shift);
993 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
995 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
996 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
998 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1003 f->picture_number++;
1007 avctx->release_buffer(avctx, p); //FIXME
1009 *data_size = sizeof(AVFrame);
1012 bytes_read= get_cabac_terminate(c);
1013 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1015 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1021 AVCodec ffv1_decoder = {
1025 sizeof(FFV1Context),
1030 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1034 #ifdef CONFIG_ENCODERS
1035 AVCodec ffv1_encoder = {
1039 sizeof(FFV1Context),