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
24 * @file libavcodec/ffv1.c
25 * FF Video Codec 1 (an experimental lossless codec)
32 #include "rangecoder.h"
37 #define CONTEXT_SIZE 32
39 extern const uint8_t ff_log2_run[32];
41 static const int8_t quant3[256]={
42 0, 0, 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,-1,
56 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
57 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
59 static const int8_t quant5[256]={
60 0, 1, 1, 1, 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,-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,-2,-2,-2,-2,-2,-1,-1,-1,
77 static const int8_t quant7[256]={
78 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
80 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
90 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
91 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
92 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
93 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
95 static const int8_t quant9[256]={
96 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
97 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
109 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
110 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
111 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
113 static const int8_t quant11[256]={
114 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
115 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
116 4, 4, 4, 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,-5,-5,
126 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
127 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
128 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
129 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
131 static const int8_t quant13[256]={
132 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
133 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
134 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
135 5, 5, 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,-6,
143 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
144 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
145 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
146 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
147 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
150 typedef struct VlcState{
157 typedef struct PlaneContext{
159 uint8_t (*state)[CONTEXT_SIZE];
161 uint8_t interlace_bit_state[2];
164 typedef struct FFV1Context{
165 AVCodecContext *avctx;
171 int chroma_h_shift, chroma_v_shift;
176 int ac; ///< 1-> CABAC 0-> golomb rice
177 PlaneContext plane[MAX_PLANES];
178 int16_t quant_table[5][256];
185 static av_always_inline int fold(int diff, int bits){
197 static inline int predict(int_fast16_t *src, int_fast16_t *last){
198 const int LT= last[-1];
199 const int T= last[ 0];
200 const int L = src[-1];
202 return mid_pred(L, L + T - LT, T);
205 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
206 const int LT= last[-1];
207 const int T= last[ 0];
208 const int RT= last[ 1];
209 const int L = src[-1];
211 if(f->quant_table[3][127]){
212 const int TT= last2[0];
213 const int LL= src[-2];
214 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
215 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
217 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
220 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
224 const int a= FFABS(v);
225 const int e= av_log2(a);
226 put_rac(c, state+0, 0);
231 put_rac(c, state+1+i, 1); //1..10
233 put_rac(c, state+1+i, 0);
235 for(i=e-1; i>=0; i--){
236 put_rac(c, state+22+i, (a>>i)&1); //22..31
240 put_rac(c, state+11 + e, v < 0); //11..21
242 put_rac(c, state+0, 1);
246 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
247 if(get_rac(c, state+0))
252 while(get_rac(c, state+1 + e) && e<9){ //1..10
257 for(i=e-1; i>=0; i--){
258 a += a + get_rac(c, state+22 + i); //22..31
261 if(is_signed && get_rac(c, state+11 + e)) //11..21
268 static inline void update_vlc_state(VlcState * const state, const int v){
269 int drift= state->drift;
270 int count= state->count;
271 state->error_sum += FFABS(v);
274 if(count == 128){ //FIXME variable
277 state->error_sum >>= 1;
282 if(state->bias > -128) state->bias--;
288 if(state->bias < 127) state->bias++;
299 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
301 //printf("final: %d ", v);
302 v = fold(v - state->bias, bits);
306 while(i < state->error_sum){ //FIXME optimize
314 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
317 code= v ^ ((2*state->drift + state->count)>>31);
320 //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);
321 set_sr_golomb(pb, code, k, 12, bits);
323 update_vlc_state(state, v);
326 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
331 while(i < state->error_sum){ //FIXME optimize
338 v= get_sr_golomb(gb, k, 12, bits);
339 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
342 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
344 v ^= ((2*state->drift + state->count)>>31);
347 ret= fold(v + state->bias, bits);
349 update_vlc_state(state, v);
350 //printf("final: %d\n", ret);
354 #if CONFIG_FFV1_ENCODER
355 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
356 PlaneContext * const p= &s->plane[plane_index];
357 RangeCoder * const c= &s->c;
359 int run_index= s->run_index;
364 if(c->bytestream_end - c->bytestream < w*20){
365 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
369 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
370 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
378 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
379 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
386 diff= fold(diff, bits);
389 put_symbol(c, p->state[context], diff, 1);
391 if(context == 0) run_mode=1;
396 while(run_count >= 1<<ff_log2_run[run_index]){
397 run_count -= 1<<ff_log2_run[run_index];
399 put_bits(&s->pb, 1, 1);
402 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
403 if(run_index) run_index--;
412 // 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));
415 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
419 while(run_count >= 1<<ff_log2_run[run_index]){
420 run_count -= 1<<ff_log2_run[run_index];
422 put_bits(&s->pb, 1, 1);
426 put_bits(&s->pb, 1, 1);
428 s->run_index= run_index;
433 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
435 const int ring_size= s->avctx->context_model ? 3 : 2;
436 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
439 memset(sample_buffer, 0, sizeof(sample_buffer));
442 for(i=0; i<ring_size; i++)
443 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
445 sample[0][-1]= sample[1][0 ];
446 sample[1][ w]= sample[1][w-1];
449 sample[0][x]= src[x + stride*y];
451 encode_line(s, w, sample, plane_index, 8);
452 //STOP_TIMER("encode line")}
456 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
458 const int ring_size= s->avctx->context_model ? 3 : 2;
459 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
462 memset(sample_buffer, 0, sizeof(sample_buffer));
465 for(i=0; i<ring_size; i++)
467 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
470 int v= src[x + stride*y];
481 // assert(g>=0 && b>=0 && r>=0);
482 // assert(g<256 && b<512 && r<512);
488 sample[p][0][-1]= sample[p][1][0 ];
489 sample[p][1][ w]= sample[p][1][w-1];
490 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
495 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
498 uint8_t state[CONTEXT_SIZE];
499 memset(state, 128, sizeof(state));
501 for(i=1; i<128 ; i++){
502 if(quant_table[i] != quant_table[i-1]){
503 put_symbol(c, state, i-last-1, 0);
507 put_symbol(c, state, i-last-1, 0);
510 static void write_header(FFV1Context *f){
511 uint8_t state[CONTEXT_SIZE];
513 RangeCoder * const c= &f->c;
515 memset(state, 128, sizeof(state));
517 put_symbol(c, state, f->version, 0);
518 put_symbol(c, state, f->avctx->coder_type, 0);
519 put_symbol(c, state, f->colorspace, 0); //YUV cs type
520 put_rac(c, state, 1); //chroma planes
521 put_symbol(c, state, f->chroma_h_shift, 0);
522 put_symbol(c, state, f->chroma_v_shift, 0);
523 put_rac(c, state, 0); //no transparency plane
526 write_quant_table(c, f->quant_table[i]);
528 #endif /* CONFIG_FFV1_ENCODER */
530 static av_cold int common_init(AVCodecContext *avctx){
531 FFV1Context *s = avctx->priv_data;
534 s->flags= avctx->flags;
536 dsputil_init(&s->dsp, avctx);
538 s->width = avctx->width;
539 s->height= avctx->height;
541 assert(s->width && s->height);
546 #if CONFIG_FFV1_ENCODER
547 static av_cold int encode_init(AVCodecContext *avctx)
549 FFV1Context *s = avctx->priv_data;
555 s->ac= avctx->coder_type;
558 for(i=0; i<256; i++){
559 s->quant_table[0][i]= quant11[i];
560 s->quant_table[1][i]= 11*quant11[i];
561 if(avctx->context_model==0){
562 s->quant_table[2][i]= 11*11*quant11[i];
563 s->quant_table[3][i]=
564 s->quant_table[4][i]=0;
566 s->quant_table[2][i]= 11*11*quant5 [i];
567 s->quant_table[3][i]= 5*11*11*quant5 [i];
568 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
572 for(i=0; i<s->plane_count; i++){
573 PlaneContext * const p= &s->plane[i];
575 if(avctx->context_model==0){
576 p->context_count= (11*11*11+1)/2;
578 p->context_count= (11*11*5*5*5+1)/2;
582 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
584 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
588 avctx->coded_frame= &s->picture;
589 switch(avctx->pix_fmt){
590 case PIX_FMT_YUV444P:
591 case PIX_FMT_YUV422P:
592 case PIX_FMT_YUV420P:
593 case PIX_FMT_YUV411P:
594 case PIX_FMT_YUV410P:
601 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
604 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
610 #endif /* CONFIG_FFV1_ENCODER */
613 static void clear_state(FFV1Context *f){
616 for(i=0; i<f->plane_count; i++){
617 PlaneContext *p= &f->plane[i];
619 p->interlace_bit_state[0]= 128;
620 p->interlace_bit_state[1]= 128;
622 for(j=0; j<p->context_count; j++){
624 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
626 p->vlc_state[j].drift= 0;
627 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
628 p->vlc_state[j].bias= 0;
629 p->vlc_state[j].count= 1;
635 #if CONFIG_FFV1_ENCODER
636 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
637 FFV1Context *f = avctx->priv_data;
638 RangeCoder * const c= &f->c;
639 AVFrame *pict = data;
640 const int width= f->width;
641 const int height= f->height;
642 AVFrame * const p= &f->picture;
644 uint8_t keystate=128;
646 ff_init_range_encoder(c, buf, buf_size);
647 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
648 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
651 p->pict_type= FF_I_TYPE;
653 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
654 put_rac(c, &keystate, 1);
659 put_rac(c, &keystate, 0);
664 used_count += ff_rac_terminate(c);
665 //printf("pos=%d\n", used_count);
666 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
669 if(f->colorspace==0){
670 const int chroma_width = -((-width )>>f->chroma_h_shift);
671 const int chroma_height= -((-height)>>f->chroma_v_shift);
673 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
675 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
676 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
678 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
685 return ff_rac_terminate(c);
687 flush_put_bits(&f->pb); //nicer padding FIXME
688 return used_count + (put_bits_count(&f->pb)+7)/8;
691 #endif /* CONFIG_FFV1_ENCODER */
693 static av_cold int common_end(AVCodecContext *avctx){
694 FFV1Context *s = avctx->priv_data;
697 for(i=0; i<s->plane_count; i++){
698 PlaneContext *p= &s->plane[i];
701 av_freep(&p->vlc_state);
707 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
708 PlaneContext * const p= &s->plane[plane_index];
709 RangeCoder * const c= &s->c;
713 int run_index= s->run_index;
716 int diff, context, sign;
718 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
727 diff= get_symbol(c, p->state[context], 1);
729 if(context == 0 && run_mode==0) run_mode=1;
732 if(run_count==0 && run_mode==1){
733 if(get_bits1(&s->gb)){
734 run_count = 1<<ff_log2_run[run_index];
735 if(x + run_count <= w) run_index++;
737 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
739 if(run_index) run_index--;
747 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
752 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
754 // 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));
757 if(sign) diff= -diff;
759 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
761 s->run_index= run_index;
764 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
766 int_fast16_t sample_buffer[2][w+6];
767 int_fast16_t *sample[2];
768 sample[0]=sample_buffer[0]+3;
769 sample[1]=sample_buffer[1]+3;
773 memset(sample_buffer, 0, sizeof(sample_buffer));
776 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
778 sample[0]= sample[1];
781 sample[1][-1]= sample[0][0 ];
782 sample[0][ w]= sample[0][w-1];
785 decode_line(s, w, sample, plane_index, 8);
787 src[x + stride*y]= sample[1][x];
789 //STOP_TIMER("decode-line")}
793 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
795 int_fast16_t sample_buffer[3][2][w+6];
796 int_fast16_t *sample[3][2];
798 sample[x][0] = sample_buffer[x][0]+3;
799 sample[x][1] = sample_buffer[x][1]+3;
804 memset(sample_buffer, 0, sizeof(sample_buffer));
808 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
810 sample[p][0]= sample[p][1];
813 sample[p][1][-1]= sample[p][0][0 ];
814 sample[p][0][ w]= sample[p][0][w-1];
815 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
818 int g= sample[0][1][x];
819 int b= sample[1][1][x];
820 int r= sample[2][1][x];
822 // assert(g>=0 && b>=0 && r>=0);
823 // assert(g<256 && b<512 && r<512);
831 src[x + stride*y]= b + (g<<8) + (r<<16);
836 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
839 uint8_t state[CONTEXT_SIZE];
841 memset(state, 128, sizeof(state));
843 for(v=0; i<128 ; v++){
844 int len= get_symbol(c, state, 0) + 1;
846 if(len + i > 128) return -1;
849 quant_table[i] = scale*v;
852 //if(i%16==0) printf("\n");
856 for(i=1; i<128; i++){
857 quant_table[256-i]= -quant_table[i];
859 quant_table[128]= -quant_table[127];
864 static int read_header(FFV1Context *f){
865 uint8_t state[CONTEXT_SIZE];
866 int i, context_count;
867 RangeCoder * const c= &f->c;
869 memset(state, 128, sizeof(state));
871 f->version= get_symbol(c, state, 0);
872 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
873 f->colorspace= get_symbol(c, state, 0); //YUV cs type
874 get_rac(c, state); //no chroma = false
875 f->chroma_h_shift= get_symbol(c, state, 0);
876 f->chroma_v_shift= get_symbol(c, state, 0);
877 get_rac(c, state); //transparency plane
880 if(f->colorspace==0){
881 switch(16*f->chroma_h_shift + f->chroma_v_shift){
882 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
883 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
884 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
885 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
886 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
888 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
891 }else if(f->colorspace==1){
892 if(f->chroma_h_shift || f->chroma_v_shift){
893 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
896 f->avctx->pix_fmt= PIX_FMT_RGB32;
898 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
902 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
906 context_count*= read_quant_table(c, f->quant_table[i], context_count);
907 if(context_count < 0 || context_count > 32768){
908 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
912 context_count= (context_count+1)/2;
914 for(i=0; i<f->plane_count; i++){
915 PlaneContext * const p= &f->plane[i];
917 p->context_count= context_count;
920 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
922 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
929 static av_cold int decode_init(AVCodecContext *avctx)
931 // FFV1Context *s = avctx->priv_data;
938 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
939 const uint8_t *buf = avpkt->data;
940 int buf_size = avpkt->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*/,
1027 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1030 #if CONFIG_FFV1_ENCODER
1031 AVCodec ffv1_encoder = {
1035 sizeof(FFV1Context),
1039 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_NONE},
1040 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),