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];
221 int quant_table_index;
223 uint8_t (*state)[CONTEXT_SIZE];
225 uint8_t interlace_bit_state[2];
228 #define MAX_SLICES 256
230 typedef struct FFV1Context{
231 AVCodecContext *avctx;
235 uint64_t rc_stat[256][2];
236 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
239 int chroma_h_shift, chroma_v_shift;
244 int ac; ///< 1=range coder <-> 0=golomb rice
245 PlaneContext plane[MAX_PLANES];
246 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
247 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
248 int context_count[MAX_QUANT_TABLES];
249 uint8_t state_transition[256];
250 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
253 int_fast16_t *sample_buffer;
255 int quant_table_count;
259 struct FFV1Context *slice_context[MAX_SLICES];
269 static av_always_inline int fold(int diff, int bits){
281 static inline int predict(int_fast16_t *src, int_fast16_t *last){
282 const int LT= last[-1];
283 const int T= last[ 0];
284 const int L = src[-1];
286 return mid_pred(L, L + T - LT, T);
289 static inline int get_context(PlaneContext *p, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
290 const int LT= last[-1];
291 const int T= last[ 0];
292 const int RT= last[ 1];
293 const int L = src[-1];
295 if(p->quant_table[3][127]){
296 const int TT= last2[0];
297 const int LL= src[-2];
298 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
299 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
301 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
304 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2]){
307 #define put_rac(C,S,B) \
311 rc_stat2[(S)-state][B]++;\
317 const int a= FFABS(v);
318 const int e= av_log2(a);
319 put_rac(c, state+0, 0);
322 put_rac(c, state+1+i, 1); //1..10
324 put_rac(c, state+1+i, 0);
326 for(i=e-1; i>=0; i--){
327 put_rac(c, state+22+i, (a>>i)&1); //22..31
331 put_rac(c, state+11 + e, v < 0); //11..21
334 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
336 put_rac(c, state+1+9, 0);
338 for(i=e-1; i>=0; i--){
339 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
343 put_rac(c, state+11 + 10, v < 0); //11..21
346 put_rac(c, state+0, 1);
351 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
352 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
355 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
356 if(get_rac(c, state+0))
361 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
366 for(i=e-1; i>=0; i--){
367 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
370 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
375 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
376 return get_symbol_inline(c, state, is_signed);
379 static inline void update_vlc_state(VlcState * const state, const int v){
380 int drift= state->drift;
381 int count= state->count;
382 state->error_sum += FFABS(v);
385 if(count == 128){ //FIXME variable
388 state->error_sum >>= 1;
393 if(state->bias > -128) state->bias--;
399 if(state->bias < 127) state->bias++;
410 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
412 //printf("final: %d ", v);
413 v = fold(v - state->bias, bits);
417 while(i < state->error_sum){ //FIXME optimize
425 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
428 code= v ^ ((2*state->drift + state->count)>>31);
431 //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);
432 set_sr_golomb(pb, code, k, 12, bits);
434 update_vlc_state(state, v);
437 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
442 while(i < state->error_sum){ //FIXME optimize
449 v= get_sr_golomb(gb, k, 12, bits);
450 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
453 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
455 v ^= ((2*state->drift + state->count)>>31);
458 ret= fold(v + state->bias, bits);
460 update_vlc_state(state, v);
461 //printf("final: %d\n", ret);
465 #if CONFIG_FFV1_ENCODER
466 static av_always_inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
467 PlaneContext * const p= &s->plane[plane_index];
468 RangeCoder * const c= &s->c;
470 int run_index= s->run_index;
475 if(c->bytestream_end - c->bytestream < w*20){
476 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
480 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
481 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
489 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
490 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
497 diff= fold(diff, bits);
500 if(s->flags & CODEC_FLAG_PASS1){
501 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
503 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
506 if(context == 0) run_mode=1;
511 while(run_count >= 1<<ff_log2_run[run_index]){
512 run_count -= 1<<ff_log2_run[run_index];
514 put_bits(&s->pb, 1, 1);
517 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
518 if(run_index) run_index--;
527 // 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));
530 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
534 while(run_count >= 1<<ff_log2_run[run_index]){
535 run_count -= 1<<ff_log2_run[run_index];
537 put_bits(&s->pb, 1, 1);
541 put_bits(&s->pb, 1, 1);
543 s->run_index= run_index;
548 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
550 const int ring_size= s->avctx->context_model ? 3 : 2;
551 int_fast16_t *sample[3];
554 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
557 for(i=0; i<ring_size; i++)
558 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
560 sample[0][-1]= sample[1][0 ];
561 sample[1][ w]= sample[1][w-1];
563 if(s->avctx->bits_per_raw_sample<=8){
565 sample[0][x]= src[x + stride*y];
567 encode_line(s, w, sample, plane_index, 8);
570 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
572 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
574 //STOP_TIMER("encode line")}
578 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
580 const int ring_size= s->avctx->context_model ? 3 : 2;
581 int_fast16_t *sample[3][3];
584 memset(s->sample_buffer, 0, ring_size*3*(w+6)*sizeof(*s->sample_buffer));
587 for(i=0; i<ring_size; i++)
589 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
592 int v= src[x + stride*y];
603 // assert(g>=0 && b>=0 && r>=0);
604 // assert(g<256 && b<512 && r<512);
610 sample[p][0][-1]= sample[p][1][0 ];
611 sample[p][1][ w]= sample[p][1][w-1];
612 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
617 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
620 uint8_t state[CONTEXT_SIZE];
621 memset(state, 128, sizeof(state));
623 for(i=1; i<128 ; i++){
624 if(quant_table[i] != quant_table[i-1]){
625 put_symbol(c, state, i-last-1, 0);
629 put_symbol(c, state, i-last-1, 0);
632 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
635 write_quant_table(c, quant_table[i]);
638 static void write_header(FFV1Context *f){
639 uint8_t state[CONTEXT_SIZE];
641 RangeCoder * const c= &f->slice_context[0]->c;
643 memset(state, 128, sizeof(state));
646 put_symbol(c, state, f->version, 0);
647 put_symbol(c, state, f->ac, 0);
649 for(i=1; i<256; i++){
650 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
653 put_symbol(c, state, f->colorspace, 0); //YUV cs type
655 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
656 put_rac(c, state, 1); //chroma planes
657 put_symbol(c, state, f->chroma_h_shift, 0);
658 put_symbol(c, state, f->chroma_v_shift, 0);
659 put_rac(c, state, 0); //no transparency plane
661 write_quant_tables(c, f->quant_table);
663 put_symbol(c, state, f->slice_count, 0);
664 for(i=0; i<f->slice_count; i++){
665 FFV1Context *fs= f->slice_context[i];
666 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
667 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
668 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
669 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
670 for(j=0; j<f->plane_count; j++){
671 put_symbol(c, state, f->plane[j].quant_table_index, 0);
672 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
677 #endif /* CONFIG_FFV1_ENCODER */
679 static av_cold int common_init(AVCodecContext *avctx){
680 FFV1Context *s = avctx->priv_data;
683 s->flags= avctx->flags;
685 dsputil_init(&s->dsp, avctx);
687 s->width = avctx->width;
688 s->height= avctx->height;
690 assert(s->width && s->height);
699 static int init_slice_state(FFV1Context *f){
702 for(i=0; i<f->slice_count; i++){
703 FFV1Context *fs= f->slice_context[i];
704 for(j=0; j<f->plane_count; j++){
705 PlaneContext * const p= &fs->plane[j];
708 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
710 return AVERROR(ENOMEM);
712 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
714 return AVERROR(ENOMEM);
719 //FIXME only redo if state_transition changed
720 for(j=1; j<256; j++){
721 fs->c.one_state [ j]= fs->state_transition[j];
722 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
730 static av_cold int init_slice_contexts(FFV1Context *f){
733 f->slice_count= f->num_h_slices * f->num_v_slices;
735 for(i=0; i<f->slice_count; i++){
736 FFV1Context *fs= av_mallocz(sizeof(*fs));
737 int sx= i % f->num_h_slices;
738 int sy= i / f->num_h_slices;
739 int sxs= f->avctx->width * sx / f->num_h_slices;
740 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
741 int sys= f->avctx->height* sy / f->num_v_slices;
742 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
743 f->slice_context[i]= fs;
744 memcpy(fs, f, sizeof(*fs));
745 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
747 fs->slice_width = sxe - sxs;
748 fs->slice_height= sye - sys;
752 fs->sample_buffer = av_malloc(6 * (fs->width+6) * sizeof(*fs->sample_buffer));
753 if (!fs->sample_buffer)
754 return AVERROR(ENOMEM);
759 static int allocate_initial_states(FFV1Context *f){
762 for(i=0; i<f->quant_table_count; i++){
763 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
764 if(!f->initial_states[i])
765 return AVERROR(ENOMEM);
766 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
771 #if CONFIG_FFV1_ENCODER
772 static int write_extra_header(FFV1Context *f){
773 RangeCoder * const c= &f->c;
774 uint8_t state[CONTEXT_SIZE];
776 uint8_t state2[32][CONTEXT_SIZE];
778 memset(state2, 128, sizeof(state2));
779 memset(state, 128, sizeof(state));
781 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
782 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
783 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
785 put_symbol(c, state, f->version, 0);
786 put_symbol(c, state, f->ac, 0);
788 for(i=1; i<256; i++){
789 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
792 put_symbol(c, state, f->colorspace, 0); //YUV cs type
793 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
794 put_rac(c, state, 1); //chroma planes
795 put_symbol(c, state, f->chroma_h_shift, 0);
796 put_symbol(c, state, f->chroma_v_shift, 0);
797 put_rac(c, state, 0); //no transparency plane
798 put_symbol(c, state, f->num_h_slices-1, 0);
799 put_symbol(c, state, f->num_v_slices-1, 0);
801 put_symbol(c, state, f->quant_table_count, 0);
802 for(i=0; i<f->quant_table_count; i++)
803 write_quant_tables(c, f->quant_tables[i]);
805 for(i=0; i<f->quant_table_count; i++){
806 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
807 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
809 if(j<f->context_count[i]*CONTEXT_SIZE){
810 put_rac(c, state, 1);
811 for(j=0; j<f->context_count[i]; j++){
812 for(k=0; k<CONTEXT_SIZE; k++){
813 int pred= j ? f->initial_states[i][j-1][k] : 128;
814 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
818 put_rac(c, state, 0);
822 f->avctx->extradata_size= ff_rac_terminate(c);
827 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
828 int i,i2,changed,print=0;
832 for(i=12; i<244; i++){
833 for(i2=i+1; i2<245 && i2<i+4; i2++){
834 #define COST(old, new) \
835 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
836 +s->rc_stat[old][1]*-log2( (new) /256.0)
838 #define COST2(old, new) \
840 +COST(256-(old), 256-(new))
842 double size0= COST2(i, i ) + COST2(i2, i2);
843 double sizeX= COST2(i, i2) + COST2(i2, i );
844 if(sizeX < size0 && i!=128 && i2!=128){
846 FFSWAP(int, stt[ i], stt[ i2]);
847 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
848 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
850 FFSWAP(int, stt[256-i], stt[256-i2]);
851 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
852 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
854 for(j=1; j<256; j++){
855 if (stt[j] == i ) stt[j] = i2;
856 else if(stt[j] == i2) stt[j] = i ;
858 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
859 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
870 static av_cold int encode_init(AVCodecContext *avctx)
872 FFV1Context *s = avctx->priv_data;
878 s->ac= avctx->coder_type ? 2:0;
882 s->state_transition[i]=ver2_state[i];
885 for(i=0; i<256; i++){
886 s->quant_table_count=2;
887 if(avctx->bits_per_raw_sample <=8){
888 s->quant_tables[0][0][i]= quant11[i];
889 s->quant_tables[0][1][i]= 11*quant11[i];
890 s->quant_tables[0][2][i]= 11*11*quant11[i];
891 s->quant_tables[1][0][i]= quant11[i];
892 s->quant_tables[1][1][i]= 11*quant11[i];
893 s->quant_tables[1][2][i]= 11*11*quant5 [i];
894 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
895 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
897 s->quant_tables[0][0][i]= quant9_10bit[i];
898 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
899 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
900 s->quant_tables[1][0][i]= quant9_10bit[i];
901 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
902 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
903 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
904 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
907 s->context_count[0]= (11*11*11+1)/2;
908 s->context_count[1]= (11*11*5*5*5+1)/2;
909 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
911 for(i=0; i<s->plane_count; i++){
912 PlaneContext * const p= &s->plane[i];
914 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
915 p->quant_table_index= avctx->context_model;
916 p->context_count= s->context_count[p->quant_table_index];
919 if(allocate_initial_states(s) < 0)
920 return AVERROR(ENOMEM);
922 avctx->coded_frame= &s->picture;
923 switch(avctx->pix_fmt){
924 case PIX_FMT_YUV444P16:
925 case PIX_FMT_YUV422P16:
926 case PIX_FMT_YUV420P16:
927 if(avctx->bits_per_raw_sample <=8){
928 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
932 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
935 s->version= FFMAX(s->version, 1);
936 case PIX_FMT_YUV444P:
937 case PIX_FMT_YUV422P:
938 case PIX_FMT_YUV420P:
939 case PIX_FMT_YUV411P:
940 case PIX_FMT_YUV410P:
947 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
950 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
954 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
955 for(i=0; i<s->quant_table_count; i++){
956 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
958 return AVERROR(ENOMEM);
962 char *p= avctx->stats_in;
965 av_assert0(s->version>=2);
968 for(j=0; j<256; j++){
970 s->rc_stat[j][i]= strtol(p, &next, 0);
972 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
978 for(i=0; i<s->quant_table_count; i++){
979 for(j=0; j<s->context_count[i]; j++){
982 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
984 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
992 while(*p=='\n' || *p==' ') p++;
995 sort_stt(s, s->state_transition);
997 for(i=0; i<s->quant_table_count; i++){
998 for(j=0; j<s->context_count[i]; j++){
1001 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1002 p=256*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1004 p= av_clip(p, 1, 254);
1005 s->initial_states[i][j][k]= p;
1014 write_extra_header(s);
1017 if(init_slice_contexts(s) < 0)
1019 if(init_slice_state(s) < 0)
1022 #define STATS_OUT_SIZE 1024*1024*6
1023 if(avctx->flags & CODEC_FLAG_PASS1){
1024 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1025 for(i=0; i<s->quant_table_count; i++){
1026 for(j=0; j<s->slice_count; j++){
1027 FFV1Context *sf= s->slice_context[j];
1028 av_assert0(!sf->rc_stat2[i]);
1029 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1030 if(!sf->rc_stat2[i])
1031 return AVERROR(ENOMEM);
1038 #endif /* CONFIG_FFV1_ENCODER */
1041 static void clear_state(FFV1Context *f){
1044 for(si=0; si<f->slice_count; si++){
1045 FFV1Context *fs= f->slice_context[si];
1046 for(i=0; i<f->plane_count; i++){
1047 PlaneContext *p= &fs->plane[i];
1049 p->interlace_bit_state[0]= 128;
1050 p->interlace_bit_state[1]= 128;
1053 if(f->initial_states[p->quant_table_index]){
1054 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1056 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1058 for(j=0; j<p->context_count; j++){
1059 p->vlc_state[j].drift= 0;
1060 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1061 p->vlc_state[j].bias= 0;
1062 p->vlc_state[j].count= 1;
1069 #if CONFIG_FFV1_ENCODER
1070 static int encode_slice(AVCodecContext *c, void *arg){
1071 FFV1Context *fs= *(void**)arg;
1072 FFV1Context *f= fs->avctx->priv_data;
1073 int width = fs->slice_width;
1074 int height= fs->slice_height;
1077 AVFrame * const p= &f->picture;
1079 if(f->colorspace==0){
1080 const int chroma_width = -((-width )>>f->chroma_h_shift);
1081 const int chroma_height= -((-height)>>f->chroma_v_shift);
1082 const int cx= x>>f->chroma_h_shift;
1083 const int cy= y>>f->chroma_v_shift;
1085 encode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1087 encode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1088 encode_plane(fs, p->data[2] + cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1090 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1097 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1098 FFV1Context *f = avctx->priv_data;
1099 RangeCoder * const c= &f->slice_context[0]->c;
1100 AVFrame *pict = data;
1101 AVFrame * const p= &f->picture;
1103 uint8_t keystate=128;
1107 ff_init_range_encoder(c, buf, buf_size);
1108 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1111 p->pict_type= FF_I_TYPE;
1113 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1114 put_rac(c, &keystate, 1);
1119 put_rac(c, &keystate, 0);
1124 used_count += ff_rac_terminate(c);
1125 //printf("pos=%d\n", used_count);
1126 init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1129 for(i=1; i<256; i++){
1130 c->one_state[i]= f->state_transition[i];
1131 c->zero_state[256-i]= 256-c->one_state[i];
1135 for(i=1; i<f->slice_count; i++){
1136 FFV1Context *fs= f->slice_context[i];
1137 uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1138 int len= buf_size/f->slice_count;
1141 ff_init_range_encoder(&fs->c, start, len);
1143 init_put_bits(&fs->pb, start, len);
1146 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1149 for(i=0; i<f->slice_count; i++){
1150 FFV1Context *fs= f->slice_context[i];
1155 put_rac(&fs->c, &state, 0);
1156 bytes= ff_rac_terminate(&fs->c);
1158 flush_put_bits(&fs->pb); //nicer padding FIXME
1159 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1163 av_assert0(bytes < buf_size/f->slice_count);
1164 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1165 av_assert0(bytes < (1<<24));
1166 AV_WB24(buf_p+bytes, bytes);
1172 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1174 char *p= avctx->stats_out;
1175 char *end= p + STATS_OUT_SIZE;
1177 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1178 for(i=0; i<f->quant_table_count; i++)
1179 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1181 for(j=0; j<f->slice_count; j++){
1182 FFV1Context *fs= f->slice_context[j];
1183 for(i=0; i<256; i++){
1184 f->rc_stat[i][0] += fs->rc_stat[i][0];
1185 f->rc_stat[i][1] += fs->rc_stat[i][1];
1187 for(i=0; i<f->quant_table_count; i++){
1188 for(k=0; k<f->context_count[i]; k++){
1189 for(m=0; m<32; m++){
1190 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1191 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1197 for(j=0; j<256; j++){
1198 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1201 snprintf(p, end-p, "\n");
1203 for(i=0; i<f->quant_table_count; i++){
1204 for(j=0; j<f->context_count[i]; j++){
1205 for(m=0; m<32; m++){
1206 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1211 snprintf(p, end-p, "\n");
1212 } else if(avctx->flags&CODEC_FLAG_PASS1)
1213 avctx->stats_out[0] = '\0';
1215 f->picture_number++;
1218 #endif /* CONFIG_FFV1_ENCODER */
1220 static av_cold int common_end(AVCodecContext *avctx){
1221 FFV1Context *s = avctx->priv_data;
1224 for(j=0; j<s->slice_count; j++){
1225 FFV1Context *fs= s->slice_context[j];
1226 for(i=0; i<s->plane_count; i++){
1227 PlaneContext *p= &fs->plane[i];
1229 av_freep(&p->state);
1230 av_freep(&p->vlc_state);
1232 av_freep(&fs->sample_buffer);
1235 av_freep(&avctx->stats_out);
1236 for(j=0; j<s->quant_table_count; j++){
1237 av_freep(&s->initial_states[j]);
1238 for(i=0; i<s->slice_count; i++){
1239 FFV1Context *sf= s->slice_context[i];
1240 av_freep(&sf->rc_stat2[j]);
1242 av_freep(&s->rc_stat2[j]);
1248 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
1249 PlaneContext * const p= &s->plane[plane_index];
1250 RangeCoder * const c= &s->c;
1254 int run_index= s->run_index;
1257 int diff, context, sign;
1259 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1266 av_assert2(context < p->context_count);
1269 diff= get_symbol_inline(c, p->state[context], 1);
1271 if(context == 0 && run_mode==0) run_mode=1;
1274 if(run_count==0 && run_mode==1){
1275 if(get_bits1(&s->gb)){
1276 run_count = 1<<ff_log2_run[run_index];
1277 if(x + run_count <= w) run_index++;
1279 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1281 if(run_index) run_index--;
1289 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1294 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1296 // 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));
1299 if(sign) diff= -diff;
1301 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1303 s->run_index= run_index;
1306 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1308 int_fast16_t *sample[2];
1309 sample[0]=s->sample_buffer +3;
1310 sample[1]=s->sample_buffer+w+6+3;
1314 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1317 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
1319 sample[0]= sample[1];
1322 sample[1][-1]= sample[0][0 ];
1323 sample[0][ w]= sample[0][w-1];
1326 if(s->avctx->bits_per_raw_sample <= 8){
1327 decode_line(s, w, sample, plane_index, 8);
1329 src[x + stride*y]= sample[1][x];
1332 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1334 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1337 //STOP_TIMER("decode-line")}
1341 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1343 int_fast16_t *sample[3][2];
1345 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1346 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1351 memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer));
1355 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
1357 sample[p][0]= sample[p][1];
1360 sample[p][1][-1]= sample[p][0][0 ];
1361 sample[p][0][ w]= sample[p][0][w-1];
1362 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
1365 int g= sample[0][1][x];
1366 int b= sample[1][1][x];
1367 int r= sample[2][1][x];
1369 // assert(g>=0 && b>=0 && r>=0);
1370 // assert(g<256 && b<512 && r<512);
1378 src[x + stride*y]= b + (g<<8) + (r<<16) + (0xFF<<24);
1383 static int decode_slice(AVCodecContext *c, void *arg){
1384 FFV1Context *fs= *(void**)arg;
1385 FFV1Context *f= fs->avctx->priv_data;
1386 int width = fs->slice_width;
1387 int height= fs->slice_height;
1390 AVFrame * const p= &f->picture;
1392 av_assert1(width && height);
1393 if(f->colorspace==0){
1394 const int chroma_width = -((-width )>>f->chroma_h_shift);
1395 const int chroma_height= -((-height)>>f->chroma_v_shift);
1396 const int cx= x>>f->chroma_h_shift;
1397 const int cy= y>>f->chroma_v_shift;
1398 decode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1400 decode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1401 decode_plane(fs, p->data[2] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[2], 1);
1403 decode_rgb_frame(fs, (uint32_t*)p->data[0] + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1411 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1414 uint8_t state[CONTEXT_SIZE];
1416 memset(state, 128, sizeof(state));
1418 for(v=0; i<128 ; v++){
1419 int len= get_symbol(c, state, 0) + 1;
1421 if(len + i > 128) return -1;
1424 quant_table[i] = scale*v;
1427 //if(i%16==0) printf("\n");
1431 for(i=1; i<128; i++){
1432 quant_table[256-i]= -quant_table[i];
1434 quant_table[128]= -quant_table[127];
1439 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1441 int context_count=1;
1444 context_count*= read_quant_table(c, quant_table[i], context_count);
1445 if(context_count > 32768U){
1449 return (context_count+1)/2;
1452 static int read_extra_header(FFV1Context *f){
1453 RangeCoder * const c= &f->c;
1454 uint8_t state[CONTEXT_SIZE];
1456 uint8_t state2[32][CONTEXT_SIZE];
1458 memset(state2, 128, sizeof(state2));
1459 memset(state, 128, sizeof(state));
1461 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1462 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1464 f->version= get_symbol(c, state, 0);
1465 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1467 for(i=1; i<256; i++){
1468 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1471 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1472 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1473 get_rac(c, state); //no chroma = false
1474 f->chroma_h_shift= get_symbol(c, state, 0);
1475 f->chroma_v_shift= get_symbol(c, state, 0);
1476 get_rac(c, state); //transparency plane
1478 f->num_h_slices= 1 + get_symbol(c, state, 0);
1479 f->num_v_slices= 1 + get_symbol(c, state, 0);
1480 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1481 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1485 f->quant_table_count= get_symbol(c, state, 0);
1486 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1488 for(i=0; i<f->quant_table_count; i++){
1489 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1490 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1495 if(allocate_initial_states(f) < 0)
1496 return AVERROR(ENOMEM);
1498 for(i=0; i<f->quant_table_count; i++){
1499 if(get_rac(c, state)){
1500 for(j=0; j<f->context_count[i]; j++){
1501 for(k=0; k<CONTEXT_SIZE; k++){
1502 int pred= j ? f->initial_states[i][j-1][k] : 128;
1503 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1512 static int read_header(FFV1Context *f){
1513 uint8_t state[CONTEXT_SIZE];
1514 int i, j, context_count;
1515 RangeCoder * const c= &f->slice_context[0]->c;
1517 memset(state, 128, sizeof(state));
1520 f->version= get_symbol(c, state, 0);
1521 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1523 for(i=1; i<256; i++){
1524 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1527 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1529 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1530 get_rac(c, state); //no chroma = false
1531 f->chroma_h_shift= get_symbol(c, state, 0);
1532 f->chroma_v_shift= get_symbol(c, state, 0);
1533 get_rac(c, state); //transparency plane
1537 if(f->colorspace==0){
1538 if(f->avctx->bits_per_raw_sample<=8){
1539 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1540 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1541 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1542 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1543 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1544 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1546 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1550 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1551 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1552 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1553 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1555 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1559 }else if(f->colorspace==1){
1560 if(f->chroma_h_shift || f->chroma_v_shift){
1561 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1564 f->avctx->pix_fmt= PIX_FMT_RGB32;
1566 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1570 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1572 context_count= read_quant_tables(c, f->quant_table);
1573 if(context_count < 0){
1574 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1578 f->slice_count= get_symbol(c, state, 0);
1579 if(f->slice_count > (unsigned)MAX_SLICES)
1583 for(j=0; j<f->slice_count; j++){
1584 FFV1Context *fs= f->slice_context[j];
1587 if(f->version >= 2){
1588 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1589 fs->slice_y = get_symbol(c, state, 0) *f->height;
1590 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1591 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1593 fs->slice_x /= f->num_h_slices;
1594 fs->slice_y /= f->num_v_slices;
1595 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1596 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1597 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1599 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1600 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1604 for(i=0; i<f->plane_count; i++){
1605 PlaneContext * const p= &fs->plane[i];
1607 if(f->version >= 2){
1608 int idx=get_symbol(c, state, 0);
1609 if(idx > (unsigned)f->quant_table_count){
1610 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1613 p->quant_table_index= idx;
1614 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1615 context_count= f->context_count[idx];
1617 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1620 if(p->context_count < context_count){
1621 av_freep(&p->state);
1622 av_freep(&p->vlc_state);
1624 p->context_count= context_count;
1631 static av_cold int decode_init(AVCodecContext *avctx)
1633 FFV1Context *f = avctx->priv_data;
1637 if(avctx->extradata && read_extra_header(f) < 0)
1640 if(init_slice_contexts(f) < 0)
1646 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1647 const uint8_t *buf = avpkt->data;
1648 int buf_size = avpkt->size;
1649 FFV1Context *f = avctx->priv_data;
1650 RangeCoder * const c= &f->slice_context[0]->c;
1651 AVFrame * const p= &f->picture;
1653 uint8_t keystate= 128;
1654 const uint8_t *buf_p;
1656 AVFrame *picture = data;
1658 ff_init_range_decoder(c, buf, buf_size);
1659 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1662 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1663 if(get_rac(c, &keystate)){
1665 if(read_header(f) < 0)
1667 if(init_slice_state(f) < 0)
1676 for(i=1; i<256; i++){
1677 c->one_state[i]= f->state_transition[i];
1678 c->zero_state[256-i]= 256-c->one_state[i];
1683 if(avctx->get_buffer(avctx, p) < 0){
1684 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1688 if(avctx->debug&FF_DEBUG_PICT_INFO)
1689 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1692 bytes_read = c->bytestream - c->bytestream_start - 1;
1693 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1694 //printf("pos=%d\n", bytes_read);
1695 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, buf_size - bytes_read);
1697 bytes_read = 0; /* avoid warning */
1700 buf_p= buf + buf_size;
1701 for(i=f->slice_count-1; i>0; i--){
1702 FFV1Context *fs= f->slice_context[i];
1703 int v= AV_RB24(buf_p-3)+3;
1704 if(buf_p - buf <= v){
1705 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1710 ff_init_range_decoder(&fs->c, buf_p, v);
1712 init_get_bits(&fs->gb, buf_p, v);
1716 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1717 f->picture_number++;
1721 avctx->release_buffer(avctx, p); //FIXME
1723 *data_size = sizeof(AVFrame);
1728 AVCodec ffv1_decoder = {
1732 sizeof(FFV1Context),
1737 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1739 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1742 #if CONFIG_FFV1_ENCODER
1743 AVCodec ffv1_encoder = {
1747 sizeof(FFV1Context),
1751 .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},
1752 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),