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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * FF Video Codec 1 (an experimental lossless codec)
28 #include "bitstream.h"
31 #include "rangecoder.h"
35 #define CONTEXT_SIZE 32
37 static const int8_t quant3[256]={
38 0, 0, 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,-1,
53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
55 static const int8_t quant5[256]={
56 0, 1, 1, 1, 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,-2,-2,-2,
71 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
73 static const int8_t quant7[256]={
74 0, 1, 1, 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, 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,-3,-3,-3,-3,-3,-3,-3,
87 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
91 static const int8_t quant9[256]={
92 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
106 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
109 static const int8_t quant11[256]={
110 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
111 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
112 4, 4, 4, 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,-5,-5,
123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
127 static const int8_t quant13[256]={
128 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
129 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
131 5, 5, 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,-6,
140 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
146 static const uint8_t log2_run[32]={
147 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
148 4, 4, 5, 5, 6, 6, 7, 7,
149 8, 9,10,11,12,13,14,15,
152 typedef struct VlcState{
159 typedef struct PlaneContext{
161 uint8_t (*state)[CONTEXT_SIZE];
163 uint8_t interlace_bit_state[2];
166 typedef struct FFV1Context{
167 AVCodecContext *avctx;
173 int chroma_h_shift, chroma_v_shift;
178 int ac; ///< 1-> CABAC 0-> golomb rice
179 PlaneContext plane[MAX_PLANES];
180 int16_t quant_table[5][256];
187 static always_inline int fold(int diff, int bits){
199 static inline int predict(int_fast16_t *src, int_fast16_t *last){
200 const int LT= last[-1];
201 const int T= last[ 0];
202 const int L = src[-1];
204 return mid_pred(L, L + T - LT, T);
207 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
208 const int LT= last[-1];
209 const int T= last[ 0];
210 const int RT= last[ 1];
211 const int L = src[-1];
213 if(f->quant_table[3][127]){
214 const int TT= last2[0];
215 const int LL= src[-2];
216 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
217 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
219 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
222 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
227 const int e= av_log2(a);
228 put_rac(c, state+0, 0);
233 put_rac(c, state+1+i, 1); //1..10
235 put_rac(c, state+1+i, 0);
237 for(i=e-1; i>=0; i--){
238 put_rac(c, state+22+i, (a>>i)&1); //22..31
242 put_rac(c, state+11 + e, v < 0); //11..21
244 put_rac(c, state+0, 1);
248 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
249 if(get_rac(c, state+0))
254 while(get_rac(c, state+1 + e)){ //1..10
260 for(i=e-1; i>=0; i--){
261 a += a + get_rac(c, state+22 + i); //22..31
264 if(is_signed && get_rac(c, state+11 + e)) //11..21
271 static inline void update_vlc_state(VlcState * const state, const int v){
272 int drift= state->drift;
273 int count= state->count;
274 state->error_sum += ABS(v);
277 if(count == 128){ //FIXME variable
280 state->error_sum >>= 1;
285 if(state->bias > -128) state->bias--;
291 if(state->bias < 127) state->bias++;
302 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
304 //printf("final: %d ", v);
305 v = fold(v - state->bias, bits);
309 while(i < state->error_sum){ //FIXME optimize
317 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
320 code= v ^ ((2*state->drift + state->count)>>31);
323 //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);
324 set_sr_golomb(pb, code, k, 12, bits);
326 update_vlc_state(state, v);
329 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
334 while(i < state->error_sum){ //FIXME optimize
341 v= get_sr_golomb(gb, k, 12, bits);
342 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
345 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
347 v ^= ((2*state->drift + state->count)>>31);
350 ret= fold(v + state->bias, bits);
352 update_vlc_state(state, v);
353 //printf("final: %d\n", ret);
357 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
358 PlaneContext * const p= &s->plane[plane_index];
359 RangeCoder * const c= &s->c;
361 int run_index= s->run_index;
366 if(c->bytestream_end - c->bytestream < w*20){
367 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
371 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
372 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
380 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
381 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
388 diff= fold(diff, bits);
391 put_symbol(c, p->state[context], diff, 1);
393 if(context == 0) run_mode=1;
398 while(run_count >= 1<<log2_run[run_index]){
399 run_count -= 1<<log2_run[run_index];
401 put_bits(&s->pb, 1, 1);
404 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
405 if(run_index) run_index--;
414 // 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));
417 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
421 while(run_count >= 1<<log2_run[run_index]){
422 run_count -= 1<<log2_run[run_index];
424 put_bits(&s->pb, 1, 1);
428 put_bits(&s->pb, 1, 1);
430 s->run_index= run_index;
435 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
437 const int ring_size= s->avctx->context_model ? 3 : 2;
438 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
441 memset(sample_buffer, 0, sizeof(sample_buffer));
444 for(i=0; i<ring_size; i++)
445 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
447 sample[0][-1]= sample[1][0 ];
448 sample[1][ w]= sample[1][w-1];
451 sample[0][x]= src[x + stride*y];
453 encode_line(s, w, sample, plane_index, 8);
454 //STOP_TIMER("encode line")}
458 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
460 const int ring_size= s->avctx->context_model ? 3 : 2;
461 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
464 memset(sample_buffer, 0, sizeof(sample_buffer));
467 for(i=0; i<ring_size; i++)
469 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
472 int v= src[x + stride*y];
483 // assert(g>=0 && b>=0 && r>=0);
484 // assert(g<256 && b<512 && r<512);
490 sample[p][0][-1]= sample[p][1][0 ];
491 sample[p][1][ w]= sample[p][1][w-1];
492 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
497 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
500 uint8_t state[CONTEXT_SIZE];
501 memset(state, 128, sizeof(state));
503 for(i=1; i<128 ; i++){
504 if(quant_table[i] != quant_table[i-1]){
505 put_symbol(c, state, i-last-1, 0);
509 put_symbol(c, state, i-last-1, 0);
512 static void write_header(FFV1Context *f){
513 uint8_t state[CONTEXT_SIZE];
515 RangeCoder * const c= &f->c;
517 memset(state, 128, sizeof(state));
519 put_symbol(c, state, f->version, 0);
520 put_symbol(c, state, f->avctx->coder_type, 0);
521 put_symbol(c, state, f->colorspace, 0); //YUV cs type
522 put_rac(c, state, 1); //chroma planes
523 put_symbol(c, state, f->chroma_h_shift, 0);
524 put_symbol(c, state, f->chroma_v_shift, 0);
525 put_rac(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]= 128;
620 p->interlace_bit_state[1]= 128;
622 for(j=0; j<p->context_count; j++){
624 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
626 p->vlc_state[j].drift= 0;
627 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
628 p->vlc_state[j].bias= 0;
629 p->vlc_state[j].count= 1;
635 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
636 FFV1Context *f = avctx->priv_data;
637 RangeCoder * const c= &f->c;
638 AVFrame *pict = data;
639 const int width= f->width;
640 const int height= f->height;
641 AVFrame * const p= &f->picture;
643 uint8_t keystate=128;
645 ff_init_range_encoder(c, buf, buf_size);
646 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
647 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
650 p->pict_type= FF_I_TYPE;
652 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
653 put_rac(c, &keystate, 1);
658 put_rac(c, &keystate, 0);
663 used_count += ff_rac_terminate(c);
664 //printf("pos=%d\n", used_count);
665 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
668 if(f->colorspace==0){
669 const int chroma_width = -((-width )>>f->chroma_h_shift);
670 const int chroma_height= -((-height)>>f->chroma_v_shift);
672 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
674 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
675 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
677 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
684 return ff_rac_terminate(c);
686 flush_put_bits(&f->pb); //nicer padding FIXME
687 return used_count + (put_bits_count(&f->pb)+7)/8;
691 static int common_end(AVCodecContext *avctx){
692 FFV1Context *s = avctx->priv_data;
695 for(i=0; i<s->plane_count; i++){
696 PlaneContext *p= &s->plane[i];
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 RangeCoder * 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);
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(RangeCoder *c, int16_t *quant_table, int scale){
833 uint8_t state[CONTEXT_SIZE];
835 memset(state, 128, sizeof(state));
837 for(v=0; i<128 ; v++){
838 int len= get_symbol(c, state, 0) + 1;
840 if(len + i > 128) return -1;
843 quant_table[i] = scale*v;
846 //if(i%16==0) printf("\n");
850 for(i=1; i<128; i++){
851 quant_table[256-i]= -quant_table[i];
853 quant_table[128]= -quant_table[127];
858 static int read_header(FFV1Context *f){
859 uint8_t state[CONTEXT_SIZE];
860 int i, context_count;
861 RangeCoder * const c= &f->c;
863 memset(state, 128, sizeof(state));
865 f->version= get_symbol(c, state, 0);
866 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
867 f->colorspace= get_symbol(c, state, 0); //YUV cs type
868 get_rac(c, state); //no chroma = false
869 f->chroma_h_shift= get_symbol(c, state, 0);
870 f->chroma_v_shift= get_symbol(c, state, 0);
871 get_rac(c, state); //transparency plane
874 if(f->colorspace==0){
875 switch(16*f->chroma_h_shift + f->chroma_v_shift){
876 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
877 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
878 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
879 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
880 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
882 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
885 }else if(f->colorspace==1){
886 if(f->chroma_h_shift || f->chroma_v_shift){
887 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
890 f->avctx->pix_fmt= PIX_FMT_RGBA32;
892 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
896 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
900 context_count*= read_quant_table(c, f->quant_table[i], context_count);
901 if(context_count < 0 || context_count > 32768){
902 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
906 context_count= (context_count+1)/2;
908 for(i=0; i<f->plane_count; i++){
909 PlaneContext * const p= &f->plane[i];
911 p->context_count= context_count;
914 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
916 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
923 static int decode_init(AVCodecContext *avctx)
925 // FFV1Context *s = avctx->priv_data;
932 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
933 FFV1Context *f = avctx->priv_data;
934 RangeCoder * const c= &f->c;
935 const int width= f->width;
936 const int height= f->height;
937 AVFrame * const p= &f->picture;
939 uint8_t keystate= 128;
941 AVFrame *picture = data;
943 ff_init_range_decoder(c, buf, buf_size);
944 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
947 p->pict_type= FF_I_TYPE; //FIXME I vs. P
948 if(get_rac(c, &keystate)){
950 if(read_header(f) < 0)
956 if(!f->plane[0].state && !f->plane[0].vlc_state)
960 if(avctx->get_buffer(avctx, p) < 0){
961 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
965 if(avctx->debug&FF_DEBUG_PICT_INFO)
966 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
969 bytes_read = c->bytestream - c->bytestream_start - 1;
970 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
971 //printf("pos=%d\n", bytes_read);
972 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
974 bytes_read = 0; /* avoid warning */
977 if(f->colorspace==0){
978 const int chroma_width = -((-width )>>f->chroma_h_shift);
979 const int chroma_height= -((-height)>>f->chroma_v_shift);
980 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
982 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
983 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
985 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
994 avctx->release_buffer(avctx, p); //FIXME
996 *data_size = sizeof(AVFrame);
999 bytes_read= c->bytestream - c->bytestream_start - 1;
1000 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1002 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1008 AVCodec ffv1_decoder = {
1012 sizeof(FFV1Context),
1017 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1021 #ifdef CONFIG_ENCODERS
1022 AVCodec ffv1_encoder = {
1026 sizeof(FFV1Context),
1030 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGBA32, -1},