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 (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 static const uint8_t ver2_state[256]= {
190 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
191 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
192 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
193 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
194 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
195 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
196 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
197 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
198 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
199 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
200 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
201 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
202 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
203 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
204 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
205 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
208 typedef struct VlcState{
215 typedef struct PlaneContext{
217 uint8_t (*state)[CONTEXT_SIZE];
219 uint8_t interlace_bit_state[2];
222 typedef struct FFV1Context{
223 AVCodecContext *avctx;
229 int chroma_h_shift, chroma_v_shift;
234 int ac; ///< 1=range coder <-> 0=golomb rice
235 PlaneContext plane[MAX_PLANES];
236 int16_t quant_table[5][256];
237 uint8_t state_transition[256];
240 int_fast16_t *sample_buffer;
245 static av_always_inline int fold(int diff, int bits){
257 static inline int predict(int_fast16_t *src, int_fast16_t *last){
258 const int LT= last[-1];
259 const int T= last[ 0];
260 const int L = src[-1];
262 return mid_pred(L, L + T - LT, T);
265 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
266 const int LT= last[-1];
267 const int T= last[ 0];
268 const int RT= last[ 1];
269 const int L = src[-1];
271 if(f->quant_table[3][127]){
272 const int TT= last2[0];
273 const int LL= src[-2];
274 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
275 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
277 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
280 static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){
284 const int a= FFABS(v);
285 const int e= av_log2(a);
286 put_rac(c, state+0, 0);
289 put_rac(c, state+1+i, 1); //1..10
291 put_rac(c, state+1+i, 0);
293 for(i=e-1; i>=0; i--){
294 put_rac(c, state+22+i, (a>>i)&1); //22..31
298 put_rac(c, state+11 + e, v < 0); //11..21
301 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
303 put_rac(c, state+1+9, 0);
305 for(i=e-1; i>=0; i--){
306 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
310 put_rac(c, state+11 + 10, v < 0); //11..21
313 put_rac(c, state+0, 1);
317 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
318 put_symbol_inline(c, state, v, is_signed);
321 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
322 if(get_rac(c, state+0))
327 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
332 for(i=e-1; i>=0; i--){
333 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
336 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
341 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
342 return get_symbol_inline(c, state, is_signed);
345 static inline void update_vlc_state(VlcState * const state, const int v){
346 int drift= state->drift;
347 int count= state->count;
348 state->error_sum += FFABS(v);
351 if(count == 128){ //FIXME variable
354 state->error_sum >>= 1;
359 if(state->bias > -128) state->bias--;
365 if(state->bias < 127) state->bias++;
376 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
378 //printf("final: %d ", v);
379 v = fold(v - state->bias, bits);
383 while(i < state->error_sum){ //FIXME optimize
391 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
394 code= v ^ ((2*state->drift + state->count)>>31);
397 //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);
398 set_sr_golomb(pb, code, k, 12, bits);
400 update_vlc_state(state, v);
403 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
408 while(i < state->error_sum){ //FIXME optimize
415 v= get_sr_golomb(gb, k, 12, bits);
416 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
419 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
421 v ^= ((2*state->drift + state->count)>>31);
424 ret= fold(v + state->bias, bits);
426 update_vlc_state(state, v);
427 //printf("final: %d\n", ret);
431 #if CONFIG_FFV1_ENCODER
432 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
433 PlaneContext * const p= &s->plane[plane_index];
434 RangeCoder * const c= &s->c;
436 int run_index= s->run_index;
441 if(c->bytestream_end - c->bytestream < w*20){
442 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
446 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
447 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
455 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
456 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
463 diff= fold(diff, bits);
466 put_symbol_inline(c, p->state[context], diff, 1);
468 if(context == 0) run_mode=1;
473 while(run_count >= 1<<ff_log2_run[run_index]){
474 run_count -= 1<<ff_log2_run[run_index];
476 put_bits(&s->pb, 1, 1);
479 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
480 if(run_index) run_index--;
489 // 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));
492 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
496 while(run_count >= 1<<ff_log2_run[run_index]){
497 run_count -= 1<<ff_log2_run[run_index];
499 put_bits(&s->pb, 1, 1);
503 put_bits(&s->pb, 1, 1);
505 s->run_index= run_index;
510 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
512 const int ring_size= s->avctx->context_model ? 3 : 2;
513 int_fast16_t *sample[3];
516 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
519 for(i=0; i<ring_size; i++)
520 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
522 sample[0][-1]= sample[1][0 ];
523 sample[1][ w]= sample[1][w-1];
525 if(s->avctx->bits_per_raw_sample<=8){
527 sample[0][x]= src[x + stride*y];
529 encode_line(s, w, sample, plane_index, 8);
532 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
534 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
536 //STOP_TIMER("encode line")}
540 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
542 const int ring_size= s->avctx->context_model ? 3 : 2;
543 int_fast16_t *sample[3][3];
546 memset(s->sample_buffer, 0, ring_size*3*(w+6)*sizeof(*s->sample_buffer));
549 for(i=0; i<ring_size; i++)
551 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
554 int v= src[x + stride*y];
565 // assert(g>=0 && b>=0 && r>=0);
566 // assert(g<256 && b<512 && r<512);
572 sample[p][0][-1]= sample[p][1][0 ];
573 sample[p][1][ w]= sample[p][1][w-1];
574 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
579 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
582 uint8_t state[CONTEXT_SIZE];
583 memset(state, 128, sizeof(state));
585 for(i=1; i<128 ; i++){
586 if(quant_table[i] != quant_table[i-1]){
587 put_symbol(c, state, i-last-1, 0);
591 put_symbol(c, state, i-last-1, 0);
594 static void write_quant_tables(RangeCoder *c, int16_t quant_table[5][256]){
597 write_quant_table(c, quant_table[i]);
600 static void write_header(FFV1Context *f){
601 uint8_t state[CONTEXT_SIZE];
603 RangeCoder * const c= &f->c;
605 memset(state, 128, sizeof(state));
608 put_symbol(c, state, f->version, 0);
609 put_symbol(c, state, f->ac, 0);
611 for(i=1; i<256; i++){
612 f->state_transition[i]=ver2_state[i];
613 put_symbol(c, state, ver2_state[i] - c->one_state[i], 1);
616 put_symbol(c, state, f->colorspace, 0); //YUV cs type
618 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
619 put_rac(c, state, 1); //chroma planes
620 put_symbol(c, state, f->chroma_h_shift, 0);
621 put_symbol(c, state, f->chroma_v_shift, 0);
622 put_rac(c, state, 0); //no transparency plane
624 write_quant_tables(c, f->quant_table);
627 #endif /* CONFIG_FFV1_ENCODER */
629 static av_cold int common_init(AVCodecContext *avctx){
630 FFV1Context *s = avctx->priv_data;
633 s->flags= avctx->flags;
635 dsputil_init(&s->dsp, avctx);
637 s->width = avctx->width;
638 s->height= avctx->height;
640 assert(s->width && s->height);
642 s->sample_buffer = av_malloc(6 * (s->width+6) * sizeof(*s->sample_buffer));
643 if (!s->sample_buffer)
644 return AVERROR(ENOMEM);
649 #if CONFIG_FFV1_ENCODER
650 static int write_extra_header(FFV1Context *f){
651 RangeCoder * const c= &f->c;
652 uint8_t state[CONTEXT_SIZE];
654 memset(state, 128, sizeof(state));
656 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000);
657 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
658 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
660 put_symbol(c, state, f->version, 0);
661 put_symbol(c, state, f->ac, 0);
663 for(i=1; i<256; i++){
664 f->state_transition[i]=ver2_state[i];
665 put_symbol(c, state, ver2_state[i] - c->one_state[i], 1);
668 put_symbol(c, state, f->colorspace, 0); //YUV cs type
669 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
670 put_rac(c, state, 1); //chroma planes
671 put_symbol(c, state, f->chroma_h_shift, 0);
672 put_symbol(c, state, f->chroma_v_shift, 0);
673 put_rac(c, state, 0); //no transparency plane
674 write_quant_tables(c, f->quant_table);
676 f->avctx->extradata_size= ff_rac_terminate(c);
681 static av_cold int encode_init(AVCodecContext *avctx)
683 FFV1Context *s = avctx->priv_data;
689 s->ac= avctx->coder_type ? 2:0;
692 for(i=0; i<256; i++){
693 if(avctx->bits_per_raw_sample <=8){
694 s->quant_table[0][i]= quant11[i];
695 s->quant_table[1][i]= 11*quant11[i];
696 if(avctx->context_model==0){
697 s->quant_table[2][i]= 11*11*quant11[i];
698 s->quant_table[3][i]=
699 s->quant_table[4][i]=0;
701 s->quant_table[2][i]= 11*11*quant5 [i];
702 s->quant_table[3][i]= 5*11*11*quant5 [i];
703 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
706 s->quant_table[0][i]= quant9_10bit[i];
707 s->quant_table[1][i]= 11*quant9_10bit[i];
708 if(avctx->context_model==0){
709 s->quant_table[2][i]= 11*11*quant9_10bit[i];
710 s->quant_table[3][i]=
711 s->quant_table[4][i]=0;
713 s->quant_table[2][i]= 11*11*quant5_10bit[i];
714 s->quant_table[3][i]= 5*11*11*quant5_10bit[i];
715 s->quant_table[4][i]= 5*5*11*11*quant5_10bit[i];
720 for(i=0; i<s->plane_count; i++){
721 PlaneContext * const p= &s->plane[i];
723 if(avctx->context_model==0){
724 p->context_count= (11*11*11+1)/2;
726 p->context_count= (11*11*5*5*5+1)/2;
730 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
732 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
736 avctx->coded_frame= &s->picture;
737 switch(avctx->pix_fmt){
738 case PIX_FMT_YUV444P16:
739 case PIX_FMT_YUV422P16:
740 case PIX_FMT_YUV420P16:
741 if(avctx->bits_per_raw_sample <=8){
742 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
746 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
749 s->version= FFMAX(s->version, 1);
750 case PIX_FMT_YUV444P:
751 case PIX_FMT_YUV422P:
752 case PIX_FMT_YUV420P:
753 case PIX_FMT_YUV411P:
754 case PIX_FMT_YUV410P:
761 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
764 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
769 write_extra_header(s);
773 #endif /* CONFIG_FFV1_ENCODER */
776 static void clear_state(FFV1Context *f){
779 for(i=0; i<f->plane_count; i++){
780 PlaneContext *p= &f->plane[i];
782 p->interlace_bit_state[0]= 128;
783 p->interlace_bit_state[1]= 128;
785 for(j=0; j<p->context_count; j++){
787 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
789 p->vlc_state[j].drift= 0;
790 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
791 p->vlc_state[j].bias= 0;
792 p->vlc_state[j].count= 1;
798 #if CONFIG_FFV1_ENCODER
799 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
800 FFV1Context *f = avctx->priv_data;
801 RangeCoder * const c= &f->c;
802 AVFrame *pict = data;
803 const int width= f->width;
804 const int height= f->height;
805 AVFrame * const p= &f->picture;
807 uint8_t keystate=128;
809 ff_init_range_encoder(c, buf, buf_size);
810 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
813 p->pict_type= FF_I_TYPE;
815 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
816 put_rac(c, &keystate, 1);
821 put_rac(c, &keystate, 0);
826 used_count += ff_rac_terminate(c);
827 //printf("pos=%d\n", used_count);
828 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
831 for(i=1; i<256; i++){
832 c->one_state[i]= f->state_transition[i];
833 c->zero_state[256-i]= 256-c->one_state[i];
837 if(f->colorspace==0){
838 const int chroma_width = -((-width )>>f->chroma_h_shift);
839 const int chroma_height= -((-height)>>f->chroma_v_shift);
841 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
843 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
844 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
846 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
853 return ff_rac_terminate(c);
855 flush_put_bits(&f->pb); //nicer padding FIXME
856 return used_count + (put_bits_count(&f->pb)+7)/8;
859 #endif /* CONFIG_FFV1_ENCODER */
861 static av_cold int common_end(AVCodecContext *avctx){
862 FFV1Context *s = avctx->priv_data;
865 for(i=0; i<s->plane_count; i++){
866 PlaneContext *p= &s->plane[i];
869 av_freep(&p->vlc_state);
872 av_freep(&s->sample_buffer);
877 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
878 PlaneContext * const p= &s->plane[plane_index];
879 RangeCoder * const c= &s->c;
883 int run_index= s->run_index;
886 int diff, context, sign;
888 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
897 diff= get_symbol_inline(c, p->state[context], 1);
899 if(context == 0 && run_mode==0) run_mode=1;
902 if(run_count==0 && run_mode==1){
903 if(get_bits1(&s->gb)){
904 run_count = 1<<ff_log2_run[run_index];
905 if(x + run_count <= w) run_index++;
907 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
909 if(run_index) run_index--;
917 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
922 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
924 // 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));
927 if(sign) diff= -diff;
929 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
931 s->run_index= run_index;
934 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
936 int_fast16_t *sample[2];
937 sample[0]=s->sample_buffer +3;
938 sample[1]=s->sample_buffer+w+6+3;
942 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
945 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
947 sample[0]= sample[1];
950 sample[1][-1]= sample[0][0 ];
951 sample[0][ w]= sample[0][w-1];
954 if(s->avctx->bits_per_raw_sample <= 8){
955 decode_line(s, w, sample, plane_index, 8);
957 src[x + stride*y]= sample[1][x];
960 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
962 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
965 //STOP_TIMER("decode-line")}
969 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
971 int_fast16_t *sample[3][2];
973 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
974 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
979 memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer));
983 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
985 sample[p][0]= sample[p][1];
988 sample[p][1][-1]= sample[p][0][0 ];
989 sample[p][0][ w]= sample[p][0][w-1];
990 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
993 int g= sample[0][1][x];
994 int b= sample[1][1][x];
995 int r= sample[2][1][x];
997 // assert(g>=0 && b>=0 && r>=0);
998 // assert(g<256 && b<512 && r<512);
1006 src[x + stride*y]= b + (g<<8) + (r<<16) + (0xFF<<24);
1011 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1014 uint8_t state[CONTEXT_SIZE];
1016 memset(state, 128, sizeof(state));
1018 for(v=0; i<128 ; v++){
1019 int len= get_symbol(c, state, 0) + 1;
1021 if(len + i > 128) return -1;
1024 quant_table[i] = scale*v;
1027 //if(i%16==0) printf("\n");
1031 for(i=1; i<128; i++){
1032 quant_table[256-i]= -quant_table[i];
1034 quant_table[128]= -quant_table[127];
1039 static int read_quant_tables(RangeCoder *c, int16_t quant_table[5][256]){
1041 int context_count=1;
1044 context_count*= read_quant_table(c, quant_table[i], context_count);
1045 if(context_count > 32768U){
1049 return (context_count+1)/2;
1052 static int read_extra_header(FFV1Context *f){
1053 RangeCoder * const c= &f->c;
1054 uint8_t state[CONTEXT_SIZE];
1055 int i,context_count;
1057 memset(state, 128, sizeof(state));
1059 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1060 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1062 f->version= get_symbol(c, state, 0);
1063 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1065 for(i=1; i<256; i++){
1066 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1069 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1070 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1071 get_rac(c, state); //no chroma = false
1072 f->chroma_h_shift= get_symbol(c, state, 0);
1073 f->chroma_v_shift= get_symbol(c, state, 0);
1074 get_rac(c, state); //transparency plane
1076 context_count= read_quant_tables(c, f->quant_table);
1077 if(context_count < 0){
1078 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1081 for(i=0; i<f->plane_count; i++){
1082 PlaneContext * const p= &f->plane[i];
1084 p->context_count= context_count;
1087 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1089 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1096 static int read_header(FFV1Context *f){
1097 uint8_t state[CONTEXT_SIZE];
1098 int i, context_count;
1099 RangeCoder * const c= &f->c;
1101 memset(state, 128, sizeof(state));
1104 f->version= get_symbol(c, state, 0);
1105 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1107 for(i=1; i<256; i++){
1108 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1111 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1113 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1114 get_rac(c, state); //no chroma = false
1115 f->chroma_h_shift= get_symbol(c, state, 0);
1116 f->chroma_v_shift= get_symbol(c, state, 0);
1117 get_rac(c, state); //transparency plane
1121 if(f->colorspace==0){
1122 if(f->avctx->bits_per_raw_sample<=8){
1123 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1124 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1125 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1126 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1127 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1128 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1130 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1134 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1135 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1136 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1137 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1139 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1143 }else if(f->colorspace==1){
1144 if(f->chroma_h_shift || f->chroma_v_shift){
1145 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1148 f->avctx->pix_fmt= PIX_FMT_RGB32;
1150 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1154 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1156 context_count= read_quant_tables(c, f->quant_table);
1157 if(context_count < 0){
1158 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1162 for(i=0; i<f->plane_count; i++){
1163 PlaneContext * const p= &f->plane[i];
1165 p->context_count= context_count;
1168 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1170 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1178 static av_cold int decode_init(AVCodecContext *avctx)
1180 FFV1Context *f = avctx->priv_data;
1184 if(avctx->extradata)
1185 return read_extra_header(f);
1190 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1191 const uint8_t *buf = avpkt->data;
1192 int buf_size = avpkt->size;
1193 FFV1Context *f = avctx->priv_data;
1194 RangeCoder * const c= &f->c;
1195 const int width= f->width;
1196 const int height= f->height;
1197 AVFrame * const p= &f->picture;
1199 uint8_t keystate= 128;
1201 AVFrame *picture = data;
1203 ff_init_range_decoder(c, buf, buf_size);
1204 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1207 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1208 if(get_rac(c, &keystate)){
1210 if(read_header(f) < 0)
1218 for(i=1; i<256; i++){
1219 c->one_state[i]= f->state_transition[i];
1220 c->zero_state[256-i]= 256-c->one_state[i];
1224 if(!f->plane[0].state && !f->plane[0].vlc_state)
1228 if(avctx->get_buffer(avctx, p) < 0){
1229 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1233 if(avctx->debug&FF_DEBUG_PICT_INFO)
1234 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1237 bytes_read = c->bytestream - c->bytestream_start - 1;
1238 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1239 //printf("pos=%d\n", bytes_read);
1240 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
1242 bytes_read = 0; /* avoid warning */
1245 if(f->colorspace==0){
1246 const int chroma_width = -((-width )>>f->chroma_h_shift);
1247 const int chroma_height= -((-height)>>f->chroma_v_shift);
1248 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
1250 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
1251 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
1253 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1258 f->picture_number++;
1262 avctx->release_buffer(avctx, p); //FIXME
1264 *data_size = sizeof(AVFrame);
1267 bytes_read= c->bytestream - c->bytestream_start - 1;
1268 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1270 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1276 AVCodec ffv1_decoder = {
1280 sizeof(FFV1Context),
1285 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1287 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1290 #if CONFIG_FFV1_ENCODER
1291 AVCodec ffv1_encoder = {
1295 sizeof(FFV1Context),
1299 .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},
1300 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),