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)
30 #include "rangecoder.h"
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];
221 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
226 const int e= av_log2(a);
227 put_rac(c, state+0, 0);
232 put_rac(c, state+1+i, 1); //1..10
234 put_rac(c, state+1+i, 0);
236 for(i=e-1; i>=0; i--){
237 put_rac(c, state+22+i, (a>>i)&1); //22..31
241 put_rac(c, state+11 + e, v < 0); //11..21
243 put_rac(c, state+0, 1);
247 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
248 if(get_rac(c, state+0))
253 while(get_rac(c, state+1 + e)){ //1..10
259 for(i=e-1; i>=0; i--){
260 a += a + get_rac(c, state+22 + i); //22..31
263 if(is_signed && get_rac(c, state+11 + e)) //11..21
270 static inline void update_vlc_state(VlcState * const state, const int v){
271 int drift= state->drift;
272 int count= state->count;
273 state->error_sum += ABS(v);
276 if(count == 128){ //FIXME variable
279 state->error_sum >>= 1;
284 if(state->bias > -128) state->bias--;
290 if(state->bias < 127) state->bias++;
301 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
303 //printf("final: %d ", v);
304 v = fold(v - state->bias, bits);
308 while(i < state->error_sum){ //FIXME optimize
316 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
319 code= v ^ ((2*state->drift + state->count)>>31);
322 //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);
323 set_sr_golomb(pb, code, k, 12, bits);
325 update_vlc_state(state, v);
328 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
333 while(i < state->error_sum){ //FIXME optimize
340 v= get_sr_golomb(gb, k, 12, bits);
341 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
344 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
346 v ^= ((2*state->drift + state->count)>>31);
349 ret= fold(v + state->bias, bits);
351 update_vlc_state(state, v);
352 //printf("final: %d\n", ret);
356 static inline void encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
357 PlaneContext * const p= &s->plane[plane_index];
358 RangeCoder * const c= &s->c;
360 int run_index= s->run_index;
367 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
368 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
375 diff= fold(diff, bits);
378 put_symbol(c, p->state[context], diff, 1);
380 if(context == 0) run_mode=1;
385 while(run_count >= 1<<log2_run[run_index]){
386 run_count -= 1<<log2_run[run_index];
388 put_bits(&s->pb, 1, 1);
391 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
392 if(run_index) run_index--;
401 // 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));
404 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
408 while(run_count >= 1<<log2_run[run_index]){
409 run_count -= 1<<log2_run[run_index];
411 put_bits(&s->pb, 1, 1);
415 put_bits(&s->pb, 1, 1);
417 s->run_index= run_index;
420 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
422 const int ring_size= s->avctx->context_model ? 3 : 2;
423 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
426 memset(sample_buffer, 0, sizeof(sample_buffer));
429 for(i=0; i<ring_size; i++)
430 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
432 sample[0][-1]= sample[1][0 ];
433 sample[1][ w]= sample[1][w-1];
436 sample[0][x]= src[x + stride*y];
438 encode_line(s, w, sample, plane_index, 8);
439 //STOP_TIMER("encode line")}
443 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
445 const int ring_size= s->avctx->context_model ? 3 : 2;
446 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
449 memset(sample_buffer, 0, sizeof(sample_buffer));
452 for(i=0; i<ring_size; i++)
454 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
457 int v= src[x + stride*y];
468 // assert(g>=0 && b>=0 && r>=0);
469 // assert(g<256 && b<512 && r<512);
475 sample[p][0][-1]= sample[p][1][0 ];
476 sample[p][1][ w]= sample[p][1][w-1];
477 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
482 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
485 uint8_t state[CONTEXT_SIZE];
486 memset(state, 128, sizeof(state));
488 for(i=1; i<128 ; i++){
489 if(quant_table[i] != quant_table[i-1]){
490 put_symbol(c, state, i-last-1, 0);
494 put_symbol(c, state, i-last-1, 0);
497 static void write_header(FFV1Context *f){
498 uint8_t state[CONTEXT_SIZE];
500 RangeCoder * const c= &f->c;
502 memset(state, 128, sizeof(state));
504 put_symbol(c, state, f->version, 0);
505 put_symbol(c, state, f->avctx->coder_type, 0);
506 put_symbol(c, state, f->colorspace, 0); //YUV cs type
507 put_rac(c, state, 1); //chroma planes
508 put_symbol(c, state, f->chroma_h_shift, 0);
509 put_symbol(c, state, f->chroma_v_shift, 0);
510 put_rac(c, state, 0); //no transparency plane
513 write_quant_table(c, f->quant_table[i]);
516 static int common_init(AVCodecContext *avctx){
517 FFV1Context *s = avctx->priv_data;
521 s->flags= avctx->flags;
523 dsputil_init(&s->dsp, avctx);
525 width= s->width= avctx->width;
526 height= s->height= avctx->height;
528 assert(width && height);
533 static int encode_init(AVCodecContext *avctx)
535 FFV1Context *s = avctx->priv_data;
538 if(avctx->strict_std_compliance >= 0){
539 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
540 "use vstrict=-1 to use it anyway\n");
547 s->ac= avctx->coder_type;
550 for(i=0; i<256; i++){
551 s->quant_table[0][i]= quant11[i];
552 s->quant_table[1][i]= 11*quant11[i];
553 if(avctx->context_model==0){
554 s->quant_table[2][i]= 11*11*quant11[i];
555 s->quant_table[3][i]=
556 s->quant_table[4][i]=0;
558 s->quant_table[2][i]= 11*11*quant5 [i];
559 s->quant_table[3][i]= 5*11*11*quant5 [i];
560 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
564 for(i=0; i<s->plane_count; i++){
565 PlaneContext * const p= &s->plane[i];
567 if(avctx->context_model==0){
568 p->context_count= (11*11*11+1)/2;
570 p->context_count= (11*11*5*5*5+1)/2;
574 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
576 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
580 avctx->coded_frame= &s->picture;
581 switch(avctx->pix_fmt){
582 case PIX_FMT_YUV444P:
583 case PIX_FMT_YUV422P:
584 case PIX_FMT_YUV420P:
585 case PIX_FMT_YUV411P:
586 case PIX_FMT_YUV410P:
593 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
596 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
604 static void clear_state(FFV1Context *f){
607 for(i=0; i<f->plane_count; i++){
608 PlaneContext *p= &f->plane[i];
610 p->interlace_bit_state[0]= 128;
611 p->interlace_bit_state[1]= 128;
613 for(j=0; j<p->context_count; j++){
615 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
617 p->vlc_state[j].drift= 0;
618 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
619 p->vlc_state[j].bias= 0;
620 p->vlc_state[j].count= 1;
626 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
627 FFV1Context *f = avctx->priv_data;
628 RangeCoder * const c= &f->c;
629 AVFrame *pict = data;
630 const int width= f->width;
631 const int height= f->height;
632 AVFrame * const p= &f->picture;
634 uint8_t keystate=128;
636 ff_init_range_encoder(c, buf, buf_size);
637 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
638 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
641 p->pict_type= FF_I_TYPE;
643 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
644 put_rac(c, &keystate, 1);
649 put_rac(c, &keystate, 0);
654 used_count += ff_rac_terminate(c);
655 //printf("pos=%d\n", used_count);
656 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
659 if(f->colorspace==0){
660 const int chroma_width = -((-width )>>f->chroma_h_shift);
661 const int chroma_height= -((-height)>>f->chroma_v_shift);
663 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
665 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
666 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
668 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
675 return ff_rac_terminate(c);
677 flush_put_bits(&f->pb); //nicer padding FIXME
678 return used_count + (put_bits_count(&f->pb)+7)/8;
682 static void common_end(FFV1Context *s){
685 for(i=0; i<s->plane_count; i++){
686 PlaneContext *p= &s->plane[i];
692 static int encode_end(AVCodecContext *avctx)
694 FFV1Context *s = avctx->priv_data;
701 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
702 PlaneContext * const p= &s->plane[plane_index];
703 RangeCoder * const c= &s->c;
707 int run_index= s->run_index;
710 int diff, context, sign;
712 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
721 diff= get_symbol(c, p->state[context], 1);
723 if(context == 0 && run_mode==0) run_mode=1;
726 if(run_count==0 && run_mode==1){
727 if(get_bits1(&s->gb)){
728 run_count = 1<<log2_run[run_index];
729 if(x + run_count <= w) run_index++;
731 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
733 if(run_index) run_index--;
741 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
746 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
748 // 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));
751 if(sign) diff= -diff;
753 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
755 s->run_index= run_index;
758 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
760 int_fast16_t sample_buffer[2][w+6];
761 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
765 memset(sample_buffer, 0, sizeof(sample_buffer));
768 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
770 sample[0]= sample[1];
773 sample[1][-1]= sample[0][0 ];
774 sample[0][ w]= sample[0][w-1];
777 decode_line(s, w, sample, plane_index, 8);
779 src[x + stride*y]= sample[1][x];
781 //STOP_TIMER("decode-line")}
785 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
787 int_fast16_t sample_buffer[3][2][w+6];
788 int_fast16_t *sample[3][2]= {
789 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
790 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
791 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
795 memset(sample_buffer, 0, sizeof(sample_buffer));
799 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
801 sample[p][0]= sample[p][1];
804 sample[p][1][-1]= sample[p][0][0 ];
805 sample[p][0][ w]= sample[p][0][w-1];
806 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
809 int g= sample[0][1][x];
810 int b= sample[1][1][x];
811 int r= sample[2][1][x];
813 // assert(g>=0 && b>=0 && r>=0);
814 // assert(g<256 && b<512 && r<512);
822 src[x + stride*y]= b + (g<<8) + (r<<16);
827 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
830 uint8_t state[CONTEXT_SIZE];
832 memset(state, 128, sizeof(state));
834 for(v=0; i<128 ; v++){
835 int len= get_symbol(c, state, 0) + 1;
837 if(len + i > 128) return -1;
840 quant_table[i] = scale*v;
843 //if(i%16==0) printf("\n");
847 for(i=1; i<128; i++){
848 quant_table[256-i]= -quant_table[i];
850 quant_table[128]= -quant_table[127];
855 static int read_header(FFV1Context *f){
856 uint8_t state[CONTEXT_SIZE];
857 int i, context_count;
858 RangeCoder * const c= &f->c;
860 memset(state, 128, sizeof(state));
862 f->version= get_symbol(c, state, 0);
863 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
864 f->colorspace= get_symbol(c, state, 0); //YUV cs type
865 get_rac(c, state); //no chroma = false
866 f->chroma_h_shift= get_symbol(c, state, 0);
867 f->chroma_v_shift= get_symbol(c, state, 0);
868 get_rac(c, state); //transparency plane
871 if(f->colorspace==0){
872 switch(16*f->chroma_h_shift + f->chroma_v_shift){
873 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
874 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
875 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
876 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
877 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
879 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
882 }else if(f->colorspace==1){
883 if(f->chroma_h_shift || f->chroma_v_shift){
884 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
887 f->avctx->pix_fmt= PIX_FMT_RGBA32;
889 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
893 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
897 context_count*= read_quant_table(c, f->quant_table[i], context_count);
898 if(context_count < 0){
899 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
903 context_count= (context_count+1)/2;
905 for(i=0; i<f->plane_count; i++){
906 PlaneContext * const p= &f->plane[i];
908 p->context_count= context_count;
911 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
913 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
920 static int decode_init(AVCodecContext *avctx)
922 // FFV1Context *s = avctx->priv_data;
929 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
930 FFV1Context *f = avctx->priv_data;
931 RangeCoder * const c= &f->c;
932 const int width= f->width;
933 const int height= f->height;
934 AVFrame * const p= &f->picture;
936 uint8_t keystate= 128;
938 AVFrame *picture = data;
940 /* no supplementary picture */
944 ff_init_range_decoder(c, buf, buf_size);
945 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
948 p->pict_type= FF_I_TYPE; //FIXME I vs. P
949 if(get_rac(c, &keystate)){
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 = c->bytestream - c->bytestream_start - 1;
968 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
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= c->bytestream - c->bytestream_start - 1;
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),