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);
327 //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);
328 set_sr_golomb(pb, code, k, 12, bits);
330 update_vlc_state(state, v);
333 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
338 while(i < state->error_sum){ //FIXME optimize
345 v= get_sr_golomb(gb, k, 12, bits);
346 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
349 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
351 v ^= ((2*state->drift + state->count)>>31);
354 ret= fold(v + state->bias, bits);
356 update_vlc_state(state, v);
357 //printf("final: %d\n", ret);
361 static inline void encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
362 PlaneContext * const p= &s->plane[plane_index];
363 CABACContext * const c= &s->c;
365 int run_index= s->run_index;
372 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
373 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
380 diff= fold(diff, bits);
383 put_symbol(c, p->state[context], diff, 1, bits-1);
385 if(context == 0) run_mode=1;
390 while(run_count >= 1<<log2_run[run_index]){
391 run_count -= 1<<log2_run[run_index];
393 put_bits(&s->pb, 1, 1);
396 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
397 if(run_index) run_index--;
406 // 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));
409 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
413 while(run_count >= 1<<log2_run[run_index]){
414 run_count -= 1<<log2_run[run_index];
416 put_bits(&s->pb, 1, 1);
420 put_bits(&s->pb, 1, 1);
422 s->run_index= run_index;
425 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
427 const int ring_size= s->avctx->context_model ? 3 : 2;
428 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
431 memset(sample_buffer, 0, sizeof(sample_buffer));
434 for(i=0; i<ring_size; i++)
435 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
437 sample[0][-1]= sample[1][0 ];
438 sample[1][ w]= sample[1][w-1];
441 sample[0][x]= src[x + stride*y];
443 encode_line(s, w, sample, plane_index, 8);
444 //STOP_TIMER("encode line")}
448 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
450 const int ring_size= s->avctx->context_model ? 3 : 2;
451 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
454 memset(sample_buffer, 0, sizeof(sample_buffer));
457 for(i=0; i<ring_size; i++)
459 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
462 int v= src[x + stride*y];
473 // assert(g>=0 && b>=0 && r>=0);
474 // assert(g<256 && b<512 && r<512);
480 sample[p][0][-1]= sample[p][1][0 ];
481 sample[p][1][ w]= sample[p][1][w-1];
482 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
487 static void write_quant_table(CABACContext *c, int16_t *quant_table){
490 uint8_t state[CONTEXT_SIZE]={0};
492 for(i=1; i<128 ; i++){
493 if(quant_table[i] != quant_table[i-1]){
494 put_symbol(c, state, i-last-1, 0, 7);
498 put_symbol(c, state, i-last-1, 0, 7);
501 static void write_header(FFV1Context *f){
502 uint8_t state[CONTEXT_SIZE]={0};
504 CABACContext * const c= &f->c;
506 put_symbol(c, state, f->version, 0, 7);
507 put_symbol(c, state, f->avctx->coder_type, 0, 7);
508 put_symbol(c, state, f->colorspace, 0, 7); //YUV cs type
509 put_cabac(c, state, 1); //chroma planes
510 put_symbol(c, state, f->chroma_h_shift, 0, 7);
511 put_symbol(c, state, f->chroma_v_shift, 0, 7);
512 put_cabac(c, state, 0); //no transparency plane
515 write_quant_table(c, f->quant_table[i]);
518 static int common_init(AVCodecContext *avctx){
519 FFV1Context *s = avctx->priv_data;
523 s->flags= avctx->flags;
525 dsputil_init(&s->dsp, avctx);
527 width= s->width= avctx->width;
528 height= s->height= avctx->height;
530 assert(width && height);
535 static int encode_init(AVCodecContext *avctx)
537 FFV1Context *s = avctx->priv_data;
540 if(avctx->strict_std_compliance >= 0){
541 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
542 "use vstrict=-1 to use it anyway\n");
549 s->ac= avctx->coder_type;
552 for(i=0; i<256; i++){
553 s->quant_table[0][i]= quant11[i];
554 s->quant_table[1][i]= 11*quant11[i];
555 if(avctx->context_model==0){
556 s->quant_table[2][i]= 11*11*quant11[i];
557 s->quant_table[3][i]=
558 s->quant_table[4][i]=0;
560 s->quant_table[2][i]= 11*11*quant5 [i];
561 s->quant_table[3][i]= 5*11*11*quant5 [i];
562 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
566 for(i=0; i<s->plane_count; i++){
567 PlaneContext * const p= &s->plane[i];
569 if(avctx->context_model==0){
570 p->context_count= (11*11*11+1)/2;
572 p->context_count= (11*11*5*5*5+1)/2;
576 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
578 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
582 avctx->coded_frame= &s->picture;
583 switch(avctx->pix_fmt){
584 case PIX_FMT_YUV444P:
585 case PIX_FMT_YUV422P:
586 case PIX_FMT_YUV420P:
587 case PIX_FMT_YUV411P:
588 case PIX_FMT_YUV410P:
595 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
598 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
606 static void clear_state(FFV1Context *f){
609 for(i=0; i<f->plane_count; i++){
610 PlaneContext *p= &f->plane[i];
612 p->interlace_bit_state[0]= 0;
613 p->interlace_bit_state[1]= 0;
615 for(j=0; j<p->context_count; j++){
617 memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE);
618 p->state[j][7] = 2*62;
620 p->vlc_state[j].drift= 0;
621 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
622 p->vlc_state[j].bias= 0;
623 p->vlc_state[j].count= 1;
629 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
630 FFV1Context *f = avctx->priv_data;
631 CABACContext * const c= &f->c;
632 AVFrame *pict = data;
633 const int width= f->width;
634 const int height= f->height;
635 AVFrame * const p= &f->picture;
638 ff_init_cabac_encoder(c, buf, buf_size);
639 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
644 p->pict_type= FF_I_TYPE;
646 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
647 put_cabac_bypass(c, 1);
652 put_cabac_bypass(c, 0);
657 used_count += put_cabac_terminate(c, 1);
658 //printf("pos=%d\n", used_count);
659 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
662 if(f->colorspace==0){
663 const int chroma_width = -((-width )>>f->chroma_h_shift);
664 const int chroma_height= -((-height)>>f->chroma_v_shift);
666 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
668 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
669 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
671 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
678 return put_cabac_terminate(c, 1);
680 flush_put_bits(&f->pb); //nicer padding FIXME
681 return used_count + (put_bits_count(&f->pb)+7)/8;
685 static void common_end(FFV1Context *s){
688 for(i=0; i<s->plane_count; i++){
689 PlaneContext *p= &s->plane[i];
695 static int encode_end(AVCodecContext *avctx)
697 FFV1Context *s = avctx->priv_data;
704 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
705 PlaneContext * const p= &s->plane[plane_index];
706 CABACContext * const c= &s->c;
710 int run_index= s->run_index;
713 int diff, context, sign;
715 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
724 diff= get_symbol(c, p->state[context], 1, bits-1);
726 if(context == 0 && run_mode==0) run_mode=1;
729 if(run_count==0 && run_mode==1){
730 if(get_bits1(&s->gb)){
731 run_count = 1<<log2_run[run_index];
732 if(x + run_count <= w) run_index++;
734 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
736 if(run_index) run_index--;
744 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
749 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
751 // 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));
754 if(sign) diff= -diff;
756 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
758 s->run_index= run_index;
761 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
763 int_fast16_t sample_buffer[2][w+6];
764 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
768 memset(sample_buffer, 0, sizeof(sample_buffer));
771 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
773 sample[0]= sample[1];
776 sample[1][-1]= sample[0][0 ];
777 sample[0][ w]= sample[0][w-1];
780 decode_line(s, w, sample, plane_index, 8);
782 src[x + stride*y]= sample[1][x];
784 //STOP_TIMER("decode-line")}
788 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
790 int_fast16_t sample_buffer[3][2][w+6];
791 int_fast16_t *sample[3][2]= {
792 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
793 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
794 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
798 memset(sample_buffer, 0, sizeof(sample_buffer));
802 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
804 sample[p][0]= sample[p][1];
807 sample[p][1][-1]= sample[p][0][0 ];
808 sample[p][0][ w]= sample[p][0][w-1];
809 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
812 int g= sample[0][1][x];
813 int b= sample[1][1][x];
814 int r= sample[2][1][x];
816 // assert(g>=0 && b>=0 && r>=0);
817 // assert(g<256 && b<512 && r<512);
825 src[x + stride*y]= b + (g<<8) + (r<<16);
830 static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
833 uint8_t state[CONTEXT_SIZE]={0};
835 for(v=0; i<128 ; v++){
836 int len= get_symbol(c, state, 0, 7) + 1;
838 if(len + i > 128) return -1;
841 quant_table[i] = scale*v;
844 //if(i%16==0) printf("\n");
848 for(i=1; i<128; i++){
849 quant_table[256-i]= -quant_table[i];
851 quant_table[128]= -quant_table[127];
856 static int read_header(FFV1Context *f){
857 uint8_t state[CONTEXT_SIZE]={0};
858 int i, context_count;
859 CABACContext * const c= &f->c;
861 f->version= get_symbol(c, state, 0, 7);
862 f->ac= f->avctx->coder_type= get_symbol(c, state, 0, 7);
863 f->colorspace= get_symbol(c, state, 0, 7); //YUV cs type
864 get_cabac(c, state); //no chroma = false
865 f->chroma_h_shift= get_symbol(c, state, 0, 7);
866 f->chroma_v_shift= get_symbol(c, state, 0, 7);
867 get_cabac(c, state); //transparency plane
870 if(f->colorspace==0){
871 switch(16*f->chroma_h_shift + f->chroma_v_shift){
872 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
873 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
874 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
875 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
876 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
878 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
881 }else if(f->colorspace==1){
882 if(f->chroma_h_shift || f->chroma_v_shift){
883 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
886 f->avctx->pix_fmt= PIX_FMT_RGBA32;
888 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
892 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
896 context_count*= read_quant_table(c, f->quant_table[i], context_count);
897 if(context_count < 0){
898 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
902 context_count= (context_count+1)/2;
904 for(i=0; i<f->plane_count; i++){
905 PlaneContext * const p= &f->plane[i];
907 p->context_count= context_count;
910 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
912 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
919 static int decode_init(AVCodecContext *avctx)
921 // FFV1Context *s = avctx->priv_data;
928 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
929 FFV1Context *f = avctx->priv_data;
930 CABACContext * const c= &f->c;
931 const int width= f->width;
932 const int height= f->height;
933 AVFrame * const p= &f->picture;
936 AVFrame *picture = data;
938 /* no supplementary picture */
942 ff_init_cabac_decoder(c, buf, buf_size);
943 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
948 p->pict_type= FF_I_TYPE; //FIXME I vs. P
949 if(get_cabac_bypass(c)){
958 if(avctx->get_buffer(avctx, p) < 0){
959 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
963 if(avctx->debug&FF_DEBUG_PICT_INFO)
964 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
967 bytes_read = get_cabac_terminate(c);
968 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n");
969 //printf("pos=%d\n", bytes_read);
970 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
972 bytes_read = 0; /* avoid warning */
975 if(f->colorspace==0){
976 const int chroma_width = -((-width )>>f->chroma_h_shift);
977 const int chroma_height= -((-height)>>f->chroma_v_shift);
978 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
980 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
981 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
983 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
992 avctx->release_buffer(avctx, p); //FIXME
994 *data_size = sizeof(AVFrame);
997 bytes_read= get_cabac_terminate(c);
998 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1000 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1006 AVCodec ffv1_decoder = {
1010 sizeof(FFV1Context),
1015 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1019 #ifdef CONFIG_ENCODERS
1020 AVCodec ffv1_encoder = {
1024 sizeof(FFV1Context),