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)){ //1..10
258 for(i=e-1; i>=0; i--){
259 a += a + get_rac(c, state+22 + i); //22..31
262 if(is_signed && get_rac(c, state+11 + e)) //11..21
269 static inline void update_vlc_state(VlcState * const state, const int v){
270 int drift= state->drift;
271 int count= state->count;
272 state->error_sum += FFABS(v);
275 if(count == 128){ //FIXME variable
278 state->error_sum >>= 1;
283 if(state->bias > -128) state->bias--;
289 if(state->bias < 127) state->bias++;
300 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
302 //printf("final: %d ", v);
303 v = fold(v - state->bias, bits);
307 while(i < state->error_sum){ //FIXME optimize
315 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
318 code= v ^ ((2*state->drift + state->count)>>31);
321 //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);
322 set_sr_golomb(pb, code, k, 12, bits);
324 update_vlc_state(state, v);
327 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
332 while(i < state->error_sum){ //FIXME optimize
339 v= get_sr_golomb(gb, k, 12, bits);
340 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
343 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
345 v ^= ((2*state->drift + state->count)>>31);
348 ret= fold(v + state->bias, bits);
350 update_vlc_state(state, v);
351 //printf("final: %d\n", ret);
355 #if CONFIG_FFV1_ENCODER
356 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
357 PlaneContext * const p= &s->plane[plane_index];
358 RangeCoder * const c= &s->c;
360 int run_index= s->run_index;
365 if(c->bytestream_end - c->bytestream < w*20){
366 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
370 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
371 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
379 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
380 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
387 diff= fold(diff, bits);
390 put_symbol(c, p->state[context], diff, 1);
392 if(context == 0) run_mode=1;
397 while(run_count >= 1<<ff_log2_run[run_index]){
398 run_count -= 1<<ff_log2_run[run_index];
400 put_bits(&s->pb, 1, 1);
403 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
404 if(run_index) run_index--;
413 // 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));
416 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
420 while(run_count >= 1<<ff_log2_run[run_index]){
421 run_count -= 1<<ff_log2_run[run_index];
423 put_bits(&s->pb, 1, 1);
427 put_bits(&s->pb, 1, 1);
429 s->run_index= run_index;
434 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
436 const int ring_size= s->avctx->context_model ? 3 : 2;
437 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
440 memset(sample_buffer, 0, sizeof(sample_buffer));
443 for(i=0; i<ring_size; i++)
444 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
446 sample[0][-1]= sample[1][0 ];
447 sample[1][ w]= sample[1][w-1];
450 sample[0][x]= src[x + stride*y];
452 encode_line(s, w, sample, plane_index, 8);
453 //STOP_TIMER("encode line")}
457 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
459 const int ring_size= s->avctx->context_model ? 3 : 2;
460 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
463 memset(sample_buffer, 0, sizeof(sample_buffer));
466 for(i=0; i<ring_size; i++)
468 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
471 int v= src[x + stride*y];
482 // assert(g>=0 && b>=0 && r>=0);
483 // assert(g<256 && b<512 && r<512);
489 sample[p][0][-1]= sample[p][1][0 ];
490 sample[p][1][ w]= sample[p][1][w-1];
491 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
496 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
499 uint8_t state[CONTEXT_SIZE];
500 memset(state, 128, sizeof(state));
502 for(i=1; i<128 ; i++){
503 if(quant_table[i] != quant_table[i-1]){
504 put_symbol(c, state, i-last-1, 0);
508 put_symbol(c, state, i-last-1, 0);
511 static void write_header(FFV1Context *f){
512 uint8_t state[CONTEXT_SIZE];
514 RangeCoder * const c= &f->c;
516 memset(state, 128, sizeof(state));
518 put_symbol(c, state, f->version, 0);
519 put_symbol(c, state, f->avctx->coder_type, 0);
520 put_symbol(c, state, f->colorspace, 0); //YUV cs type
521 put_rac(c, state, 1); //chroma planes
522 put_symbol(c, state, f->chroma_h_shift, 0);
523 put_symbol(c, state, f->chroma_v_shift, 0);
524 put_rac(c, state, 0); //no transparency plane
527 write_quant_table(c, f->quant_table[i]);
529 #endif /* CONFIG_FFV1_ENCODER */
531 static av_cold int common_init(AVCodecContext *avctx){
532 FFV1Context *s = avctx->priv_data;
536 s->flags= avctx->flags;
538 dsputil_init(&s->dsp, avctx);
540 width= s->width= avctx->width;
541 height= s->height= avctx->height;
543 assert(width && height);
548 #if CONFIG_FFV1_ENCODER
549 static av_cold int encode_init(AVCodecContext *avctx)
551 FFV1Context *s = avctx->priv_data;
557 s->ac= avctx->coder_type;
560 for(i=0; i<256; i++){
561 s->quant_table[0][i]= quant11[i];
562 s->quant_table[1][i]= 11*quant11[i];
563 if(avctx->context_model==0){
564 s->quant_table[2][i]= 11*11*quant11[i];
565 s->quant_table[3][i]=
566 s->quant_table[4][i]=0;
568 s->quant_table[2][i]= 11*11*quant5 [i];
569 s->quant_table[3][i]= 5*11*11*quant5 [i];
570 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
574 for(i=0; i<s->plane_count; i++){
575 PlaneContext * const p= &s->plane[i];
577 if(avctx->context_model==0){
578 p->context_count= (11*11*11+1)/2;
580 p->context_count= (11*11*5*5*5+1)/2;
584 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
586 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
590 avctx->coded_frame= &s->picture;
591 switch(avctx->pix_fmt){
592 case PIX_FMT_YUV444P:
593 case PIX_FMT_YUV422P:
594 case PIX_FMT_YUV420P:
595 case PIX_FMT_YUV411P:
596 case PIX_FMT_YUV410P:
603 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
606 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
612 #endif /* CONFIG_FFV1_ENCODER */
615 static void clear_state(FFV1Context *f){
618 for(i=0; i<f->plane_count; i++){
619 PlaneContext *p= &f->plane[i];
621 p->interlace_bit_state[0]= 128;
622 p->interlace_bit_state[1]= 128;
624 for(j=0; j<p->context_count; j++){
626 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
628 p->vlc_state[j].drift= 0;
629 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
630 p->vlc_state[j].bias= 0;
631 p->vlc_state[j].count= 1;
637 #if CONFIG_FFV1_ENCODER
638 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
639 FFV1Context *f = avctx->priv_data;
640 RangeCoder * const c= &f->c;
641 AVFrame *pict = data;
642 const int width= f->width;
643 const int height= f->height;
644 AVFrame * const p= &f->picture;
646 uint8_t keystate=128;
648 ff_init_range_encoder(c, buf, buf_size);
649 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
650 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
653 p->pict_type= FF_I_TYPE;
655 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
656 put_rac(c, &keystate, 1);
661 put_rac(c, &keystate, 0);
666 used_count += ff_rac_terminate(c);
667 //printf("pos=%d\n", used_count);
668 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
671 if(f->colorspace==0){
672 const int chroma_width = -((-width )>>f->chroma_h_shift);
673 const int chroma_height= -((-height)>>f->chroma_v_shift);
675 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
677 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
678 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
680 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
687 return ff_rac_terminate(c);
689 flush_put_bits(&f->pb); //nicer padding FIXME
690 return used_count + (put_bits_count(&f->pb)+7)/8;
693 #endif /* CONFIG_FFV1_ENCODER */
695 static av_cold int common_end(AVCodecContext *avctx){
696 FFV1Context *s = avctx->priv_data;
699 for(i=0; i<s->plane_count; i++){
700 PlaneContext *p= &s->plane[i];
703 av_freep(&p->vlc_state);
709 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
710 PlaneContext * const p= &s->plane[plane_index];
711 RangeCoder * const c= &s->c;
715 int run_index= s->run_index;
718 int diff, context, sign;
720 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
729 diff= get_symbol(c, p->state[context], 1);
731 if(context == 0 && run_mode==0) run_mode=1;
734 if(run_count==0 && run_mode==1){
735 if(get_bits1(&s->gb)){
736 run_count = 1<<ff_log2_run[run_index];
737 if(x + run_count <= w) run_index++;
739 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
741 if(run_index) run_index--;
749 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
754 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
756 // 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));
759 if(sign) diff= -diff;
761 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
763 s->run_index= run_index;
766 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
768 int_fast16_t sample_buffer[2][w+6];
769 int_fast16_t *sample[2];
770 sample[0]=sample_buffer[0]+3;
771 sample[1]=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];
800 sample[x][0] = sample_buffer[x][0]+3;
801 sample[x][1] = sample_buffer[x][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 av_cold int decode_init(AVCodecContext *avctx)
933 // FFV1Context *s = avctx->priv_data;
940 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
941 const uint8_t *buf = avpkt->data;
942 int buf_size = avpkt->size;
943 FFV1Context *f = avctx->priv_data;
944 RangeCoder * const c= &f->c;
945 const int width= f->width;
946 const int height= f->height;
947 AVFrame * const p= &f->picture;
949 uint8_t keystate= 128;
951 AVFrame *picture = data;
953 ff_init_range_decoder(c, buf, buf_size);
954 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
957 p->pict_type= FF_I_TYPE; //FIXME I vs. P
958 if(get_rac(c, &keystate)){
960 if(read_header(f) < 0)
966 if(!f->plane[0].state && !f->plane[0].vlc_state)
970 if(avctx->get_buffer(avctx, p) < 0){
971 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
975 if(avctx->debug&FF_DEBUG_PICT_INFO)
976 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
979 bytes_read = c->bytestream - c->bytestream_start - 1;
980 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
981 //printf("pos=%d\n", bytes_read);
982 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
984 bytes_read = 0; /* avoid warning */
987 if(f->colorspace==0){
988 const int chroma_width = -((-width )>>f->chroma_h_shift);
989 const int chroma_height= -((-height)>>f->chroma_v_shift);
990 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
992 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
993 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
995 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1000 f->picture_number++;
1004 avctx->release_buffer(avctx, p); //FIXME
1006 *data_size = sizeof(AVFrame);
1009 bytes_read= c->bytestream - c->bytestream_start - 1;
1010 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1012 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1018 AVCodec ffv1_decoder = {
1022 sizeof(FFV1Context),
1027 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1029 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1032 #if CONFIG_FFV1_ENCODER
1033 AVCodec ffv1_encoder = {
1037 sizeof(FFV1Context),
1041 .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},
1042 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),