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 (a experimental lossless codec)
34 #define CONTEXT_SIZE 32
36 static const int8_t quant3[256]={
37 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
54 static const int8_t quant5[256]={
55 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
56 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
57 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
58 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
59 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
63 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
64 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
65 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
66 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
67 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
68 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
72 static const int8_t quant7[256]={
73 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
74 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
75 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
76 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
77 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
78 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
79 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
81 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
82 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
83 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
84 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
87 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
90 static const int8_t quant9[256]={
91 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
92 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
93 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
95 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
96 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
99 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
100 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
101 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
102 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
108 static const int8_t quant11[256]={
109 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
110 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
111 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
112 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
113 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
114 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
115 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
117 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
118 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
119 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
120 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
123 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
124 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
126 static const int8_t quant13[256]={
127 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
128 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
129 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
131 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
132 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
133 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
134 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
135 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
136 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
137 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
138 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
140 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
145 static const uint8_t log2_run[32]={
146 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
147 4, 4, 5, 5, 6, 6, 7, 7,
148 8, 9,10,11,12,13,14,15,
151 typedef struct VlcState{
158 typedef struct PlaneContext{
160 uint8_t (*state)[CONTEXT_SIZE];
162 uint8_t interlace_bit_state[2];
165 typedef struct FFV1Context{
166 AVCodecContext *avctx;
172 int chroma_h_shift, chroma_v_shift;
177 int ac; ///< 1-> CABAC 0-> golomb rice
178 PlaneContext plane[MAX_PLANES];
179 int16_t quant_table[5][256];
184 static inline int predict(uint8_t *src, uint8_t *last){
185 const int LT= last[-1];
186 const int T= last[ 0];
187 const int L = src[-1];
189 return mid_pred(L, L + T - LT, T);
192 static inline int get_context(FFV1Context *f, uint8_t *src, uint8_t *last, uint8_t *last2){
193 const int LT= last[-1];
194 const int T= last[ 0];
195 const int RT= last[ 1];
196 const int L = src[-1];
198 if(f->quant_table[3][127]){
199 const int TT= last2[0];
200 const int LL= src[-2];
201 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
202 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
204 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
210 static inline void put_symbol(CABACContext *c, uint8_t *state, int v, int is_signed, int max_exp){
215 const int e= av_log2(a);
217 put_cabac(c, state+0, 0);
220 put_cabac(c, state+1+i, 1); //1..8
224 put_cabac(c, state+1+i, 0); //1..8
226 for(i=e-1; i>=0; i--){
227 put_cabac(c, state+16+e+i, (a>>i)&1); //17..29
230 put_cabac(c, state+9 + e, v < 0); //9..16
233 put_cabac(c, state+0, 1);
237 static inline int get_symbol(CABACContext *c, uint8_t *state, int is_signed, int max_exp){
238 if(get_cabac(c, state+0))
243 for(e=0; e<max_exp; e++){
246 if(get_cabac(c, state + 1 + e)==0){ // 1..8
247 for(i=e-1; i>=0; i--){
248 a += get_cabac(c, state+16+e+i)<<i; //17..29
251 if(is_signed && get_cabac(c, state+9 + e)) //9..16
261 static inline void update_vlc_state(VlcState * const state, const int v){
262 int drift= state->drift;
263 int count= state->count;
264 state->error_sum += ABS(v);
267 if(count == 128){ //FIXME variable
270 state->error_sum >>= 1;
275 if(state->bias > -128) state->bias--;
281 if(state->bias < 127) state->bias++;
292 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v){
294 //printf("final: %d ", v);
295 v = (int8_t)(v - state->bias);
299 while(i < state->error_sum){ //FIXME optimize
307 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
310 code= v ^ ((2*state->drift + state->count)>>31);
315 //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);
316 set_ur_golomb(pb, code, k, 12, 8);
318 update_vlc_state(state, v);
321 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state){
326 while(i < state->error_sum){ //FIXME optimize
333 v= get_ur_golomb(gb, k, 12, 8);
334 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
341 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
343 v ^= ((2*state->drift + state->count)>>31);
346 ret= (int8_t)(v + state->bias);
348 update_vlc_state(state, v);
349 //printf("final: %d\n", ret);
355 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
356 PlaneContext * const p= &s->plane[plane_index];
357 CABACContext * const c= &s->c;
359 uint8_t sample_buffer[2][w+6];
360 uint8_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
363 memset(sample_buffer, 0, sizeof(sample_buffer));
366 uint8_t *temp= sample[0]; //FIXME try a normal buffer
370 sample[0]= sample[1];
373 sample[1][-1]= sample[0][0 ];
374 sample[0][ w]= sample[0][w-1];
377 uint8_t *temp_src= src + x + stride*y;
380 context= get_context(s, sample[1]+x, sample[0]+x, sample[1]+x);
381 diff= temp_src[0] - predict(sample[1]+x, sample[0]+x);
391 put_symbol(c, p->state[context], diff, 1, 7);
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)get_bit_count(&s->pb));
417 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff);
420 sample[1][x]= temp_src[0];
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);
435 static void write_quant_table(CABACContext *c, int16_t *quant_table){
438 uint8_t state[CONTEXT_SIZE]={0};
440 for(i=1; i<128 ; i++){
441 if(quant_table[i] != quant_table[i-1]){
442 put_symbol(c, state, i-last-1, 0, 7);
446 put_symbol(c, state, i-last-1, 0, 7);
449 static void write_header(FFV1Context *f){
450 uint8_t state[CONTEXT_SIZE]={0};
452 CABACContext * const c= &f->c;
454 put_symbol(c, state, f->version, 0, 7);
455 put_symbol(c, state, f->avctx->coder_type, 0, 7);
456 put_symbol(c, state, 0, 0, 7); //YUV cs type
457 put_cabac(c, state, 1); //chroma planes
458 put_symbol(c, state, f->chroma_h_shift, 0, 7);
459 put_symbol(c, state, f->chroma_v_shift, 0, 7);
460 put_cabac(c, state, 0); //no transparency plane
463 write_quant_table(c, f->quant_table[i]);
466 static int common_init(AVCodecContext *avctx){
467 FFV1Context *s = avctx->priv_data;
471 s->flags= avctx->flags;
473 dsputil_init(&s->dsp, avctx);
475 width= s->width= avctx->width;
476 height= s->height= avctx->height;
478 assert(width && height);
483 static int encode_init(AVCodecContext *avctx)
485 FFV1Context *s = avctx->priv_data;
491 s->ac= avctx->coder_type;
494 for(i=0; i<256; i++){
495 s->quant_table[0][i]= quant11[i];
496 s->quant_table[1][i]= 11*quant11[i];
497 if(avctx->context_model==0){
498 s->quant_table[2][i]= 11*11*quant11[i];
499 s->quant_table[3][i]=
500 s->quant_table[4][i]=0;
502 s->quant_table[2][i]= 11*11*quant5 [i];
503 s->quant_table[3][i]= 5*11*11*quant5 [i];
504 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
508 for(i=0; i<s->plane_count; i++){
509 PlaneContext * const p= &s->plane[i];
511 if(avctx->context_model==0){
512 p->context_count= (11*11*11+1)/2;
514 p->context_count= (11*11*5*5*5+1)/2;
518 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
520 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
524 avctx->coded_frame= &s->picture;
525 switch(avctx->pix_fmt){
526 case PIX_FMT_YUV444P:
527 case PIX_FMT_YUV422P:
528 case PIX_FMT_YUV420P:
529 case PIX_FMT_YUV411P:
530 case PIX_FMT_YUV410P:
531 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
534 fprintf(stderr, "format not supported\n");
545 static void clear_state(FFV1Context *f){
548 for(i=0; i<f->plane_count; i++){
549 PlaneContext *p= &f->plane[i];
551 p->interlace_bit_state[0]= 0;
552 p->interlace_bit_state[1]= 0;
554 for(j=0; j<p->context_count; j++){
556 memset(p->state[j], 0, sizeof(uint8_t)*CONTEXT_SIZE);
557 p->state[j][7] = 2*62;
559 p->vlc_state[j].drift= 0;
560 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
561 p->vlc_state[j].bias= 0;
562 p->vlc_state[j].count= 1;
568 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
569 FFV1Context *f = avctx->priv_data;
570 CABACContext * const c= &f->c;
571 AVFrame *pict = data;
572 const int width= f->width;
573 const int height= f->height;
574 AVFrame * const p= &f->picture;
577 if(avctx->strict_std_compliance >= 0){
578 printf("this codec is under development, files encoded with it wont be decodeable with future versions!!!\n"
579 "use vstrict=-1 to use it anyway\n");
583 ff_init_cabac_encoder(c, buf, buf_size);
584 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
587 p->pict_type= FF_I_TYPE;
589 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
590 put_cabac_bypass(c, 1);
595 put_cabac_bypass(c, 0);
600 used_count += put_cabac_terminate(c, 1);
601 //printf("pos=%d\n", used_count);
602 init_put_bits(&f->pb, buf + used_count, buf_size - used_count, NULL, NULL);
606 const int chroma_width = -((-width )>>f->chroma_h_shift);
607 const int chroma_height= -((-height)>>f->chroma_v_shift);
609 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
611 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
612 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
619 return put_cabac_terminate(c, 1);
621 flush_put_bits(&f->pb); //nicer padding FIXME
622 return used_count + (get_bit_count(&f->pb)+7)/8;
626 static void common_end(FFV1Context *s){
629 for(i=0; i<s->plane_count; i++){
630 PlaneContext *p= &s->plane[i];
636 static int encode_end(AVCodecContext *avctx)
638 FFV1Context *s = avctx->priv_data;
645 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
646 PlaneContext * const p= &s->plane[plane_index];
647 CABACContext * const c= &s->c;
649 uint8_t sample_buffer[2][w+6];
650 uint8_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
653 memset(sample_buffer, 0, sizeof(sample_buffer));
656 uint8_t *temp= sample[0]; //FIXME try a normal buffer
660 sample[0]= sample[1];
663 sample[1][-1]= sample[0][0 ];
664 sample[0][ w]= sample[0][w-1];
667 uint8_t *temp_src= src + x + stride*y;
668 int diff, context, sign;
670 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
679 diff= get_symbol(c, p->state[context], 1, 7);
681 if(context == 0 && run_mode==0) run_mode=1;
684 if(run_count==0 && run_mode==1){
685 if(get_bits1(&s->gb)){
686 run_count = 1<<log2_run[run_index];
687 if(x + run_count <= w) run_index++;
689 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
691 if(run_index) run_index--;
699 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
704 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context]);
706 // 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));
709 if(sign) diff= (int8_t)(-diff); //FIXME remove cast
712 temp_src[0] = predict(sample[1] + x, sample[0] + x) + diff;
714 assert(diff>= -128 && diff <= 127);
719 static int read_quant_table(CABACContext *c, int16_t *quant_table, int scale){
722 uint8_t state[CONTEXT_SIZE]={0};
724 for(v=0; i<128 ; v++){
725 int len= get_symbol(c, state, 0, 7) + 1;
727 if(len + i > 128) return -1;
730 quant_table[i] = scale*v;
733 //if(i%16==0) printf("\n");
737 for(i=1; i<128; i++){
738 quant_table[256-i]= -quant_table[i];
740 quant_table[128]= -quant_table[127];
745 static int read_header(FFV1Context *f){
746 uint8_t state[CONTEXT_SIZE]={0};
747 int i, context_count;
748 CABACContext * const c= &f->c;
750 f->version= get_symbol(c, state, 0, 7);
751 f->ac= f->avctx->coder_type= get_symbol(c, state, 0, 7);
752 get_symbol(c, state, 0, 7); //YUV cs type
753 get_cabac(c, state); //no chroma = false
754 f->chroma_h_shift= get_symbol(c, state, 0, 7);
755 f->chroma_v_shift= get_symbol(c, state, 0, 7);
756 get_cabac(c, state); //transparency plane
759 switch(16*f->chroma_h_shift + f->chroma_v_shift){
760 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
761 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
762 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
763 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
764 case 0x33: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
766 fprintf(stderr, "format not supported\n");
769 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
773 context_count*= read_quant_table(c, f->quant_table[i], context_count);
774 if(context_count < 0){
775 printf("read_quant_table error\n");
779 context_count= (context_count+1)/2;
781 for(i=0; i<f->plane_count; i++){
782 PlaneContext * const p= &f->plane[i];
784 p->context_count= context_count;
787 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
789 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
796 static int decode_init(AVCodecContext *avctx)
798 // FFV1Context *s = avctx->priv_data;
803 switch(s->bitstream_bpp){
805 avctx->pix_fmt = PIX_FMT_YUV420P;
808 avctx->pix_fmt = PIX_FMT_YUV422P;
813 avctx->pix_fmt = PIX_FMT_RGBA32;
815 avctx->pix_fmt = PIX_FMT_BGR24;
826 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
827 FFV1Context *f = avctx->priv_data;
828 CABACContext * const c= &f->c;
829 const int width= f->width;
830 const int height= f->height;
831 AVFrame * const p= &f->picture;
834 AVFrame *picture = data;
838 /* no supplementary picture */
842 ff_init_cabac_decoder(c, buf, buf_size);
843 ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
845 p->pict_type= FF_I_TYPE; //FIXME I vs. P
846 if(get_cabac_bypass(c)){
855 if(avctx->get_buffer(avctx, p) < 0){
856 fprintf(stderr, "get_buffer() failed\n");
860 if(avctx->debug&FF_DEBUG_PICT_INFO)
861 printf("keyframe:%d coder:%d\n", p->key_frame, f->ac);
864 bytes_read = get_cabac_terminate(c);
865 if(bytes_read ==0) printf("error at end of AC stream\n");
866 //printf("pos=%d\n", bytes_read);
867 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
871 const int chroma_width = -((-width )>>f->chroma_h_shift);
872 const int chroma_height= -((-height)>>f->chroma_v_shift);
873 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
875 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
876 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
885 avctx->release_buffer(avctx, p); //FIXME
887 *data_size = sizeof(AVFrame);
890 bytes_read= get_cabac_terminate(c);
891 if(bytes_read ==0) printf("error at end of frame\n");
893 bytes_read+= (get_bits_count(&f->gb)+7)/8;
899 static int decode_end(AVCodecContext *avctx)
901 FFV1Context *s = avctx->priv_data;
904 if(avctx->get_buffer == avcodec_default_get_buffer){
906 av_freep(&s->picture.base[i]);
907 s->picture.data[i]= NULL;
909 av_freep(&s->picture.opaque);
915 AVCodec ffv1_decoder = {
924 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
928 #ifdef CONFIG_ENCODERS
929 AVCodec ffv1_encoder = {