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
24 * @file libavcodec/ffv1.c
25 * FF Video Codec 1 (an experimental lossless codec)
29 #include "bitstream.h"
31 #include "rangecoder.h"
36 #define CONTEXT_SIZE 32
38 extern const uint8_t ff_log2_run
[32];
40 static const int8_t quant3
[256]={
41 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 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, 0,
58 static const int8_t quant5
[256]={
59 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
60 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
63 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
64 2, 2, 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,-2,
74 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
76 static const int8_t quant7
[256]={
77 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
79 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
81 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
82 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
83 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
84 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
87 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
88 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
89 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
90 -3,-3,-3,-3,-3,-3,-3,-3,-3,-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,-1,-1,
94 static const int8_t quant9
[256]={
95 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
96 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
98 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
99 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
100 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
101 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
102 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
106 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
107 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
108 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
109 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
110 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
112 static const int8_t quant11
[256]={
113 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
114 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
115 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
116 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
117 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
118 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
119 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
120 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
124 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
125 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
126 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
130 static const int8_t quant13
[256]={
131 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
132 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
133 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
134 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
135 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
136 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
137 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
138 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
140 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
141 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
142 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
143 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
144 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
145 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
146 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
149 typedef struct VlcState
{
156 typedef struct PlaneContext
{
158 uint8_t (*state
)[CONTEXT_SIZE
];
160 uint8_t interlace_bit_state
[2];
163 typedef struct FFV1Context
{
164 AVCodecContext
*avctx
;
170 int chroma_h_shift
, chroma_v_shift
;
175 int ac
; ///< 1-> CABAC 0-> golomb rice
176 PlaneContext plane
[MAX_PLANES
];
177 int16_t quant_table
[5][256];
184 static av_always_inline
int fold(int diff
, int bits
){
196 static inline int predict(int_fast16_t *src
, int_fast16_t *last
){
197 const int LT
= last
[-1];
198 const int T
= last
[ 0];
199 const int L
= src
[-1];
201 return mid_pred(L
, L
+ T
- LT
, T
);
204 static inline int get_context(FFV1Context
*f
, int_fast16_t *src
, int_fast16_t *last
, int_fast16_t *last2
){
205 const int LT
= last
[-1];
206 const int T
= last
[ 0];
207 const int RT
= last
[ 1];
208 const int L
= src
[-1];
210 if(f
->quant_table
[3][127]){
211 const int TT
= last2
[0];
212 const int LL
= src
[-2];
213 return f
->quant_table
[0][(L
-LT
) & 0xFF] + f
->quant_table
[1][(LT
-T
) & 0xFF] + f
->quant_table
[2][(T
-RT
) & 0xFF]
214 +f
->quant_table
[3][(LL
-L
) & 0xFF] + f
->quant_table
[4][(TT
-T
) & 0xFF];
216 return f
->quant_table
[0][(L
-LT
) & 0xFF] + f
->quant_table
[1][(LT
-T
) & 0xFF] + f
->quant_table
[2][(T
-RT
) & 0xFF];
219 static inline void put_symbol(RangeCoder
*c
, uint8_t *state
, int v
, int is_signed
){
223 const int a
= FFABS(v
);
224 const int e
= av_log2(a
);
225 put_rac(c
, state
+0, 0);
230 put_rac(c
, state
+1+i
, 1); //1..10
232 put_rac(c
, state
+1+i
, 0);
234 for(i
=e
-1; i
>=0; i
--){
235 put_rac(c
, state
+22+i
, (a
>>i
)&1); //22..31
239 put_rac(c
, state
+11 + e
, v
< 0); //11..21
241 put_rac(c
, state
+0, 1);
245 static inline int get_symbol(RangeCoder
*c
, uint8_t *state
, int is_signed
){
246 if(get_rac(c
, state
+0))
251 while(get_rac(c
, state
+1 + e
)){ //1..10
257 for(i
=e
-1; i
>=0; i
--){
258 a
+= a
+ get_rac(c
, state
+22 + i
); //22..31
261 if(is_signed
&& get_rac(c
, state
+11 + e
)) //11..21
268 static inline void update_vlc_state(VlcState
* const state
, const int v
){
269 int drift
= state
->drift
;
270 int count
= state
->count
;
271 state
->error_sum
+= FFABS(v
);
274 if(count
== 128){ //FIXME variable
277 state
->error_sum
>>= 1;
282 if(state
->bias
> -128) state
->bias
--;
288 if(state
->bias
< 127) state
->bias
++;
299 static inline void put_vlc_symbol(PutBitContext
*pb
, VlcState
* const state
, int v
, int bits
){
301 //printf("final: %d ", v);
302 v
= fold(v
- state
->bias
, bits
);
306 while(i
< state
->error_sum
){ //FIXME optimize
314 if(k
==0 && 2*state
->drift
<= - state
->count
) code
= v
^ (-1);
317 code
= v
^ ((2*state
->drift
+ state
->count
)>>31);
320 //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);
321 set_sr_golomb(pb
, code
, k
, 12, bits
);
323 update_vlc_state(state
, v
);
326 static inline int get_vlc_symbol(GetBitContext
*gb
, VlcState
* const state
, int bits
){
331 while(i
< state
->error_sum
){ //FIXME optimize
338 v
= get_sr_golomb(gb
, k
, 12, bits
);
339 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
342 if(k
==0 && 2*state
->drift
<= - state
->count
) v
^= (-1);
344 v
^= ((2*state
->drift
+ state
->count
)>>31);
347 ret
= fold(v
+ state
->bias
, bits
);
349 update_vlc_state(state
, v
);
350 //printf("final: %d\n", ret);
354 #if CONFIG_FFV1_ENCODER
355 static inline int encode_line(FFV1Context
*s
, int w
, int_fast16_t *sample
[2], int plane_index
, int bits
){
356 PlaneContext
* const p
= &s
->plane
[plane_index
];
357 RangeCoder
* const c
= &s
->c
;
359 int run_index
= s
->run_index
;
364 if(c
->bytestream_end
- c
->bytestream
< w
*20){
365 av_log(s
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
369 if(s
->pb
.buf_end
- s
->pb
.buf
- (put_bits_count(&s
->pb
)>>3) < w
*4){
370 av_log(s
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
378 context
= get_context(s
, sample
[0]+x
, sample
[1]+x
, sample
[2]+x
);
379 diff
= sample
[0][x
] - predict(sample
[0]+x
, sample
[1]+x
);
386 diff
= fold(diff
, bits
);
389 put_symbol(c
, p
->state
[context
], diff
, 1);
391 if(context
== 0) run_mode
=1;
396 while(run_count
>= 1<<ff_log2_run
[run_index
]){
397 run_count
-= 1<<ff_log2_run
[run_index
];
399 put_bits(&s
->pb
, 1, 1);
402 put_bits(&s
->pb
, 1 + ff_log2_run
[run_index
], run_count
);
403 if(run_index
) run_index
--;
412 // 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));
415 put_vlc_symbol(&s
->pb
, &p
->vlc_state
[context
], diff
, bits
);
419 while(run_count
>= 1<<ff_log2_run
[run_index
]){
420 run_count
-= 1<<ff_log2_run
[run_index
];
422 put_bits(&s
->pb
, 1, 1);
426 put_bits(&s
->pb
, 1, 1);
428 s
->run_index
= run_index
;
433 static void encode_plane(FFV1Context
*s
, uint8_t *src
, int w
, int h
, int stride
, int plane_index
){
435 const int ring_size
= s
->avctx
->context_model
? 3 : 2;
436 int_fast16_t sample_buffer
[ring_size
][w
+6], *sample
[ring_size
];
439 memset(sample_buffer
, 0, sizeof(sample_buffer
));
442 for(i
=0; i
<ring_size
; i
++)
443 sample
[i
]= sample_buffer
[(h
+i
-y
)%ring_size
]+3;
445 sample
[0][-1]= sample
[1][0 ];
446 sample
[1][ w
]= sample
[1][w
-1];
449 sample
[0][x
]= src
[x
+ stride
*y
];
451 encode_line(s
, w
, sample
, plane_index
, 8);
452 //STOP_TIMER("encode line")}
456 static void encode_rgb_frame(FFV1Context
*s
, uint32_t *src
, int w
, int h
, int stride
){
458 const int ring_size
= s
->avctx
->context_model
? 3 : 2;
459 int_fast16_t sample_buffer
[3][ring_size
][w
+6], *sample
[3][ring_size
];
462 memset(sample_buffer
, 0, sizeof(sample_buffer
));
465 for(i
=0; i
<ring_size
; i
++)
467 sample
[p
][i
]= sample_buffer
[p
][(h
+i
-y
)%ring_size
]+3;
470 int v
= src
[x
+ stride
*y
];
481 // assert(g>=0 && b>=0 && r>=0);
482 // assert(g<256 && b<512 && r<512);
488 sample
[p
][0][-1]= sample
[p
][1][0 ];
489 sample
[p
][1][ w
]= sample
[p
][1][w
-1];
490 encode_line(s
, w
, sample
[p
], FFMIN(p
, 1), 9);
495 static void write_quant_table(RangeCoder
*c
, int16_t *quant_table
){
498 uint8_t state
[CONTEXT_SIZE
];
499 memset(state
, 128, sizeof(state
));
501 for(i
=1; i
<128 ; i
++){
502 if(quant_table
[i
] != quant_table
[i
-1]){
503 put_symbol(c
, state
, i
-last
-1, 0);
507 put_symbol(c
, state
, i
-last
-1, 0);
510 static void write_header(FFV1Context
*f
){
511 uint8_t state
[CONTEXT_SIZE
];
513 RangeCoder
* const c
= &f
->c
;
515 memset(state
, 128, sizeof(state
));
517 put_symbol(c
, state
, f
->version
, 0);
518 put_symbol(c
, state
, f
->avctx
->coder_type
, 0);
519 put_symbol(c
, state
, f
->colorspace
, 0); //YUV cs type
520 put_rac(c
, state
, 1); //chroma planes
521 put_symbol(c
, state
, f
->chroma_h_shift
, 0);
522 put_symbol(c
, state
, f
->chroma_v_shift
, 0);
523 put_rac(c
, state
, 0); //no transparency plane
526 write_quant_table(c
, f
->quant_table
[i
]);
528 #endif /* CONFIG_FFV1_ENCODER */
530 static av_cold
int common_init(AVCodecContext
*avctx
){
531 FFV1Context
*s
= avctx
->priv_data
;
535 s
->flags
= avctx
->flags
;
537 dsputil_init(&s
->dsp
, avctx
);
539 width
= s
->width
= avctx
->width
;
540 height
= s
->height
= avctx
->height
;
542 assert(width
&& height
);
547 #if CONFIG_FFV1_ENCODER
548 static av_cold
int encode_init(AVCodecContext
*avctx
)
550 FFV1Context
*s
= avctx
->priv_data
;
556 s
->ac
= avctx
->coder_type
;
559 for(i
=0; i
<256; i
++){
560 s
->quant_table
[0][i
]= quant11
[i
];
561 s
->quant_table
[1][i
]= 11*quant11
[i
];
562 if(avctx
->context_model
==0){
563 s
->quant_table
[2][i
]= 11*11*quant11
[i
];
564 s
->quant_table
[3][i
]=
565 s
->quant_table
[4][i
]=0;
567 s
->quant_table
[2][i
]= 11*11*quant5
[i
];
568 s
->quant_table
[3][i
]= 5*11*11*quant5
[i
];
569 s
->quant_table
[4][i
]= 5*5*11*11*quant5
[i
];
573 for(i
=0; i
<s
->plane_count
; i
++){
574 PlaneContext
* const p
= &s
->plane
[i
];
576 if(avctx
->context_model
==0){
577 p
->context_count
= (11*11*11+1)/2;
579 p
->context_count
= (11*11*5*5*5+1)/2;
583 if(!p
->state
) p
->state
= av_malloc(CONTEXT_SIZE
*p
->context_count
*sizeof(uint8_t));
585 if(!p
->vlc_state
) p
->vlc_state
= av_malloc(p
->context_count
*sizeof(VlcState
));
589 avctx
->coded_frame
= &s
->picture
;
590 switch(avctx
->pix_fmt
){
591 case PIX_FMT_YUV444P
:
592 case PIX_FMT_YUV422P
:
593 case PIX_FMT_YUV420P
:
594 case PIX_FMT_YUV411P
:
595 case PIX_FMT_YUV410P
:
602 av_log(avctx
, AV_LOG_ERROR
, "format not supported\n");
605 avcodec_get_chroma_sub_sample(avctx
->pix_fmt
, &s
->chroma_h_shift
, &s
->chroma_v_shift
);
611 #endif /* CONFIG_FFV1_ENCODER */
614 static void clear_state(FFV1Context
*f
){
617 for(i
=0; i
<f
->plane_count
; i
++){
618 PlaneContext
*p
= &f
->plane
[i
];
620 p
->interlace_bit_state
[0]= 128;
621 p
->interlace_bit_state
[1]= 128;
623 for(j
=0; j
<p
->context_count
; j
++){
625 memset(p
->state
[j
], 128, sizeof(uint8_t)*CONTEXT_SIZE
);
627 p
->vlc_state
[j
].drift
= 0;
628 p
->vlc_state
[j
].error_sum
= 4; //FFMAX((RANGE + 32)/64, 2);
629 p
->vlc_state
[j
].bias
= 0;
630 p
->vlc_state
[j
].count
= 1;
636 #if CONFIG_FFV1_ENCODER
637 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
638 FFV1Context
*f
= avctx
->priv_data
;
639 RangeCoder
* const c
= &f
->c
;
640 AVFrame
*pict
= data
;
641 const int width
= f
->width
;
642 const int height
= f
->height
;
643 AVFrame
* const p
= &f
->picture
;
645 uint8_t keystate
=128;
647 ff_init_range_encoder(c
, buf
, buf_size
);
648 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
649 ff_build_rac_states(c
, 0.05*(1LL<<32), 256-8);
652 p
->pict_type
= FF_I_TYPE
;
654 if(avctx
->gop_size
==0 || f
->picture_number
% avctx
->gop_size
== 0){
655 put_rac(c
, &keystate
, 1);
660 put_rac(c
, &keystate
, 0);
665 used_count
+= ff_rac_terminate(c
);
666 //printf("pos=%d\n", used_count);
667 init_put_bits(&f
->pb
, buf
+ used_count
, buf_size
- used_count
);
670 if(f
->colorspace
==0){
671 const int chroma_width
= -((-width
)>>f
->chroma_h_shift
);
672 const int chroma_height
= -((-height
)>>f
->chroma_v_shift
);
674 encode_plane(f
, p
->data
[0], width
, height
, p
->linesize
[0], 0);
676 encode_plane(f
, p
->data
[1], chroma_width
, chroma_height
, p
->linesize
[1], 1);
677 encode_plane(f
, p
->data
[2], chroma_width
, chroma_height
, p
->linesize
[2], 1);
679 encode_rgb_frame(f
, (uint32_t*)(p
->data
[0]), width
, height
, p
->linesize
[0]/4);
686 return ff_rac_terminate(c
);
688 flush_put_bits(&f
->pb
); //nicer padding FIXME
689 return used_count
+ (put_bits_count(&f
->pb
)+7)/8;
692 #endif /* CONFIG_FFV1_ENCODER */
694 static av_cold
int common_end(AVCodecContext
*avctx
){
695 FFV1Context
*s
= avctx
->priv_data
;
698 for(i
=0; i
<s
->plane_count
; i
++){
699 PlaneContext
*p
= &s
->plane
[i
];
702 av_freep(&p
->vlc_state
);
708 static inline void decode_line(FFV1Context
*s
, int w
, int_fast16_t *sample
[2], int plane_index
, int bits
){
709 PlaneContext
* const p
= &s
->plane
[plane_index
];
710 RangeCoder
* const c
= &s
->c
;
714 int run_index
= s
->run_index
;
717 int diff
, context
, sign
;
719 context
= get_context(s
, sample
[1] + x
, sample
[0] + x
, sample
[1] + x
);
728 diff
= get_symbol(c
, p
->state
[context
], 1);
730 if(context
== 0 && run_mode
==0) run_mode
=1;
733 if(run_count
==0 && run_mode
==1){
734 if(get_bits1(&s
->gb
)){
735 run_count
= 1<<ff_log2_run
[run_index
];
736 if(x
+ run_count
<= w
) run_index
++;
738 if(ff_log2_run
[run_index
]) run_count
= get_bits(&s
->gb
, ff_log2_run
[run_index
]);
740 if(run_index
) run_index
--;
748 diff
= get_vlc_symbol(&s
->gb
, &p
->vlc_state
[context
], bits
);
753 diff
= get_vlc_symbol(&s
->gb
, &p
->vlc_state
[context
], bits
);
755 // 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));
758 if(sign
) diff
= -diff
;
760 sample
[1][x
]= (predict(sample
[1] + x
, sample
[0] + x
) + diff
) & ((1<<bits
)-1);
762 s
->run_index
= run_index
;
765 static void decode_plane(FFV1Context
*s
, uint8_t *src
, int w
, int h
, int stride
, int plane_index
){
767 int_fast16_t sample_buffer
[2][w
+6];
768 int_fast16_t *sample
[2];
769 sample
[0]=sample_buffer
[0]+3;
770 sample
[1]=sample_buffer
[1]+3;
774 memset(sample_buffer
, 0, sizeof(sample_buffer
));
777 int_fast16_t *temp
= sample
[0]; //FIXME try a normal buffer
779 sample
[0]= sample
[1];
782 sample
[1][-1]= sample
[0][0 ];
783 sample
[0][ w
]= sample
[0][w
-1];
786 decode_line(s
, w
, sample
, plane_index
, 8);
788 src
[x
+ stride
*y
]= sample
[1][x
];
790 //STOP_TIMER("decode-line")}
794 static void decode_rgb_frame(FFV1Context
*s
, uint32_t *src
, int w
, int h
, int stride
){
796 int_fast16_t sample_buffer
[3][2][w
+6];
797 int_fast16_t *sample
[3][2];
799 sample
[x
][0] = sample_buffer
[x
][0]+3;
800 sample
[x
][1] = sample_buffer
[x
][1]+3;
805 memset(sample_buffer
, 0, sizeof(sample_buffer
));
809 int_fast16_t *temp
= sample
[p
][0]; //FIXME try a normal buffer
811 sample
[p
][0]= sample
[p
][1];
814 sample
[p
][1][-1]= sample
[p
][0][0 ];
815 sample
[p
][0][ w
]= sample
[p
][0][w
-1];
816 decode_line(s
, w
, sample
[p
], FFMIN(p
, 1), 9);
819 int g
= sample
[0][1][x
];
820 int b
= sample
[1][1][x
];
821 int r
= sample
[2][1][x
];
823 // assert(g>=0 && b>=0 && r>=0);
824 // assert(g<256 && b<512 && r<512);
832 src
[x
+ stride
*y
]= b
+ (g
<<8) + (r
<<16);
837 static int read_quant_table(RangeCoder
*c
, int16_t *quant_table
, int scale
){
840 uint8_t state
[CONTEXT_SIZE
];
842 memset(state
, 128, sizeof(state
));
844 for(v
=0; i
<128 ; v
++){
845 int len
= get_symbol(c
, state
, 0) + 1;
847 if(len
+ i
> 128) return -1;
850 quant_table
[i
] = scale
*v
;
853 //if(i%16==0) printf("\n");
857 for(i
=1; i
<128; i
++){
858 quant_table
[256-i
]= -quant_table
[i
];
860 quant_table
[128]= -quant_table
[127];
865 static int read_header(FFV1Context
*f
){
866 uint8_t state
[CONTEXT_SIZE
];
867 int i
, context_count
;
868 RangeCoder
* const c
= &f
->c
;
870 memset(state
, 128, sizeof(state
));
872 f
->version
= get_symbol(c
, state
, 0);
873 f
->ac
= f
->avctx
->coder_type
= get_symbol(c
, state
, 0);
874 f
->colorspace
= get_symbol(c
, state
, 0); //YUV cs type
875 get_rac(c
, state
); //no chroma = false
876 f
->chroma_h_shift
= get_symbol(c
, state
, 0);
877 f
->chroma_v_shift
= get_symbol(c
, state
, 0);
878 get_rac(c
, state
); //transparency plane
881 if(f
->colorspace
==0){
882 switch(16*f
->chroma_h_shift
+ f
->chroma_v_shift
){
883 case 0x00: f
->avctx
->pix_fmt
= PIX_FMT_YUV444P
; break;
884 case 0x10: f
->avctx
->pix_fmt
= PIX_FMT_YUV422P
; break;
885 case 0x11: f
->avctx
->pix_fmt
= PIX_FMT_YUV420P
; break;
886 case 0x20: f
->avctx
->pix_fmt
= PIX_FMT_YUV411P
; break;
887 case 0x22: f
->avctx
->pix_fmt
= PIX_FMT_YUV410P
; break;
889 av_log(f
->avctx
, AV_LOG_ERROR
, "format not supported\n");
892 }else if(f
->colorspace
==1){
893 if(f
->chroma_h_shift
|| f
->chroma_v_shift
){
894 av_log(f
->avctx
, AV_LOG_ERROR
, "chroma subsampling not supported in this colorspace\n");
897 f
->avctx
->pix_fmt
= PIX_FMT_RGB32
;
899 av_log(f
->avctx
, AV_LOG_ERROR
, "colorspace not supported\n");
903 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
907 context_count
*= read_quant_table(c
, f
->quant_table
[i
], context_count
);
908 if(context_count
< 0 || context_count
> 32768){
909 av_log(f
->avctx
, AV_LOG_ERROR
, "read_quant_table error\n");
913 context_count
= (context_count
+1)/2;
915 for(i
=0; i
<f
->plane_count
; i
++){
916 PlaneContext
* const p
= &f
->plane
[i
];
918 p
->context_count
= context_count
;
921 if(!p
->state
) p
->state
= av_malloc(CONTEXT_SIZE
*p
->context_count
*sizeof(uint8_t));
923 if(!p
->vlc_state
) p
->vlc_state
= av_malloc(p
->context_count
*sizeof(VlcState
));
930 static av_cold
int decode_init(AVCodecContext
*avctx
)
932 // FFV1Context *s = avctx->priv_data;
939 static int decode_frame(AVCodecContext
*avctx
, void *data
, int *data_size
, const uint8_t *buf
, int buf_size
){
940 FFV1Context
*f
= avctx
->priv_data
;
941 RangeCoder
* const c
= &f
->c
;
942 const int width
= f
->width
;
943 const int height
= f
->height
;
944 AVFrame
* const p
= &f
->picture
;
946 uint8_t keystate
= 128;
948 AVFrame
*picture
= data
;
950 ff_init_range_decoder(c
, buf
, buf_size
);
951 ff_build_rac_states(c
, 0.05*(1LL<<32), 256-8);
954 p
->pict_type
= FF_I_TYPE
; //FIXME I vs. P
955 if(get_rac(c
, &keystate
)){
957 if(read_header(f
) < 0)
963 if(!f
->plane
[0].state
&& !f
->plane
[0].vlc_state
)
967 if(avctx
->get_buffer(avctx
, p
) < 0){
968 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
972 if(avctx
->debug
&FF_DEBUG_PICT_INFO
)
973 av_log(avctx
, AV_LOG_ERROR
, "keyframe:%d coder:%d\n", p
->key_frame
, f
->ac
);
976 bytes_read
= c
->bytestream
- c
->bytestream_start
- 1;
977 if(bytes_read
==0) av_log(avctx
, AV_LOG_ERROR
, "error at end of AC stream\n"); //FIXME
978 //printf("pos=%d\n", bytes_read);
979 init_get_bits(&f
->gb
, buf
+ bytes_read
, buf_size
- bytes_read
);
981 bytes_read
= 0; /* avoid warning */
984 if(f
->colorspace
==0){
985 const int chroma_width
= -((-width
)>>f
->chroma_h_shift
);
986 const int chroma_height
= -((-height
)>>f
->chroma_v_shift
);
987 decode_plane(f
, p
->data
[0], width
, height
, p
->linesize
[0], 0);
989 decode_plane(f
, p
->data
[1], chroma_width
, chroma_height
, p
->linesize
[1], 1);
990 decode_plane(f
, p
->data
[2], chroma_width
, chroma_height
, p
->linesize
[2], 1);
992 decode_rgb_frame(f
, (uint32_t*)p
->data
[0], width
, height
, p
->linesize
[0]/4);
1001 avctx
->release_buffer(avctx
, p
); //FIXME
1003 *data_size
= sizeof(AVFrame
);
1006 bytes_read
= c
->bytestream
- c
->bytestream_start
- 1;
1007 if(bytes_read
==0) av_log(f
->avctx
, AV_LOG_ERROR
, "error at end of frame\n");
1009 bytes_read
+= (get_bits_count(&f
->gb
)+7)/8;
1015 AVCodec ffv1_decoder
= {
1019 sizeof(FFV1Context
),
1024 CODEC_CAP_DR1
/*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1026 .long_name
= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1029 #if CONFIG_FFV1_ENCODER
1030 AVCodec ffv1_encoder
= {
1034 sizeof(FFV1Context
),
1038 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_YUV444P
, PIX_FMT_YUV422P
, PIX_FMT_YUV411P
, PIX_FMT_YUV410P
, PIX_FMT_RGB32
, PIX_FMT_NONE
},
1039 .long_name
= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),