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"
35 #include "libavutil/avassert.h"
38 #define CONTEXT_SIZE 32
40 #define MAX_QUANT_TABLES 8
41 #define MAX_CONTEXT_INPUTS 5
43 extern const uint8_t ff_log2_run[32];
45 static const int8_t quant3[256]={
46 0, 0, 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,-1,
58 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
59 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
64 static const int8_t quant5_10bit[256]={
65 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
66 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
67 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
68 1, 1, 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,-2,-2,-2,
75 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
76 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
77 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,
78 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
79 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
80 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
83 static const int8_t quant5[256]={
84 0, 1, 1, 1, 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,-2,-2,-2,
96 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
97 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
98 -2,-2,-2,-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,-1,-1,-1,
101 static const int8_t quant7[256]={
102 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
104 2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
112 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
113 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
114 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
115 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
116 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
117 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
119 static const int8_t quant9[256]={
120 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
121 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
131 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
132 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
133 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
134 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
135 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
137 static const int8_t quant9_10bit[256]={
138 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
139 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
140 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
141 3, 3, 3, 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,-4,-4,-4,
147 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
148 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
149 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
150 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
151 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
152 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
153 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
156 static const int8_t quant11[256]={
157 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
158 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
159 4, 4, 4, 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,-5,-5,
167 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
168 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
169 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
170 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
171 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
172 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
174 static const int8_t quant13[256]={
175 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
176 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
177 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
178 5, 5, 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,-6,
184 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
185 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
186 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
187 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
188 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
189 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
190 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
193 static const uint8_t ver2_state[256]= {
194 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
195 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
196 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
197 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
198 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
199 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
200 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
201 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
202 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
203 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
204 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
205 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
206 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
207 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
208 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
209 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
212 typedef struct VlcState{
219 typedef struct PlaneContext{
220 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
222 uint8_t (*state)[CONTEXT_SIZE];
224 uint8_t interlace_bit_state[2];
227 #define MAX_SLICES 256
229 typedef struct FFV1Context{
230 AVCodecContext *avctx;
234 uint64_t rc_stat[256][2];
237 int chroma_h_shift, chroma_v_shift;
242 int ac; ///< 1=range coder <-> 0=golomb rice
243 PlaneContext plane[MAX_PLANES];
244 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
245 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
246 int context_count[MAX_QUANT_TABLES];
247 uint8_t state_transition[256];
250 int_fast16_t *sample_buffer;
252 int quant_table_count;
256 struct FFV1Context *slice_context[MAX_SLICES];
266 static av_always_inline int fold(int diff, int bits){
278 static inline int predict(int_fast16_t *src, int_fast16_t *last){
279 const int LT= last[-1];
280 const int T= last[ 0];
281 const int L = src[-1];
283 return mid_pred(L, L + T - LT, T);
286 static inline int get_context(PlaneContext *p, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
287 const int LT= last[-1];
288 const int T= last[ 0];
289 const int RT= last[ 1];
290 const int L = src[-1];
292 if(p->quant_table[3][127]){
293 const int TT= last2[0];
294 const int LL= src[-2];
295 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
296 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
298 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
301 static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2]){
304 #define put_rac(C,S,B) \
311 const int a= FFABS(v);
312 const int e= av_log2(a);
313 put_rac(c, state+0, 0);
316 put_rac(c, state+1+i, 1); //1..10
318 put_rac(c, state+1+i, 0);
320 for(i=e-1; i>=0; i--){
321 put_rac(c, state+22+i, (a>>i)&1); //22..31
325 put_rac(c, state+11 + e, v < 0); //11..21
328 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
330 put_rac(c, state+1+9, 0);
332 for(i=e-1; i>=0; i--){
333 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
337 put_rac(c, state+11 + 10, v < 0); //11..21
340 put_rac(c, state+0, 1);
345 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
346 uint64_t rc_stat[256][2]; //we dont bother counting header bits.
347 put_symbol_inline(c, state, v, is_signed, rc_stat);
350 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
351 if(get_rac(c, state+0))
356 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
361 for(i=e-1; i>=0; i--){
362 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
365 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
370 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
371 return get_symbol_inline(c, state, is_signed);
374 static inline void update_vlc_state(VlcState * const state, const int v){
375 int drift= state->drift;
376 int count= state->count;
377 state->error_sum += FFABS(v);
380 if(count == 128){ //FIXME variable
383 state->error_sum >>= 1;
388 if(state->bias > -128) state->bias--;
394 if(state->bias < 127) state->bias++;
405 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
407 //printf("final: %d ", v);
408 v = fold(v - state->bias, bits);
412 while(i < state->error_sum){ //FIXME optimize
420 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
423 code= v ^ ((2*state->drift + state->count)>>31);
426 //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);
427 set_sr_golomb(pb, code, k, 12, bits);
429 update_vlc_state(state, v);
432 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
437 while(i < state->error_sum){ //FIXME optimize
444 v= get_sr_golomb(gb, k, 12, bits);
445 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
448 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
450 v ^= ((2*state->drift + state->count)>>31);
453 ret= fold(v + state->bias, bits);
455 update_vlc_state(state, v);
456 //printf("final: %d\n", ret);
460 #if CONFIG_FFV1_ENCODER
461 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
462 PlaneContext * const p= &s->plane[plane_index];
463 RangeCoder * const c= &s->c;
465 int run_index= s->run_index;
470 if(c->bytestream_end - c->bytestream < w*20){
471 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
475 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
476 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
484 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
485 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
492 diff= fold(diff, bits);
495 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat);
497 if(context == 0) run_mode=1;
502 while(run_count >= 1<<ff_log2_run[run_index]){
503 run_count -= 1<<ff_log2_run[run_index];
505 put_bits(&s->pb, 1, 1);
508 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
509 if(run_index) run_index--;
518 // 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));
521 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
525 while(run_count >= 1<<ff_log2_run[run_index]){
526 run_count -= 1<<ff_log2_run[run_index];
528 put_bits(&s->pb, 1, 1);
532 put_bits(&s->pb, 1, 1);
534 s->run_index= run_index;
539 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
541 const int ring_size= s->avctx->context_model ? 3 : 2;
542 int_fast16_t *sample[3];
545 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
548 for(i=0; i<ring_size; i++)
549 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
551 sample[0][-1]= sample[1][0 ];
552 sample[1][ w]= sample[1][w-1];
554 if(s->avctx->bits_per_raw_sample<=8){
556 sample[0][x]= src[x + stride*y];
558 encode_line(s, w, sample, plane_index, 8);
561 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
563 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
565 //STOP_TIMER("encode line")}
569 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
571 const int ring_size= s->avctx->context_model ? 3 : 2;
572 int_fast16_t *sample[3][3];
575 memset(s->sample_buffer, 0, ring_size*3*(w+6)*sizeof(*s->sample_buffer));
578 for(i=0; i<ring_size; i++)
580 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
583 int v= src[x + stride*y];
594 // assert(g>=0 && b>=0 && r>=0);
595 // assert(g<256 && b<512 && r<512);
601 sample[p][0][-1]= sample[p][1][0 ];
602 sample[p][1][ w]= sample[p][1][w-1];
603 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
608 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
611 uint8_t state[CONTEXT_SIZE];
612 memset(state, 128, sizeof(state));
614 for(i=1; i<128 ; i++){
615 if(quant_table[i] != quant_table[i-1]){
616 put_symbol(c, state, i-last-1, 0);
620 put_symbol(c, state, i-last-1, 0);
623 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
626 write_quant_table(c, quant_table[i]);
629 static void write_header(FFV1Context *f){
630 uint8_t state[CONTEXT_SIZE];
632 RangeCoder * const c= &f->slice_context[0]->c;
634 memset(state, 128, sizeof(state));
637 put_symbol(c, state, f->version, 0);
638 put_symbol(c, state, f->ac, 0);
640 for(i=1; i<256; i++){
641 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
644 put_symbol(c, state, f->colorspace, 0); //YUV cs type
646 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
647 put_rac(c, state, 1); //chroma planes
648 put_symbol(c, state, f->chroma_h_shift, 0);
649 put_symbol(c, state, f->chroma_v_shift, 0);
650 put_rac(c, state, 0); //no transparency plane
652 write_quant_tables(c, f->quant_table);
654 put_symbol(c, state, f->slice_count, 0);
655 for(i=0; i<f->slice_count; i++){
656 FFV1Context *fs= f->slice_context[i];
657 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
658 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
659 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
660 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
661 for(j=0; j<f->plane_count; j++)
662 put_symbol(c, state, f->avctx->context_model, 0);
666 #endif /* CONFIG_FFV1_ENCODER */
668 static av_cold int common_init(AVCodecContext *avctx){
669 FFV1Context *s = avctx->priv_data;
672 s->flags= avctx->flags;
674 dsputil_init(&s->dsp, avctx);
676 s->width = avctx->width;
677 s->height= avctx->height;
679 assert(s->width && s->height);
688 static int init_slice_state(FFV1Context *f){
691 for(i=0; i<f->slice_count; i++){
692 FFV1Context *fs= f->slice_context[i];
693 for(j=0; j<f->plane_count; j++){
694 PlaneContext * const p= &fs->plane[j];
697 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
699 return AVERROR(ENOMEM);
701 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
703 return AVERROR(ENOMEM);
708 //FIXME only redo if state_transition changed
709 for(j=1; j<256; j++){
710 fs->c.one_state [ j]= fs->state_transition[j];
711 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
719 static av_cold int init_slice_contexts(FFV1Context *f){
722 f->slice_count= f->num_h_slices * f->num_v_slices;
724 for(i=0; i<f->slice_count; i++){
725 FFV1Context *fs= av_mallocz(sizeof(*fs));
726 int sx= i % f->num_h_slices;
727 int sy= i / f->num_h_slices;
728 int sxs= f->avctx->width * sx / f->num_h_slices;
729 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
730 int sys= f->avctx->height* sy / f->num_v_slices;
731 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
732 f->slice_context[i]= fs;
733 memcpy(fs, f, sizeof(*fs));
735 fs->slice_width = sxe - sxs;
736 fs->slice_height= sye - sys;
740 fs->sample_buffer = av_malloc(6 * (fs->width+6) * sizeof(*fs->sample_buffer));
741 if (!fs->sample_buffer)
742 return AVERROR(ENOMEM);
747 #if CONFIG_FFV1_ENCODER
748 static int write_extra_header(FFV1Context *f){
749 RangeCoder * const c= &f->c;
750 uint8_t state[CONTEXT_SIZE];
752 memset(state, 128, sizeof(state));
754 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000);
755 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
756 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
758 put_symbol(c, state, f->version, 0);
759 put_symbol(c, state, f->ac, 0);
761 for(i=1; i<256; i++){
762 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
765 put_symbol(c, state, f->colorspace, 0); //YUV cs type
766 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
767 put_rac(c, state, 1); //chroma planes
768 put_symbol(c, state, f->chroma_h_shift, 0);
769 put_symbol(c, state, f->chroma_v_shift, 0);
770 put_rac(c, state, 0); //no transparency plane
771 put_symbol(c, state, f->num_h_slices-1, 0);
772 put_symbol(c, state, f->num_v_slices-1, 0);
774 put_symbol(c, state, f->quant_table_count, 0);
775 for(i=0; i<f->quant_table_count; i++)
776 write_quant_tables(c, f->quant_tables[i]);
778 f->avctx->extradata_size= ff_rac_terminate(c);
783 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
784 int i,i2,changed,print=0;
788 for(i=12; i<244; i++){
789 for(i2=i+1; i2<245 && i2<i+4; i2++){
790 #define COST(old, new) \
791 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
792 +s->rc_stat[old][1]*-log2( (new) /256.0)
794 #define COST2(old, new) \
796 +COST(256-(old), 256-(new))
798 double size0= COST2(i, i ) + COST2(i2, i2);
799 double sizeX= COST2(i, i2) + COST2(i2, i );
800 if(sizeX < size0 && i!=128 && i2!=128){
802 FFSWAP(int, stt[ i], stt[ i2]);
803 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
804 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
806 FFSWAP(int, stt[256-i], stt[256-i2]);
807 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
808 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
810 for(j=1; j<256; j++){
811 if (stt[j] == i ) stt[j] = i2;
812 else if(stt[j] == i2) stt[j] = i ;
814 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
815 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
826 static av_cold int encode_init(AVCodecContext *avctx)
828 FFV1Context *s = avctx->priv_data;
834 s->ac= avctx->coder_type ? 2:0;
838 s->state_transition[i]=ver2_state[i];
841 for(i=0; i<256; i++){
842 s->quant_table_count=2;
843 if(avctx->bits_per_raw_sample <=8){
844 s->quant_tables[0][0][i]= quant11[i];
845 s->quant_tables[0][1][i]= 11*quant11[i];
846 s->quant_tables[0][2][i]= 11*11*quant11[i];
847 s->quant_tables[1][0][i]= quant11[i];
848 s->quant_tables[1][1][i]= 11*quant11[i];
849 s->quant_tables[1][2][i]= 11*11*quant5 [i];
850 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
851 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
853 s->quant_tables[0][0][i]= quant9_10bit[i];
854 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
855 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
856 s->quant_tables[1][0][i]= quant9_10bit[i];
857 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
858 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
859 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
860 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
863 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
865 for(i=0; i<s->plane_count; i++){
866 PlaneContext * const p= &s->plane[i];
868 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
869 if(avctx->context_model==0){
870 p->context_count= (11*11*11+1)/2;
872 p->context_count= (11*11*5*5*5+1)/2;
876 avctx->coded_frame= &s->picture;
877 switch(avctx->pix_fmt){
878 case PIX_FMT_YUV444P16:
879 case PIX_FMT_YUV422P16:
880 case PIX_FMT_YUV420P16:
881 if(avctx->bits_per_raw_sample <=8){
882 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
886 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
889 s->version= FFMAX(s->version, 1);
890 case PIX_FMT_YUV444P:
891 case PIX_FMT_YUV422P:
892 case PIX_FMT_YUV420P:
893 case PIX_FMT_YUV411P:
894 case PIX_FMT_YUV410P:
901 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
904 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
909 char *p= avctx->stats_in;
912 for(j=0; j<256; j++){
915 s->rc_stat[j][i]= strtol(p, &next, 0);
917 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
923 while(*p=='\n' || *p==' ') p++;
926 sort_stt(s, s->state_transition);
932 write_extra_header(s);
935 if(init_slice_contexts(s) < 0)
937 if(init_slice_state(s) < 0)
940 avctx->stats_out= av_mallocz(1024*30);
944 #endif /* CONFIG_FFV1_ENCODER */
947 static void clear_state(FFV1Context *f){
950 for(si=0; si<f->slice_count; si++){
951 FFV1Context *fs= f->slice_context[si];
952 for(i=0; i<f->plane_count; i++){
953 PlaneContext *p= &fs->plane[i];
955 p->interlace_bit_state[0]= 128;
956 p->interlace_bit_state[1]= 128;
958 for(j=0; j<p->context_count; j++){
960 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
962 p->vlc_state[j].drift= 0;
963 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
964 p->vlc_state[j].bias= 0;
965 p->vlc_state[j].count= 1;
972 #if CONFIG_FFV1_ENCODER
973 static int encode_slice(AVCodecContext *c, void *arg){
974 FFV1Context *fs= *(void**)arg;
975 FFV1Context *f= fs->avctx->priv_data;
976 int width = fs->slice_width;
977 int height= fs->slice_height;
980 AVFrame * const p= &f->picture;
982 if(f->colorspace==0){
983 const int chroma_width = -((-width )>>f->chroma_h_shift);
984 const int chroma_height= -((-height)>>f->chroma_v_shift);
985 const int cx= x>>f->chroma_h_shift;
986 const int cy= y>>f->chroma_v_shift;
988 encode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
990 encode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
991 encode_plane(fs, p->data[2] + cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
993 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1000 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1001 FFV1Context *f = avctx->priv_data;
1002 RangeCoder * const c= &f->slice_context[0]->c;
1003 AVFrame *pict = data;
1004 AVFrame * const p= &f->picture;
1006 uint8_t keystate=128;
1010 ff_init_range_encoder(c, buf, buf_size);
1011 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1014 p->pict_type= FF_I_TYPE;
1016 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1017 put_rac(c, &keystate, 1);
1022 put_rac(c, &keystate, 0);
1027 used_count += ff_rac_terminate(c);
1028 //printf("pos=%d\n", used_count);
1029 init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1032 for(i=1; i<256; i++){
1033 c->one_state[i]= f->state_transition[i];
1034 c->zero_state[256-i]= 256-c->one_state[i];
1038 for(i=1; i<f->slice_count; i++){
1039 FFV1Context *fs= f->slice_context[i];
1040 uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1041 int len= buf_size/f->slice_count;
1044 ff_init_range_encoder(&fs->c, start, len);
1046 init_put_bits(&fs->pb, start, len);
1049 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1052 for(i=0; i<f->slice_count; i++){
1053 FFV1Context *fs= f->slice_context[i];
1058 put_rac(&fs->c, &state, 0);
1059 bytes= ff_rac_terminate(&fs->c);
1061 flush_put_bits(&fs->pb); //nicer padding FIXME
1062 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1066 av_assert0(bytes < buf_size/f->slice_count);
1067 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1068 av_assert0(bytes < (1<<24));
1069 AV_WB24(buf_p+bytes, bytes);
1075 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1077 char *p= avctx->stats_out;
1078 char *end= p + 1024*30;
1080 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1081 for(j=0; j<f->slice_count; j++){
1082 FFV1Context *fs= f->slice_context[j];
1083 for(i=0; i<256; i++){
1084 f->rc_stat[i][0] += fs->rc_stat[i][0];
1085 f->rc_stat[i][1] += fs->rc_stat[i][1];
1089 for(j=0; j<256; j++){
1090 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1093 snprintf(p, end-p, "\n");
1095 avctx->stats_out[0] = '\0';
1097 f->picture_number++;
1100 #endif /* CONFIG_FFV1_ENCODER */
1102 static av_cold int common_end(AVCodecContext *avctx){
1103 FFV1Context *s = avctx->priv_data;
1106 for(j=0; j<s->slice_count; j++){
1107 FFV1Context *fs= s->slice_context[j];
1108 for(i=0; i<s->plane_count; i++){
1109 PlaneContext *p= &fs->plane[i];
1111 av_freep(&p->state);
1112 av_freep(&p->vlc_state);
1114 av_freep(&fs->sample_buffer);
1117 av_freep(&avctx->stats_out);
1122 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
1123 PlaneContext * const p= &s->plane[plane_index];
1124 RangeCoder * const c= &s->c;
1128 int run_index= s->run_index;
1131 int diff, context, sign;
1133 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1140 av_assert2(context < p->context_count);
1143 diff= get_symbol_inline(c, p->state[context], 1);
1145 if(context == 0 && run_mode==0) run_mode=1;
1148 if(run_count==0 && run_mode==1){
1149 if(get_bits1(&s->gb)){
1150 run_count = 1<<ff_log2_run[run_index];
1151 if(x + run_count <= w) run_index++;
1153 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1155 if(run_index) run_index--;
1163 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1168 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1170 // 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));
1173 if(sign) diff= -diff;
1175 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1177 s->run_index= run_index;
1180 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1182 int_fast16_t *sample[2];
1183 sample[0]=s->sample_buffer +3;
1184 sample[1]=s->sample_buffer+w+6+3;
1188 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1191 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
1193 sample[0]= sample[1];
1196 sample[1][-1]= sample[0][0 ];
1197 sample[0][ w]= sample[0][w-1];
1200 if(s->avctx->bits_per_raw_sample <= 8){
1201 decode_line(s, w, sample, plane_index, 8);
1203 src[x + stride*y]= sample[1][x];
1206 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1208 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1211 //STOP_TIMER("decode-line")}
1215 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1217 int_fast16_t *sample[3][2];
1219 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1220 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1225 memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer));
1229 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
1231 sample[p][0]= sample[p][1];
1234 sample[p][1][-1]= sample[p][0][0 ];
1235 sample[p][0][ w]= sample[p][0][w-1];
1236 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
1239 int g= sample[0][1][x];
1240 int b= sample[1][1][x];
1241 int r= sample[2][1][x];
1243 // assert(g>=0 && b>=0 && r>=0);
1244 // assert(g<256 && b<512 && r<512);
1252 src[x + stride*y]= b + (g<<8) + (r<<16) + (0xFF<<24);
1257 static int decode_slice(AVCodecContext *c, void *arg){
1258 FFV1Context *fs= *(void**)arg;
1259 FFV1Context *f= fs->avctx->priv_data;
1260 int width = fs->slice_width;
1261 int height= fs->slice_height;
1264 AVFrame * const p= &f->picture;
1266 av_assert1(width && height);
1267 if(f->colorspace==0){
1268 const int chroma_width = -((-width )>>f->chroma_h_shift);
1269 const int chroma_height= -((-height)>>f->chroma_v_shift);
1270 const int cx= x>>f->chroma_h_shift;
1271 const int cy= y>>f->chroma_v_shift;
1272 decode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1274 decode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1275 decode_plane(fs, p->data[2] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[2], 1);
1277 decode_rgb_frame(fs, (uint32_t*)p->data[0] + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1285 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1288 uint8_t state[CONTEXT_SIZE];
1290 memset(state, 128, sizeof(state));
1292 for(v=0; i<128 ; v++){
1293 int len= get_symbol(c, state, 0) + 1;
1295 if(len + i > 128) return -1;
1298 quant_table[i] = scale*v;
1301 //if(i%16==0) printf("\n");
1305 for(i=1; i<128; i++){
1306 quant_table[256-i]= -quant_table[i];
1308 quant_table[128]= -quant_table[127];
1313 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1315 int context_count=1;
1318 context_count*= read_quant_table(c, quant_table[i], context_count);
1319 if(context_count > 32768U){
1323 return (context_count+1)/2;
1326 static int read_extra_header(FFV1Context *f){
1327 RangeCoder * const c= &f->c;
1328 uint8_t state[CONTEXT_SIZE];
1331 memset(state, 128, sizeof(state));
1333 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1334 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1336 f->version= get_symbol(c, state, 0);
1337 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1339 for(i=1; i<256; i++){
1340 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1343 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1344 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1345 get_rac(c, state); //no chroma = false
1346 f->chroma_h_shift= get_symbol(c, state, 0);
1347 f->chroma_v_shift= get_symbol(c, state, 0);
1348 get_rac(c, state); //transparency plane
1350 f->num_h_slices= 1 + get_symbol(c, state, 0);
1351 f->num_v_slices= 1 + get_symbol(c, state, 0);
1352 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1353 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1357 f->quant_table_count= get_symbol(c, state, 0);
1358 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1360 for(i=0; i<f->quant_table_count; i++){
1361 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1362 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1370 static int read_header(FFV1Context *f){
1371 uint8_t state[CONTEXT_SIZE];
1372 int i, j, context_count;
1373 RangeCoder * const c= &f->slice_context[0]->c;
1375 memset(state, 128, sizeof(state));
1378 f->version= get_symbol(c, state, 0);
1379 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1381 for(i=1; i<256; i++){
1382 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1385 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1387 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1388 get_rac(c, state); //no chroma = false
1389 f->chroma_h_shift= get_symbol(c, state, 0);
1390 f->chroma_v_shift= get_symbol(c, state, 0);
1391 get_rac(c, state); //transparency plane
1395 if(f->colorspace==0){
1396 if(f->avctx->bits_per_raw_sample<=8){
1397 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1398 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1399 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1400 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1401 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1402 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1404 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1408 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1409 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1410 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1411 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1413 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1417 }else if(f->colorspace==1){
1418 if(f->chroma_h_shift || f->chroma_v_shift){
1419 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1422 f->avctx->pix_fmt= PIX_FMT_RGB32;
1424 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1428 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1430 context_count= read_quant_tables(c, f->quant_table);
1431 if(context_count < 0){
1432 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1436 f->slice_count= get_symbol(c, state, 0);
1437 if(f->slice_count > (unsigned)MAX_SLICES)
1441 for(j=0; j<f->slice_count; j++){
1442 FFV1Context *fs= f->slice_context[j];
1445 if(f->version >= 2){
1446 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1447 fs->slice_y = get_symbol(c, state, 0) *f->height;
1448 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1449 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1451 fs->slice_x /= f->num_h_slices;
1452 fs->slice_y /= f->num_v_slices;
1453 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1454 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1455 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1457 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1458 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1462 for(i=0; i<f->plane_count; i++){
1463 PlaneContext * const p= &fs->plane[i];
1465 if(f->version >= 2){
1466 int idx=get_symbol(c, state, 0);
1467 if(idx > (unsigned)f->quant_table_count){
1468 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1471 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1472 context_count= f->context_count[idx];
1474 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1477 if(p->context_count < context_count){
1478 av_freep(&p->state);
1479 av_freep(&p->vlc_state);
1481 p->context_count= context_count;
1488 static av_cold int decode_init(AVCodecContext *avctx)
1490 FFV1Context *f = avctx->priv_data;
1494 if(avctx->extradata && read_extra_header(f) < 0)
1497 if(init_slice_contexts(f) < 0)
1503 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1504 const uint8_t *buf = avpkt->data;
1505 int buf_size = avpkt->size;
1506 FFV1Context *f = avctx->priv_data;
1507 RangeCoder * const c= &f->slice_context[0]->c;
1508 AVFrame * const p= &f->picture;
1510 uint8_t keystate= 128;
1511 const uint8_t *buf_p;
1513 AVFrame *picture = data;
1515 ff_init_range_decoder(c, buf, buf_size);
1516 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1519 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1520 if(get_rac(c, &keystate)){
1522 if(read_header(f) < 0)
1524 if(init_slice_state(f) < 0)
1533 for(i=1; i<256; i++){
1534 c->one_state[i]= f->state_transition[i];
1535 c->zero_state[256-i]= 256-c->one_state[i];
1540 if(avctx->get_buffer(avctx, p) < 0){
1541 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1545 if(avctx->debug&FF_DEBUG_PICT_INFO)
1546 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1549 bytes_read = c->bytestream - c->bytestream_start - 1;
1550 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1551 //printf("pos=%d\n", bytes_read);
1552 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, buf_size - bytes_read);
1554 bytes_read = 0; /* avoid warning */
1557 buf_p= buf + buf_size;
1558 for(i=f->slice_count-1; i>0; i--){
1559 FFV1Context *fs= f->slice_context[i];
1560 int v= AV_RB24(buf_p-3)+3;
1561 if(buf_p - buf <= v){
1562 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1567 ff_init_range_decoder(&fs->c, buf_p, v);
1569 init_get_bits(&fs->gb, buf_p, v);
1573 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1574 f->picture_number++;
1578 avctx->release_buffer(avctx, p); //FIXME
1580 *data_size = sizeof(AVFrame);
1585 AVCodec ffv1_decoder = {
1589 sizeof(FFV1Context),
1594 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1596 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1599 #if CONFIG_FFV1_ENCODER
1600 AVCodec ffv1_encoder = {
1604 sizeof(FFV1Context),
1608 .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},
1609 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),