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"
33 #include "rangecoder.h"
37 #define CONTEXT_SIZE 32
39 static const int8_t quant3[256]={
40 0, 0, 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,-1,
55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
57 static const int8_t quant5[256]={
58 0, 1, 1, 1, 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,-2,-2,-2,
73 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
75 static const int8_t quant7[256]={
76 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
89 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
91 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
93 static const int8_t quant9[256]={
94 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
95 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
108 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
109 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
111 static const int8_t quant11[256]={
112 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
113 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
114 4, 4, 4, 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,-5,-5,
125 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
126 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
127 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
129 static const int8_t quant13[256]={
130 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
131 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
132 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
133 5, 5, 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,-6,
142 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
143 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
144 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
145 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
148 static const uint8_t log2_run[32]={
149 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
150 4, 4, 5, 5, 6, 6, 7, 7,
151 8, 9,10,11,12,13,14,15,
154 typedef struct VlcState{
161 typedef struct PlaneContext{
163 uint8_t (*state)[CONTEXT_SIZE];
165 uint8_t interlace_bit_state[2];
168 typedef struct FFV1Context{
169 AVCodecContext *avctx;
175 int chroma_h_shift, chroma_v_shift;
180 int ac; ///< 1-> CABAC 0-> golomb rice
181 PlaneContext plane[MAX_PLANES];
182 int16_t quant_table[5][256];
189 static av_always_inline int fold(int diff, int bits){
201 static inline int predict(int_fast16_t *src, int_fast16_t *last){
202 const int LT= last[-1];
203 const int T= last[ 0];
204 const int L = src[-1];
206 return mid_pred(L, L + T - LT, T);
209 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
210 const int LT= last[-1];
211 const int T= last[ 0];
212 const int RT= last[ 1];
213 const int L = src[-1];
215 if(f->quant_table[3][127]){
216 const int TT= last2[0];
217 const int LL= src[-2];
218 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
219 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
221 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
224 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
228 const int a= FFABS(v);
229 const int e= av_log2(a);
230 put_rac(c, state+0, 0);
235 put_rac(c, state+1+i, 1); //1..10
237 put_rac(c, state+1+i, 0);
239 for(i=e-1; i>=0; i--){
240 put_rac(c, state+22+i, (a>>i)&1); //22..31
244 put_rac(c, state+11 + e, v < 0); //11..21
246 put_rac(c, state+0, 1);
250 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
251 if(get_rac(c, state+0))
256 while(get_rac(c, state+1 + e)){ //1..10
262 for(i=e-1; i>=0; i--){
263 a += a + get_rac(c, state+22 + i); //22..31
266 if(is_signed && get_rac(c, state+11 + e)) //11..21
273 static inline void update_vlc_state(VlcState * const state, const int v){
274 int drift= state->drift;
275 int count= state->count;
276 state->error_sum += FFABS(v);
279 if(count == 128){ //FIXME variable
282 state->error_sum >>= 1;
287 if(state->bias > -128) state->bias--;
293 if(state->bias < 127) state->bias++;
304 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
306 //printf("final: %d ", v);
307 v = fold(v - state->bias, bits);
311 while(i < state->error_sum){ //FIXME optimize
319 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
322 code= v ^ ((2*state->drift + state->count)>>31);
325 //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);
326 set_sr_golomb(pb, code, k, 12, bits);
328 update_vlc_state(state, v);
331 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
336 while(i < state->error_sum){ //FIXME optimize
343 v= get_sr_golomb(gb, k, 12, bits);
344 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
347 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
349 v ^= ((2*state->drift + state->count)>>31);
352 ret= fold(v + state->bias, bits);
354 update_vlc_state(state, v);
355 //printf("final: %d\n", ret);
359 #ifdef CONFIG_ENCODERS
360 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
361 PlaneContext * const p= &s->plane[plane_index];
362 RangeCoder * const c= &s->c;
364 int run_index= s->run_index;
369 if(c->bytestream_end - c->bytestream < w*20){
370 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
374 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
375 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
383 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
384 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
391 diff= fold(diff, bits);
394 put_symbol(c, p->state[context], diff, 1);
396 if(context == 0) run_mode=1;
401 while(run_count >= 1<<log2_run[run_index]){
402 run_count -= 1<<log2_run[run_index];
404 put_bits(&s->pb, 1, 1);
407 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
408 if(run_index) run_index--;
417 // 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));
420 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
424 while(run_count >= 1<<log2_run[run_index]){
425 run_count -= 1<<log2_run[run_index];
427 put_bits(&s->pb, 1, 1);
431 put_bits(&s->pb, 1, 1);
433 s->run_index= run_index;
438 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
440 const int ring_size= s->avctx->context_model ? 3 : 2;
441 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
444 memset(sample_buffer, 0, sizeof(sample_buffer));
447 for(i=0; i<ring_size; i++)
448 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
450 sample[0][-1]= sample[1][0 ];
451 sample[1][ w]= sample[1][w-1];
454 sample[0][x]= src[x + stride*y];
456 encode_line(s, w, sample, plane_index, 8);
457 //STOP_TIMER("encode line")}
461 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
463 const int ring_size= s->avctx->context_model ? 3 : 2;
464 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
467 memset(sample_buffer, 0, sizeof(sample_buffer));
470 for(i=0; i<ring_size; i++)
472 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
475 int v= src[x + stride*y];
486 // assert(g>=0 && b>=0 && r>=0);
487 // assert(g<256 && b<512 && r<512);
493 sample[p][0][-1]= sample[p][1][0 ];
494 sample[p][1][ w]= sample[p][1][w-1];
495 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
500 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
503 uint8_t state[CONTEXT_SIZE];
504 memset(state, 128, sizeof(state));
506 for(i=1; i<128 ; i++){
507 if(quant_table[i] != quant_table[i-1]){
508 put_symbol(c, state, i-last-1, 0);
512 put_symbol(c, state, i-last-1, 0);
515 static void write_header(FFV1Context *f){
516 uint8_t state[CONTEXT_SIZE];
518 RangeCoder * const c= &f->c;
520 memset(state, 128, sizeof(state));
522 put_symbol(c, state, f->version, 0);
523 put_symbol(c, state, f->avctx->coder_type, 0);
524 put_symbol(c, state, f->colorspace, 0); //YUV cs type
525 put_rac(c, state, 1); //chroma planes
526 put_symbol(c, state, f->chroma_h_shift, 0);
527 put_symbol(c, state, f->chroma_v_shift, 0);
528 put_rac(c, state, 0); //no transparency plane
531 write_quant_table(c, f->quant_table[i]);
533 #endif /* CONFIG_ENCODERS */
535 static int common_init(AVCodecContext *avctx){
536 FFV1Context *s = avctx->priv_data;
540 s->flags= avctx->flags;
542 dsputil_init(&s->dsp, avctx);
544 width= s->width= avctx->width;
545 height= s->height= avctx->height;
547 assert(width && height);
552 #ifdef CONFIG_ENCODERS
553 static int encode_init(AVCodecContext *avctx)
555 FFV1Context *s = avctx->priv_data;
561 s->ac= avctx->coder_type;
564 for(i=0; i<256; i++){
565 s->quant_table[0][i]= quant11[i];
566 s->quant_table[1][i]= 11*quant11[i];
567 if(avctx->context_model==0){
568 s->quant_table[2][i]= 11*11*quant11[i];
569 s->quant_table[3][i]=
570 s->quant_table[4][i]=0;
572 s->quant_table[2][i]= 11*11*quant5 [i];
573 s->quant_table[3][i]= 5*11*11*quant5 [i];
574 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
578 for(i=0; i<s->plane_count; i++){
579 PlaneContext * const p= &s->plane[i];
581 if(avctx->context_model==0){
582 p->context_count= (11*11*11+1)/2;
584 p->context_count= (11*11*5*5*5+1)/2;
588 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
590 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
594 avctx->coded_frame= &s->picture;
595 switch(avctx->pix_fmt){
596 case PIX_FMT_YUV444P:
597 case PIX_FMT_YUV422P:
598 case PIX_FMT_YUV420P:
599 case PIX_FMT_YUV411P:
600 case PIX_FMT_YUV410P:
607 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
610 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
616 #endif /* CONFIG_ENCODERS */
619 static void clear_state(FFV1Context *f){
622 for(i=0; i<f->plane_count; i++){
623 PlaneContext *p= &f->plane[i];
625 p->interlace_bit_state[0]= 128;
626 p->interlace_bit_state[1]= 128;
628 for(j=0; j<p->context_count; j++){
630 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
632 p->vlc_state[j].drift= 0;
633 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
634 p->vlc_state[j].bias= 0;
635 p->vlc_state[j].count= 1;
641 #ifdef CONFIG_ENCODERS
642 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
643 FFV1Context *f = avctx->priv_data;
644 RangeCoder * const c= &f->c;
645 AVFrame *pict = data;
646 const int width= f->width;
647 const int height= f->height;
648 AVFrame * const p= &f->picture;
650 uint8_t keystate=128;
652 ff_init_range_encoder(c, buf, buf_size);
653 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
654 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
657 p->pict_type= FF_I_TYPE;
659 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
660 put_rac(c, &keystate, 1);
665 put_rac(c, &keystate, 0);
670 used_count += ff_rac_terminate(c);
671 //printf("pos=%d\n", used_count);
672 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
675 if(f->colorspace==0){
676 const int chroma_width = -((-width )>>f->chroma_h_shift);
677 const int chroma_height= -((-height)>>f->chroma_v_shift);
679 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
681 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
682 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
684 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
691 return ff_rac_terminate(c);
693 flush_put_bits(&f->pb); //nicer padding FIXME
694 return used_count + (put_bits_count(&f->pb)+7)/8;
697 #endif /* CONFIG_ENCODERS */
699 static int common_end(AVCodecContext *avctx){
700 FFV1Context *s = avctx->priv_data;
703 for(i=0; i<s->plane_count; i++){
704 PlaneContext *p= &s->plane[i];
712 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
713 PlaneContext * const p= &s->plane[plane_index];
714 RangeCoder * const c= &s->c;
718 int run_index= s->run_index;
721 int diff, context, sign;
723 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
732 diff= get_symbol(c, p->state[context], 1);
734 if(context == 0 && run_mode==0) run_mode=1;
737 if(run_count==0 && run_mode==1){
738 if(get_bits1(&s->gb)){
739 run_count = 1<<log2_run[run_index];
740 if(x + run_count <= w) run_index++;
742 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
744 if(run_index) run_index--;
752 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
757 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
759 // 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));
762 if(sign) diff= -diff;
764 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
766 s->run_index= run_index;
769 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
771 int_fast16_t sample_buffer[2][w+6];
772 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
776 memset(sample_buffer, 0, sizeof(sample_buffer));
779 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
781 sample[0]= sample[1];
784 sample[1][-1]= sample[0][0 ];
785 sample[0][ w]= sample[0][w-1];
788 decode_line(s, w, sample, plane_index, 8);
790 src[x + stride*y]= sample[1][x];
792 //STOP_TIMER("decode-line")}
796 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
798 int_fast16_t sample_buffer[3][2][w+6];
799 int_fast16_t *sample[3][2]= {
800 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
801 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
802 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
806 memset(sample_buffer, 0, sizeof(sample_buffer));
810 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
812 sample[p][0]= sample[p][1];
815 sample[p][1][-1]= sample[p][0][0 ];
816 sample[p][0][ w]= sample[p][0][w-1];
817 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
820 int g= sample[0][1][x];
821 int b= sample[1][1][x];
822 int r= sample[2][1][x];
824 // assert(g>=0 && b>=0 && r>=0);
825 // assert(g<256 && b<512 && r<512);
833 src[x + stride*y]= b + (g<<8) + (r<<16);
838 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
841 uint8_t state[CONTEXT_SIZE];
843 memset(state, 128, sizeof(state));
845 for(v=0; i<128 ; v++){
846 int len= get_symbol(c, state, 0) + 1;
848 if(len + i > 128) return -1;
851 quant_table[i] = scale*v;
854 //if(i%16==0) printf("\n");
858 for(i=1; i<128; i++){
859 quant_table[256-i]= -quant_table[i];
861 quant_table[128]= -quant_table[127];
866 static int read_header(FFV1Context *f){
867 uint8_t state[CONTEXT_SIZE];
868 int i, context_count;
869 RangeCoder * const c= &f->c;
871 memset(state, 128, sizeof(state));
873 f->version= get_symbol(c, state, 0);
874 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
875 f->colorspace= get_symbol(c, state, 0); //YUV cs type
876 get_rac(c, state); //no chroma = false
877 f->chroma_h_shift= get_symbol(c, state, 0);
878 f->chroma_v_shift= get_symbol(c, state, 0);
879 get_rac(c, state); //transparency plane
882 if(f->colorspace==0){
883 switch(16*f->chroma_h_shift + f->chroma_v_shift){
884 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
885 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
886 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
887 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
888 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
890 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
893 }else if(f->colorspace==1){
894 if(f->chroma_h_shift || f->chroma_v_shift){
895 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
898 f->avctx->pix_fmt= PIX_FMT_RGB32;
900 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
904 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
908 context_count*= read_quant_table(c, f->quant_table[i], context_count);
909 if(context_count < 0 || context_count > 32768){
910 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
914 context_count= (context_count+1)/2;
916 for(i=0; i<f->plane_count; i++){
917 PlaneContext * const p= &f->plane[i];
919 p->context_count= context_count;
922 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
924 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
931 static int decode_init(AVCodecContext *avctx)
933 // FFV1Context *s = avctx->priv_data;
940 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
941 FFV1Context *f = avctx->priv_data;
942 RangeCoder * const c= &f->c;
943 const int width= f->width;
944 const int height= f->height;
945 AVFrame * const p= &f->picture;
947 uint8_t keystate= 128;
949 AVFrame *picture = data;
951 ff_init_range_decoder(c, buf, buf_size);
952 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
955 p->pict_type= FF_I_TYPE; //FIXME I vs. P
956 if(get_rac(c, &keystate)){
958 if(read_header(f) < 0)
964 if(!f->plane[0].state && !f->plane[0].vlc_state)
968 if(avctx->get_buffer(avctx, p) < 0){
969 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
973 if(avctx->debug&FF_DEBUG_PICT_INFO)
974 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
977 bytes_read = c->bytestream - c->bytestream_start - 1;
978 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
979 //printf("pos=%d\n", bytes_read);
980 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
982 bytes_read = 0; /* avoid warning */
985 if(f->colorspace==0){
986 const int chroma_width = -((-width )>>f->chroma_h_shift);
987 const int chroma_height= -((-height)>>f->chroma_v_shift);
988 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
990 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
991 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
993 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1002 avctx->release_buffer(avctx, p); //FIXME
1004 *data_size = sizeof(AVFrame);
1007 bytes_read= c->bytestream - c->bytestream_start - 1;
1008 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1010 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1016 AVCodec ffv1_decoder = {
1020 sizeof(FFV1Context),
1025 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1029 #ifdef CONFIG_ENCODERS
1030 AVCodec ffv1_encoder = {
1034 sizeof(FFV1Context),
1038 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, -1},