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));
746 fs->slice_width = sxe - sxs;
747 fs->slice_height= sye - sys;
751 fs->sample_buffer = av_malloc(6 * (fs->width+6) * sizeof(*fs->sample_buffer));
752 if (!fs->sample_buffer)
753 return AVERROR(ENOMEM);
758 static int allocate_initial_states(FFV1Context *f){
761 for(i=0; i<f->quant_table_count; i++){
762 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
763 if(!f->initial_states[i])
764 return AVERROR(ENOMEM);
765 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
770 #if CONFIG_FFV1_ENCODER
771 static int write_extra_header(FFV1Context *f){
772 RangeCoder * const c= &f->c;
773 uint8_t state[CONTEXT_SIZE];
775 uint8_t state2[32][CONTEXT_SIZE];
777 memset(state2, 128, sizeof(state2));
778 memset(state, 128, sizeof(state));
780 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
781 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
782 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
784 put_symbol(c, state, f->version, 0);
785 put_symbol(c, state, f->ac, 0);
787 for(i=1; i<256; i++){
788 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
791 put_symbol(c, state, f->colorspace, 0); //YUV cs type
792 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
793 put_rac(c, state, 1); //chroma planes
794 put_symbol(c, state, f->chroma_h_shift, 0);
795 put_symbol(c, state, f->chroma_v_shift, 0);
796 put_rac(c, state, 0); //no transparency plane
797 put_symbol(c, state, f->num_h_slices-1, 0);
798 put_symbol(c, state, f->num_v_slices-1, 0);
800 put_symbol(c, state, f->quant_table_count, 0);
801 for(i=0; i<f->quant_table_count; i++)
802 write_quant_tables(c, f->quant_tables[i]);
804 for(i=0; i<f->quant_table_count; i++){
805 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
806 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
808 if(j<f->context_count[i]*CONTEXT_SIZE){
809 put_rac(c, state, 1);
810 for(j=0; j<f->context_count[i]; j++){
811 for(k=0; k<CONTEXT_SIZE; k++){
812 int pred= j ? f->initial_states[i][j-1][k] : 128;
813 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
817 put_rac(c, state, 0);
821 f->avctx->extradata_size= ff_rac_terminate(c);
826 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
827 int i,i2,changed,print=0;
831 for(i=12; i<244; i++){
832 for(i2=i+1; i2<245 && i2<i+4; i2++){
833 #define COST(old, new) \
834 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
835 +s->rc_stat[old][1]*-log2( (new) /256.0)
837 #define COST2(old, new) \
839 +COST(256-(old), 256-(new))
841 double size0= COST2(i, i ) + COST2(i2, i2);
842 double sizeX= COST2(i, i2) + COST2(i2, i );
843 if(sizeX < size0 && i!=128 && i2!=128){
845 FFSWAP(int, stt[ i], stt[ i2]);
846 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
847 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
849 FFSWAP(int, stt[256-i], stt[256-i2]);
850 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
851 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
853 for(j=1; j<256; j++){
854 if (stt[j] == i ) stt[j] = i2;
855 else if(stt[j] == i2) stt[j] = i ;
857 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
858 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
869 static av_cold int encode_init(AVCodecContext *avctx)
871 FFV1Context *s = avctx->priv_data;
877 s->ac= avctx->coder_type ? 2:0;
881 s->state_transition[i]=ver2_state[i];
884 for(i=0; i<256; i++){
885 s->quant_table_count=2;
886 if(avctx->bits_per_raw_sample <=8){
887 s->quant_tables[0][0][i]= quant11[i];
888 s->quant_tables[0][1][i]= 11*quant11[i];
889 s->quant_tables[0][2][i]= 11*11*quant11[i];
890 s->quant_tables[1][0][i]= quant11[i];
891 s->quant_tables[1][1][i]= 11*quant11[i];
892 s->quant_tables[1][2][i]= 11*11*quant5 [i];
893 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
894 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
896 s->quant_tables[0][0][i]= quant9_10bit[i];
897 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
898 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
899 s->quant_tables[1][0][i]= quant9_10bit[i];
900 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
901 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
902 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
903 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
906 s->context_count[0]= (11*11*11+1)/2;
907 s->context_count[1]= (11*11*5*5*5+1)/2;
908 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
910 for(i=0; i<s->plane_count; i++){
911 PlaneContext * const p= &s->plane[i];
913 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
914 p->quant_table_index= avctx->context_model;
915 p->context_count= s->context_count[p->quant_table_index];
918 if(allocate_initial_states(s) < 0)
919 return AVERROR(ENOMEM);
921 avctx->coded_frame= &s->picture;
922 switch(avctx->pix_fmt){
923 case PIX_FMT_YUV444P16:
924 case PIX_FMT_YUV422P16:
925 case PIX_FMT_YUV420P16:
926 if(avctx->bits_per_raw_sample <=8){
927 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
931 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
934 s->version= FFMAX(s->version, 1);
935 case PIX_FMT_YUV444P:
936 case PIX_FMT_YUV422P:
937 case PIX_FMT_YUV420P:
938 case PIX_FMT_YUV411P:
939 case PIX_FMT_YUV410P:
946 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
949 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
954 char *p= avctx->stats_in;
957 for(j=0; j<256; j++){
960 s->rc_stat[j][i]= strtol(p, &next, 0);
962 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
968 while(*p=='\n' || *p==' ') p++;
971 sort_stt(s, s->state_transition);
977 write_extra_header(s);
980 if(init_slice_contexts(s) < 0)
982 if(init_slice_state(s) < 0)
985 #define STATS_OUT_SIZE 1024*30
986 if(avctx->flags & CODEC_FLAG_PASS1){
987 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
988 for(i=0; i<s->quant_table_count; i++){
989 for(j=0; j<s->slice_count; j++){
990 FFV1Context *sf= s->slice_context[j];
991 av_assert0(!sf->rc_stat2[i]);
992 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
994 return AVERROR(ENOMEM);
1001 #endif /* CONFIG_FFV1_ENCODER */
1004 static void clear_state(FFV1Context *f){
1007 for(si=0; si<f->slice_count; si++){
1008 FFV1Context *fs= f->slice_context[si];
1009 for(i=0; i<f->plane_count; i++){
1010 PlaneContext *p= &fs->plane[i];
1012 p->interlace_bit_state[0]= 128;
1013 p->interlace_bit_state[1]= 128;
1016 if(f->initial_states[p->quant_table_index]){
1017 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1019 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1021 for(j=0; j<p->context_count; j++){
1022 p->vlc_state[j].drift= 0;
1023 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1024 p->vlc_state[j].bias= 0;
1025 p->vlc_state[j].count= 1;
1032 #if CONFIG_FFV1_ENCODER
1033 static int encode_slice(AVCodecContext *c, void *arg){
1034 FFV1Context *fs= *(void**)arg;
1035 FFV1Context *f= fs->avctx->priv_data;
1036 int width = fs->slice_width;
1037 int height= fs->slice_height;
1040 AVFrame * const p= &f->picture;
1042 if(f->colorspace==0){
1043 const int chroma_width = -((-width )>>f->chroma_h_shift);
1044 const int chroma_height= -((-height)>>f->chroma_v_shift);
1045 const int cx= x>>f->chroma_h_shift;
1046 const int cy= y>>f->chroma_v_shift;
1048 encode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1050 encode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1051 encode_plane(fs, p->data[2] + cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1053 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1060 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1061 FFV1Context *f = avctx->priv_data;
1062 RangeCoder * const c= &f->slice_context[0]->c;
1063 AVFrame *pict = data;
1064 AVFrame * const p= &f->picture;
1066 uint8_t keystate=128;
1070 ff_init_range_encoder(c, buf, buf_size);
1071 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1074 p->pict_type= FF_I_TYPE;
1076 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1077 put_rac(c, &keystate, 1);
1082 put_rac(c, &keystate, 0);
1087 used_count += ff_rac_terminate(c);
1088 //printf("pos=%d\n", used_count);
1089 init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1092 for(i=1; i<256; i++){
1093 c->one_state[i]= f->state_transition[i];
1094 c->zero_state[256-i]= 256-c->one_state[i];
1098 for(i=1; i<f->slice_count; i++){
1099 FFV1Context *fs= f->slice_context[i];
1100 uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1101 int len= buf_size/f->slice_count;
1104 ff_init_range_encoder(&fs->c, start, len);
1106 init_put_bits(&fs->pb, start, len);
1109 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1112 for(i=0; i<f->slice_count; i++){
1113 FFV1Context *fs= f->slice_context[i];
1118 put_rac(&fs->c, &state, 0);
1119 bytes= ff_rac_terminate(&fs->c);
1121 flush_put_bits(&fs->pb); //nicer padding FIXME
1122 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1126 av_assert0(bytes < buf_size/f->slice_count);
1127 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1128 av_assert0(bytes < (1<<24));
1129 AV_WB24(buf_p+bytes, bytes);
1135 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1137 char *p= avctx->stats_out;
1138 char *end= p + STATS_OUT_SIZE;
1140 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1141 for(j=0; j<f->slice_count; j++){
1142 FFV1Context *fs= f->slice_context[j];
1143 for(i=0; i<256; i++){
1144 f->rc_stat[i][0] += fs->rc_stat[i][0];
1145 f->rc_stat[i][1] += fs->rc_stat[i][1];
1149 for(j=0; j<256; j++){
1150 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1153 snprintf(p, end-p, "\n");
1154 } else if(avctx->flags&CODEC_FLAG_PASS1)
1155 avctx->stats_out[0] = '\0';
1157 f->picture_number++;
1160 #endif /* CONFIG_FFV1_ENCODER */
1162 static av_cold int common_end(AVCodecContext *avctx){
1163 FFV1Context *s = avctx->priv_data;
1166 for(j=0; j<s->slice_count; j++){
1167 FFV1Context *fs= s->slice_context[j];
1168 for(i=0; i<s->plane_count; i++){
1169 PlaneContext *p= &fs->plane[i];
1171 av_freep(&p->state);
1172 av_freep(&p->vlc_state);
1174 av_freep(&fs->sample_buffer);
1177 av_freep(&avctx->stats_out);
1178 for(j=0; j<s->quant_table_count; j++){
1179 av_freep(&s->initial_states[j]);
1180 for(i=0; i<s->slice_count; i++){
1181 FFV1Context *sf= s->slice_context[i];
1182 av_freep(&sf->rc_stat2[j]);
1189 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
1190 PlaneContext * const p= &s->plane[plane_index];
1191 RangeCoder * const c= &s->c;
1195 int run_index= s->run_index;
1198 int diff, context, sign;
1200 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1207 av_assert2(context < p->context_count);
1210 diff= get_symbol_inline(c, p->state[context], 1);
1212 if(context == 0 && run_mode==0) run_mode=1;
1215 if(run_count==0 && run_mode==1){
1216 if(get_bits1(&s->gb)){
1217 run_count = 1<<ff_log2_run[run_index];
1218 if(x + run_count <= w) run_index++;
1220 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1222 if(run_index) run_index--;
1230 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1235 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1237 // 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));
1240 if(sign) diff= -diff;
1242 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1244 s->run_index= run_index;
1247 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1249 int_fast16_t *sample[2];
1250 sample[0]=s->sample_buffer +3;
1251 sample[1]=s->sample_buffer+w+6+3;
1255 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1258 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
1260 sample[0]= sample[1];
1263 sample[1][-1]= sample[0][0 ];
1264 sample[0][ w]= sample[0][w-1];
1267 if(s->avctx->bits_per_raw_sample <= 8){
1268 decode_line(s, w, sample, plane_index, 8);
1270 src[x + stride*y]= sample[1][x];
1273 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1275 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1278 //STOP_TIMER("decode-line")}
1282 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1284 int_fast16_t *sample[3][2];
1286 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1287 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1292 memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer));
1296 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
1298 sample[p][0]= sample[p][1];
1301 sample[p][1][-1]= sample[p][0][0 ];
1302 sample[p][0][ w]= sample[p][0][w-1];
1303 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
1306 int g= sample[0][1][x];
1307 int b= sample[1][1][x];
1308 int r= sample[2][1][x];
1310 // assert(g>=0 && b>=0 && r>=0);
1311 // assert(g<256 && b<512 && r<512);
1319 src[x + stride*y]= b + (g<<8) + (r<<16) + (0xFF<<24);
1324 static int decode_slice(AVCodecContext *c, void *arg){
1325 FFV1Context *fs= *(void**)arg;
1326 FFV1Context *f= fs->avctx->priv_data;
1327 int width = fs->slice_width;
1328 int height= fs->slice_height;
1331 AVFrame * const p= &f->picture;
1333 av_assert1(width && height);
1334 if(f->colorspace==0){
1335 const int chroma_width = -((-width )>>f->chroma_h_shift);
1336 const int chroma_height= -((-height)>>f->chroma_v_shift);
1337 const int cx= x>>f->chroma_h_shift;
1338 const int cy= y>>f->chroma_v_shift;
1339 decode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1341 decode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1342 decode_plane(fs, p->data[2] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[2], 1);
1344 decode_rgb_frame(fs, (uint32_t*)p->data[0] + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1352 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1355 uint8_t state[CONTEXT_SIZE];
1357 memset(state, 128, sizeof(state));
1359 for(v=0; i<128 ; v++){
1360 int len= get_symbol(c, state, 0) + 1;
1362 if(len + i > 128) return -1;
1365 quant_table[i] = scale*v;
1368 //if(i%16==0) printf("\n");
1372 for(i=1; i<128; i++){
1373 quant_table[256-i]= -quant_table[i];
1375 quant_table[128]= -quant_table[127];
1380 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1382 int context_count=1;
1385 context_count*= read_quant_table(c, quant_table[i], context_count);
1386 if(context_count > 32768U){
1390 return (context_count+1)/2;
1393 static int read_extra_header(FFV1Context *f){
1394 RangeCoder * const c= &f->c;
1395 uint8_t state[CONTEXT_SIZE];
1397 uint8_t state2[32][CONTEXT_SIZE];
1399 memset(state2, 128, sizeof(state2));
1400 memset(state, 128, sizeof(state));
1402 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1403 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1405 f->version= get_symbol(c, state, 0);
1406 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1408 for(i=1; i<256; i++){
1409 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1412 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1413 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1414 get_rac(c, state); //no chroma = false
1415 f->chroma_h_shift= get_symbol(c, state, 0);
1416 f->chroma_v_shift= get_symbol(c, state, 0);
1417 get_rac(c, state); //transparency plane
1419 f->num_h_slices= 1 + get_symbol(c, state, 0);
1420 f->num_v_slices= 1 + get_symbol(c, state, 0);
1421 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1422 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1426 f->quant_table_count= get_symbol(c, state, 0);
1427 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1429 for(i=0; i<f->quant_table_count; i++){
1430 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1431 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1436 if(allocate_initial_states(f) < 0)
1437 return AVERROR(ENOMEM);
1439 for(i=0; i<f->quant_table_count; i++){
1440 if(get_rac(c, state)){
1441 for(j=0; j<f->context_count[i]; j++){
1442 for(k=0; k<CONTEXT_SIZE; k++){
1443 int pred= j ? f->initial_states[i][j-1][k] : 128;
1444 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1453 static int read_header(FFV1Context *f){
1454 uint8_t state[CONTEXT_SIZE];
1455 int i, j, context_count;
1456 RangeCoder * const c= &f->slice_context[0]->c;
1458 memset(state, 128, sizeof(state));
1461 f->version= get_symbol(c, state, 0);
1462 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1464 for(i=1; i<256; i++){
1465 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1468 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1470 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1471 get_rac(c, state); //no chroma = false
1472 f->chroma_h_shift= get_symbol(c, state, 0);
1473 f->chroma_v_shift= get_symbol(c, state, 0);
1474 get_rac(c, state); //transparency plane
1478 if(f->colorspace==0){
1479 if(f->avctx->bits_per_raw_sample<=8){
1480 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1481 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1482 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1483 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1484 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1485 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1487 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1491 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1492 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1493 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1494 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1496 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1500 }else if(f->colorspace==1){
1501 if(f->chroma_h_shift || f->chroma_v_shift){
1502 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1505 f->avctx->pix_fmt= PIX_FMT_RGB32;
1507 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1511 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1513 context_count= read_quant_tables(c, f->quant_table);
1514 if(context_count < 0){
1515 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1519 f->slice_count= get_symbol(c, state, 0);
1520 if(f->slice_count > (unsigned)MAX_SLICES)
1524 for(j=0; j<f->slice_count; j++){
1525 FFV1Context *fs= f->slice_context[j];
1528 if(f->version >= 2){
1529 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1530 fs->slice_y = get_symbol(c, state, 0) *f->height;
1531 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1532 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1534 fs->slice_x /= f->num_h_slices;
1535 fs->slice_y /= f->num_v_slices;
1536 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1537 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1538 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1540 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1541 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1545 for(i=0; i<f->plane_count; i++){
1546 PlaneContext * const p= &fs->plane[i];
1548 if(f->version >= 2){
1549 int idx=get_symbol(c, state, 0);
1550 if(idx > (unsigned)f->quant_table_count){
1551 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1554 p->quant_table_index= idx;
1555 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1556 context_count= f->context_count[idx];
1558 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1561 if(p->context_count < context_count){
1562 av_freep(&p->state);
1563 av_freep(&p->vlc_state);
1565 p->context_count= context_count;
1572 static av_cold int decode_init(AVCodecContext *avctx)
1574 FFV1Context *f = avctx->priv_data;
1578 if(avctx->extradata && read_extra_header(f) < 0)
1581 if(init_slice_contexts(f) < 0)
1587 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1588 const uint8_t *buf = avpkt->data;
1589 int buf_size = avpkt->size;
1590 FFV1Context *f = avctx->priv_data;
1591 RangeCoder * const c= &f->slice_context[0]->c;
1592 AVFrame * const p= &f->picture;
1594 uint8_t keystate= 128;
1595 const uint8_t *buf_p;
1597 AVFrame *picture = data;
1599 ff_init_range_decoder(c, buf, buf_size);
1600 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1603 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1604 if(get_rac(c, &keystate)){
1606 if(read_header(f) < 0)
1608 if(init_slice_state(f) < 0)
1617 for(i=1; i<256; i++){
1618 c->one_state[i]= f->state_transition[i];
1619 c->zero_state[256-i]= 256-c->one_state[i];
1624 if(avctx->get_buffer(avctx, p) < 0){
1625 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1629 if(avctx->debug&FF_DEBUG_PICT_INFO)
1630 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1633 bytes_read = c->bytestream - c->bytestream_start - 1;
1634 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1635 //printf("pos=%d\n", bytes_read);
1636 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, buf_size - bytes_read);
1638 bytes_read = 0; /* avoid warning */
1641 buf_p= buf + buf_size;
1642 for(i=f->slice_count-1; i>0; i--){
1643 FFV1Context *fs= f->slice_context[i];
1644 int v= AV_RB24(buf_p-3)+3;
1645 if(buf_p - buf <= v){
1646 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1651 ff_init_range_decoder(&fs->c, buf_p, v);
1653 init_get_bits(&fs->gb, buf_p, v);
1657 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1658 f->picture_number++;
1662 avctx->release_buffer(avctx, p); //FIXME
1664 *data_size = sizeof(AVFrame);
1669 AVCodec ffv1_decoder = {
1673 sizeof(FFV1Context),
1678 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1680 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1683 #if CONFIG_FFV1_ENCODER
1684 AVCodec ffv1_encoder = {
1688 sizeof(FFV1Context),
1692 .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},
1693 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),