Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
[FFMpeg-mirror/lagarith.git] / libavcodec / ffv1.c
blobcd361f7f439ffabfea843f66695e9cd53581b545
1 /*
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
23 /**
24 * @file libavcodec/ffv1.c
25 * FF Video Codec 1 (an experimental lossless codec)
28 #include "avcodec.h"
29 #include "get_bits.h"
30 #include "put_bits.h"
31 #include "dsputil.h"
32 #include "rangecoder.h"
33 #include "golomb.h"
34 #include "mathops.h"
36 #define MAX_PLANES 4
37 #define CONTEXT_SIZE 32
39 extern const uint8_t ff_log2_run[32];
41 static const int8_t quant3[256]={
42 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
56 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
57 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
60 static const int8_t quant5_10bit[256]={
61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
66 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
67 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
68 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
71 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
72 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
73 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,
74 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
76 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
79 static const int8_t quant5[256]={
80 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
90 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
91 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
92 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
93 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
94 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
95 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
97 static const int8_t quant7[256]={
98 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
101 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
108 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
109 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
110 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
111 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
112 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
113 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
115 static const int8_t quant9[256]={
116 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
118 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
119 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
120 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
121 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
122 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
123 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
126 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
127 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
128 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
129 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
130 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
131 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
133 static const int8_t quant9_10bit[256]={
134 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
135 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
138 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
139 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
140 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
141 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
142 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
145 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
146 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
147 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
148 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
149 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
152 static const int8_t quant11[256]={
153 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
154 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
155 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
157 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
158 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
159 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
160 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
161 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
162 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
163 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
164 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
165 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
166 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
167 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
168 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
170 static const int8_t quant13[256]={
171 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
172 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
173 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
174 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
175 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
176 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
177 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
178 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
179 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
180 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
181 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
182 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
183 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
184 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
185 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
186 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
189 typedef struct VlcState{
190 int16_t drift;
191 uint16_t error_sum;
192 int8_t bias;
193 uint8_t count;
194 } VlcState;
196 typedef struct PlaneContext{
197 int context_count;
198 uint8_t (*state)[CONTEXT_SIZE];
199 VlcState *vlc_state;
200 uint8_t interlace_bit_state[2];
201 } PlaneContext;
203 typedef struct FFV1Context{
204 AVCodecContext *avctx;
205 RangeCoder c;
206 GetBitContext gb;
207 PutBitContext pb;
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;
215 int ac; ///< 1-> CABAC 0-> golomb rice
216 PlaneContext plane[MAX_PLANES];
217 int16_t quant_table[5][256];
218 int run_index;
219 int colorspace;
221 DSPContext dsp;
222 }FFV1Context;
224 static av_always_inline int fold(int diff, int bits){
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);
233 return diff;
236 static inline int predict(int_fast16_t *src, int_fast16_t *last){
237 const int LT= last[-1];
238 const int T= last[ 0];
239 const int L = src[-1];
241 return mid_pred(L, L + T - LT, T);
244 static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
245 const int LT= last[-1];
246 const int T= last[ 0];
247 const int RT= last[ 1];
248 const int L = src[-1];
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];
259 static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){
260 int i;
262 if(v){
263 const int a= FFABS(v);
264 const int e= av_log2(a);
265 put_rac(c, state+0, 0);
266 if(e<=9){
267 for(i=0; i<e; i++){
268 put_rac(c, state+1+i, 1); //1..10
270 put_rac(c, state+1+i, 0);
272 for(i=e-1; i>=0; i--){
273 put_rac(c, state+22+i, (a>>i)&1); //22..31
276 if(is_signed)
277 put_rac(c, state+11 + e, v < 0); //11..21
278 }else{
279 for(i=0; i<e; i++){
280 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
282 put_rac(c, state+1+9, 0);
284 for(i=e-1; i>=0; i--){
285 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
288 if(is_signed)
289 put_rac(c, state+11 + 10, v < 0); //11..21
291 }else{
292 put_rac(c, state+0, 1);
296 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
297 put_symbol_inline(c, state, v, is_signed);
300 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
301 if(get_rac(c, state+0))
302 return 0;
303 else{
304 int i, e, a;
305 e= 0;
306 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
307 e++;
310 a= 1;
311 for(i=e-1; i>=0; i--){
312 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
315 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
316 return (a^e)-e;
320 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
321 return get_symbol_inline(c, state, is_signed);
324 static inline void update_vlc_state(VlcState * const state, const int v){
325 int drift= state->drift;
326 int count= state->count;
327 state->error_sum += FFABS(v);
328 drift += v;
330 if(count == 128){ //FIXME variable
331 count >>= 1;
332 drift >>= 1;
333 state->error_sum >>= 1;
335 count++;
337 if(drift <= -count){
338 if(state->bias > -128) state->bias--;
340 drift += count;
341 if(drift <= -count)
342 drift= -count + 1;
343 }else if(drift > 0){
344 if(state->bias < 127) state->bias++;
346 drift -= count;
347 if(drift > 0)
348 drift= 0;
351 state->drift= drift;
352 state->count= count;
355 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
356 int i, k, code;
357 //printf("final: %d ", v);
358 v = fold(v - state->bias, bits);
360 i= state->count;
361 k=0;
362 while(i < state->error_sum){ //FIXME optimize
363 k++;
364 i += i;
367 assert(k<=8);
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
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);
377 set_sr_golomb(pb, code, k, 12, bits);
379 update_vlc_state(state, v);
382 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
383 int k, i, v, ret;
385 i= state->count;
386 k=0;
387 while(i < state->error_sum){ //FIXME optimize
388 k++;
389 i += i;
392 assert(k<=8);
394 v= get_sr_golomb(gb, k, 12, bits);
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);
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);
401 #endif
403 ret= fold(v + state->bias, bits);
405 update_vlc_state(state, v);
406 //printf("final: %d\n", ret);
407 return ret;
410 #if CONFIG_FFV1_ENCODER
411 static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
412 PlaneContext * const p= &s->plane[plane_index];
413 RangeCoder * const c= &s->c;
414 int x;
415 int run_index= s->run_index;
416 int run_count=0;
417 int run_mode=0;
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;
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;
431 for(x=0; x<w; x++){
432 int diff, context;
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);
437 if(context < 0){
438 context = -context;
439 diff= -diff;
442 diff= fold(diff, bits);
444 if(s->ac){
445 put_symbol_inline(c, p->state[context], diff, 1);
446 }else{
447 if(context == 0) run_mode=1;
449 if(run_mode){
451 if(diff){
452 while(run_count >= 1<<ff_log2_run[run_index]){
453 run_count -= 1<<ff_log2_run[run_index];
454 run_index++;
455 put_bits(&s->pb, 1, 1);
458 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
459 if(run_index) run_index--;
460 run_count=0;
461 run_mode=0;
462 if(diff>0) diff--;
463 }else{
464 run_count++;
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));
470 if(run_mode == 0)
471 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
474 if(run_mode){
475 while(run_count >= 1<<ff_log2_run[run_index]){
476 run_count -= 1<<ff_log2_run[run_index];
477 run_index++;
478 put_bits(&s->pb, 1, 1);
481 if(run_count)
482 put_bits(&s->pb, 1, 1);
484 s->run_index= run_index;
486 return 0;
489 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
490 int x,y,i;
491 const int ring_size= s->avctx->context_model ? 3 : 2;
492 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
493 s->run_index=0;
495 memset(sample_buffer, 0, sizeof(sample_buffer));
497 for(y=0; y<h; y++){
498 for(i=0; i<ring_size; i++)
499 sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
501 sample[0][-1]= sample[1][0 ];
502 sample[1][ w]= sample[1][w-1];
503 //{START_TIMER
504 if(s->avctx->bits_per_raw_sample<=8){
505 for(x=0; x<w; x++){
506 sample[0][x]= src[x + stride*y];
508 encode_line(s, w, sample, plane_index, 8);
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);
513 encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
515 //STOP_TIMER("encode line")}
519 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
520 int x, y, p, i;
521 const int ring_size= s->avctx->context_model ? 3 : 2;
522 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
523 s->run_index=0;
525 memset(sample_buffer, 0, sizeof(sample_buffer));
527 for(y=0; y<h; y++){
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;
532 for(x=0; x<w; x++){
533 int v= src[x + stride*y];
534 int b= v&0xFF;
535 int g= (v>>8)&0xFF;
536 int r= (v>>16)&0xFF;
538 b -= g;
539 r -= g;
540 g += (b + r)>>2;
541 b += 0x100;
542 r += 0x100;
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;
550 for(p=0; p<3; p++){
551 sample[p][0][-1]= sample[p][1][0 ];
552 sample[p][1][ w]= sample[p][1][w-1];
553 encode_line(s, w, sample[p], FFMIN(p, 1), 9);
558 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
559 int last=0;
560 int i;
561 uint8_t state[CONTEXT_SIZE];
562 memset(state, 128, sizeof(state));
564 for(i=1; i<128 ; i++){
565 if(quant_table[i] != quant_table[i-1]){
566 put_symbol(c, state, i-last-1, 0);
567 last= i;
570 put_symbol(c, state, i-last-1, 0);
573 static void write_header(FFV1Context *f){
574 uint8_t state[CONTEXT_SIZE];
575 int i;
576 RangeCoder * const c= &f->c;
578 memset(state, 128, sizeof(state));
580 put_symbol(c, state, f->version, 0);
581 put_symbol(c, state, f->avctx->coder_type, 0);
582 put_symbol(c, state, f->colorspace, 0); //YUV cs type
583 if(f->version>0)
584 put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
585 put_rac(c, state, 1); //chroma planes
586 put_symbol(c, state, f->chroma_h_shift, 0);
587 put_symbol(c, state, f->chroma_v_shift, 0);
588 put_rac(c, state, 0); //no transparency plane
590 for(i=0; i<5; i++)
591 write_quant_table(c, f->quant_table[i]);
593 #endif /* CONFIG_FFV1_ENCODER */
595 static av_cold int common_init(AVCodecContext *avctx){
596 FFV1Context *s = avctx->priv_data;
598 s->avctx= avctx;
599 s->flags= avctx->flags;
601 dsputil_init(&s->dsp, avctx);
603 s->width = avctx->width;
604 s->height= avctx->height;
606 assert(s->width && s->height);
608 return 0;
611 #if CONFIG_FFV1_ENCODER
612 static av_cold int encode_init(AVCodecContext *avctx)
614 FFV1Context *s = avctx->priv_data;
615 int i;
617 common_init(avctx);
619 s->version=0;
620 s->ac= avctx->coder_type;
622 s->plane_count=2;
623 for(i=0; i<256; i++){
624 if(avctx->bits_per_raw_sample <=8){
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];
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];
651 for(i=0; i<s->plane_count; i++){
652 PlaneContext * const p= &s->plane[i];
654 if(avctx->context_model==0){
655 p->context_count= (11*11*11+1)/2;
656 }else{
657 p->context_count= (11*11*5*5*5+1)/2;
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));
667 avctx->coded_frame= &s->picture;
668 switch(avctx->pix_fmt){
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;
677 if(avctx->bits_per_raw_sample <=8){
678 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample inavlid\n");
679 return -1;
681 s->version= 1;
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:
687 s->colorspace= 0;
688 break;
689 case PIX_FMT_RGB32:
690 s->colorspace= 1;
691 break;
692 default:
693 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
694 return -1;
696 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
698 s->picture_number=0;
700 return 0;
702 #endif /* CONFIG_FFV1_ENCODER */
705 static void clear_state(FFV1Context *f){
706 int i, j;
708 for(i=0; i<f->plane_count; i++){
709 PlaneContext *p= &f->plane[i];
711 p->interlace_bit_state[0]= 128;
712 p->interlace_bit_state[1]= 128;
714 for(j=0; j<p->context_count; j++){
715 if(f->ac){
716 memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
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;
727 #if CONFIG_FFV1_ENCODER
728 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
729 FFV1Context *f = avctx->priv_data;
730 RangeCoder * const c= &f->c;
731 AVFrame *pict = data;
732 const int width= f->width;
733 const int height= f->height;
734 AVFrame * const p= &f->picture;
735 int used_count= 0;
736 uint8_t keystate=128;
738 ff_init_range_encoder(c, buf, buf_size);
739 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
740 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
742 *p = *pict;
743 p->pict_type= FF_I_TYPE;
745 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
746 put_rac(c, &keystate, 1);
747 p->key_frame= 1;
748 write_header(f);
749 clear_state(f);
750 }else{
751 put_rac(c, &keystate, 0);
752 p->key_frame= 0;
755 if(!f->ac){
756 used_count += ff_rac_terminate(c);
757 //printf("pos=%d\n", used_count);
758 init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
761 if(f->colorspace==0){
762 const int chroma_width = -((-width )>>f->chroma_h_shift);
763 const int chroma_height= -((-height)>>f->chroma_v_shift);
765 encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
767 encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
768 encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
769 }else{
770 encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
772 emms_c();
774 f->picture_number++;
776 if(f->ac){
777 return ff_rac_terminate(c);
778 }else{
779 flush_put_bits(&f->pb); //nicer padding FIXME
780 return used_count + (put_bits_count(&f->pb)+7)/8;
783 #endif /* CONFIG_FFV1_ENCODER */
785 static av_cold int common_end(AVCodecContext *avctx){
786 FFV1Context *s = avctx->priv_data;
787 int i;
789 for(i=0; i<s->plane_count; i++){
790 PlaneContext *p= &s->plane[i];
792 av_freep(&p->state);
793 av_freep(&p->vlc_state);
796 return 0;
799 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
800 PlaneContext * const p= &s->plane[plane_index];
801 RangeCoder * const c= &s->c;
802 int x;
803 int run_count=0;
804 int run_mode=0;
805 int run_index= s->run_index;
807 for(x=0; x<w; x++){
808 int diff, context, sign;
810 context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
811 if(context < 0){
812 context= -context;
813 sign=1;
814 }else
815 sign=0;
818 if(s->ac){
819 diff= get_symbol_inline(c, p->state[context], 1);
820 }else{
821 if(context == 0 && run_mode==0) run_mode=1;
823 if(run_mode){
824 if(run_count==0 && run_mode==1){
825 if(get_bits1(&s->gb)){
826 run_count = 1<<ff_log2_run[run_index];
827 if(x + run_count <= w) run_index++;
828 }else{
829 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
830 else run_count=0;
831 if(run_index) run_index--;
832 run_mode=2;
835 run_count--;
836 if(run_count < 0){
837 run_mode=0;
838 run_count=0;
839 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
840 if(diff>=0) diff++;
841 }else
842 diff=0;
843 }else
844 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
846 // 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));
849 if(sign) diff= -diff;
851 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
853 s->run_index= run_index;
856 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
857 int x, y;
858 int_fast16_t sample_buffer[2][w+6];
859 int_fast16_t *sample[2];
860 sample[0]=sample_buffer[0]+3;
861 sample[1]=sample_buffer[1]+3;
863 s->run_index=0;
865 memset(sample_buffer, 0, sizeof(sample_buffer));
867 for(y=0; y<h; y++){
868 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
870 sample[0]= sample[1];
871 sample[1]= temp;
873 sample[1][-1]= sample[0][0 ];
874 sample[0][ w]= sample[0][w-1];
876 //{START_TIMER
877 if(s->avctx->bits_per_raw_sample <= 8){
878 decode_line(s, w, sample, plane_index, 8);
879 for(x=0; x<w; x++){
880 src[x + stride*y]= sample[1][x];
882 }else{
883 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
884 for(x=0; x<w; x++){
885 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
888 //STOP_TIMER("decode-line")}
892 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
893 int x, y, p;
894 int_fast16_t sample_buffer[3][2][w+6];
895 int_fast16_t *sample[3][2];
896 for(x=0; x<3; x++){
897 sample[x][0] = sample_buffer[x][0]+3;
898 sample[x][1] = sample_buffer[x][1]+3;
901 s->run_index=0;
903 memset(sample_buffer, 0, sizeof(sample_buffer));
905 for(y=0; y<h; y++){
906 for(p=0; p<3; p++){
907 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
909 sample[p][0]= sample[p][1];
910 sample[p][1]= temp;
912 sample[p][1][-1]= sample[p][0][0 ];
913 sample[p][0][ w]= sample[p][0][w-1];
914 decode_line(s, w, sample[p], FFMIN(p, 1), 9);
916 for(x=0; x<w; x++){
917 int g= sample[0][1][x];
918 int b= sample[1][1][x];
919 int r= sample[2][1][x];
921 // assert(g>=0 && b>=0 && r>=0);
922 // assert(g<256 && b<512 && r<512);
924 b -= 0x100;
925 r -= 0x100;
926 g -= (b + r)>>2;
927 b += g;
928 r += g;
930 src[x + stride*y]= b + (g<<8) + (r<<16);
935 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
936 int v;
937 int i=0;
938 uint8_t state[CONTEXT_SIZE];
940 memset(state, 128, sizeof(state));
942 for(v=0; i<128 ; v++){
943 int len= get_symbol(c, state, 0) + 1;
945 if(len + i > 128) return -1;
947 while(len--){
948 quant_table[i] = scale*v;
949 i++;
950 //printf("%2d ",v);
951 //if(i%16==0) printf("\n");
955 for(i=1; i<128; i++){
956 quant_table[256-i]= -quant_table[i];
958 quant_table[128]= -quant_table[127];
960 return 2*v - 1;
963 static int read_header(FFV1Context *f){
964 uint8_t state[CONTEXT_SIZE];
965 int i, context_count;
966 RangeCoder * const c= &f->c;
968 memset(state, 128, sizeof(state));
970 f->version= get_symbol(c, state, 0);
971 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
972 f->colorspace= get_symbol(c, state, 0); //YUV cs type
973 if(f->version>0)
974 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
975 get_rac(c, state); //no chroma = false
976 f->chroma_h_shift= get_symbol(c, state, 0);
977 f->chroma_v_shift= get_symbol(c, state, 0);
978 get_rac(c, state); //transparency plane
979 f->plane_count= 2;
981 if(f->colorspace==0){
982 if(f->avctx->bits_per_raw_sample<=8){
983 switch(16*f->chroma_h_shift + f->chroma_v_shift){
984 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
985 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
986 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
987 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
988 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
989 default:
990 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
991 return -1;
993 }else{
994 switch(16*f->chroma_h_shift + f->chroma_v_shift){
995 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
996 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
997 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
998 default:
999 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1000 return -1;
1003 }else if(f->colorspace==1){
1004 if(f->chroma_h_shift || f->chroma_v_shift){
1005 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1006 return -1;
1008 f->avctx->pix_fmt= PIX_FMT_RGB32;
1009 }else{
1010 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1011 return -1;
1014 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1016 context_count=1;
1017 for(i=0; i<5; i++){
1018 context_count*= read_quant_table(c, f->quant_table[i], context_count);
1019 if(context_count < 0 || context_count > 32768){
1020 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1021 return -1;
1024 context_count= (context_count+1)/2;
1026 for(i=0; i<f->plane_count; i++){
1027 PlaneContext * const p= &f->plane[i];
1029 p->context_count= context_count;
1031 if(f->ac){
1032 if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1033 }else{
1034 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1038 return 0;
1041 static av_cold int decode_init(AVCodecContext *avctx)
1043 // FFV1Context *s = avctx->priv_data;
1045 common_init(avctx);
1047 return 0;
1050 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1051 const uint8_t *buf = avpkt->data;
1052 int buf_size = avpkt->size;
1053 FFV1Context *f = avctx->priv_data;
1054 RangeCoder * const c= &f->c;
1055 const int width= f->width;
1056 const int height= f->height;
1057 AVFrame * const p= &f->picture;
1058 int bytes_read;
1059 uint8_t keystate= 128;
1061 AVFrame *picture = data;
1063 ff_init_range_decoder(c, buf, buf_size);
1064 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1067 p->pict_type= FF_I_TYPE; //FIXME I vs. P
1068 if(get_rac(c, &keystate)){
1069 p->key_frame= 1;
1070 if(read_header(f) < 0)
1071 return -1;
1072 clear_state(f);
1073 }else{
1074 p->key_frame= 0;
1076 if(!f->plane[0].state && !f->plane[0].vlc_state)
1077 return -1;
1079 p->reference= 0;
1080 if(avctx->get_buffer(avctx, p) < 0){
1081 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1082 return -1;
1085 if(avctx->debug&FF_DEBUG_PICT_INFO)
1086 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1088 if(!f->ac){
1089 bytes_read = c->bytestream - c->bytestream_start - 1;
1090 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1091 //printf("pos=%d\n", bytes_read);
1092 init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
1093 } else {
1094 bytes_read = 0; /* avoid warning */
1097 if(f->colorspace==0){
1098 const int chroma_width = -((-width )>>f->chroma_h_shift);
1099 const int chroma_height= -((-height)>>f->chroma_v_shift);
1100 decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
1102 decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
1103 decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
1104 }else{
1105 decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1108 emms_c();
1110 f->picture_number++;
1112 *picture= *p;
1114 avctx->release_buffer(avctx, p); //FIXME
1116 *data_size = sizeof(AVFrame);
1118 if(f->ac){
1119 bytes_read= c->bytestream - c->bytestream_start - 1;
1120 if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1121 }else{
1122 bytes_read+= (get_bits_count(&f->gb)+7)/8;
1125 return bytes_read;
1128 AVCodec ffv1_decoder = {
1129 "ffv1",
1130 CODEC_TYPE_VIDEO,
1131 CODEC_ID_FFV1,
1132 sizeof(FFV1Context),
1133 decode_init,
1134 NULL,
1135 common_end,
1136 decode_frame,
1137 CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1138 NULL,
1139 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1142 #if CONFIG_FFV1_ENCODER
1143 AVCodec ffv1_encoder = {
1144 "ffv1",
1145 CODEC_TYPE_VIDEO,
1146 CODEC_ID_FFV1,
1147 sizeof(FFV1Context),
1148 encode_init,
1149 encode_frame,
1150 common_end,
1151 .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},
1152 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1154 #endif