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 e= -(is_signed && get_rac(c, state+11 + e)); //11..21
266 static inline void update_vlc_state(VlcState * const state, const int v){
267 int drift= state->drift;
268 int count= state->count;
269 state->error_sum += FFABS(v);
272 if(count == 128){ //FIXME variable
275 state->error_sum >>= 1;
280 if(state->bias > -128) state->bias--;
286 if(state->bias < 127) state->bias++;
297 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
299 //printf("final: %d ", v);
300 v = fold(v - state->bias, bits);
304 while(i < state->error_sum){ //FIXME optimize
312 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
315 code= v ^ ((2*state->drift + state->count)>>31);
318 //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);
319 set_sr_golomb(pb, code, k, 12, bits);
321 update_vlc_state(state, v);
324 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
329 while(i < state->error_sum){ //FIXME optimize
336 v= get_sr_golomb(gb, k, 12, bits);
337 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
340 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
342 v ^= ((2*state->drift + state->count)>>31);
345 ret= fold(v + state->bias, bits);
347 update_vlc_state(state, v);
348 //printf("final: %d\n", ret);
352 #if CONFIG_FFV1_ENCODER
353 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
354 PlaneContext * const p= &s->plane[plane_index];
355 RangeCoder * const c= &s->c;
357 int run_index= s->run_index;
362 if(c->bytestream_end - c->bytestream < w*20){
363 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
367 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
368 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
376 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
377 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
384 diff= fold(diff, bits);
387 put_symbol(c, p->state[context], diff, 1);
389 if(context == 0) run_mode=1;
394 while(run_count >= 1<<ff_log2_run[run_index]){
395 run_count -= 1<<ff_log2_run[run_index];
397 put_bits(&s->pb, 1, 1);
400 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
401 if(run_index) run_index--;
410 // 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));
413 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
417 while(run_count >= 1<<ff_log2_run[run_index]){
418 run_count -= 1<<ff_log2_run[run_index];
420 put_bits(&s->pb, 1, 1);
424 put_bits(&s->pb, 1, 1);
426 s->run_index= run_index;
431 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
433 const int ring_size= s->avctx->context_model ? 3 : 2;
434 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
437 memset(sample_buffer, 0, sizeof(sample_buffer));
440 for(i=0; i<ring_size; i++)
441 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
443 sample[0][-1]= sample[1][0 ];
444 sample[1][ w]= sample[1][w-1];
447 sample[0][x]= src[x + stride*y];
449 encode_line(s, w, sample, plane_index, 8);
450 //STOP_TIMER("encode line")}
454 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
456 const int ring_size= s->avctx->context_model ? 3 : 2;
457 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
460 memset(sample_buffer, 0, sizeof(sample_buffer));
463 for(i=0; i<ring_size; i++)
465 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
468 int v= src[x + stride*y];
479 // assert(g>=0 && b>=0 && r>=0);
480 // assert(g<256 && b<512 && r<512);
486 sample[p][0][-1]= sample[p][1][0 ];
487 sample[p][1][ w]= sample[p][1][w-1];
488 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
493 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
496 uint8_t state[CONTEXT_SIZE];
497 memset(state, 128, sizeof(state));
499 for(i=1; i<128 ; i++){
500 if(quant_table[i] != quant_table[i-1]){
501 put_symbol(c, state, i-last-1, 0);
505 put_symbol(c, state, i-last-1, 0);
508 static void write_header(FFV1Context *f){
509 uint8_t state[CONTEXT_SIZE];
511 RangeCoder * const c= &f->c;
513 memset(state, 128, sizeof(state));
515 put_symbol(c, state, f->version, 0);
516 put_symbol(c, state, f->avctx->coder_type, 0);
517 put_symbol(c, state, f->colorspace, 0); //YUV cs type
518 put_rac(c, state, 1); //chroma planes
519 put_symbol(c, state, f->chroma_h_shift, 0);
520 put_symbol(c, state, f->chroma_v_shift, 0);
521 put_rac(c, state, 0); //no transparency plane
524 write_quant_table(c, f->quant_table[i]);
526 #endif /* CONFIG_FFV1_ENCODER */
528 static av_cold int common_init(AVCodecContext *avctx){
529 FFV1Context *s = avctx->priv_data;
532 s->flags= avctx->flags;
534 dsputil_init(&s->dsp, avctx);
536 s->width = avctx->width;
537 s->height= avctx->height;
539 assert(s->width && s->height);
544 #if CONFIG_FFV1_ENCODER
545 static av_cold int encode_init(AVCodecContext *avctx)
547 FFV1Context *s = avctx->priv_data;
553 s->ac= avctx->coder_type;
556 for(i=0; i<256; i++){
557 s->quant_table[0][i]= quant11[i];
558 s->quant_table[1][i]= 11*quant11[i];
559 if(avctx->context_model==0){
560 s->quant_table[2][i]= 11*11*quant11[i];
561 s->quant_table[3][i]=
562 s->quant_table[4][i]=0;
564 s->quant_table[2][i]= 11*11*quant5 [i];
565 s->quant_table[3][i]= 5*11*11*quant5 [i];
566 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
570 for(i=0; i<s->plane_count; i++){
571 PlaneContext * const p= &s->plane[i];
573 if(avctx->context_model==0){
574 p->context_count= (11*11*11+1)/2;
576 p->context_count= (11*11*5*5*5+1)/2;
580 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
582 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
586 avctx->coded_frame= &s->picture;
587 switch(avctx->pix_fmt){
588 case PIX_FMT_YUV444P:
589 case PIX_FMT_YUV422P:
590 case PIX_FMT_YUV420P:
591 case PIX_FMT_YUV411P:
592 case PIX_FMT_YUV410P:
599 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
602 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
608 #endif /* CONFIG_FFV1_ENCODER */
611 static void clear_state(FFV1Context *f){
614 for(i=0; i<f->plane_count; i++){
615 PlaneContext *p= &f->plane[i];
617 p->interlace_bit_state[0]= 128;
618 p->interlace_bit_state[1]= 128;
620 for(j=0; j<p->context_count; j++){
622 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
624 p->vlc_state[j].drift= 0;
625 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
626 p->vlc_state[j].bias= 0;
627 p->vlc_state[j].count= 1;
633 #if CONFIG_FFV1_ENCODER
634 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
635 FFV1Context *f = avctx->priv_data;
636 RangeCoder * const c= &f->c;
637 AVFrame *pict = data;
638 const int width= f->width;
639 const int height= f->height;
640 AVFrame * const p= &f->picture;
642 uint8_t keystate=128;
644 ff_init_range_encoder(c, buf, buf_size);
645 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
646 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
649 p->pict_type= FF_I_TYPE;
651 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
652 put_rac(c, &keystate, 1);
657 put_rac(c, &keystate, 0);
662 used_count += ff_rac_terminate(c);
663 //printf("pos=%d\n", used_count);
664 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
667 if(f->colorspace==0){
668 const int chroma_width = -((-width )>>f->chroma_h_shift);
669 const int chroma_height= -((-height)>>f->chroma_v_shift);
671 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
673 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
674 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
676 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
683 return ff_rac_terminate(c);
685 flush_put_bits(&f->pb); //nicer padding FIXME
686 return used_count + (put_bits_count(&f->pb)+7)/8;
689 #endif /* CONFIG_FFV1_ENCODER */
691 static av_cold int common_end(AVCodecContext *avctx){
692 FFV1Context *s = avctx->priv_data;
695 for(i=0; i<s->plane_count; i++){
696 PlaneContext *p= &s->plane[i];
699 av_freep(&p->vlc_state);
705 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
706 PlaneContext * const p= &s->plane[plane_index];
707 RangeCoder * const c= &s->c;
711 int run_index= s->run_index;
714 int diff, context, sign;
716 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
725 diff= get_symbol(c, p->state[context], 1);
727 if(context == 0 && run_mode==0) run_mode=1;
730 if(run_count==0 && run_mode==1){
731 if(get_bits1(&s->gb)){
732 run_count = 1<<ff_log2_run[run_index];
733 if(x + run_count <= w) run_index++;
735 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
737 if(run_index) run_index--;
745 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
750 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
752 // 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));
755 if(sign) diff= -diff;
757 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
759 s->run_index= run_index;
762 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
764 int_fast16_t sample_buffer[2][w+6];
765 int_fast16_t *sample[2];
766 sample[0]=sample_buffer[0]+3;
767 sample[1]=sample_buffer[1]+3;
771 memset(sample_buffer, 0, sizeof(sample_buffer));
774 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
776 sample[0]= sample[1];
779 sample[1][-1]= sample[0][0 ];
780 sample[0][ w]= sample[0][w-1];
783 decode_line(s, w, sample, plane_index, 8);
785 src[x + stride*y]= sample[1][x];
787 //STOP_TIMER("decode-line")}
791 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
793 int_fast16_t sample_buffer[3][2][w+6];
794 int_fast16_t *sample[3][2];
796 sample[x][0] = sample_buffer[x][0]+3;
797 sample[x][1] = sample_buffer[x][1]+3;
802 memset(sample_buffer, 0, sizeof(sample_buffer));
806 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
808 sample[p][0]= sample[p][1];
811 sample[p][1][-1]= sample[p][0][0 ];
812 sample[p][0][ w]= sample[p][0][w-1];
813 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
816 int g= sample[0][1][x];
817 int b= sample[1][1][x];
818 int r= sample[2][1][x];
820 // assert(g>=0 && b>=0 && r>=0);
821 // assert(g<256 && b<512 && r<512);
829 src[x + stride*y]= b + (g<<8) + (r<<16);
834 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
837 uint8_t state[CONTEXT_SIZE];
839 memset(state, 128, sizeof(state));
841 for(v=0; i<128 ; v++){
842 int len= get_symbol(c, state, 0) + 1;
844 if(len + i > 128) return -1;
847 quant_table[i] = scale*v;
850 //if(i%16==0) printf("\n");
854 for(i=1; i<128; i++){
855 quant_table[256-i]= -quant_table[i];
857 quant_table[128]= -quant_table[127];
862 static int read_header(FFV1Context *f){
863 uint8_t state[CONTEXT_SIZE];
864 int i, context_count;
865 RangeCoder * const c= &f->c;
867 memset(state, 128, sizeof(state));
869 f->version= get_symbol(c, state, 0);
870 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
871 f->colorspace= get_symbol(c, state, 0); //YUV cs type
872 get_rac(c, state); //no chroma = false
873 f->chroma_h_shift= get_symbol(c, state, 0);
874 f->chroma_v_shift= get_symbol(c, state, 0);
875 get_rac(c, state); //transparency plane
878 if(f->colorspace==0){
879 switch(16*f->chroma_h_shift + f->chroma_v_shift){
880 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
881 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
882 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
883 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
884 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
886 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
889 }else if(f->colorspace==1){
890 if(f->chroma_h_shift || f->chroma_v_shift){
891 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
894 f->avctx->pix_fmt= PIX_FMT_RGB32;
896 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
900 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
904 context_count*= read_quant_table(c, f->quant_table[i], context_count);
905 if(context_count < 0 || context_count > 32768){
906 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
910 context_count= (context_count+1)/2;
912 for(i=0; i<f->plane_count; i++){
913 PlaneContext * const p= &f->plane[i];
915 p->context_count= context_count;
918 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
920 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
927 static av_cold int decode_init(AVCodecContext *avctx)
929 // FFV1Context *s = avctx->priv_data;
936 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
937 const uint8_t *buf = avpkt->data;
938 int buf_size = avpkt->size;
939 FFV1Context *f = avctx->priv_data;
940 RangeCoder * const c= &f->c;
941 const int width= f->width;
942 const int height= f->height;
943 AVFrame * const p= &f->picture;
945 uint8_t keystate= 128;
947 AVFrame *picture = data;
949 ff_init_range_decoder(c, buf, buf_size);
950 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
953 p->pict_type= FF_I_TYPE; //FIXME I vs. P
954 if(get_rac(c, &keystate)){
956 if(read_header(f) < 0)
962 if(!f->plane[0].state && !f->plane[0].vlc_state)
966 if(avctx->get_buffer(avctx, p) < 0){
967 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
971 if(avctx->debug&FF_DEBUG_PICT_INFO)
972 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
975 bytes_read = c->bytestream - c->bytestream_start - 1;
976 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
977 //printf("pos=%d\n", bytes_read);
978 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
980 bytes_read = 0; /* avoid warning */
983 if(f->colorspace==0){
984 const int chroma_width = -((-width )>>f->chroma_h_shift);
985 const int chroma_height= -((-height)>>f->chroma_v_shift);
986 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
988 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
989 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
991 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1000 avctx->release_buffer(avctx, p); //FIXME
1002 *data_size = sizeof(AVFrame);
1005 bytes_read= c->bytestream - c->bytestream_start - 1;
1006 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1008 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1014 AVCodec ffv1_decoder = {
1018 sizeof(FFV1Context),
1023 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1025 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1028 #if CONFIG_FFV1_ENCODER
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, PIX_FMT_NONE},
1038 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),