Use "FFmpeg video codec #1" instead of "FFmpeg codec #1" as codec long name.
[libav.git] / libavcodec / ffv1.c
CommitLineData
5e20f836
MN
1/*
2 * FFV1 codec for libavcodec
3 *
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 *
b78e7197
DB
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
5e20f836
MN
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
b78e7197 11 * version 2.1 of the License, or (at your option) any later version.
5e20f836 12 *
b78e7197 13 * FFmpeg is distributed in the hope that it will be useful,
5e20f836
MN
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.
17 *
18 * You should have received a copy of the GNU Lesser General Public
b78e7197 19 * License along with FFmpeg; if not, write to the Free Software
5509bffa 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5e20f836 21 */
115329f1 22
5e20f836 23/**
bad5537e 24 * @file libavcodec/ffv1.c
dc7cb06a 25 * FF Video Codec 1 (an experimental lossless codec)
5e20f836
MN
26 */
27
5e20f836 28#include "avcodec.h"
9106a698 29#include "get_bits.h"
b2755007 30#include "put_bits.h"
5e20f836 31#include "dsputil.h"
880eae9c 32#include "rangecoder.h"
11e659c2 33#include "golomb.h"
199436b9 34#include "mathops.h"
5e20f836
MN
35
36#define MAX_PLANES 4
c2f1b2cb
MN
37#define CONTEXT_SIZE 32
38
b3bf98aa
SG
39extern const uint8_t ff_log2_run[32];
40
11e659c2
MN
41static const int8_t quant3[256]={
42 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5e20f836
MN
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,
11e659c2
MN
50-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
56-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
57-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
58};
68f8d33b
MN
59
60static const int8_t quant5_10bit[256]={
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
71-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
72-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
73-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,
74-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
76-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
77};
78
11e659c2
MN
79static const int8_t quant5[256]={
80 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
5e20f836 81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
11e659c2
MN
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
90-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
91-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
92-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
93-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
94-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
95-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
96};
97static const int8_t quant7[256]={
98 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
101 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
107-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
108-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
109-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
110-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
111-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
112-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
113-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
114};
115static const int8_t quant9[256]={
116 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
119 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
120 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
121 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
122 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
123 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
124-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
126-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
127-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
128-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
129-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
130-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
131-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
132};
68f8d33b
MN
133static const int8_t quant9_10bit[256]={
134 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
135 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
138 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
139 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
140 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
141 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
142-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
145-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
146-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
147-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
148-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
149-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
150};
151
11e659c2
MN
152static const int8_t quant11[256]={
153 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
154 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
155 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
157 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
158 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
159 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
160 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
161-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
162-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
163-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
164-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
165-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
166-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
167-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
168-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
169};
170static const int8_t quant13[256]={
171 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
172 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
173 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
174 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
175 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
176 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
177 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
178 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
179-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
180-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
181-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
182-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
183-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
184-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
185-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
186-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
187};
5e20f836 188
11e659c2
MN
189typedef struct VlcState{
190 int16_t drift;
191 uint16_t error_sum;
192 int8_t bias;
193 uint8_t count;
194} VlcState;
195
5e20f836 196typedef struct PlaneContext{
5e20f836 197 int context_count;
c2f1b2cb 198 uint8_t (*state)[CONTEXT_SIZE];
11e659c2 199 VlcState *vlc_state;
5e20f836
MN
200 uint8_t interlace_bit_state[2];
201} PlaneContext;
202
203typedef struct FFV1Context{
204 AVCodecContext *avctx;
880eae9c 205 RangeCoder c;
11e659c2
MN
206 GetBitContext gb;
207 PutBitContext pb;
5e20f836
MN
208 int version;
209 int width, height;
210 int chroma_h_shift, chroma_v_shift;
211 int flags;
212 int picture_number;
213 AVFrame picture;
214 int plane_count;
2fee538a 215 int ac; ///< 1=range coder <-> 0=golomb rice
5e20f836 216 PlaneContext plane[MAX_PLANES];
11e659c2 217 int16_t quant_table[5][256];
2cbb7820
MN
218 int run_index;
219 int colorspace;
115329f1
DB
220
221 DSPContext dsp;
5e20f836
MN
222}FFV1Context;
223
849f1035 224static av_always_inline int fold(int diff, int bits){
2cbb7820
MN
225 if(bits==8)
226 diff= (int8_t)diff;
227 else{
228 diff+= 1<<(bits-1);
229 diff&=(1<<bits)-1;
230 diff-= 1<<(bits-1);
231 }
232
233 return diff;
234}
235
236static inline int predict(int_fast16_t *src, int_fast16_t *last){
11e659c2
MN
237 const int LT= last[-1];
238 const int T= last[ 0];
239 const int L = src[-1];
5e20f836 240
25bd2349 241 return mid_pred(L, L + T - LT, T);
5e20f836
MN
242}
243
2cbb7820 244static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
11e659c2
MN
245 const int LT= last[-1];
246 const int T= last[ 0];
247 const int RT= last[ 1];
248 const int L = src[-1];
249
250 if(f->quant_table[3][127]){
251 const int TT= last2[0];
252 const int LL= src[-2];
253 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
254 +f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
255 }else
256 return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
5e20f836 257}
c2f1b2cb 258
217d34e3 259static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){
5e20f836 260 int i;
5e20f836 261
5e20f836 262 if(v){
c26abfa5 263 const int a= FFABS(v);
5e20f836 264 const int e= av_log2(a);
880eae9c 265 put_rac(c, state+0, 0);
68f8d33b 266 if(e<=9){
f83c5773
MN
267 for(i=0; i<e; i++){
268 put_rac(c, state+1+i, 1); //1..10
269 }
270 put_rac(c, state+1+i, 0);
085565f7 271
f83c5773
MN
272 for(i=e-1; i>=0; i--){
273 put_rac(c, state+22+i, (a>>i)&1); //22..31
274 }
d34a0746 275
f83c5773
MN
276 if(is_signed)
277 put_rac(c, state+11 + e, v < 0); //11..21
68f8d33b
MN
278 }else{
279 for(i=0; i<e; i++){
280 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
281 }
282 put_rac(c, state+1+9, 0);
283
284 for(i=e-1; i>=0; i--){
285 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
286 }
287
288 if(is_signed)
289 put_rac(c, state+11 + 10, v < 0); //11..21
290 }
5e20f836 291 }else{
880eae9c 292 put_rac(c, state+0, 1);
5e20f836 293 }
5e20f836
MN
294}
295
217d34e3
MN
296static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
297 put_symbol_inline(c, state, v, is_signed);
298}
299
68f8d33b 300static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
880eae9c 301 if(get_rac(c, state+0))
5e20f836
MN
302 return 0;
303 else{
d34a0746
MN
304 int i, e, a;
305 e= 0;
68f8d33b 306 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
d34a0746
MN
307 e++;
308 }
5e20f836 309
d34a0746
MN
310 a= 1;
311 for(i=e-1; i>=0; i--){
68f8d33b 312 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
085565f7 313 }
d34a0746 314
68f8d33b 315 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
3788e661 316 return (a^e)-e;
5e20f836
MN
317 }
318}
11e659c2 319
217d34e3
MN
320static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
321 return get_symbol_inline(c, state, is_signed);
322}
323
11e659c2
MN
324static inline void update_vlc_state(VlcState * const state, const int v){
325 int drift= state->drift;
326 int count= state->count;
c26abfa5 327 state->error_sum += FFABS(v);
11e659c2
MN
328 drift += v;
329
330 if(count == 128){ //FIXME variable
331 count >>= 1;
332 drift >>= 1;
333 state->error_sum >>= 1;
334 }
335 count++;
336
337 if(drift <= -count){
338 if(state->bias > -128) state->bias--;
115329f1 339
11e659c2
MN
340 drift += count;
341 if(drift <= -count)
342 drift= -count + 1;
343 }else if(drift > 0){
344 if(state->bias < 127) state->bias++;
115329f1 345
11e659c2 346 drift -= count;
115329f1 347 if(drift > 0)
11e659c2
MN
348 drift= 0;
349 }
350
351 state->drift= drift;
352 state->count= count;
353}
354
2cbb7820 355static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
11e659c2
MN
356 int i, k, code;
357//printf("final: %d ", v);
2cbb7820
MN
358 v = fold(v - state->bias, bits);
359
11e659c2
MN
360 i= state->count;
361 k=0;
362 while(i < state->error_sum){ //FIXME optimize
363 k++;
364 i += i;
365 }
d9e6a6c6
MN
366
367 assert(k<=8);
368
11e659c2
MN
369#if 0 // JPEG LS
370 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
371 else code= v;
372#else
373 code= v ^ ((2*state->drift + state->count)>>31);
374#endif
115329f1 375
11e659c2 376//printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k);
a6c01275 377 set_sr_golomb(pb, code, k, 12, bits);
11e659c2
MN
378
379 update_vlc_state(state, v);
380}
381
2cbb7820 382static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
11e659c2
MN
383 int k, i, v, ret;
384
385 i= state->count;
386 k=0;
387 while(i < state->error_sum){ //FIXME optimize
388 k++;
389 i += i;
390 }
d9e6a6c6
MN
391
392 assert(k<=8);
393
a6c01275 394 v= get_sr_golomb(gb, k, 12, bits);
11e659c2 395//printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
d9e6a6c6 396
11e659c2
MN
397#if 0 // JPEG LS
398 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
399#else
400 v ^= ((2*state->drift + state->count)>>31);
5e20f836
MN
401#endif
402
2cbb7820 403 ret= fold(v + state->bias, bits);
115329f1 404
11e659c2
MN
405 update_vlc_state(state, v);
406//printf("final: %d\n", ret);
407 return ret;
408}
409
b250f9c6 410#if CONFIG_FFV1_ENCODER
0ecca7a4 411static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
2cbb7820 412 PlaneContext * const p= &s->plane[plane_index];
880eae9c 413 RangeCoder * const c= &s->c;
2cbb7820
MN
414 int x;
415 int run_index= s->run_index;
416 int run_count=0;
417 int run_mode=0;
418
0ecca7a4
MN
419 if(s->ac){
420 if(c->bytestream_end - c->bytestream < w*20){
421 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
422 return -1;
423 }
424 }else{
425 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
426 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
427 return -1;
428 }
429 }
430
2cbb7820
MN
431 for(x=0; x<w; x++){
432 int diff, context;
115329f1 433
c172913a
MN
434 context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
435 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
11e659c2 436
2cbb7820
MN
437 if(context < 0){
438 context = -context;
439 diff= -diff;
440 }
441
442 diff= fold(diff, bits);
115329f1 443
2cbb7820 444 if(s->ac){
217d34e3 445 put_symbol_inline(c, p->state[context], diff, 1);
2cbb7820
MN
446 }else{
447 if(context == 0) run_mode=1;
115329f1 448
2cbb7820
MN
449 if(run_mode){
450
451 if(diff){
b3bf98aa
SG
452 while(run_count >= 1<<ff_log2_run[run_index]){
453 run_count -= 1<<ff_log2_run[run_index];
2cbb7820
MN
454 run_index++;
455 put_bits(&s->pb, 1, 1);
456 }
115329f1 457
b3bf98aa 458 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
2cbb7820
MN
459 if(run_index) run_index--;
460 run_count=0;
461 run_mode=0;
462 if(diff>0) diff--;
463 }else{
464 run_count++;
465 }
466 }
115329f1 467
fe455f33 468// printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, (int)put_bits_count(&s->pb));
2cbb7820
MN
469
470 if(run_mode == 0)
471 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
472 }
473 }
474 if(run_mode){
b3bf98aa
SG
475 while(run_count >= 1<<ff_log2_run[run_index]){
476 run_count -= 1<<ff_log2_run[run_index];
2cbb7820
MN
477 run_index++;
478 put_bits(&s->pb, 1, 1);
479 }
480
481 if(run_count)
482 put_bits(&s->pb, 1, 1);
483 }
484 s->run_index= run_index;
115329f1 485
0ecca7a4 486 return 0;
2cbb7820 487}
11e659c2 488
5e20f836 489static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
c172913a 490 int x,y,i;
fa2522d7 491 const int ring_size= s->avctx->context_model ? 3 : 2;
c172913a 492 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
2cbb7820 493 s->run_index=0;
115329f1 494
d9ced4ca 495 memset(sample_buffer, 0, sizeof(sample_buffer));
115329f1 496
5e20f836 497 for(y=0; y<h; y++){
c172913a
MN
498 for(i=0; i<ring_size; i++)
499 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
115329f1 500
c172913a
MN
501 sample[0][-1]= sample[1][0 ];
502 sample[1][ w]= sample[1][w-1];
2cbb7820 503//{START_TIMER
68f8d33b 504 if(s->avctx->bits_per_raw_sample<=8){
f83c5773
MN
505 for(x=0; x<w; x++){
506 sample[0][x]= src[x + stride*y];
507 }
508 encode_line(s, w, sample, plane_index, 8);
68f8d33b
MN
509 }else{
510 for(x=0; x<w; x++){
511 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
512 }
513 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
514 }
2cbb7820
MN
515//STOP_TIMER("encode line")}
516 }
517}
5e20f836 518
2cbb7820 519static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
c172913a 520 int x, y, p, i;
fa2522d7 521 const int ring_size= s->avctx->context_model ? 3 : 2;
c172913a 522 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
2cbb7820 523 s->run_index=0;
115329f1 524
2cbb7820 525 memset(sample_buffer, 0, sizeof(sample_buffer));
115329f1 526
2cbb7820 527 for(y=0; y<h; y++){
c172913a
MN
528 for(i=0; i<ring_size; i++)
529 for(p=0; p<3; p++)
530 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
531
5e20f836 532 for(x=0; x<w; x++){
2cbb7820
MN
533 int v= src[x + stride*y];
534 int b= v&0xFF;
535 int g= (v>>8)&0xFF;
536 int r= (v>>16)&0xFF;
115329f1 537
2cbb7820
MN
538 b -= g;
539 r -= g;
540 g += (b + r)>>2;
541 b += 0x100;
542 r += 0x100;
115329f1 543
2cbb7820
MN
544// assert(g>=0 && b>=0 && r>=0);
545// assert(g<256 && b<512 && r<512);
546 sample[0][0][x]= g;
547 sample[1][0][x]= b;
548 sample[2][0][x]= r;
11e659c2 549 }
2cbb7820 550 for(p=0; p<3; p++){
c172913a
MN
551 sample[p][0][-1]= sample[p][1][0 ];
552 sample[p][1][ w]= sample[p][1][w-1];
2cbb7820 553 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
5e20f836
MN
554 }
555 }
556}
557
880eae9c 558static void write_quant_table(RangeCoder *c, int16_t *quant_table){
5e20f836
MN
559 int last=0;
560 int i;
880eae9c
MN
561 uint8_t state[CONTEXT_SIZE];
562 memset(state, 128, sizeof(state));
5e20f836 563
11e659c2 564 for(i=1; i<128 ; i++){
5e20f836 565 if(quant_table[i] != quant_table[i-1]){
d34a0746 566 put_symbol(c, state, i-last-1, 0);
5e20f836
MN
567 last= i;
568 }
569 }
d34a0746 570 put_symbol(c, state, i-last-1, 0);
5e20f836
MN
571}
572
573static void write_header(FFV1Context *f){
880eae9c 574 uint8_t state[CONTEXT_SIZE];
5e20f836 575 int i;
880eae9c 576 RangeCoder * const c= &f->c;
5e20f836 577
880eae9c 578 memset(state, 128, sizeof(state));
115329f1 579
d34a0746
MN
580 put_symbol(c, state, f->version, 0);
581 put_symbol(c, state, f->avctx->coder_type, 0);
115329f1 582 put_symbol(c, state, f->colorspace, 0); //YUV cs type
68f8d33b
MN
583 if(f->version>0)
584 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
880eae9c 585 put_rac(c, state, 1); //chroma planes
d34a0746
MN
586 put_symbol(c, state, f->chroma_h_shift, 0);
587 put_symbol(c, state, f->chroma_v_shift, 0);
880eae9c 588 put_rac(c, state, 0); //no transparency plane
5e20f836 589
11e659c2
MN
590 for(i=0; i<5; i++)
591 write_quant_table(c, f->quant_table[i]);
5e20f836 592}
f544a5fc 593#endif /* CONFIG_FFV1_ENCODER */
5e20f836 594
98a6fff9 595static av_cold int common_init(AVCodecContext *avctx){
5e20f836 596 FFV1Context *s = avctx->priv_data;
5e20f836
MN
597
598 s->avctx= avctx;
599 s->flags= avctx->flags;
115329f1 600
5e20f836 601 dsputil_init(&s->dsp, avctx);
115329f1 602
6081c30b
MN
603 s->width = avctx->width;
604 s->height= avctx->height;
115329f1 605
6081c30b 606 assert(s->width && s->height);
5e20f836 607
5e20f836
MN
608 return 0;
609}
610
b250f9c6 611#if CONFIG_FFV1_ENCODER
98a6fff9 612static av_cold int encode_init(AVCodecContext *avctx)
5e20f836
MN
613{
614 FFV1Context *s = avctx->priv_data;
615 int i;
616
617 common_init(avctx);
115329f1 618
5e20f836 619 s->version=0;
11e659c2 620 s->ac= avctx->coder_type;
115329f1 621
27fc5352 622 s->plane_count=2;
11e659c2 623 for(i=0; i<256; i++){
68f8d33b 624 if(avctx->bits_per_raw_sample <=8){
f83c5773
MN
625 s->quant_table[0][i]= quant11[i];
626 s->quant_table[1][i]= 11*quant11[i];
627 if(avctx->context_model==0){
628 s->quant_table[2][i]= 11*11*quant11[i];
629 s->quant_table[3][i]=
630 s->quant_table[4][i]=0;
631 }else{
632 s->quant_table[2][i]= 11*11*quant5 [i];
633 s->quant_table[3][i]= 5*11*11*quant5 [i];
634 s->quant_table[4][i]= 5*5*11*11*quant5 [i];
635 }
68f8d33b
MN
636 }else{
637 s->quant_table[0][i]= quant9_10bit[i];
638 s->quant_table[1][i]= 11*quant9_10bit[i];
639 if(avctx->context_model==0){
640 s->quant_table[2][i]= 11*11*quant9_10bit[i];
641 s->quant_table[3][i]=
642 s->quant_table[4][i]=0;
643 }else{
644 s->quant_table[2][i]= 11*11*quant5_10bit[i];
645 s->quant_table[3][i]= 5*11*11*quant5_10bit[i];
646 s->quant_table[4][i]= 5*5*11*11*quant5_10bit[i];
647 }
648 }
11e659c2 649 }
5e20f836
MN
650
651 for(i=0; i<s->plane_count; i++){
652 PlaneContext * const p= &s->plane[i];
115329f1 653
11e659c2
MN
654 if(avctx->context_model==0){
655 p->context_count= (11*11*11+1)/2;
115329f1 656 }else{
11e659c2
MN
657 p->context_count= (11*11*5*5*5+1)/2;
658 }
659
660 if(s->ac){
661 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
662 }else{
663 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
664 }
5e20f836
MN
665 }
666
667 avctx->coded_frame= &s->picture;
668 switch(avctx->pix_fmt){
68f8d33b
MN
669 case PIX_FMT_YUV444P16:
670 case PIX_FMT_YUV422P16:
671 case PIX_FMT_YUV420P16:
672 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){
673 av_log(avctx, AV_LOG_ERROR, "More than 8 bit per component is still experimental and no gurantee is yet made for future compatibility\n"
674 "Use vstrict=-2 / -strict -2 to use it anyway.\n");
675 return -1;
676 }
677 if(avctx->bits_per_raw_sample <=8){
84c1b149 678 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
68f8d33b
MN
679 return -1;
680 }
681 s->version= 1;
5e20f836
MN
682 case PIX_FMT_YUV444P:
683 case PIX_FMT_YUV422P:
684 case PIX_FMT_YUV420P:
685 case PIX_FMT_YUV411P:
686 case PIX_FMT_YUV410P:
2cbb7820
MN
687 s->colorspace= 0;
688 break;
71e445fc 689 case PIX_FMT_RGB32:
2cbb7820 690 s->colorspace= 1;
5e20f836
MN
691 break;
692 default:
9b879566 693 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
5e20f836
MN
694 return -1;
695 }
2cbb7820
MN
696 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
697
5e20f836 698 s->picture_number=0;
115329f1 699
5e20f836
MN
700 return 0;
701}
f544a5fc 702#endif /* CONFIG_FFV1_ENCODER */
5e20f836
MN
703
704
705static void clear_state(FFV1Context *f){
c2f1b2cb 706 int i, j;
5e20f836
MN
707
708 for(i=0; i<f->plane_count; i++){
709 PlaneContext *p= &f->plane[i];
710
880eae9c
MN
711 p->interlace_bit_state[0]= 128;
712 p->interlace_bit_state[1]= 128;
115329f1 713
c2f1b2cb 714 for(j=0; j<p->context_count; j++){
11e659c2 715 if(f->ac){
880eae9c 716 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
11e659c2
MN
717 }else{
718 p->vlc_state[j].drift= 0;
719 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
720 p->vlc_state[j].bias= 0;
721 p->vlc_state[j].count= 1;
722 }
c2f1b2cb 723 }
5e20f836
MN
724 }
725}
726
b250f9c6 727#if CONFIG_FFV1_ENCODER
5e20f836
MN
728static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
729 FFV1Context *f = avctx->priv_data;
880eae9c 730 RangeCoder * const c= &f->c;
5e20f836
MN
731 AVFrame *pict = data;
732 const int width= f->width;
733 const int height= f->height;
734 AVFrame * const p= &f->picture;
11e659c2 735 int used_count= 0;
880eae9c
MN
736 uint8_t keystate=128;
737
738 ff_init_range_encoder(c, buf, buf_size);
880eae9c 739 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
5e20f836 740
5e20f836
MN
741 *p = *pict;
742 p->pict_type= FF_I_TYPE;
115329f1 743
5e20f836 744 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
880eae9c 745 put_rac(c, &keystate, 1);
5e20f836
MN
746 p->key_frame= 1;
747 write_header(f);
748 clear_state(f);
749 }else{
880eae9c 750 put_rac(c, &keystate, 0);
5e20f836
MN
751 p->key_frame= 0;
752 }
753
11e659c2 754 if(!f->ac){
880eae9c 755 used_count += ff_rac_terminate(c);
11e659c2 756//printf("pos=%d\n", used_count);
ed7debda 757 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
11e659c2 758 }
115329f1 759
2cbb7820 760 if(f->colorspace==0){
5e20f836
MN
761 const int chroma_width = -((-width )>>f->chroma_h_shift);
762 const int chroma_height= -((-height)>>f->chroma_v_shift);
763
764 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
765
766 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
27fc5352 767 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
2cbb7820
MN
768 }else{
769 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
5e20f836
MN
770 }
771 emms_c();
115329f1 772
5e20f836
MN
773 f->picture_number++;
774
11e659c2 775 if(f->ac){
880eae9c 776 return ff_rac_terminate(c);
11e659c2
MN
777 }else{
778 flush_put_bits(&f->pb); //nicer padding FIXME
fe455f33 779 return used_count + (put_bits_count(&f->pb)+7)/8;
11e659c2 780 }
5e20f836 781}
f544a5fc 782#endif /* CONFIG_FFV1_ENCODER */
5e20f836 783
98a6fff9 784static av_cold int common_end(AVCodecContext *avctx){
0c2aaa88 785 FFV1Context *s = avctx->priv_data;
115329f1 786 int i;
5e20f836
MN
787
788 for(i=0; i<s->plane_count; i++){
789 PlaneContext *p= &s->plane[i];
790
791 av_freep(&p->state);
3caffb7d 792 av_freep(&p->vlc_state);
5e20f836 793 }
5e20f836
MN
794
795 return 0;
796}
797
217d34e3 798static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
5e20f836 799 PlaneContext * const p= &s->plane[plane_index];
880eae9c 800 RangeCoder * const c= &s->c;
2cbb7820
MN
801 int x;
802 int run_count=0;
803 int run_mode=0;
804 int run_index= s->run_index;
805
806 for(x=0; x<w; x++){
807 int diff, context, sign;
115329f1 808
2cbb7820
MN
809 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
810 if(context < 0){
811 context= -context;
812 sign=1;
813 }else
814 sign=0;
115329f1 815
2cbb7820 816
d34a0746 817 if(s->ac){
217d34e3 818 diff= get_symbol_inline(c, p->state[context], 1);
d34a0746 819 }else{
2cbb7820 820 if(context == 0 && run_mode==0) run_mode=1;
115329f1 821
2cbb7820
MN
822 if(run_mode){
823 if(run_count==0 && run_mode==1){
824 if(get_bits1(&s->gb)){
b3bf98aa 825 run_count = 1<<ff_log2_run[run_index];
2cbb7820
MN
826 if(x + run_count <= w) run_index++;
827 }else{
b3bf98aa 828 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
2cbb7820
MN
829 else run_count=0;
830 if(run_index) run_index--;
831 run_mode=2;
832 }
833 }
834 run_count--;
835 if(run_count < 0){
836 run_mode=0;
837 run_count=0;
838 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
839 if(diff>=0) diff++;
840 }else
841 diff=0;
842 }else
843 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
115329f1 844
2cbb7820
MN
845// 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));
846 }
847
848 if(sign) diff= -diff;
849
850 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
851 }
115329f1 852 s->run_index= run_index;
2cbb7820
MN
853}
854
855static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
856 int x, y;
857 int_fast16_t sample_buffer[2][w+6];
d1845b4c
CEH
858 int_fast16_t *sample[2];
859 sample[0]=sample_buffer[0]+3;
860 sample[1]=sample_buffer[1]+3;
2cbb7820
MN
861
862 s->run_index=0;
115329f1 863
d9ced4ca 864 memset(sample_buffer, 0, sizeof(sample_buffer));
115329f1 865
5e20f836 866 for(y=0; y<h; y++){
2cbb7820 867 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
5e20f836 868
d9ced4ca
MN
869 sample[0]= sample[1];
870 sample[1]= temp;
5e20f836 871
d9ced4ca
MN
872 sample[1][-1]= sample[0][0 ];
873 sample[0][ w]= sample[0][w-1];
115329f1 874
2cbb7820 875//{START_TIMER
68f8d33b 876 if(s->avctx->bits_per_raw_sample <= 8){
f83c5773
MN
877 decode_line(s, w, sample, plane_index, 8);
878 for(x=0; x<w; x++){
879 src[x + stride*y]= sample[1][x];
880 }
68f8d33b
MN
881 }else{
882 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
883 for(x=0; x<w; x++){
884 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
885 }
886 }
2cbb7820
MN
887//STOP_TIMER("decode-line")}
888 }
889}
5e20f836 890
2cbb7820
MN
891static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
892 int x, y, p;
893 int_fast16_t sample_buffer[3][2][w+6];
d1845b4c
CEH
894 int_fast16_t *sample[3][2];
895 for(x=0; x<3; x++){
896 sample[x][0] = sample_buffer[x][0]+3;
897 sample[x][1] = sample_buffer[x][1]+3;
898 }
2cbb7820
MN
899
900 s->run_index=0;
115329f1 901
2cbb7820 902 memset(sample_buffer, 0, sizeof(sample_buffer));
115329f1 903
2cbb7820
MN
904 for(y=0; y<h; y++){
905 for(p=0; p<3; p++){
906 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
907
908 sample[p][0]= sample[p][1];
909 sample[p][1]= temp;
5e20f836 910
2cbb7820
MN
911 sample[p][1][-1]= sample[p][0][0 ];
912 sample[p][0][ w]= sample[p][0][w-1];
913 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
914 }
915 for(x=0; x<w; x++){
916 int g= sample[0][1][x];
917 int b= sample[1][1][x];
918 int r= sample[2][1][x];
11e659c2 919
2cbb7820
MN
920// assert(g>=0 && b>=0 && r>=0);
921// assert(g<256 && b<512 && r<512);
115329f1 922
2cbb7820
MN
923 b -= 0x100;
924 r -= 0x100;
925 g -= (b + r)>>2;
926 b += g;
927 r += g;
115329f1 928
2cbb7820 929 src[x + stride*y]= b + (g<<8) + (r<<16);
5e20f836
MN
930 }
931 }
932}
933
880eae9c 934static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
5e20f836
MN
935 int v;
936 int i=0;
880eae9c
MN
937 uint8_t state[CONTEXT_SIZE];
938
939 memset(state, 128, sizeof(state));
5e20f836 940
11e659c2 941 for(v=0; i<128 ; v++){
d34a0746 942 int len= get_symbol(c, state, 0) + 1;
5e20f836 943
11e659c2 944 if(len + i > 128) return -1;
115329f1 945
5e20f836 946 while(len--){
11e659c2
MN
947 quant_table[i] = scale*v;
948 i++;
5e20f836
MN
949//printf("%2d ",v);
950//if(i%16==0) printf("\n");
951 }
952 }
11e659c2
MN
953
954 for(i=1; i<128; i++){
955 quant_table[256-i]= -quant_table[i];
956 }
957 quant_table[128]= -quant_table[127];
115329f1 958
11e659c2 959 return 2*v - 1;
5e20f836
MN
960}
961
962static int read_header(FFV1Context *f){
880eae9c 963 uint8_t state[CONTEXT_SIZE];
11e659c2 964 int i, context_count;
880eae9c 965 RangeCoder * const c= &f->c;
115329f1 966
880eae9c
MN
967 memset(state, 128, sizeof(state));
968
d34a0746
MN
969 f->version= get_symbol(c, state, 0);
970 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
971 f->colorspace= get_symbol(c, state, 0); //YUV cs type
68f8d33b
MN
972 if(f->version>0)
973 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
880eae9c 974 get_rac(c, state); //no chroma = false
d34a0746
MN
975 f->chroma_h_shift= get_symbol(c, state, 0);
976 f->chroma_v_shift= get_symbol(c, state, 0);
880eae9c 977 get_rac(c, state); //transparency plane
27fc5352 978 f->plane_count= 2;
085565f7 979
2cbb7820 980 if(f->colorspace==0){
68f8d33b 981 if(f->avctx->bits_per_raw_sample<=8){
f83c5773
MN
982 switch(16*f->chroma_h_shift + f->chroma_v_shift){
983 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
984 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
985 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
986 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
987 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
988 default:
989 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
990 return -1;
991 }
68f8d33b
MN
992 }else{
993 switch(16*f->chroma_h_shift + f->chroma_v_shift){
994 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
995 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
996 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
997 default:
998 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
999 return -1;
1000 }
1001 }
2cbb7820
MN
1002 }else if(f->colorspace==1){
1003 if(f->chroma_h_shift || f->chroma_v_shift){
9b879566 1004 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
2cbb7820
MN
1005 return -1;
1006 }
71e445fc 1007 f->avctx->pix_fmt= PIX_FMT_RGB32;
2cbb7820 1008 }else{
9b879566 1009 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
085565f7
MN
1010 return -1;
1011 }
2cbb7820 1012
085565f7
MN
1013//printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1014
11e659c2
MN
1015 context_count=1;
1016 for(i=0; i<5; i++){
1017 context_count*= read_quant_table(c, f->quant_table[i], context_count);
0ecca7a4 1018 if(context_count < 0 || context_count > 32768){
9b879566 1019 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
085565f7
MN
1020 return -1;
1021 }
11e659c2
MN
1022 }
1023 context_count= (context_count+1)/2;
115329f1 1024
5e20f836
MN
1025 for(i=0; i<f->plane_count; i++){
1026 PlaneContext * const p= &f->plane[i];
1027
11e659c2
MN
1028 p->context_count= context_count;
1029
1030 if(f->ac){
1031 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1032 }else{
1033 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1034 }
5e20f836 1035 }
115329f1 1036
5e20f836
MN
1037 return 0;
1038}
1039
98a6fff9 1040static av_cold int decode_init(AVCodecContext *avctx)
5e20f836 1041{
11e659c2 1042// FFV1Context *s = avctx->priv_data;
5e20f836
MN
1043
1044 common_init(avctx);
115329f1 1045
5e20f836
MN
1046 return 0;
1047}
1048
7a00bbad
TB
1049static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1050 const uint8_t *buf = avpkt->data;
1051 int buf_size = avpkt->size;
5e20f836 1052 FFV1Context *f = avctx->priv_data;
880eae9c 1053 RangeCoder * const c= &f->c;
5e20f836
MN
1054 const int width= f->width;
1055 const int height= f->height;
1056 AVFrame * const p= &f->picture;
1057 int bytes_read;
880eae9c 1058 uint8_t keystate= 128;
5e20f836
MN
1059
1060 AVFrame *picture = data;
1061
880eae9c
MN
1062 ff_init_range_decoder(c, buf, buf_size);
1063 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
e5017ab8 1064
5e20f836 1065
5e20f836 1066 p->pict_type= FF_I_TYPE; //FIXME I vs. P
880eae9c 1067 if(get_rac(c, &keystate)){
5e20f836 1068 p->key_frame= 1;
ee7388c9
MN
1069 if(read_header(f) < 0)
1070 return -1;
5e20f836
MN
1071 clear_state(f);
1072 }else{
1073 p->key_frame= 0;
1074 }
ee7388c9
MN
1075 if(!f->plane[0].state && !f->plane[0].vlc_state)
1076 return -1;
085565f7
MN
1077
1078 p->reference= 0;
1079 if(avctx->get_buffer(avctx, p) < 0){
9b879566 1080 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
085565f7
MN
1081 return -1;
1082 }
1083
5e20f836 1084 if(avctx->debug&FF_DEBUG_PICT_INFO)
9b879566 1085 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
115329f1 1086
11e659c2 1087 if(!f->ac){
880eae9c
MN
1088 bytes_read = c->bytestream - c->bytestream_start - 1;
1089 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
11e659c2
MN
1090//printf("pos=%d\n", bytes_read);
1091 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
1df1df0b
FB
1092 } else {
1093 bytes_read = 0; /* avoid warning */
11e659c2 1094 }
115329f1 1095
2cbb7820 1096 if(f->colorspace==0){
5e20f836
MN
1097 const int chroma_width = -((-width )>>f->chroma_h_shift);
1098 const int chroma_height= -((-height)>>f->chroma_v_shift);
1099 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
115329f1 1100
5e20f836 1101 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
27fc5352 1102 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
2cbb7820
MN
1103 }else{
1104 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
5e20f836 1105 }
115329f1 1106
5e20f836
MN
1107 emms_c();
1108
1109 f->picture_number++;
1110
1111 *picture= *p;
115329f1 1112
5e20f836
MN
1113 avctx->release_buffer(avctx, p); //FIXME
1114
1115 *data_size = sizeof(AVFrame);
115329f1 1116
11e659c2 1117 if(f->ac){
880eae9c 1118 bytes_read= c->bytestream - c->bytestream_start - 1;
9b879566 1119 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
11e659c2
MN
1120 }else{
1121 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1122 }
1123
5e20f836
MN
1124 return bytes_read;
1125}
1126
5e20f836
MN
1127AVCodec ffv1_decoder = {
1128 "ffv1",
1129 CODEC_TYPE_VIDEO,
1130 CODEC_ID_FFV1,
1131 sizeof(FFV1Context),
1132 decode_init,
1133 NULL,
0c2aaa88 1134 common_end,
5e20f836 1135 decode_frame,
c2f1b2cb 1136 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
038f846e 1137 NULL,
7c6208d4 1138 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
5e20f836
MN
1139};
1140
b250f9c6 1141#if CONFIG_FFV1_ENCODER
5e20f836
MN
1142AVCodec ffv1_encoder = {
1143 "ffv1",
1144 CODEC_TYPE_VIDEO,
1145 CODEC_ID_FFV1,
1146 sizeof(FFV1Context),
1147 encode_init,
1148 encode_frame,
0c2aaa88 1149 common_end,
68f8d33b 1150 .pix_fmts= (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},
7c6208d4 1151 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
5e20f836 1152};
2a250222 1153#endif