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 (a 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,
60 static const int8_t quant5_10bit[256]={
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 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,-1,
74 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
76 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
79 static const int8_t quant5[256]={
80 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87 2, 2, 2, 2, 2, 2, 2, 2, 2, 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,-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,-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,-2,-2,
94 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
95 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
97 static const int8_t quant7[256]={
98 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
101 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
108 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
109 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
110 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
111 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
112 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
113 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
115 static const int8_t quant9[256]={
116 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
119 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
120 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
121 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
122 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
123 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 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,-4,-4,-4,-4,-4,-4,-4,-4,-4,-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,-4,-4,-4,-4,-4,-4,-4,-4,-4,-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,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
130 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
131 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
133 static const int8_t quant9_10bit[256]={
134 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
135 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
138 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
139 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
140 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
141 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
145 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
146 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
147 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
148 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
149 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
152 static const int8_t quant11[256]={
153 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
154 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
155 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
157 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
158 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
159 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
160 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
162 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
163 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
164 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
165 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
166 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
167 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
168 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
170 static const int8_t quant13[256]={
171 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
172 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
173 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
174 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
175 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
176 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
177 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
178 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
179 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
180 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
181 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
182 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
183 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
184 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
185 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
186 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
189 typedef struct VlcState{
196 typedef struct PlaneContext{
198 uint8_t (*state)[CONTEXT_SIZE];
200 uint8_t interlace_bit_state[2];
203 typedef struct FFV1Context{
204 AVCodecContext *avctx;
210 int chroma_h_shift, chroma_v_shift;
215 int ac; ///< 1=range coder <-> 0=golomb rice
216 PlaneContext plane[MAX_PLANES];
217 int16_t quant_table[5][256];
224 static av_always_inline int fold(int diff, int bits){
236 static inline int predict(int_fast16_t *src, int_fast16_t *last){
237 const int LT= last[-1];
238 const int T= last[ 0];
239 const int L = src[-1];
241 return mid_pred(L, L + T - LT, T);
244 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
245 const int LT= last[-1];
246 const int T= last[ 0];
247 const int RT= last[ 1];
248 const int L = src[-1];
250 if(f->quant_table[3][127]){
251 const int TT= last2[0];
252 const int LL= src[-2];
253 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
254 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
256 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
259 static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){
263 const int a= FFABS(v);
264 const int e= av_log2(a);
265 put_rac(c, state+0, 0);
268 put_rac(c, state+1+i, 1); //1..10
270 put_rac(c, state+1+i, 0);
272 for(i=e-1; i>=0; i--){
273 put_rac(c, state+22+i, (a>>i)&1); //22..31
277 put_rac(c, state+11 + e, v < 0); //11..21
280 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
282 put_rac(c, state+1+9, 0);
284 for(i=e-1; i>=0; i--){
285 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
289 put_rac(c, state+11 + 10, v < 0); //11..21
292 put_rac(c, state+0, 1);
296 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
297 put_symbol_inline(c, state, v, is_signed);
300 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
301 if(get_rac(c, state+0))
306 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
311 for(i=e-1; i>=0; i--){
312 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
315 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
320 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
321 return get_symbol_inline(c, state, is_signed);
324 static inline void update_vlc_state(VlcState * const state, const int v){
325 int drift= state->drift;
326 int count= state->count;
327 state->error_sum += FFABS(v);
330 if(count == 128){ //FIXME variable
333 state->error_sum >>= 1;
338 if(state->bias > -128) state->bias--;
344 if(state->bias < 127) state->bias++;
355 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
357 //printf("final: %d ", v);
358 v = fold(v - state->bias, bits);
362 while(i < state->error_sum){ //FIXME optimize
370 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
373 code= v ^ ((2*state->drift + state->count)>>31);
376 //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);
377 set_sr_golomb(pb, code, k, 12, bits);
379 update_vlc_state(state, v);
382 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
387 while(i < state->error_sum){ //FIXME optimize
394 v= get_sr_golomb(gb, k, 12, bits);
395 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
398 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
400 v ^= ((2*state->drift + state->count)>>31);
403 ret= fold(v + state->bias, bits);
405 update_vlc_state(state, v);
406 //printf("final: %d\n", ret);
410 #if CONFIG_FFV1_ENCODER
411 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
412 PlaneContext * const p= &s->plane[plane_index];
413 RangeCoder * const c= &s->c;
415 int run_index= s->run_index;
420 if(c->bytestream_end - c->bytestream < w*20){
421 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
425 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
426 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
434 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
435 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
442 diff= fold(diff, bits);
445 put_symbol_inline(c, p->state[context], diff, 1);
447 if(context == 0) run_mode=1;
452 while(run_count >= 1<<ff_log2_run[run_index]){
453 run_count -= 1<<ff_log2_run[run_index];
455 put_bits(&s->pb, 1, 1);
458 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
459 if(run_index) run_index--;
468 // 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));
471 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
475 while(run_count >= 1<<ff_log2_run[run_index]){
476 run_count -= 1<<ff_log2_run[run_index];
478 put_bits(&s->pb, 1, 1);
482 put_bits(&s->pb, 1, 1);
484 s->run_index= run_index;
489 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
491 const int ring_size= s->avctx->context_model ? 3 : 2;
492 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
495 memset(sample_buffer, 0, sizeof(sample_buffer));
498 for(i=0; i<ring_size; i++)
499 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
501 sample[0][-1]= sample[1][0 ];
502 sample[1][ w]= sample[1][w-1];
504 if(s->avctx->bits_per_raw_sample<=8){
506 sample[0][x]= src[x + stride*y];
508 encode_line(s, w, sample, plane_index, 8);
511 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
513 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
515 //STOP_TIMER("encode line")}
519 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
521 const int ring_size= s->avctx->context_model ? 3 : 2;
522 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
525 memset(sample_buffer, 0, sizeof(sample_buffer));
528 for(i=0; i<ring_size; i++)
530 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
533 int v= src[x + stride*y];
544 // assert(g>=0 && b>=0 && r>=0);
545 // assert(g<256 && b<512 && r<512);
551 sample[p][0][-1]= sample[p][1][0 ];
552 sample[p][1][ w]= sample[p][1][w-1];
553 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
558 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
561 uint8_t state[CONTEXT_SIZE];
562 memset(state, 128, sizeof(state));
564 for(i=1; i<128 ; i++){
565 if(quant_table[i] != quant_table[i-1]){
566 put_symbol(c, state, i-last-1, 0);
570 put_symbol(c, state, i-last-1, 0);
573 static void write_header(FFV1Context *f){
574 uint8_t state[CONTEXT_SIZE];
576 RangeCoder * const c= &f->c;
578 memset(state, 128, sizeof(state));
580 put_symbol(c, state, f->version, 0);
581 put_symbol(c, state, f->avctx->coder_type, 0);
582 put_symbol(c, state, f->colorspace, 0); //YUV cs type
584 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
585 put_rac(c, state, 1); //chroma planes
586 put_symbol(c, state, f->chroma_h_shift, 0);
587 put_symbol(c, state, f->chroma_v_shift, 0);
588 put_rac(c, state, 0); //no transparency plane
591 write_quant_table(c, f->quant_table[i]);
593 #endif /* CONFIG_FFV1_ENCODER */
595 static av_cold int common_init(AVCodecContext *avctx){
596 FFV1Context *s = avctx->priv_data;
599 s->flags= avctx->flags;
601 dsputil_init(&s->dsp, avctx);
603 s->width = avctx->width;
604 s->height= avctx->height;
606 assert(s->width && s->height);
611 #if CONFIG_FFV1_ENCODER
612 static av_cold int encode_init(AVCodecContext *avctx)
614 FFV1Context *s = avctx->priv_data;
620 s->ac= avctx->coder_type;
623 for(i=0; i<256; i++){
624 if(avctx->bits_per_raw_sample <=8){
625 s->quant_table[0][i]= quant11[i];
626 s->quant_table[1][i]= 11*quant11[i];
627 if(avctx->context_model==0){
628 s->quant_table[2][i]= 11*11*quant11[i];
629 s->quant_table[3][i]=
630 s->quant_table[4][i]=0;
632 s->quant_table[2][i]= 11*11*quant5 [i];
633 s->quant_table[3][i]= 5*11*11*quant5 [i];
634 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
637 s->quant_table[0][i]= quant9_10bit[i];
638 s->quant_table[1][i]= 11*quant9_10bit[i];
639 if(avctx->context_model==0){
640 s->quant_table[2][i]= 11*11*quant9_10bit[i];
641 s->quant_table[3][i]=
642 s->quant_table[4][i]=0;
644 s->quant_table[2][i]= 11*11*quant5_10bit[i];
645 s->quant_table[3][i]= 5*11*11*quant5_10bit[i];
646 s->quant_table[4][i]= 5*5*11*11*quant5_10bit[i];
651 for(i=0; i<s->plane_count; i++){
652 PlaneContext * const p= &s->plane[i];
654 if(avctx->context_model==0){
655 p->context_count= (11*11*11+1)/2;
657 p->context_count= (11*11*5*5*5+1)/2;
661 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
663 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
667 avctx->coded_frame= &s->picture;
668 switch(avctx->pix_fmt){
669 case PIX_FMT_YUV444P16:
670 case PIX_FMT_YUV422P16:
671 case PIX_FMT_YUV420P16:
672 if(avctx->bits_per_raw_sample <=8){
673 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
677 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
681 case PIX_FMT_YUV444P:
682 case PIX_FMT_YUV422P:
683 case PIX_FMT_YUV420P:
684 case PIX_FMT_YUV411P:
685 case PIX_FMT_YUV410P:
692 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
695 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
701 #endif /* CONFIG_FFV1_ENCODER */
704 static void clear_state(FFV1Context *f){
707 for(i=0; i<f->plane_count; i++){
708 PlaneContext *p= &f->plane[i];
710 p->interlace_bit_state[0]= 128;
711 p->interlace_bit_state[1]= 128;
713 for(j=0; j<p->context_count; j++){
715 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
717 p->vlc_state[j].drift= 0;
718 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
719 p->vlc_state[j].bias= 0;
720 p->vlc_state[j].count= 1;
726 #if CONFIG_FFV1_ENCODER
727 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
728 FFV1Context *f = avctx->priv_data;
729 RangeCoder * const c= &f->c;
730 AVFrame *pict = data;
731 const int width= f->width;
732 const int height= f->height;
733 AVFrame * const p= &f->picture;
735 uint8_t keystate=128;
737 ff_init_range_encoder(c, buf, buf_size);
738 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
741 p->pict_type= FF_I_TYPE;
743 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
744 put_rac(c, &keystate, 1);
749 put_rac(c, &keystate, 0);
754 used_count += ff_rac_terminate(c);
755 //printf("pos=%d\n", used_count);
756 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
759 if(f->colorspace==0){
760 const int chroma_width = -((-width )>>f->chroma_h_shift);
761 const int chroma_height= -((-height)>>f->chroma_v_shift);
763 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
765 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
766 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
768 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
775 return ff_rac_terminate(c);
777 flush_put_bits(&f->pb); //nicer padding FIXME
778 return used_count + (put_bits_count(&f->pb)+7)/8;
781 #endif /* CONFIG_FFV1_ENCODER */
783 static av_cold int common_end(AVCodecContext *avctx){
784 FFV1Context *s = avctx->priv_data;
787 for(i=0; i<s->plane_count; i++){
788 PlaneContext *p= &s->plane[i];
791 av_freep(&p->vlc_state);
797 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
798 PlaneContext * const p= &s->plane[plane_index];
799 RangeCoder * const c= &s->c;
803 int run_index= s->run_index;
806 int diff, context, sign;
808 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
817 diff= get_symbol_inline(c, p->state[context], 1);
819 if(context == 0 && run_mode==0) run_mode=1;
822 if(run_count==0 && run_mode==1){
823 if(get_bits1(&s->gb)){
824 run_count = 1<<ff_log2_run[run_index];
825 if(x + run_count <= w) run_index++;
827 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
829 if(run_index) run_index--;
837 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
842 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
844 // 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));
847 if(sign) diff= -diff;
849 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
851 s->run_index= run_index;
854 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
856 int_fast16_t sample_buffer[2][w+6];
857 int_fast16_t *sample[2];
858 sample[0]=sample_buffer[0]+3;
859 sample[1]=sample_buffer[1]+3;
863 memset(sample_buffer, 0, sizeof(sample_buffer));
866 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
868 sample[0]= sample[1];
871 sample[1][-1]= sample[0][0 ];
872 sample[0][ w]= sample[0][w-1];
875 if(s->avctx->bits_per_raw_sample <= 8){
876 decode_line(s, w, sample, plane_index, 8);
878 src[x + stride*y]= sample[1][x];
881 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
883 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
886 //STOP_TIMER("decode-line")}
890 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
892 int_fast16_t sample_buffer[3][2][w+6];
893 int_fast16_t *sample[3][2];
895 sample[x][0] = sample_buffer[x][0]+3;
896 sample[x][1] = sample_buffer[x][1]+3;
901 memset(sample_buffer, 0, sizeof(sample_buffer));
905 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
907 sample[p][0]= sample[p][1];
910 sample[p][1][-1]= sample[p][0][0 ];
911 sample[p][0][ w]= sample[p][0][w-1];
912 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
915 int g= sample[0][1][x];
916 int b= sample[1][1][x];
917 int r= sample[2][1][x];
919 // assert(g>=0 && b>=0 && r>=0);
920 // assert(g<256 && b<512 && r<512);
928 src[x + stride*y]= b + (g<<8) + (r<<16);
933 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
936 uint8_t state[CONTEXT_SIZE];
938 memset(state, 128, sizeof(state));
940 for(v=0; i<128 ; v++){
941 int len= get_symbol(c, state, 0) + 1;
943 if(len + i > 128) return -1;
946 quant_table[i] = scale*v;
949 //if(i%16==0) printf("\n");
953 for(i=1; i<128; i++){
954 quant_table[256-i]= -quant_table[i];
956 quant_table[128]= -quant_table[127];
961 static int read_header(FFV1Context *f){
962 uint8_t state[CONTEXT_SIZE];
963 int i, context_count;
964 RangeCoder * const c= &f->c;
966 memset(state, 128, sizeof(state));
968 f->version= get_symbol(c, state, 0);
969 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
970 f->colorspace= get_symbol(c, state, 0); //YUV cs type
972 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
973 get_rac(c, state); //no chroma = false
974 f->chroma_h_shift= get_symbol(c, state, 0);
975 f->chroma_v_shift= get_symbol(c, state, 0);
976 get_rac(c, state); //transparency plane
979 if(f->colorspace==0){
980 if(f->avctx->bits_per_raw_sample<=8){
981 switch(16*f->chroma_h_shift + f->chroma_v_shift){
982 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
983 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
984 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
985 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
986 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
988 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
992 switch(16*f->chroma_h_shift + f->chroma_v_shift){
993 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
994 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
995 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
997 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1001 }else if(f->colorspace==1){
1002 if(f->chroma_h_shift || f->chroma_v_shift){
1003 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1006 f->avctx->pix_fmt= PIX_FMT_RGB32;
1008 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1012 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1016 context_count*= read_quant_table(c, f->quant_table[i], context_count);
1017 if(context_count < 0 || context_count > 32768){
1018 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1022 context_count= (context_count+1)/2;
1024 for(i=0; i<f->plane_count; i++){
1025 PlaneContext * const p= &f->plane[i];
1027 p->context_count= context_count;
1030 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1032 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1039 static av_cold int decode_init(AVCodecContext *avctx)
1041 // FFV1Context *s = avctx->priv_data;
1048 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1049 const uint8_t *buf = avpkt->data;
1050 int buf_size = avpkt->size;
1051 FFV1Context *f = avctx->priv_data;
1052 RangeCoder * const c= &f->c;
1053 const int width= f->width;
1054 const int height= f->height;
1055 AVFrame * const p= &f->picture;
1057 uint8_t keystate= 128;
1059 AVFrame *picture = data;
1061 ff_init_range_decoder(c, buf, buf_size);
1062 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1065 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1066 if(get_rac(c, &keystate)){
1068 if(read_header(f) < 0)
1074 if(!f->plane[0].state && !f->plane[0].vlc_state)
1078 if(avctx->get_buffer(avctx, p) < 0){
1079 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1083 if(avctx->debug&FF_DEBUG_PICT_INFO)
1084 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1087 bytes_read = c->bytestream - c->bytestream_start - 1;
1088 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1089 //printf("pos=%d\n", bytes_read);
1090 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
1092 bytes_read = 0; /* avoid warning */
1095 if(f->colorspace==0){
1096 const int chroma_width = -((-width )>>f->chroma_h_shift);
1097 const int chroma_height= -((-height)>>f->chroma_v_shift);
1098 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
1100 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
1101 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
1103 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1108 f->picture_number++;
1112 avctx->release_buffer(avctx, p); //FIXME
1114 *data_size = sizeof(AVFrame);
1117 bytes_read= c->bytestream - c->bytestream_start - 1;
1118 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1120 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1126 AVCodec ffv1_decoder = {
1130 sizeof(FFV1Context),
1135 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1137 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1140 #if CONFIG_FFV1_ENCODER
1141 AVCodec ffv1_encoder = {
1145 sizeof(FFV1Context),
1149 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_NONE},
1150 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),