1/*
2 * FFV1 codec for libavcodec
3 *
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
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.
12 *
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.
17 *
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
21 */
22
23/**
24 * @file libavcodec/ffv1.c
25 * FF Video Codec 1 (an experimental lossless codec)
26 */
27
28#include "avcodec.h"
29#include "bitstream.h"
30#include "dsputil.h"
31#include "rangecoder.h"
32#include "golomb.h"
33#include "mathops.h"
34
35#define MAX_PLANES 4
36#define CONTEXT_SIZE 32
37
38extern const uint8_t ff_log2_run[32];
39
40static const int8_t quant3[256]={
41 0, 0, 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,-1,
56-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
57};
58static const int8_t quant5[256]={
59 0, 1, 1, 1, 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,-2,-2,-2,
74-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
75};
76static const int8_t quant7[256]={
77 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
90-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
91-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
92-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
93};
94static const int8_t quant9[256]={
95 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
96 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
109-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
110-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
111};
112static const int8_t quant11[256]={
113 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
115 4, 4, 4, 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,-5,-5,
126-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
127-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
128-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
129};
130static const int8_t quant13[256]={
131 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
132 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
134 5, 5, 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,-6,
143-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
144-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
145-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
146-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
147};
148
149typedef struct VlcState{
150    int16_t drift;
151    uint16_t error_sum;
152    int8_t bias;
153    uint8_t count;
154} VlcState;
155
156typedef struct PlaneContext{
157    int context_count;
158    uint8_t (*state)[CONTEXT_SIZE];
159    VlcState *vlc_state;
160    uint8_t interlace_bit_state[2];
161} PlaneContext;
162
163typedef struct FFV1Context{
164    AVCodecContext *avctx;
165    RangeCoder c;
166    GetBitContext gb;
167    PutBitContext pb;
168    int version;
169    int width, height;
170    int chroma_h_shift, chroma_v_shift;
171    int flags;
172    int picture_number;
173    AVFrame picture;
174    int plane_count;
175    int ac;                              ///< 1-> CABAC 0-> golomb rice
176    PlaneContext plane[MAX_PLANES];
177    int16_t quant_table[5][256];
178    int run_index;
179    int colorspace;
180
181    DSPContext dsp;
182}FFV1Context;
183
184static av_always_inline int fold(int diff, int bits){
185    if(bits==8)
186        diff= (int8_t)diff;
187    else{
188        diff+= 1<<(bits-1);
189        diff&=(1<<bits)-1;
190        diff-= 1<<(bits-1);
191    }
192
193    return diff;
194}
195
196static inline int predict(int_fast16_t *src, int_fast16_t *last){
197    const int LT= last[-1];
198    const int  T= last[ 0];
199    const int L =  src[-1];
200
201    return mid_pred(L, L + T - LT, T);
202}
203
204static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
205    const int LT= last[-1];
206    const int  T= last[ 0];
207    const int RT= last[ 1];
208    const int L =  src[-1];
209
210    if(f->quant_table[3][127]){
211        const int TT= last2[0];
212        const int LL=  src[-2];
213        return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
214              +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
215    }else
216        return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
217}
218
219static inline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
220    int i;
221
222    if(v){
223        const int a= FFABS(v);
224        const int e= av_log2(a);
225        put_rac(c, state+0, 0);
226
227        assert(e<=9);
228
229        for(i=0; i<e; i++){
230            put_rac(c, state+1+i, 1);  //1..10
231        }
232        put_rac(c, state+1+i, 0);
233
234        for(i=e-1; i>=0; i--){
235            put_rac(c, state+22+i, (a>>i)&1); //22..31
236        }
237
238        if(is_signed)
239            put_rac(c, state+11 + e, v < 0); //11..21
240    }else{
241        put_rac(c, state+0, 1);
242    }
243}
244
245static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
246    if(get_rac(c, state+0))
247        return 0;
248    else{
249        int i, e, a;
250        e= 0;
251        while(get_rac(c, state+1 + e) && e<9){ //1..10
252            e++;
253        }
254
255        a= 1;
256        for(i=e-1; i>=0; i--){
257            a += a + get_rac(c, state+22 + i); //22..31
258        }
259
260        if(is_signed && get_rac(c, state+11 + e)) //11..21
261            return -a;
262        else
263            return a;
264    }
265}
266
267static 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);
271    drift += v;
272
273    if(count == 128){ //FIXME variable
274        count >>= 1;
275        drift >>= 1;
276        state->error_sum >>= 1;
277    }
278    count++;
279
280    if(drift <= -count){
281        if(state->bias > -128) state->bias--;
282
283        drift += count;
284        if(drift <= -count)
285            drift= -count + 1;
286    }else if(drift > 0){
287        if(state->bias <  127) state->bias++;
288
289        drift -= count;
290        if(drift > 0)
291            drift= 0;
292    }
293
294    state->drift= drift;
295    state->count= count;
296}
297
298static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
299    int i, k, code;
300//printf("final: %d ", v);
301    v = fold(v - state->bias, bits);
302
303    i= state->count;
304    k=0;
305    while(i < state->error_sum){ //FIXME optimize
306        k++;
307        i += i;
308    }
309
310    assert(k<=8);
311
312#if 0 // JPEG LS
313    if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
314    else                                         code= v;
315#else
316     code= v ^ ((2*state->drift + state->count)>>31);
317#endif
318
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);
321
322    update_vlc_state(state, v);
323}
324
325static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
326    int k, i, v, ret;
327
328    i= state->count;
329    k=0;
330    while(i < state->error_sum){ //FIXME optimize
331        k++;
332        i += i;
333    }
334
335    assert(k<=8);
336
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);
339
340#if 0 // JPEG LS
341    if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
342#else
343     v ^= ((2*state->drift + state->count)>>31);
344#endif
345
346    ret= fold(v + state->bias, bits);
347
348    update_vlc_state(state, v);
349//printf("final: %d\n", ret);
350    return ret;
351}
352
353#if CONFIG_FFV1_ENCODER
354static 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;
357    int x;
358    int run_index= s->run_index;
359    int run_count=0;
360    int run_mode=0;
361
362    if(s->ac){
363        if(c->bytestream_end - c->bytestream < w*20){
364            av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
365            return -1;
366        }
367    }else{
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");
370            return -1;
371        }
372    }
373
374    for(x=0; x<w; x++){
375        int diff, context;
376
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);
379
380        if(context < 0){
381            context = -context;
382            diff= -diff;
383        }
384
385        diff= fold(diff, bits);
386
387        if(s->ac){
388            put_symbol(c, p->state[context], diff, 1);
389        }else{
390            if(context == 0) run_mode=1;
391
392            if(run_mode){
393
394                if(diff){
395                    while(run_count >= 1<<ff_log2_run[run_index]){
396                        run_count -= 1<<ff_log2_run[run_index];
397                        run_index++;
398                        put_bits(&s->pb, 1, 1);
399                    }
400
401                    put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
402                    if(run_index) run_index--;
403                    run_count=0;
404                    run_mode=0;
405                    if(diff>0) diff--;
406                }else{
407                    run_count++;
408                }
409            }
410
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));
412
413            if(run_mode == 0)
414                put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
415        }
416    }
417    if(run_mode){
418        while(run_count >= 1<<ff_log2_run[run_index]){
419            run_count -= 1<<ff_log2_run[run_index];
420            run_index++;
421            put_bits(&s->pb, 1, 1);
422        }
423
424        if(run_count)
425            put_bits(&s->pb, 1, 1);
426    }
427    s->run_index= run_index;
428
429    return 0;
430}
431
432static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
433    int x,y,i;
434    const int ring_size= s->avctx->context_model ? 3 : 2;
435    int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
436    s->run_index=0;
437
438    memset(sample_buffer, 0, sizeof(sample_buffer));
439
440    for(y=0; y<h; y++){
441        for(i=0; i<ring_size; i++)
442            sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
443
444        sample[0][-1]= sample[1][0  ];
445        sample[1][ w]= sample[1][w-1];
446//{START_TIMER
447        for(x=0; x<w; x++){
448            sample[0][x]= src[x + stride*y];
449        }
450        encode_line(s, w, sample, plane_index, 8);
451//STOP_TIMER("encode line")}
452    }
453}
454
455static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
456    int x, y, p, i;
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];
459    s->run_index=0;
460
461    memset(sample_buffer, 0, sizeof(sample_buffer));
462
463    for(y=0; y<h; y++){
464        for(i=0; i<ring_size; i++)
465            for(p=0; p<3; p++)
466                sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
467
468        for(x=0; x<w; x++){
469            int v= src[x + stride*y];
470            int b= v&0xFF;
471            int g= (v>>8)&0xFF;
472            int r= (v>>16)&0xFF;
473
474            b -= g;
475            r -= g;
476            g += (b + r)>>2;
477            b += 0x100;
478            r += 0x100;
479
480//            assert(g>=0 && b>=0 && r>=0);
481//            assert(g<256 && b<512 && r<512);
482            sample[0][0][x]= g;
483            sample[1][0][x]= b;
484            sample[2][0][x]= r;
485        }
486        for(p=0; p<3; p++){
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);
490        }
491    }
492}
493
494static void write_quant_table(RangeCoder *c, int16_t *quant_table){
495    int last=0;
496    int i;
497    uint8_t state[CONTEXT_SIZE];
498    memset(state, 128, sizeof(state));
499
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);
503            last= i;
504        }
505    }
506    put_symbol(c, state, i-last-1, 0);
507}
508
509static void write_header(FFV1Context *f){
510    uint8_t state[CONTEXT_SIZE];
511    int i;
512    RangeCoder * const c= &f->c;
513
514    memset(state, 128, sizeof(state));
515
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
523
524    for(i=0; i<5; i++)
525        write_quant_table(c, f->quant_table[i]);
526}
527#endif /* CONFIG_FFV1_ENCODER */
528
529static av_cold int common_init(AVCodecContext *avctx){
530    FFV1Context *s = avctx->priv_data;
531    int width, height;
532
533    s->avctx= avctx;
534    s->flags= avctx->flags;
535
536    dsputil_init(&s->dsp, avctx);
537
538    width= s->width= avctx->width;
539    height= s->height= avctx->height;
540
541    assert(width && height);
542
543    return 0;
544}
545
546#if CONFIG_FFV1_ENCODER
547static av_cold int encode_init(AVCodecContext *avctx)
548{
549    FFV1Context *s = avctx->priv_data;
550    int i;
551
552    common_init(avctx);
553
554    s->version=0;
555    s->ac= avctx->coder_type;
556
557    s->plane_count=2;
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;
565        }else{
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];
569        }
570    }
571
572    for(i=0; i<s->plane_count; i++){
573        PlaneContext * const p= &s->plane[i];
574
575        if(avctx->context_model==0){
576            p->context_count= (11*11*11+1)/2;
577        }else{
578            p->context_count= (11*11*5*5*5+1)/2;
579        }
580
581        if(s->ac){
582            if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
583        }else{
584            if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
585        }
586    }
587
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:
595        s->colorspace= 0;
596        break;
597    case PIX_FMT_RGB32:
598        s->colorspace= 1;
599        break;
600    default:
601        av_log(avctx, AV_LOG_ERROR, "format not supported\n");
602        return -1;
603    }
604    avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
605
606    s->picture_number=0;
607
608    return 0;
609}
610#endif /* CONFIG_FFV1_ENCODER */
611
612
613static void clear_state(FFV1Context *f){
614    int i, j;
615
616    for(i=0; i<f->plane_count; i++){
617        PlaneContext *p= &f->plane[i];
618
619        p->interlace_bit_state[0]= 128;
620        p->interlace_bit_state[1]= 128;
621
622        for(j=0; j<p->context_count; j++){
623            if(f->ac){
624                memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
625            }else{
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;
630            }
631        }
632    }
633}
634
635#if CONFIG_FFV1_ENCODER
636static 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;
643    int used_count= 0;
644    uint8_t keystate=128;
645
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);
649
650    *p = *pict;
651    p->pict_type= FF_I_TYPE;
652
653    if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
654        put_rac(c, &keystate, 1);
655        p->key_frame= 1;
656        write_header(f);
657        clear_state(f);
658    }else{
659        put_rac(c, &keystate, 0);
660        p->key_frame= 0;
661    }
662
663    if(!f->ac){
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);
667    }
668
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);
672
673        encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
674
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);
677    }else{
678        encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
679    }
680    emms_c();
681
682    f->picture_number++;
683
684    if(f->ac){
685        return ff_rac_terminate(c);
686    }else{
687        flush_put_bits(&f->pb); //nicer padding FIXME
688        return used_count + (put_bits_count(&f->pb)+7)/8;
689    }
690}
691#endif /* CONFIG_FFV1_ENCODER */
692
693static av_cold int common_end(AVCodecContext *avctx){
694    FFV1Context *s = avctx->priv_data;
695    int i;
696
697    for(i=0; i<s->plane_count; i++){
698        PlaneContext *p= &s->plane[i];
699
700        av_freep(&p->state);
701        av_freep(&p->vlc_state);
702    }
703
704    return 0;
705}
706
707static 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;
710    int x;
711    int run_count=0;
712    int run_mode=0;
713    int run_index= s->run_index;
714
715    for(x=0; x<w; x++){
716        int diff, context, sign;
717
718        context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
719        if(context < 0){
720            context= -context;
721            sign=1;
722        }else
723            sign=0;
724
725
726        if(s->ac){
727            diff= get_symbol(c, p->state[context], 1);
728        }else{
729            if(context == 0 && run_mode==0) run_mode=1;
730
731            if(run_mode){
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++;
736                    }else{
737                        if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
738                        else run_count=0;
739                        if(run_index) run_index--;
740                        run_mode=2;
741                    }
742                }
743                run_count--;
744                if(run_count < 0){
745                    run_mode=0;
746                    run_count=0;
747                    diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
748                    if(diff>=0) diff++;
749                }else
750                    diff=0;
751            }else
752                diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
753
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));
755        }
756
757        if(sign) diff= -diff;
758
759        sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
760    }
761    s->run_index= run_index;
762}
763
764static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
765    int x, y;
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;
770
771    s->run_index=0;
772
773    memset(sample_buffer, 0, sizeof(sample_buffer));
774
775    for(y=0; y<h; y++){
776        int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
777
778        sample[0]= sample[1];
779        sample[1]= temp;
780
781        sample[1][-1]= sample[0][0  ];
782        sample[0][ w]= sample[0][w-1];
783
784//{START_TIMER
785        decode_line(s, w, sample, plane_index, 8);
786        for(x=0; x<w; x++){
787            src[x + stride*y]= sample[1][x];
788        }
789//STOP_TIMER("decode-line")}
790    }
791}
792
793static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
794    int x, y, p;
795    int_fast16_t sample_buffer[3][2][w+6];
796    int_fast16_t *sample[3][2];
797    for(x=0; x<3; x++){
798        sample[x][0] = sample_buffer[x][0]+3;
799        sample[x][1] = sample_buffer[x][1]+3;
800    }
801
802    s->run_index=0;
803
804    memset(sample_buffer, 0, sizeof(sample_buffer));
805
806    for(y=0; y<h; y++){
807        for(p=0; p<3; p++){
808            int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
809
810            sample[p][0]= sample[p][1];
811            sample[p][1]= temp;
812
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);
816        }
817        for(x=0; x<w; x++){
818            int g= sample[0][1][x];
819            int b= sample[1][1][x];
820            int r= sample[2][1][x];
821
822//            assert(g>=0 && b>=0 && r>=0);
823//            assert(g<256 && b<512 && r<512);
824
825            b -= 0x100;
826            r -= 0x100;
827            g -= (b + r)>>2;
828            b += g;
829            r += g;
830
831            src[x + stride*y]= b + (g<<8) + (r<<16);
832        }
833    }
834}
835
836static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
837    int v;
838    int i=0;
839    uint8_t state[CONTEXT_SIZE];
840
841    memset(state, 128, sizeof(state));
842
843    for(v=0; i<128 ; v++){
844        int len= get_symbol(c, state, 0) + 1;
845
846        if(len + i > 128) return -1;
847
848        while(len--){
849            quant_table[i] = scale*v;
850            i++;
851//printf("%2d ",v);
852//if(i%16==0) printf("\n");
853        }
854    }
855
856    for(i=1; i<128; i++){
857        quant_table[256-i]= -quant_table[i];
858    }
859    quant_table[128]= -quant_table[127];
860
861    return 2*v - 1;
862}
863
864static int read_header(FFV1Context *f){
865    uint8_t state[CONTEXT_SIZE];
866    int i, context_count;
867    RangeCoder * const c= &f->c;
868
869    memset(state, 128, sizeof(state));
870
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
878    f->plane_count= 2;
879
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;
887        default:
888            av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
889            return -1;
890        }
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");
894            return -1;
895        }
896        f->avctx->pix_fmt= PIX_FMT_RGB32;
897    }else{
898        av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
899        return -1;
900    }
901
902//printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
903
904    context_count=1;
905    for(i=0; i<5; i++){
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");
909            return -1;
910        }
911    }
912    context_count= (context_count+1)/2;
913
914    for(i=0; i<f->plane_count; i++){
915        PlaneContext * const p= &f->plane[i];
916
917        p->context_count= context_count;
918
919        if(f->ac){
920            if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
921        }else{
922            if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
923        }
924    }
925
926    return 0;
927}
928
929static av_cold int decode_init(AVCodecContext *avctx)
930{
931//    FFV1Context *s = avctx->priv_data;
932
933    common_init(avctx);
934
935    return 0;
936}
937
938static 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;
944    int bytes_read;
945    uint8_t keystate= 128;
946
947    AVFrame *picture = data;
948
949    ff_init_range_decoder(c, buf, buf_size);
950    ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
951
952
953    p->pict_type= FF_I_TYPE; //FIXME I vs. P
954    if(get_rac(c, &keystate)){
955        p->key_frame= 1;
956        if(read_header(f) < 0)
957            return -1;
958        clear_state(f);
959    }else{
960        p->key_frame= 0;
961    }
962    if(!f->plane[0].state && !f->plane[0].vlc_state)
963        return -1;
964
965    p->reference= 0;
966    if(avctx->get_buffer(avctx, p) < 0){
967        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
968        return -1;
969    }
970
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);
973
974    if(!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);
979    } else {
980        bytes_read = 0; /* avoid warning */
981    }
982
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);
987
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);
990    }else{
991        decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
992    }
993
994    emms_c();
995
996    f->picture_number++;
997
998    *picture= *p;
999
1000    avctx->release_buffer(avctx, p); //FIXME
1001
1002    *data_size = sizeof(AVFrame);
1003
1004    if(f->ac){
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");
1007    }else{
1008        bytes_read+= (get_bits_count(&f->gb)+7)/8;
1009    }
1010
1011    return bytes_read;
1012}
1013
1014AVCodec ffv1_decoder = {
1015    "ffv1",
1016    CODEC_TYPE_VIDEO,
1017    CODEC_ID_FFV1,
1018    sizeof(FFV1Context),
1019    decode_init,
1020    NULL,
1021    common_end,
1022    decode_frame,
1023    CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1024    NULL,
1025    .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1026};
1027
1028#if CONFIG_FFV1_ENCODER
1029AVCodec 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, PIX_FMT_NONE},
1038    .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1039};
1040#endif
1041