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
25 * FF Video Codec 1 (an experimental lossless codec)
29 #include "bitstream.h"
31 #include "rangecoder.h"
35 #define CONTEXT_SIZE 32
37 extern const uint8_t ff_log2_run[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 typedef struct VlcState{
155 typedef struct PlaneContext{
157 uint8_t (*state)[CONTEXT_SIZE];
159 uint8_t interlace_bit_state[2];
162 typedef struct FFV1Context{
163 AVCodecContext *avctx;
169 int chroma_h_shift, chroma_v_shift;
174 int ac; ///< 1-> CABAC 0-> golomb rice
175 PlaneContext plane[MAX_PLANES];
176 int16_t quant_table[5][256];
183 static av_always_inline int fold(int diff, int bits){
195 static inline int predict(int_fast16_t *src, int_fast16_t *last){
196 const int LT= last[-1];
197 const int T= last[ 0];
198 const int L = src[-1];
200 return mid_pred(L, L + T - LT, T);
203 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
204 const int LT= last[-1];
205 const int T= last[ 0];
206 const int RT= last[ 1];
207 const int L = src[-1];
209 if(f->quant_table[3][127]){
210 const int TT= last2[0];
211 const int LL= src[-2];
212 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
213 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
215 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
218 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
222 const int a= FFABS(v);
223 const int e= av_log2(a);
224 put_rac(c, state+0, 0);
229 put_rac(c, state+1+i, 1); //1..10
231 put_rac(c, state+1+i, 0);
233 for(i=e-1; i>=0; i--){
234 put_rac(c, state+22+i, (a>>i)&1); //22..31
238 put_rac(c, state+11 + e, v < 0); //11..21
240 put_rac(c, state+0, 1);
244 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
245 if(get_rac(c, state+0))
250 while(get_rac(c, state+1 + e)){ //1..10
256 for(i=e-1; i>=0; i--){
257 a += a + get_rac(c, state+22 + i); //22..31
260 if(is_signed && get_rac(c, state+11 + e)) //11..21
267 static inline void update_vlc_state(VlcState * const state, const int v){
268 int drift= state->drift;
269 int count= state->count;
270 state->error_sum += FFABS(v);
273 if(count == 128){ //FIXME variable
276 state->error_sum >>= 1;
281 if(state->bias > -128) state->bias--;
287 if(state->bias < 127) state->bias++;
298 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
300 //printf("final: %d ", v);
301 v = fold(v - state->bias, bits);
305 while(i < state->error_sum){ //FIXME optimize
313 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
316 code= v ^ ((2*state->drift + state->count)>>31);
319 //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);
320 set_sr_golomb(pb, code, k, 12, bits);
322 update_vlc_state(state, v);
325 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
330 while(i < state->error_sum){ //FIXME optimize
337 v= get_sr_golomb(gb, k, 12, bits);
338 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
341 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
343 v ^= ((2*state->drift + state->count)>>31);
346 ret= fold(v + state->bias, bits);
348 update_vlc_state(state, v);
349 //printf("final: %d\n", ret);
353 #ifdef CONFIG_ENCODERS
354 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
355 PlaneContext * const p= &s->plane[plane_index];
356 RangeCoder * const c= &s->c;
358 int run_index= s->run_index;
363 if(c->bytestream_end - c->bytestream < w*20){
364 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
368 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
369 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
377 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
378 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
385 diff= fold(diff, bits);
388 put_symbol(c, p->state[context], diff, 1);
390 if(context == 0) run_mode=1;
395 while(run_count >= 1<<ff_log2_run[run_index]){
396 run_count -= 1<<ff_log2_run[run_index];
398 put_bits(&s->pb, 1, 1);
401 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
402 if(run_index) run_index--;
411 // 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));
414 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
418 while(run_count >= 1<<ff_log2_run[run_index]){
419 run_count -= 1<<ff_log2_run[run_index];
421 put_bits(&s->pb, 1, 1);
425 put_bits(&s->pb, 1, 1);
427 s->run_index= run_index;
432 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
434 const int ring_size= s->avctx->context_model ? 3 : 2;
435 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
438 memset(sample_buffer, 0, sizeof(sample_buffer));
441 for(i=0; i<ring_size; i++)
442 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
444 sample[0][-1]= sample[1][0 ];
445 sample[1][ w]= sample[1][w-1];
448 sample[0][x]= src[x + stride*y];
450 encode_line(s, w, sample, plane_index, 8);
451 //STOP_TIMER("encode line")}
455 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
457 const int ring_size= s->avctx->context_model ? 3 : 2;
458 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
461 memset(sample_buffer, 0, sizeof(sample_buffer));
464 for(i=0; i<ring_size; i++)
466 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
469 int v= src[x + stride*y];
480 // assert(g>=0 && b>=0 && r>=0);
481 // assert(g<256 && b<512 && r<512);
487 sample[p][0][-1]= sample[p][1][0 ];
488 sample[p][1][ w]= sample[p][1][w-1];
489 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
494 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
497 uint8_t state[CONTEXT_SIZE];
498 memset(state, 128, sizeof(state));
500 for(i=1; i<128 ; i++){
501 if(quant_table[i] != quant_table[i-1]){
502 put_symbol(c, state, i-last-1, 0);
506 put_symbol(c, state, i-last-1, 0);
509 static void write_header(FFV1Context *f){
510 uint8_t state[CONTEXT_SIZE];
512 RangeCoder * const c= &f->c;
514 memset(state, 128, sizeof(state));
516 put_symbol(c, state, f->version, 0);
517 put_symbol(c, state, f->avctx->coder_type, 0);
518 put_symbol(c, state, f->colorspace, 0); //YUV cs type
519 put_rac(c, state, 1); //chroma planes
520 put_symbol(c, state, f->chroma_h_shift, 0);
521 put_symbol(c, state, f->chroma_v_shift, 0);
522 put_rac(c, state, 0); //no transparency plane
525 write_quant_table(c, f->quant_table[i]);
527 #endif /* CONFIG_ENCODERS */
529 static av_cold int common_init(AVCodecContext *avctx){
530 FFV1Context *s = avctx->priv_data;
534 s->flags= avctx->flags;
536 dsputil_init(&s->dsp, avctx);
538 width= s->width= avctx->width;
539 height= s->height= avctx->height;
541 assert(width && height);
546 #ifdef CONFIG_ENCODERS
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_ENCODERS */
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 #ifdef CONFIG_ENCODERS
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_ENCODERS */
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, const uint8_t *buf, int buf_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 #ifdef CONFIG_ENCODERS
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"),