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);
655 p->pict_type= FF_I_TYPE;
657 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
658 put_cabac_bypass(c, 1);
663 put_cabac_bypass(c, 0);
668 used_count += put_cabac_terminate(c, 1);
669 //printf("pos=%d\n", used_count);
670 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
673 if(f->colorspace==0){
674 const int chroma_width = -((-width )>>f->chroma_h_shift);
675 const int chroma_height= -((-height)>>f->chroma_v_shift);
677 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
679 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
680 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
682 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
689 return put_cabac_terminate(c, 1);
691 flush_put_bits(&f->pb); //nicer padding FIXME
692 return used_count + (put_bits_count(&f->pb)+7)/8;
696 static void common_end(FFV1Context *s){
699 for(i=0; i<s->plane_count; i++){
700 PlaneContext *p= &s->plane[i];
706 static int encode_end(AVCodecContext *avctx)
708 FFV1Context *s = avctx->priv_data;
715 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
716 PlaneContext * const p= &s->plane[plane_index];
717 CABACContext * const c= &s->c;
721 int run_index= s->run_index;
724 int diff, context, sign;
726 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
735 diff= get_symbol(c, p->state[context], 1, bits-1);
737 if(context == 0 && run_mode==0) run_mode=1;
740 if(run_count==0 && run_mode==1){
741 if(get_bits1(&s->gb)){
742 run_count = 1<<log2_run[run_index];
743 if(x + run_count <= w) run_index++;
745 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
747 if(run_index) run_index--;
755 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
760 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
762 // 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));
765 if(sign) diff= -diff;
767 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
769 s->run_index= run_index;
772 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
774 int_fast16_t sample_buffer[2][w+6];
775 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
779 memset(sample_buffer, 0, sizeof(sample_buffer));
782 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
784 sample[0]= sample[1];
787 sample[1][-1]= sample[0][0 ];
788 sample[0][ w]= sample[0][w-1];
791 decode_line(s, w, sample, plane_index, 8);
793 src[x + stride*y]= sample[1][x];
795 //STOP_TIMER("decode-line")}
799 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
801 int_fast16_t sample_buffer[3][2][w+6];
802 int_fast16_t *sample[3][2]= {
803 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
804 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
805 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
809 memset(sample_buffer, 0, sizeof(sample_buffer));
813 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
815 sample[p][0]= sample[p][1];
818 sample[p][1][-1]= sample[p][0][0 ];
819 sample[p][0][ w]= sample[p][0][w-1];
820 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
823 int g= sample[0][1][x];
824 int b= sample[1][1][x];
825 int r= sample[2][1][x];
827 // assert(g>=0 && b>=0 && r>=0);
828 // assert(g<256 && b<512 && r<512);
836 src[x + stride*y]= b + (g<<8) + (r<<16);
841 static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
844 uint8_t state[CONTEXT_SIZE]={0};
846 for(v=0; i<128 ; v++){
847 int len= get_symbol(c, state, 0, 7) + 1;
849 if(len + i > 128) return -1;
852 quant_table[i] = scale*v;
855 //if(i%16==0) printf("\n");
859 for(i=1; i<128; i++){
860 quant_table[256-i]= -quant_table[i];
862 quant_table[128]= -quant_table[127];
867 static int read_header(FFV1Context *f){
868 uint8_t state[CONTEXT_SIZE]={0};
869 int i, context_count;
870 CABACContext * const c= &f->c;
872 f->version= get_symbol(c, state, 0, 7);
873 f->ac= f->avctx->coder_type= get_symbol(c, state, 0, 7);
874 f->colorspace= get_symbol(c, state, 0, 7); //YUV cs type
875 get_cabac(c, state); //no chroma = false
876 f->chroma_h_shift= get_symbol(c, state, 0, 7);
877 f->chroma_v_shift= get_symbol(c, state, 0, 7);
878 get_cabac(c, state); //transparency plane
881 if(f->colorspace==0){
882 switch(16*f->chroma_h_shift + f->chroma_v_shift){
883 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
884 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
885 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
886 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
887 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
889 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
892 }else if(f->colorspace==1){
893 if(f->chroma_h_shift || f->chroma_v_shift){
894 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
897 f->avctx->pix_fmt= PIX_FMT_RGBA32;
899 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
903 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
907 context_count*= read_quant_table(c, f->quant_table[i], context_count);
908 if(context_count < 0){
909 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
913 context_count= (context_count+1)/2;
915 for(i=0; i<f->plane_count; i++){
916 PlaneContext * const p= &f->plane[i];
918 p->context_count= context_count;
921 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
923 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
930 static int decode_init(AVCodecContext *avctx)
932 // FFV1Context *s = avctx->priv_data;
939 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
940 FFV1Context *f = avctx->priv_data;
941 CABACContext * const c= &f->c;
942 const int width= f->width;
943 const int height= f->height;
944 AVFrame * const p= &f->picture;
947 AVFrame *picture = data;
951 /* no supplementary picture */
955 ff_init_cabac_decoder(c, buf, buf_size);
956 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
958 p->pict_type= FF_I_TYPE; //FIXME I vs. P
959 if(get_cabac_bypass(c)){
968 if(avctx->get_buffer(avctx, p) < 0){
969 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
973 if(avctx->debug&FF_DEBUG_PICT_INFO)
974 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
977 bytes_read = get_cabac_terminate(c);
978 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n");
979 //printf("pos=%d\n", bytes_read);
980 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
982 bytes_read = 0; /* avoid warning */
985 if(f->colorspace==0){
986 const int chroma_width = -((-width )>>f->chroma_h_shift);
987 const int chroma_height= -((-height)>>f->chroma_v_shift);
988 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
990 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
991 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
993 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1002 avctx->release_buffer(avctx, p); //FIXME
1004 *data_size = sizeof(AVFrame);
1007 bytes_read= get_cabac_terminate(c);
1008 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1010 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1016 static int decode_end(AVCodecContext *avctx)
1018 FFV1Context *s = avctx->priv_data;
1021 if(avctx->get_buffer == avcodec_default_get_buffer){
1023 av_freep(&s->picture.base[i]);
1024 s->picture.data[i]= NULL;
1026 av_freep(&s->picture.opaque);
1032 AVCodec ffv1_decoder = {
1036 sizeof(FFV1Context),
1041 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1045 #ifdef CONFIG_ENCODERS
1046 AVCodec ffv1_encoder = {
1050 sizeof(FFV1Context),