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)
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 void 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;
368 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
369 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
376 diff= fold(diff, bits);
379 put_symbol(c, p->state[context], diff, 1);
381 if(context == 0) run_mode=1;
386 while(run_count >= 1<<log2_run[run_index]){
387 run_count -= 1<<log2_run[run_index];
389 put_bits(&s->pb, 1, 1);
392 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
393 if(run_index) run_index--;
402 // 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));
405 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
409 while(run_count >= 1<<log2_run[run_index]){
410 run_count -= 1<<log2_run[run_index];
412 put_bits(&s->pb, 1, 1);
416 put_bits(&s->pb, 1, 1);
418 s->run_index= run_index;
421 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
423 const int ring_size= s->avctx->context_model ? 3 : 2;
424 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
427 memset(sample_buffer, 0, sizeof(sample_buffer));
430 for(i=0; i<ring_size; i++)
431 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
433 sample[0][-1]= sample[1][0 ];
434 sample[1][ w]= sample[1][w-1];
437 sample[0][x]= src[x + stride*y];
439 encode_line(s, w, sample, plane_index, 8);
440 //STOP_TIMER("encode line")}
444 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
446 const int ring_size= s->avctx->context_model ? 3 : 2;
447 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
450 memset(sample_buffer, 0, sizeof(sample_buffer));
453 for(i=0; i<ring_size; i++)
455 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
458 int v= src[x + stride*y];
469 // assert(g>=0 && b>=0 && r>=0);
470 // assert(g<256 && b<512 && r<512);
476 sample[p][0][-1]= sample[p][1][0 ];
477 sample[p][1][ w]= sample[p][1][w-1];
478 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
483 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
486 uint8_t state[CONTEXT_SIZE];
487 memset(state, 128, sizeof(state));
489 for(i=1; i<128 ; i++){
490 if(quant_table[i] != quant_table[i-1]){
491 put_symbol(c, state, i-last-1, 0);
495 put_symbol(c, state, i-last-1, 0);
498 static void write_header(FFV1Context *f){
499 uint8_t state[CONTEXT_SIZE];
501 RangeCoder * const c= &f->c;
503 memset(state, 128, sizeof(state));
505 put_symbol(c, state, f->version, 0);
506 put_symbol(c, state, f->avctx->coder_type, 0);
507 put_symbol(c, state, f->colorspace, 0); //YUV cs type
508 put_rac(c, state, 1); //chroma planes
509 put_symbol(c, state, f->chroma_h_shift, 0);
510 put_symbol(c, state, f->chroma_v_shift, 0);
511 put_rac(c, state, 0); //no transparency plane
514 write_quant_table(c, f->quant_table[i]);
517 static int common_init(AVCodecContext *avctx){
518 FFV1Context *s = avctx->priv_data;
522 s->flags= avctx->flags;
524 dsputil_init(&s->dsp, avctx);
526 width= s->width= avctx->width;
527 height= s->height= avctx->height;
529 assert(width && height);
534 static int encode_init(AVCodecContext *avctx)
536 FFV1Context *s = avctx->priv_data;
539 if(avctx->strict_std_compliance >= 0){
540 av_log(avctx, AV_LOG_ERROR, "this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
541 "use vstrict=-1 to use it anyway\n");
548 s->ac= avctx->coder_type;
551 for(i=0; i<256; i++){
552 s->quant_table[0][i]= quant11[i];
553 s->quant_table[1][i]= 11*quant11[i];
554 if(avctx->context_model==0){
555 s->quant_table[2][i]= 11*11*quant11[i];
556 s->quant_table[3][i]=
557 s->quant_table[4][i]=0;
559 s->quant_table[2][i]= 11*11*quant5 [i];
560 s->quant_table[3][i]= 5*11*11*quant5 [i];
561 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
565 for(i=0; i<s->plane_count; i++){
566 PlaneContext * const p= &s->plane[i];
568 if(avctx->context_model==0){
569 p->context_count= (11*11*11+1)/2;
571 p->context_count= (11*11*5*5*5+1)/2;
575 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
577 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
581 avctx->coded_frame= &s->picture;
582 switch(avctx->pix_fmt){
583 case PIX_FMT_YUV444P:
584 case PIX_FMT_YUV422P:
585 case PIX_FMT_YUV420P:
586 case PIX_FMT_YUV411P:
587 case PIX_FMT_YUV410P:
594 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
597 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
605 static void clear_state(FFV1Context *f){
608 for(i=0; i<f->plane_count; i++){
609 PlaneContext *p= &f->plane[i];
611 p->interlace_bit_state[0]= 128;
612 p->interlace_bit_state[1]= 128;
614 for(j=0; j<p->context_count; j++){
616 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
618 p->vlc_state[j].drift= 0;
619 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
620 p->vlc_state[j].bias= 0;
621 p->vlc_state[j].count= 1;
627 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
628 FFV1Context *f = avctx->priv_data;
629 RangeCoder * const c= &f->c;
630 AVFrame *pict = data;
631 const int width= f->width;
632 const int height= f->height;
633 AVFrame * const p= &f->picture;
635 uint8_t keystate=128;
637 ff_init_range_encoder(c, buf, buf_size);
638 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
639 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
642 p->pict_type= FF_I_TYPE;
644 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
645 put_rac(c, &keystate, 1);
650 put_rac(c, &keystate, 0);
655 used_count += ff_rac_terminate(c);
656 //printf("pos=%d\n", used_count);
657 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
660 if(f->colorspace==0){
661 const int chroma_width = -((-width )>>f->chroma_h_shift);
662 const int chroma_height= -((-height)>>f->chroma_v_shift);
664 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
666 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
667 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
669 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
676 return ff_rac_terminate(c);
678 flush_put_bits(&f->pb); //nicer padding FIXME
679 return used_count + (put_bits_count(&f->pb)+7)/8;
683 static void common_end(FFV1Context *s){
686 for(i=0; i<s->plane_count; i++){
687 PlaneContext *p= &s->plane[i];
693 static int encode_end(AVCodecContext *avctx)
695 FFV1Context *s = avctx->priv_data;
702 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
703 PlaneContext * const p= &s->plane[plane_index];
704 RangeCoder * const c= &s->c;
708 int run_index= s->run_index;
711 int diff, context, sign;
713 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
722 diff= get_symbol(c, p->state[context], 1);
724 if(context == 0 && run_mode==0) run_mode=1;
727 if(run_count==0 && run_mode==1){
728 if(get_bits1(&s->gb)){
729 run_count = 1<<log2_run[run_index];
730 if(x + run_count <= w) run_index++;
732 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
734 if(run_index) run_index--;
742 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
747 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
749 // 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));
752 if(sign) diff= -diff;
754 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
756 s->run_index= run_index;
759 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
761 int_fast16_t sample_buffer[2][w+6];
762 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
766 memset(sample_buffer, 0, sizeof(sample_buffer));
769 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
771 sample[0]= sample[1];
774 sample[1][-1]= sample[0][0 ];
775 sample[0][ w]= sample[0][w-1];
778 decode_line(s, w, sample, plane_index, 8);
780 src[x + stride*y]= sample[1][x];
782 //STOP_TIMER("decode-line")}
786 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
788 int_fast16_t sample_buffer[3][2][w+6];
789 int_fast16_t *sample[3][2]= {
790 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
791 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
792 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
796 memset(sample_buffer, 0, sizeof(sample_buffer));
800 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
802 sample[p][0]= sample[p][1];
805 sample[p][1][-1]= sample[p][0][0 ];
806 sample[p][0][ w]= sample[p][0][w-1];
807 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
810 int g= sample[0][1][x];
811 int b= sample[1][1][x];
812 int r= sample[2][1][x];
814 // assert(g>=0 && b>=0 && r>=0);
815 // assert(g<256 && b<512 && r<512);
823 src[x + stride*y]= b + (g<<8) + (r<<16);
828 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
831 uint8_t state[CONTEXT_SIZE];
833 memset(state, 128, sizeof(state));
835 for(v=0; i<128 ; v++){
836 int len= get_symbol(c, state, 0) + 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];
858 int i, context_count;
859 RangeCoder * const c= &f->c;
861 memset(state, 128, sizeof(state));
863 f->version= get_symbol(c, state, 0);
864 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
865 f->colorspace= get_symbol(c, state, 0); //YUV cs type
866 get_rac(c, state); //no chroma = false
867 f->chroma_h_shift= get_symbol(c, state, 0);
868 f->chroma_v_shift= get_symbol(c, state, 0);
869 get_rac(c, state); //transparency plane
872 if(f->colorspace==0){
873 switch(16*f->chroma_h_shift + f->chroma_v_shift){
874 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
875 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
876 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
877 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
878 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
880 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
883 }else if(f->colorspace==1){
884 if(f->chroma_h_shift || f->chroma_v_shift){
885 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
888 f->avctx->pix_fmt= PIX_FMT_RGBA32;
890 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
894 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
898 context_count*= read_quant_table(c, f->quant_table[i], context_count);
899 if(context_count < 0){
900 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
904 context_count= (context_count+1)/2;
906 for(i=0; i<f->plane_count; i++){
907 PlaneContext * const p= &f->plane[i];
909 p->context_count= context_count;
912 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
914 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
921 static int decode_init(AVCodecContext *avctx)
923 // FFV1Context *s = avctx->priv_data;
930 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
931 FFV1Context *f = avctx->priv_data;
932 RangeCoder * const c= &f->c;
933 const int width= f->width;
934 const int height= f->height;
935 AVFrame * const p= &f->picture;
937 uint8_t keystate= 128;
939 AVFrame *picture = data;
941 /* no supplementary picture */
945 ff_init_range_decoder(c, buf, buf_size);
946 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
949 p->pict_type= FF_I_TYPE; //FIXME I vs. P
950 if(get_rac(c, &keystate)){
959 if(avctx->get_buffer(avctx, p) < 0){
960 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
964 if(avctx->debug&FF_DEBUG_PICT_INFO)
965 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
968 bytes_read = c->bytestream - c->bytestream_start - 1;
969 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
970 //printf("pos=%d\n", bytes_read);
971 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
973 bytes_read = 0; /* avoid warning */
976 if(f->colorspace==0){
977 const int chroma_width = -((-width )>>f->chroma_h_shift);
978 const int chroma_height= -((-height)>>f->chroma_v_shift);
979 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
981 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
982 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
984 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
993 avctx->release_buffer(avctx, p); //FIXME
995 *data_size = sizeof(AVFrame);
998 bytes_read= c->bytestream - c->bytestream_start - 1;
999 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1001 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1007 AVCodec ffv1_decoder = {
1011 sizeof(FFV1Context),
1016 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1020 #ifdef CONFIG_ENCODERS
1021 AVCodec ffv1_encoder = {
1025 sizeof(FFV1Context),