Clarify the error message when video width, height, or framerate are not
[ffmpeg-lucabe.git] / libavcodec / ffv1.c
blob0131b837cfdd30c08246f9934ab03c3b11775bc3
1 /*
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
23 /**
24 * @file ffv1.c
25 * FF Video Codec 1 (an experimental lossless codec)
28 #include "avcodec.h"
29 #include "bitstream.h"
30 #include "dsputil.h"
31 #include "rangecoder.h"
32 #include "golomb.h"
34 #define MAX_PLANES 4
35 #define CONTEXT_SIZE 32
37 static const int8_t quant3[256]={
38 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 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, 0,
55 static const int8_t quant5[256]={
56 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
57 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
58 2, 2, 2, 2, 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,-1,-1,-1,
73 static const int8_t quant7[256]={
74 0, 1, 1, 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, 2, 2, 2,
76 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
77 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
78 3, 3, 3, 3, 3, 3, 3, 3, 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,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
91 static const int8_t quant9[256]={
92 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
95 4, 4, 4, 4, 4, 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,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
109 static const int8_t quant11[256]={
110 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
111 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
112 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
113 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
114 5, 5, 5, 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,-4,-4,
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
127 static const int8_t quant13[256]={
128 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
129 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
131 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
132 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
133 6, 6, 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,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
146 static const uint8_t log2_run[32]={
147 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
148 4, 4, 5, 5, 6, 6, 7, 7,
149 8, 9,10,11,12,13,14,15,
152 typedef struct VlcState{
153 int16_t drift;
154 uint16_t error_sum;
155 int8_t bias;
156 uint8_t count;
157 } VlcState;
159 typedef struct PlaneContext{
160 int context_count;
161 uint8_t (*state)[CONTEXT_SIZE];
162 VlcState *vlc_state;
163 uint8_t interlace_bit_state[2];
164 } PlaneContext;
166 typedef struct FFV1Context{
167 AVCodecContext *avctx;
168 RangeCoder c;
169 GetBitContext gb;
170 PutBitContext pb;
171 int version;
172 int width, height;
173 int chroma_h_shift, chroma_v_shift;
174 int flags;
175 int picture_number;
176 AVFrame picture;
177 int plane_count;
178 int ac; ///< 1-> CABAC 0-> golomb rice
179 PlaneContext plane[MAX_PLANES];
180 int16_t quant_table[5][256];
181 int run_index;
182 int colorspace;
184 DSPContext dsp;
185 }FFV1Context;
187 static av_always_inline int fold(int diff, int bits){
188 if(bits==8)
189 diff= (int8_t)diff;
190 else{
191 diff+= 1<<(bits-1);
192 diff&=(1<<bits)-1;
193 diff-= 1<<(bits-1);
196 return diff;
199 static inline int predict(int_fast16_t *src, int_fast16_t *last){
200 const int LT= last[-1];
201 const int T= last[ 0];
202 const int L = src[-1];
204 return mid_pred(L, L + T - LT, T);
207 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
208 const int LT= last[-1];
209 const int T= last[ 0];
210 const int RT= last[ 1];
211 const int L = src[-1];
213 if(f->quant_table[3][127]){
214 const int TT= last2[0];
215 const int LL= src[-2];
216 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
217 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
218 }else
219 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
222 static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
223 int i;
225 if(v){
226 const int a= FFABS(v);
227 const int e= av_log2(a);
228 put_rac(c, state+0, 0);
230 assert(e<=9);
232 for(i=0; i<e; i++){
233 put_rac(c, state+1+i, 1); //1..10
235 put_rac(c, state+1+i, 0);
237 for(i=e-1; i>=0; i--){
238 put_rac(c, state+22+i, (a>>i)&1); //22..31
241 if(is_signed)
242 put_rac(c, state+11 + e, v < 0); //11..21
243 }else{
244 put_rac(c, state+0, 1);
248 static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
249 if(get_rac(c, state+0))
250 return 0;
251 else{
252 int i, e, a;
253 e= 0;
254 while(get_rac(c, state+1 + e)){ //1..10
255 e++;
257 assert(e<=9);
259 a= 1;
260 for(i=e-1; i>=0; i--){
261 a += a + get_rac(c, state+22 + i); //22..31
264 if(is_signed && get_rac(c, state+11 + e)) //11..21
265 return -a;
266 else
267 return a;
271 static inline void update_vlc_state(VlcState * const state, const int v){
272 int drift= state->drift;
273 int count= state->count;
274 state->error_sum += FFABS(v);
275 drift += v;
277 if(count == 128){ //FIXME variable
278 count >>= 1;
279 drift >>= 1;
280 state->error_sum >>= 1;
282 count++;
284 if(drift <= -count){
285 if(state->bias > -128) state->bias--;
287 drift += count;
288 if(drift <= -count)
289 drift= -count + 1;
290 }else if(drift > 0){
291 if(state->bias < 127) state->bias++;
293 drift -= count;
294 if(drift > 0)
295 drift= 0;
298 state->drift= drift;
299 state->count= count;
302 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
303 int i, k, code;
304 //printf("final: %d ", v);
305 v = fold(v - state->bias, bits);
307 i= state->count;
308 k=0;
309 while(i < state->error_sum){ //FIXME optimize
310 k++;
311 i += i;
314 assert(k<=8);
316 #if 0 // JPEG LS
317 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
318 else code= v;
319 #else
320 code= v ^ ((2*state->drift + state->count)>>31);
321 #endif
323 //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);
324 set_sr_golomb(pb, code, k, 12, bits);
326 update_vlc_state(state, v);
329 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
330 int k, i, v, ret;
332 i= state->count;
333 k=0;
334 while(i < state->error_sum){ //FIXME optimize
335 k++;
336 i += i;
339 assert(k<=8);
341 v= get_sr_golomb(gb, k, 12, bits);
342 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
344 #if 0 // JPEG LS
345 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
346 #else
347 v ^= ((2*state->drift + state->count)>>31);
348 #endif
350 ret= fold(v + state->bias, bits);
352 update_vlc_state(state, v);
353 //printf("final: %d\n", ret);
354 return ret;
357 #ifdef CONFIG_ENCODERS
358 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
359 PlaneContext * const p= &s->plane[plane_index];
360 RangeCoder * const c= &s->c;
361 int x;
362 int run_index= s->run_index;
363 int run_count=0;
364 int run_mode=0;
366 if(s->ac){
367 if(c->bytestream_end - c->bytestream < w*20){
368 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
369 return -1;
371 }else{
372 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
373 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
374 return -1;
378 for(x=0; x<w; x++){
379 int diff, context;
381 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
382 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
384 if(context < 0){
385 context = -context;
386 diff= -diff;
389 diff= fold(diff, bits);
391 if(s->ac){
392 put_symbol(c, p->state[context], diff, 1);
393 }else{
394 if(context == 0) run_mode=1;
396 if(run_mode){
398 if(diff){
399 while(run_count >= 1<<log2_run[run_index]){
400 run_count -= 1<<log2_run[run_index];
401 run_index++;
402 put_bits(&s->pb, 1, 1);
405 put_bits(&s->pb, 1 + log2_run[run_index], run_count);
406 if(run_index) run_index--;
407 run_count=0;
408 run_mode=0;
409 if(diff>0) diff--;
410 }else{
411 run_count++;
415 // 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));
417 if(run_mode == 0)
418 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
421 if(run_mode){
422 while(run_count >= 1<<log2_run[run_index]){
423 run_count -= 1<<log2_run[run_index];
424 run_index++;
425 put_bits(&s->pb, 1, 1);
428 if(run_count)
429 put_bits(&s->pb, 1, 1);
431 s->run_index= run_index;
433 return 0;
436 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
437 int x,y,i;
438 const int ring_size= s->avctx->context_model ? 3 : 2;
439 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
440 s->run_index=0;
442 memset(sample_buffer, 0, sizeof(sample_buffer));
444 for(y=0; y<h; y++){
445 for(i=0; i<ring_size; i++)
446 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
448 sample[0][-1]= sample[1][0 ];
449 sample[1][ w]= sample[1][w-1];
450 //{START_TIMER
451 for(x=0; x<w; x++){
452 sample[0][x]= src[x + stride*y];
454 encode_line(s, w, sample, plane_index, 8);
455 //STOP_TIMER("encode line")}
459 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
460 int x, y, p, i;
461 const int ring_size= s->avctx->context_model ? 3 : 2;
462 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
463 s->run_index=0;
465 memset(sample_buffer, 0, sizeof(sample_buffer));
467 for(y=0; y<h; y++){
468 for(i=0; i<ring_size; i++)
469 for(p=0; p<3; p++)
470 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
472 for(x=0; x<w; x++){
473 int v= src[x + stride*y];
474 int b= v&0xFF;
475 int g= (v>>8)&0xFF;
476 int r= (v>>16)&0xFF;
478 b -= g;
479 r -= g;
480 g += (b + r)>>2;
481 b += 0x100;
482 r += 0x100;
484 // assert(g>=0 && b>=0 && r>=0);
485 // assert(g<256 && b<512 && r<512);
486 sample[0][0][x]= g;
487 sample[1][0][x]= b;
488 sample[2][0][x]= r;
490 for(p=0; p<3; p++){
491 sample[p][0][-1]= sample[p][1][0 ];
492 sample[p][1][ w]= sample[p][1][w-1];
493 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
498 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
499 int last=0;
500 int i;
501 uint8_t state[CONTEXT_SIZE];
502 memset(state, 128, sizeof(state));
504 for(i=1; i<128 ; i++){
505 if(quant_table[i] != quant_table[i-1]){
506 put_symbol(c, state, i-last-1, 0);
507 last= i;
510 put_symbol(c, state, i-last-1, 0);
513 static void write_header(FFV1Context *f){
514 uint8_t state[CONTEXT_SIZE];
515 int i;
516 RangeCoder * const c= &f->c;
518 memset(state, 128, sizeof(state));
520 put_symbol(c, state, f->version, 0);
521 put_symbol(c, state, f->avctx->coder_type, 0);
522 put_symbol(c, state, f->colorspace, 0); //YUV cs type
523 put_rac(c, state, 1); //chroma planes
524 put_symbol(c, state, f->chroma_h_shift, 0);
525 put_symbol(c, state, f->chroma_v_shift, 0);
526 put_rac(c, state, 0); //no transparency plane
528 for(i=0; i<5; i++)
529 write_quant_table(c, f->quant_table[i]);
531 #endif /* CONFIG_ENCODERS */
533 static int common_init(AVCodecContext *avctx){
534 FFV1Context *s = avctx->priv_data;
535 int width, height;
537 s->avctx= avctx;
538 s->flags= avctx->flags;
540 dsputil_init(&s->dsp, avctx);
542 width= s->width= avctx->width;
543 height= s->height= avctx->height;
545 assert(width && height);
547 return 0;
550 #ifdef CONFIG_ENCODERS
551 static int encode_init(AVCodecContext *avctx)
553 FFV1Context *s = avctx->priv_data;
554 int i;
556 common_init(avctx);
558 s->version=0;
559 s->ac= avctx->coder_type;
561 s->plane_count=2;
562 for(i=0; i<256; i++){
563 s->quant_table[0][i]= quant11[i];
564 s->quant_table[1][i]= 11*quant11[i];
565 if(avctx->context_model==0){
566 s->quant_table[2][i]= 11*11*quant11[i];
567 s->quant_table[3][i]=
568 s->quant_table[4][i]=0;
569 }else{
570 s->quant_table[2][i]= 11*11*quant5 [i];
571 s->quant_table[3][i]= 5*11*11*quant5 [i];
572 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
576 for(i=0; i<s->plane_count; i++){
577 PlaneContext * const p= &s->plane[i];
579 if(avctx->context_model==0){
580 p->context_count= (11*11*11+1)/2;
581 }else{
582 p->context_count= (11*11*5*5*5+1)/2;
585 if(s->ac){
586 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
587 }else{
588 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
592 avctx->coded_frame= &s->picture;
593 switch(avctx->pix_fmt){
594 case PIX_FMT_YUV444P:
595 case PIX_FMT_YUV422P:
596 case PIX_FMT_YUV420P:
597 case PIX_FMT_YUV411P:
598 case PIX_FMT_YUV410P:
599 s->colorspace= 0;
600 break;
601 case PIX_FMT_RGB32:
602 s->colorspace= 1;
603 break;
604 default:
605 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
606 return -1;
608 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
610 s->picture_number=0;
612 return 0;
614 #endif /* CONFIG_ENCODERS */
617 static void clear_state(FFV1Context *f){
618 int i, j;
620 for(i=0; i<f->plane_count; i++){
621 PlaneContext *p= &f->plane[i];
623 p->interlace_bit_state[0]= 128;
624 p->interlace_bit_state[1]= 128;
626 for(j=0; j<p->context_count; j++){
627 if(f->ac){
628 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
629 }else{
630 p->vlc_state[j].drift= 0;
631 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
632 p->vlc_state[j].bias= 0;
633 p->vlc_state[j].count= 1;
639 #ifdef CONFIG_ENCODERS
640 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
641 FFV1Context *f = avctx->priv_data;
642 RangeCoder * const c= &f->c;
643 AVFrame *pict = data;
644 const int width= f->width;
645 const int height= f->height;
646 AVFrame * const p= &f->picture;
647 int used_count= 0;
648 uint8_t keystate=128;
650 ff_init_range_encoder(c, buf, buf_size);
651 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
652 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
654 *p = *pict;
655 p->pict_type= FF_I_TYPE;
657 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
658 put_rac(c, &keystate, 1);
659 p->key_frame= 1;
660 write_header(f);
661 clear_state(f);
662 }else{
663 put_rac(c, &keystate, 0);
664 p->key_frame= 0;
667 if(!f->ac){
668 used_count += ff_rac_terminate(c);
669 //printf("pos=%d\n", used_count);
670 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
673 if(f->colorspace==0){
674 const int chroma_width = -((-width )>>f->chroma_h_shift);
675 const int chroma_height= -((-height)>>f->chroma_v_shift);
677 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
679 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
680 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
681 }else{
682 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
684 emms_c();
686 f->picture_number++;
688 if(f->ac){
689 return ff_rac_terminate(c);
690 }else{
691 flush_put_bits(&f->pb); //nicer padding FIXME
692 return used_count + (put_bits_count(&f->pb)+7)/8;
695 #endif /* CONFIG_ENCODERS */
697 static int common_end(AVCodecContext *avctx){
698 FFV1Context *s = avctx->priv_data;
699 int i;
701 for(i=0; i<s->plane_count; i++){
702 PlaneContext *p= &s->plane[i];
704 av_freep(&p->state);
705 av_freep(&p->vlc_state);
708 return 0;
711 static inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
712 PlaneContext * const p= &s->plane[plane_index];
713 RangeCoder * const c= &s->c;
714 int x;
715 int run_count=0;
716 int run_mode=0;
717 int run_index= s->run_index;
719 for(x=0; x<w; x++){
720 int diff, context, sign;
722 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
723 if(context < 0){
724 context= -context;
725 sign=1;
726 }else
727 sign=0;
730 if(s->ac){
731 diff= get_symbol(c, p->state[context], 1);
732 }else{
733 if(context == 0 && run_mode==0) run_mode=1;
735 if(run_mode){
736 if(run_count==0 && run_mode==1){
737 if(get_bits1(&s->gb)){
738 run_count = 1<<log2_run[run_index];
739 if(x + run_count <= w) run_index++;
740 }else{
741 if(log2_run[run_index]) run_count = get_bits(&s->gb, log2_run[run_index]);
742 else run_count=0;
743 if(run_index) run_index--;
744 run_mode=2;
747 run_count--;
748 if(run_count < 0){
749 run_mode=0;
750 run_count=0;
751 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
752 if(diff>=0) diff++;
753 }else
754 diff=0;
755 }else
756 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
758 // 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));
761 if(sign) diff= -diff;
763 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
765 s->run_index= run_index;
768 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
769 int x, y;
770 int_fast16_t sample_buffer[2][w+6];
771 int_fast16_t *sample[2]= {sample_buffer[0]+3, sample_buffer[1]+3};
773 s->run_index=0;
775 memset(sample_buffer, 0, sizeof(sample_buffer));
777 for(y=0; y<h; y++){
778 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
780 sample[0]= sample[1];
781 sample[1]= temp;
783 sample[1][-1]= sample[0][0 ];
784 sample[0][ w]= sample[0][w-1];
786 //{START_TIMER
787 decode_line(s, w, sample, plane_index, 8);
788 for(x=0; x<w; x++){
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){
796 int x, y, p;
797 int_fast16_t sample_buffer[3][2][w+6];
798 int_fast16_t *sample[3][2]= {
799 {sample_buffer[0][0]+3, sample_buffer[0][1]+3},
800 {sample_buffer[1][0]+3, sample_buffer[1][1]+3},
801 {sample_buffer[2][0]+3, sample_buffer[2][1]+3}};
803 s->run_index=0;
805 memset(sample_buffer, 0, sizeof(sample_buffer));
807 for(y=0; y<h; y++){
808 for(p=0; p<3; p++){
809 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
811 sample[p][0]= sample[p][1];
812 sample[p][1]= temp;
814 sample[p][1][-1]= sample[p][0][0 ];
815 sample[p][0][ w]= sample[p][0][w-1];
816 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
818 for(x=0; x<w; x++){
819 int g= sample[0][1][x];
820 int b= sample[1][1][x];
821 int r= sample[2][1][x];
823 // assert(g>=0 && b>=0 && r>=0);
824 // assert(g<256 && b<512 && r<512);
826 b -= 0x100;
827 r -= 0x100;
828 g -= (b + r)>>2;
829 b += g;
830 r += g;
832 src[x + stride*y]= b + (g<<8) + (r<<16);
837 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
838 int v;
839 int i=0;
840 uint8_t state[CONTEXT_SIZE];
842 memset(state, 128, sizeof(state));
844 for(v=0; i<128 ; v++){
845 int len= get_symbol(c, state, 0) + 1;
847 if(len + i > 128) return -1;
849 while(len--){
850 quant_table[i] = scale*v;
851 i++;
852 //printf("%2d ",v);
853 //if(i%16==0) printf("\n");
857 for(i=1; i<128; i++){
858 quant_table[256-i]= -quant_table[i];
860 quant_table[128]= -quant_table[127];
862 return 2*v - 1;
865 static int read_header(FFV1Context *f){
866 uint8_t state[CONTEXT_SIZE];
867 int i, context_count;
868 RangeCoder * const c= &f->c;
870 memset(state, 128, sizeof(state));
872 f->version= get_symbol(c, state, 0);
873 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
874 f->colorspace= get_symbol(c, state, 0); //YUV cs type
875 get_rac(c, state); //no chroma = false
876 f->chroma_h_shift= get_symbol(c, state, 0);
877 f->chroma_v_shift= get_symbol(c, state, 0);
878 get_rac(c, state); //transparency plane
879 f->plane_count= 2;
881 if(f->colorspace==0){
882 switch(16*f->chroma_h_shift + f->chroma_v_shift){
883 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
884 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
885 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
886 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
887 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
888 default:
889 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
890 return -1;
892 }else if(f->colorspace==1){
893 if(f->chroma_h_shift || f->chroma_v_shift){
894 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
895 return -1;
897 f->avctx->pix_fmt= PIX_FMT_RGB32;
898 }else{
899 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
900 return -1;
903 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
905 context_count=1;
906 for(i=0; i<5; i++){
907 context_count*= read_quant_table(c, f->quant_table[i], context_count);
908 if(context_count < 0 || context_count > 32768){
909 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
910 return -1;
913 context_count= (context_count+1)/2;
915 for(i=0; i<f->plane_count; i++){
916 PlaneContext * const p= &f->plane[i];
918 p->context_count= context_count;
920 if(f->ac){
921 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
922 }else{
923 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
927 return 0;
930 static int decode_init(AVCodecContext *avctx)
932 // FFV1Context *s = avctx->priv_data;
934 common_init(avctx);
936 return 0;
939 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size){
940 FFV1Context *f = avctx->priv_data;
941 RangeCoder * const c= &f->c;
942 const int width= f->width;
943 const int height= f->height;
944 AVFrame * const p= &f->picture;
945 int bytes_read;
946 uint8_t keystate= 128;
948 AVFrame *picture = data;
950 ff_init_range_decoder(c, buf, buf_size);
951 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
954 p->pict_type= FF_I_TYPE; //FIXME I vs. P
955 if(get_rac(c, &keystate)){
956 p->key_frame= 1;
957 if(read_header(f) < 0)
958 return -1;
959 clear_state(f);
960 }else{
961 p->key_frame= 0;
963 if(!f->plane[0].state && !f->plane[0].vlc_state)
964 return -1;
966 p->reference= 0;
967 if(avctx->get_buffer(avctx, p) < 0){
968 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
969 return -1;
972 if(avctx->debug&FF_DEBUG_PICT_INFO)
973 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
975 if(!f->ac){
976 bytes_read = c->bytestream - c->bytestream_start - 1;
977 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
978 //printf("pos=%d\n", bytes_read);
979 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
980 } else {
981 bytes_read = 0; /* avoid warning */
984 if(f->colorspace==0){
985 const int chroma_width = -((-width )>>f->chroma_h_shift);
986 const int chroma_height= -((-height)>>f->chroma_v_shift);
987 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
989 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
990 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
991 }else{
992 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
995 emms_c();
997 f->picture_number++;
999 *picture= *p;
1001 avctx->release_buffer(avctx, p); //FIXME
1003 *data_size = sizeof(AVFrame);
1005 if(f->ac){
1006 bytes_read= c->bytestream - c->bytestream_start - 1;
1007 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1008 }else{
1009 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1012 return bytes_read;
1015 AVCodec ffv1_decoder = {
1016 "ffv1",
1017 CODEC_TYPE_VIDEO,
1018 CODEC_ID_FFV1,
1019 sizeof(FFV1Context),
1020 decode_init,
1021 NULL,
1022 common_end,
1023 decode_frame,
1024 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1025 NULL
1028 #ifdef CONFIG_ENCODERS
1029 AVCodec ffv1_encoder = {
1030 "ffv1",
1031 CODEC_TYPE_VIDEO,
1032 CODEC_ID_FFV1,
1033 sizeof(FFV1Context),
1034 encode_init,
1035 encode_frame,
1036 common_end,
1037 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, -1},
1039 #endif