2 * FFV1 codec for libavcodec
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * FF Video Codec 1 (an experimental lossless codec)
30 #include "bitstream.h"
32 #include "rangecoder.h"
36 #define CONTEXT_SIZE 32
38 static const int8_t quant3[256]={
39 0, 0, 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,-1,
54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
56 static const int8_t quant5[256]={
57 0, 1, 1, 1, 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,-2,-2,-2,
72 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
74 static const int8_t quant7[256]={
75 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
88 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
92 static const int8_t quant9[256]={
93 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
94 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
107 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
108 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
110 static const int8_t quant11[256]={
111 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
112 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
113 4, 4, 4, 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,-5,-5,
124 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
125 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
126 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
128 static const int8_t quant13[256]={
129 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
130 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
131 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
132 5, 5, 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,-6,
141 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
143 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
147 static const uint8_t log2_run[32]={
148 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
149 4, 4, 5, 5, 6, 6, 7, 7,
150 8, 9,10,11,12,13,14,15,
153 typedef struct VlcState{
160 typedef struct PlaneContext{
162 uint8_t (*state)[CONTEXT_SIZE];
164 uint8_t interlace_bit_state[2];
167 typedef struct FFV1Context{
168 AVCodecContext *avctx;
174 int chroma_h_shift, chroma_v_shift;
179 int ac; ///< 1-> CABAC 0-> golomb rice
180 PlaneContext plane[MAX_PLANES];
181 int16_t quant_table[5][256];
188 static av_always_inline int fold(int diff, int bits){
200 static inline int predict(int_fast16_t *src, int_fast16_t *last){
201 const int LT= last[-1];
202 const int T= last[ 0];
203 const int L = src[-1];
205 return mid_pred(L, L + T - LT, T);
208 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
209 const int LT= last[-1];
210 const int T= last[ 0];
211 const int RT= last[ 1];
212 const int L = src[-1];
214 if(f->quant_table[3][127]){
215 const int TT= last2[0];
216 const int LL= src[-2];
217 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
218 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
220 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
223 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
227 const int a= FFABS(v);
228 const int e= av_log2(a);
229 put_rac(c, state+0, 0);
234 put_rac(c, state+1+i, 1); //1..10
236 put_rac(c, state+1+i, 0);
238 for(i=e-1; i>=0; i--){
239 put_rac(c, state+22+i, (a>>i)&1); //22..31
243 put_rac(c, state+11 + e, v < 0); //11..21
245 put_rac(c, state+0, 1);
249 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
250 if(get_rac(c, state+0))
255 while(get_rac(c, state+1 + e)){ //1..10
261 for(i=e-1; i>=0; i--){
262 a += a + get_rac(c, state+22 + i); //22..31
265 if(is_signed && get_rac(c, state+11 + e)) //11..21
272 static inline void update_vlc_state(VlcState * const state, const int v){
273 int drift= state->drift;
274 int count= state->count;
275 state->error_sum += FFABS(v);
278 if(count == 128){ //FIXME variable
281 state->error_sum >>= 1;
286 if(state->bias > -128) state->bias--;
292 if(state->bias < 127) state->bias++;
303 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
305 //printf("final: %d ", v);
306 v = fold(v - state->bias, bits);
310 while(i < state->error_sum){ //FIXME optimize
318 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
321 code= v ^ ((2*state->drift + state->count)>>31);
324 //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);
325 set_sr_golomb(pb, code, k, 12, bits);
327 update_vlc_state(state, v);
330 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
335 while(i < state->error_sum){ //FIXME optimize
342 v= get_sr_golomb(gb, k, 12, bits);
343 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
346 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
348 v ^= ((2*state->drift + state->count)>>31);
351 ret= fold(v + state->bias, bits);
353 update_vlc_state(state, v);
354 //printf("final: %d\n", ret);
358 #ifdef CONFIG_ENCODERS
359 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
360 PlaneContext * const p= &s->plane[plane_index];
361 RangeCoder * const c= &s->c;
363 int run_index= s->run_index;
368 if(c->bytestream_end - c->bytestream < w*20){
369 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
373 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
374 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
382 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
383 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
390 diff= fold(diff, bits);
393 put_symbol(c, p->state[context], diff, 1);
395 if(context == 0) run_mode=1;
400 while(run_count >= 1<<log2_run[run_index]){
401 run_count -= 1<<log2_run[run_index];
403 put_bits(&s->pb, 1, 1);
406 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
407 if(run_index) run_index--;
416 // 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));
419 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
423 while(run_count >= 1<<log2_run[run_index]){
424 run_count -= 1<<log2_run[run_index];
426 put_bits(&s->pb, 1, 1);
430 put_bits(&s->pb, 1, 1);
432 s->run_index= run_index;
437 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
439 const int ring_size= s->avctx->context_model ? 3 : 2;
440 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
443 memset(sample_buffer, 0, sizeof(sample_buffer));
446 for(i=0; i<ring_size; i++)
447 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
449 sample[0][-1]= sample[1][0 ];
450 sample[1][ w]= sample[1][w-1];
453 sample[0][x]= src[x + stride*y];
455 encode_line(s, w, sample, plane_index, 8);
456 //STOP_TIMER("encode line")}
460 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
462 const int ring_size= s->avctx->context_model ? 3 : 2;
463 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
466 memset(sample_buffer, 0, sizeof(sample_buffer));
469 for(i=0; i<ring_size; i++)
471 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
474 int v= src[x + stride*y];
485 // assert(g>=0 && b>=0 && r>=0);
486 // assert(g<256 && b<512 && r<512);
492 sample[p][0][-1]= sample[p][1][0 ];
493 sample[p][1][ w]= sample[p][1][w-1];
494 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
499 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
502 uint8_t state[CONTEXT_SIZE];
503 memset(state, 128, sizeof(state));
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);
511 put_symbol(c, state, i-last-1, 0);
514 static void write_header(FFV1Context *f){
515 uint8_t state[CONTEXT_SIZE];
517 RangeCoder * const c= &f->c;
519 memset(state, 128, sizeof(state));
521 put_symbol(c, state, f->version, 0);
522 put_symbol(c, state, f->avctx->coder_type, 0);
523 put_symbol(c, state, f->colorspace, 0); //YUV cs type
524 put_rac(c, state, 1); //chroma planes
525 put_symbol(c, state, f->chroma_h_shift, 0);
526 put_symbol(c, state, f->chroma_v_shift, 0);
527 put_rac(c, state, 0); //no transparency plane
530 write_quant_table(c, f->quant_table[i]);
532 #endif /* CONFIG_ENCODERS */
534 static int common_init(AVCodecContext *avctx){
535 FFV1Context *s = avctx->priv_data;
539 s->flags= avctx->flags;
541 dsputil_init(&s->dsp, avctx);
543 width= s->width= avctx->width;
544 height= s->height= avctx->height;
546 assert(width && height);
551 #ifdef CONFIG_ENCODERS
552 static int encode_init(AVCodecContext *avctx)
554 FFV1Context *s = avctx->priv_data;
560 s->ac= avctx->coder_type;
563 for(i=0; i<256; i++){
564 s->quant_table[0][i]= quant11[i];
565 s->quant_table[1][i]= 11*quant11[i];
566 if(avctx->context_model==0){
567 s->quant_table[2][i]= 11*11*quant11[i];
568 s->quant_table[3][i]=
569 s->quant_table[4][i]=0;
571 s->quant_table[2][i]= 11*11*quant5 [i];
572 s->quant_table[3][i]= 5*11*11*quant5 [i];
573 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
577 for(i=0; i<s->plane_count; i++){
578 PlaneContext * const p= &s->plane[i];
580 if(avctx->context_model==0){
581 p->context_count= (11*11*11+1)/2;
583 p->context_count= (11*11*5*5*5+1)/2;
587 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
589 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
593 avctx->coded_frame= &s->picture;
594 switch(avctx->pix_fmt){
595 case PIX_FMT_YUV444P:
596 case PIX_FMT_YUV422P:
597 case PIX_FMT_YUV420P:
598 case PIX_FMT_YUV411P:
599 case PIX_FMT_YUV410P:
606 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
609 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
615 #endif /* CONFIG_ENCODERS */
618 static void clear_state(FFV1Context *f){
621 for(i=0; i<f->plane_count; i++){
622 PlaneContext *p= &f->plane[i];
624 p->interlace_bit_state[0]= 128;
625 p->interlace_bit_state[1]= 128;
627 for(j=0; j<p->context_count; j++){
629 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
631 p->vlc_state[j].drift= 0;
632 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
633 p->vlc_state[j].bias= 0;
634 p->vlc_state[j].count= 1;
640 #ifdef CONFIG_ENCODERS
641 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
642 FFV1Context *f = avctx->priv_data;
643 RangeCoder * const c= &f->c;
644 AVFrame *pict = data;
645 const int width= f->width;
646 const int height= f->height;
647 AVFrame * const p= &f->picture;
649 uint8_t keystate=128;
651 ff_init_range_encoder(c, buf, buf_size);
652 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
653 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
656 p->pict_type= FF_I_TYPE;
658 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
659 put_rac(c, &keystate, 1);
664 put_rac(c, &keystate, 0);
669 used_count += ff_rac_terminate(c);
670 //printf("pos=%d\n", used_count);
671 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
674 if(f->colorspace==0){
675 const int chroma_width = -((-width )>>f->chroma_h_shift);
676 const int chroma_height= -((-height)>>f->chroma_v_shift);
678 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
680 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
681 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
683 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
690 return ff_rac_terminate(c);
692 flush_put_bits(&f->pb); //nicer padding FIXME
693 return used_count + (put_bits_count(&f->pb)+7)/8;
696 #endif /* CONFIG_ENCODERS */
698 static int common_end(AVCodecContext *avctx){
699 FFV1Context *s = avctx->priv_data;
702 for(i=0; i<s->plane_count; i++){
703 PlaneContext *p= &s->plane[i];
711 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
712 PlaneContext * const p= &s->plane[plane_index];
713 RangeCoder * const c= &s->c;
717 int run_index= s->run_index;
720 int diff, context, sign;
722 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
731 diff= get_symbol(c, p->state[context], 1);
733 if(context == 0 && run_mode==0) run_mode=1;
736 if(run_count==0 && run_mode==1){
737 if(get_bits1(&s->gb)){
738 run_count = 1<<log2_run[run_index];
739 if(x + run_count <= w) run_index++;
741 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
743 if(run_index) run_index--;
751 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
756 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
758 // 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));
761 if(sign) diff= -diff;
763 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
765 s->run_index= run_index;
768 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
770 int_fast16_t sample_buffer[2][w+6];
771 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
775 memset(sample_buffer, 0, sizeof(sample_buffer));
778 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
780 sample[0]= sample[1];
783 sample[1][-1]= sample[0][0 ];
784 sample[0][ w]= sample[0][w-1];
787 decode_line(s, w, sample, plane_index, 8);
789 src[x + stride*y]= sample[1][x];
791 //STOP_TIMER("decode-line")}
795 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
797 int_fast16_t sample_buffer[3][2][w+6];
798 int_fast16_t *sample[3][2]= {
799 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
800 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
801 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
805 memset(sample_buffer, 0, sizeof(sample_buffer));
809 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
811 sample[p][0]= sample[p][1];
814 sample[p][1][-1]= sample[p][0][0 ];
815 sample[p][0][ w]= sample[p][0][w-1];
816 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
819 int g= sample[0][1][x];
820 int b= sample[1][1][x];
821 int r= sample[2][1][x];
823 // assert(g>=0 && b>=0 && r>=0);
824 // assert(g<256 && b<512 && r<512);
832 src[x + stride*y]= b + (g<<8) + (r<<16);
837 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
840 uint8_t state[CONTEXT_SIZE];
842 memset(state, 128, sizeof(state));
844 for(v=0; i<128 ; v++){
845 int len= get_symbol(c, state, 0) + 1;
847 if(len + i > 128) return -1;
850 quant_table[i] = scale*v;
853 //if(i%16==0) printf("\n");
857 for(i=1; i<128; i++){
858 quant_table[256-i]= -quant_table[i];
860 quant_table[128]= -quant_table[127];
865 static int read_header(FFV1Context *f){
866 uint8_t state[CONTEXT_SIZE];
867 int i, context_count;
868 RangeCoder * const c= &f->c;
870 memset(state, 128, sizeof(state));
872 f->version= get_symbol(c, state, 0);
873 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
874 f->colorspace= get_symbol(c, state, 0); //YUV cs type
875 get_rac(c, state); //no chroma = false
876 f->chroma_h_shift= get_symbol(c, state, 0);
877 f->chroma_v_shift= get_symbol(c, state, 0);
878 get_rac(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 0x22: 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_RGB32;
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 || context_count > 32768){
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 RangeCoder * const c= &f->c;
942 const int width= f->width;
943 const int height= f->height;
944 AVFrame * const p= &f->picture;
946 uint8_t keystate= 128;
948 AVFrame *picture = data;
950 ff_init_range_decoder(c, buf, buf_size);
951 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
954 p->pict_type= FF_I_TYPE; //FIXME I vs. P
955 if(get_rac(c, &keystate)){
957 if(read_header(f) < 0)
963 if(!f->plane[0].state && !f->plane[0].vlc_state)
967 if(avctx->get_buffer(avctx, p) < 0){
968 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
972 if(avctx->debug&FF_DEBUG_PICT_INFO)
973 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
976 bytes_read = c->bytestream - c->bytestream_start - 1;
977 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
978 //printf("pos=%d\n", bytes_read);
979 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
981 bytes_read = 0; /* avoid warning */
984 if(f->colorspace==0){
985 const int chroma_width = -((-width )>>f->chroma_h_shift);
986 const int chroma_height= -((-height)>>f->chroma_v_shift);
987 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
989 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
990 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
992 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1001 avctx->release_buffer(avctx, p); //FIXME
1003 *data_size = sizeof(AVFrame);
1006 bytes_read= c->bytestream - c->bytestream_start - 1;
1007 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1009 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1015 AVCodec ffv1_decoder = {
1019 sizeof(FFV1Context),
1024 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1028 #ifdef CONFIG_ENCODERS
1029 AVCodec ffv1_encoder = {
1033 sizeof(FFV1Context),
1037 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, -1},