2 * FFV1 codec for libavcodec
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * FF Video Codec 1 (a lossless codec)
32 #include "rangecoder.h"
35 #include "libavutil/pixdesc.h"
36 #include "libavutil/avassert.h"
39 #define CONTEXT_SIZE 32
41 #define MAX_QUANT_TABLES 8
42 #define MAX_CONTEXT_INPUTS 5
44 extern const uint8_t ff_log2_run[41];
46 static const int8_t quant5_10bit[256]={
47 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
51 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
52 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
53 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
54 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
55 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
56 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
57 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
58 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
59 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,
60 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
62 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
65 static const int8_t quant5[256]={
66 0, 1, 1, 1, 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,-2,-2,-2,
75 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
76 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
77 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-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,-2,-2,-2,-2,-2,-2,-2,-2,
80 -2,-2,-2,-2,-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,-1,-1,-1,
84 static const int8_t quant9_10bit[256]={
85 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
86 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 4, 4, 4, 4, 4, 4, 4, 4,
89 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
91 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
92 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
93 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
94 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
95 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
96 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
97 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
98 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
99 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
100 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
103 static const int8_t quant11[256]={
104 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
107 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
108 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
109 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
110 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
111 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
112 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
113 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
114 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
115 -5,-5,-5,-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,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
122 static const uint8_t ver2_state[256]= {
123 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
124 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
125 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
126 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
127 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
128 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
129 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
130 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
131 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
132 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
133 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
134 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
135 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
136 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
137 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
138 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
141 typedef struct VlcState{
148 typedef struct PlaneContext{
149 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
150 int quant_table_index;
152 uint8_t (*state)[CONTEXT_SIZE];
154 uint8_t interlace_bit_state[2];
157 #define MAX_SLICES 256
159 typedef struct FFV1Context{
160 AVCodecContext *avctx;
164 uint64_t rc_stat[256][2];
165 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
168 int chroma_h_shift, chroma_v_shift;
175 int ac; ///< 1=range coder <-> 0=golomb rice
176 PlaneContext plane[MAX_PLANES];
177 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
178 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
179 int context_count[MAX_QUANT_TABLES];
180 uint8_t state_transition[256];
181 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
184 int16_t *sample_buffer;
188 int quant_table_count;
192 struct FFV1Context *slice_context[MAX_SLICES];
200 int bits_per_raw_sample;
203 static av_always_inline int fold(int diff, int bits){
215 static inline int predict(int16_t *src, int16_t *last)
217 const int LT= last[-1];
218 const int T= last[ 0];
219 const int L = src[-1];
221 return mid_pred(L, L + T - LT, T);
224 static inline int get_context(PlaneContext *p, int16_t *src,
225 int16_t *last, int16_t *last2)
227 const int LT= last[-1];
228 const int T= last[ 0];
229 const int RT= last[ 1];
230 const int L = src[-1];
232 if(p->quant_table[3][127]){
233 const int TT= last2[0];
234 const int LL= src[-2];
235 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
236 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
238 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
241 static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
246 l2tab[i]= log2(i/256.0);
248 for(i=0; i<256; i++){
249 double best_len[256];
255 for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
259 for(k=0; k<256; k++){
260 double newocc[256]={0};
261 for(m=0; m<256; m++){
263 len -=occ[m]*( p *l2tab[ m]
264 + (1-p)*l2tab[256-m]);
267 if(len < best_len[k]){
271 for(m=0; m<256; m++){
273 newocc[ one_state[ m]] += occ[m]* p ;
274 newocc[256-one_state[256-m]] += occ[m]*(1-p);
277 memcpy(occ, newocc, sizeof(occ));
283 static av_always_inline av_flatten void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed, uint64_t rc_stat[256][2], uint64_t rc_stat2[32][2]){
286 #define put_rac(C,S,B) \
290 rc_stat2[(S)-state][B]++;\
296 const int a= FFABS(v);
297 const int e= av_log2(a);
298 put_rac(c, state+0, 0);
301 put_rac(c, state+1+i, 1); //1..10
303 put_rac(c, state+1+i, 0);
305 for(i=e-1; i>=0; i--){
306 put_rac(c, state+22+i, (a>>i)&1); //22..31
310 put_rac(c, state+11 + e, v < 0); //11..21
313 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
315 put_rac(c, state+1+9, 0);
317 for(i=e-1; i>=0; i--){
318 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
322 put_rac(c, state+11 + 10, v < 0); //11..21
325 put_rac(c, state+0, 1);
330 static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
331 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
334 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
335 if(get_rac(c, state+0))
340 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
345 for(i=e-1; i>=0; i--){
346 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
349 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
354 static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
355 return get_symbol_inline(c, state, is_signed);
358 static inline void update_vlc_state(VlcState * const state, const int v){
359 int drift= state->drift;
360 int count= state->count;
361 state->error_sum += FFABS(v);
364 if(count == 128){ //FIXME variable
367 state->error_sum >>= 1;
372 if(state->bias > -128) state->bias--;
378 if(state->bias < 127) state->bias++;
389 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
391 //printf("final: %d ", v);
392 v = fold(v - state->bias, bits);
396 while(i < state->error_sum){ //FIXME optimize
404 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
407 code= v ^ ((2*state->drift + state->count)>>31);
410 //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);
411 set_sr_golomb(pb, code, k, 12, bits);
413 update_vlc_state(state, v);
416 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
421 while(i < state->error_sum){ //FIXME optimize
428 v= get_sr_golomb(gb, k, 12, bits);
429 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
432 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
434 v ^= ((2*state->drift + state->count)>>31);
437 ret= fold(v + state->bias, bits);
439 update_vlc_state(state, v);
440 //printf("final: %d\n", ret);
444 #if CONFIG_FFV1_ENCODER
445 static av_always_inline int encode_line(FFV1Context *s, int w,
447 int plane_index, int bits)
449 PlaneContext * const p= &s->plane[plane_index];
450 RangeCoder * const c= &s->c;
452 int run_index= s->run_index;
457 if(c->bytestream_end - c->bytestream < w*20){
458 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
462 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
463 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
471 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
472 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
479 diff= fold(diff, bits);
482 if(s->flags & CODEC_FLAG_PASS1){
483 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
485 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
488 if(context == 0) run_mode=1;
493 while(run_count >= 1<<ff_log2_run[run_index]){
494 run_count -= 1<<ff_log2_run[run_index];
496 put_bits(&s->pb, 1, 1);
499 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
500 if(run_index) run_index--;
509 // 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));
512 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
516 while(run_count >= 1<<ff_log2_run[run_index]){
517 run_count -= 1<<ff_log2_run[run_index];
519 put_bits(&s->pb, 1, 1);
523 put_bits(&s->pb, 1, 1);
525 s->run_index= run_index;
530 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
532 const int ring_size= s->avctx->context_model ? 3 : 2;
536 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
539 for(i=0; i<ring_size; i++)
540 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
542 sample[0][-1]= sample[1][0 ];
543 sample[1][ w]= sample[1][w-1];
545 if(s->bits_per_raw_sample<=8){
547 sample[0][x]= src[x + stride*y];
549 encode_line(s, w, sample, plane_index, 8);
551 if(s->packed_at_lsb){
553 sample[0][x]= ((uint16_t*)(src + stride*y))[x];
557 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
560 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
562 //STOP_TIMER("encode line")}
566 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
568 const int ring_size= s->avctx->context_model ? 3 : 2;
569 int16_t *sample[4][3];
572 memset(s->sample_buffer, 0, ring_size*4*(w+6)*sizeof(*s->sample_buffer));
575 for(i=0; i<ring_size; i++)
577 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
580 unsigned v= src[x + stride*y];
592 // assert(g>=0 && b>=0 && r>=0);
593 // assert(g<256 && b<512 && r<512);
599 for(p=0; p<3 + s->transparency; p++){
600 sample[p][0][-1]= sample[p][1][0 ];
601 sample[p][1][ w]= sample[p][1][w-1];
602 encode_line(s, w, sample[p], (p+1)/2, 9);
607 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
610 uint8_t state[CONTEXT_SIZE];
611 memset(state, 128, sizeof(state));
613 for(i=1; i<128 ; i++){
614 if(quant_table[i] != quant_table[i-1]){
615 put_symbol(c, state, i-last-1, 0);
619 put_symbol(c, state, i-last-1, 0);
622 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
625 write_quant_table(c, quant_table[i]);
628 static void write_header(FFV1Context *f){
629 uint8_t state[CONTEXT_SIZE];
631 RangeCoder * const c= &f->slice_context[0]->c;
633 memset(state, 128, sizeof(state));
636 put_symbol(c, state, f->version, 0);
637 put_symbol(c, state, f->ac, 0);
639 for(i=1; i<256; i++){
640 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
643 put_symbol(c, state, f->colorspace, 0); //YUV cs type
645 put_symbol(c, state, f->bits_per_raw_sample, 0);
646 put_rac(c, state, f->chroma_planes);
647 put_symbol(c, state, f->chroma_h_shift, 0);
648 put_symbol(c, state, f->chroma_v_shift, 0);
649 put_rac(c, state, f->transparency);
651 write_quant_tables(c, f->quant_table);
653 put_symbol(c, state, f->slice_count, 0);
654 for(i=0; i<f->slice_count; i++){
655 FFV1Context *fs= f->slice_context[i];
656 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
657 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
658 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
659 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
660 for(j=0; j<f->plane_count; j++){
661 put_symbol(c, state, f->plane[j].quant_table_index, 0);
662 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
667 #endif /* CONFIG_FFV1_ENCODER */
669 static av_cold int common_init(AVCodecContext *avctx){
670 FFV1Context *s = avctx->priv_data;
673 s->flags= avctx->flags;
675 avcodec_get_frame_defaults(&s->picture);
677 ff_dsputil_init(&s->dsp, avctx);
679 s->width = avctx->width;
680 s->height= avctx->height;
682 assert(s->width && s->height);
691 static int init_slice_state(FFV1Context *f){
694 for(i=0; i<f->slice_count; i++){
695 FFV1Context *fs= f->slice_context[i];
696 fs->plane_count= f->plane_count;
697 fs->transparency= f->transparency;
698 for(j=0; j<f->plane_count; j++){
699 PlaneContext * const p= &fs->plane[j];
702 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
704 return AVERROR(ENOMEM);
706 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
708 return AVERROR(ENOMEM);
713 //FIXME only redo if state_transition changed
714 for(j=1; j<256; j++){
715 fs->c.one_state [ j]= fs->state_transition[j];
716 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
724 static av_cold int init_slice_contexts(FFV1Context *f){
727 f->slice_count= f->num_h_slices * f->num_v_slices;
729 for(i=0; i<f->slice_count; i++){
730 FFV1Context *fs= av_mallocz(sizeof(*fs));
731 int sx= i % f->num_h_slices;
732 int sy= i / f->num_h_slices;
733 int sxs= f->avctx->width * sx / f->num_h_slices;
734 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
735 int sys= f->avctx->height* sy / f->num_v_slices;
736 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
737 f->slice_context[i]= fs;
738 memcpy(fs, f, sizeof(*fs));
739 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
741 fs->slice_width = sxe - sxs;
742 fs->slice_height= sye - sys;
746 fs->sample_buffer = av_malloc(3*4 * (fs->width+6) * sizeof(*fs->sample_buffer));
747 if (!fs->sample_buffer)
748 return AVERROR(ENOMEM);
753 static int allocate_initial_states(FFV1Context *f){
756 for(i=0; i<f->quant_table_count; i++){
757 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
758 if(!f->initial_states[i])
759 return AVERROR(ENOMEM);
760 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
765 #if CONFIG_FFV1_ENCODER
766 static int write_extra_header(FFV1Context *f){
767 RangeCoder * const c= &f->c;
768 uint8_t state[CONTEXT_SIZE];
770 uint8_t state2[32][CONTEXT_SIZE];
772 memset(state2, 128, sizeof(state2));
773 memset(state, 128, sizeof(state));
775 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
776 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
777 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
779 put_symbol(c, state, f->version, 0);
780 put_symbol(c, state, f->ac, 0);
782 for(i=1; i<256; i++){
783 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
786 put_symbol(c, state, f->colorspace, 0); //YUV cs type
787 put_symbol(c, state, f->bits_per_raw_sample, 0);
788 put_rac(c, state, f->chroma_planes);
789 put_symbol(c, state, f->chroma_h_shift, 0);
790 put_symbol(c, state, f->chroma_v_shift, 0);
791 put_rac(c, state, f->transparency);
792 put_symbol(c, state, f->num_h_slices-1, 0);
793 put_symbol(c, state, f->num_v_slices-1, 0);
795 put_symbol(c, state, f->quant_table_count, 0);
796 for(i=0; i<f->quant_table_count; i++)
797 write_quant_tables(c, f->quant_tables[i]);
799 for(i=0; i<f->quant_table_count; i++){
800 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
801 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
803 if(j<f->context_count[i]*CONTEXT_SIZE){
804 put_rac(c, state, 1);
805 for(j=0; j<f->context_count[i]; j++){
806 for(k=0; k<CONTEXT_SIZE; k++){
807 int pred= j ? f->initial_states[i][j-1][k] : 128;
808 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
812 put_rac(c, state, 0);
816 f->avctx->extradata_size= ff_rac_terminate(c);
821 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
822 int i,i2,changed,print=0;
826 for(i=12; i<244; i++){
827 for(i2=i+1; i2<245 && i2<i+4; i2++){
828 #define COST(old, new) \
829 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
830 +s->rc_stat[old][1]*-log2( (new) /256.0)
832 #define COST2(old, new) \
834 +COST(256-(old), 256-(new))
836 double size0= COST2(i, i ) + COST2(i2, i2);
837 double sizeX= COST2(i, i2) + COST2(i2, i );
838 if(sizeX < size0 && i!=128 && i2!=128){
840 FFSWAP(int, stt[ i], stt[ i2]);
841 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
842 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
844 FFSWAP(int, stt[256-i], stt[256-i2]);
845 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
846 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
848 for(j=1; j<256; j++){
849 if (stt[j] == i ) stt[j] = i2;
850 else if(stt[j] == i2) stt[j] = i ;
852 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
853 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
864 static av_cold int encode_init(AVCodecContext *avctx)
866 FFV1Context *s = avctx->priv_data;
872 s->ac= avctx->coder_type ? 2:0;
876 s->state_transition[i]=ver2_state[i];
879 switch(avctx->pix_fmt){
880 case PIX_FMT_YUV420P9:
881 if (!avctx->bits_per_raw_sample)
882 s->bits_per_raw_sample = 9;
883 case PIX_FMT_YUV420P10:
884 case PIX_FMT_YUV422P10:
885 s->packed_at_lsb = 1;
886 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
887 s->bits_per_raw_sample = 10;
889 case PIX_FMT_YUV444P16:
890 case PIX_FMT_YUV422P16:
891 case PIX_FMT_YUV420P16:
892 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
893 s->bits_per_raw_sample = 16;
894 } else if (!s->bits_per_raw_sample){
895 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
897 if(s->bits_per_raw_sample <=8){
898 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
902 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
905 s->version= FFMAX(s->version, 1);
907 case PIX_FMT_YUV444P:
908 case PIX_FMT_YUV440P:
909 case PIX_FMT_YUV422P:
910 case PIX_FMT_YUV420P:
911 case PIX_FMT_YUV411P:
912 case PIX_FMT_YUV410P:
913 s->chroma_planes= av_pix_fmt_descriptors[avctx->pix_fmt].nb_components < 3 ? 0 : 1;
916 case PIX_FMT_YUVA444P:
917 case PIX_FMT_YUVA420P:
930 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
933 if (s->transparency) {
934 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
937 for(i=0; i<256; i++){
938 s->quant_table_count=2;
939 if(s->bits_per_raw_sample <=8){
940 s->quant_tables[0][0][i]= quant11[i];
941 s->quant_tables[0][1][i]= 11*quant11[i];
942 s->quant_tables[0][2][i]= 11*11*quant11[i];
943 s->quant_tables[1][0][i]= quant11[i];
944 s->quant_tables[1][1][i]= 11*quant11[i];
945 s->quant_tables[1][2][i]= 11*11*quant5 [i];
946 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
947 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
949 s->quant_tables[0][0][i]= quant9_10bit[i];
950 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
951 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
952 s->quant_tables[1][0][i]= quant9_10bit[i];
953 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
954 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
955 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
956 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
959 s->context_count[0]= (11*11*11+1)/2;
960 s->context_count[1]= (11*11*5*5*5+1)/2;
961 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
963 for(i=0; i<s->plane_count; i++){
964 PlaneContext * const p= &s->plane[i];
966 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
967 p->quant_table_index= avctx->context_model;
968 p->context_count= s->context_count[p->quant_table_index];
971 if(allocate_initial_states(s) < 0)
972 return AVERROR(ENOMEM);
974 avctx->coded_frame= &s->picture;
977 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
981 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
982 for(i=0; i<s->quant_table_count; i++){
983 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
985 return AVERROR(ENOMEM);
989 char *p= avctx->stats_in;
990 uint8_t best_state[256][256];
994 av_assert0(s->version>=2);
997 for(j=0; j<256; j++){
999 s->rc_stat[j][i]= strtol(p, &next, 0);
1001 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1007 for(i=0; i<s->quant_table_count; i++){
1008 for(j=0; j<s->context_count[i]; j++){
1009 for(k=0; k<32; k++){
1011 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1013 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1021 gob_count= strtol(p, &next, 0);
1022 if(next==p || gob_count <0){
1023 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1027 while(*p=='\n' || *p==' ') p++;
1030 sort_stt(s, s->state_transition);
1032 find_best_state(best_state, s->state_transition);
1034 for(i=0; i<s->quant_table_count; i++){
1035 for(j=0; j<s->context_count[i]; j++){
1036 for(k=0; k<32; k++){
1038 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1039 p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1041 s->initial_states[i][j][k]= best_state[av_clip(round(p), 1, 255)][av_clip((s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1])/gob_count, 0, 255)];
1050 write_extra_header(s);
1053 if(init_slice_contexts(s) < 0)
1055 if(init_slice_state(s) < 0)
1058 #define STATS_OUT_SIZE 1024*1024*6
1059 if(avctx->flags & CODEC_FLAG_PASS1){
1060 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1061 for(i=0; i<s->quant_table_count; i++){
1062 for(j=0; j<s->slice_count; j++){
1063 FFV1Context *sf= s->slice_context[j];
1064 av_assert0(!sf->rc_stat2[i]);
1065 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1066 if(!sf->rc_stat2[i])
1067 return AVERROR(ENOMEM);
1074 #endif /* CONFIG_FFV1_ENCODER */
1077 static void clear_state(FFV1Context *f){
1080 for(si=0; si<f->slice_count; si++){
1081 FFV1Context *fs= f->slice_context[si];
1082 for(i=0; i<f->plane_count; i++){
1083 PlaneContext *p= &fs->plane[i];
1085 p->interlace_bit_state[0]= 128;
1086 p->interlace_bit_state[1]= 128;
1089 if(f->initial_states[p->quant_table_index]){
1090 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1092 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1094 for(j=0; j<p->context_count; j++){
1095 p->vlc_state[j].drift= 0;
1096 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1097 p->vlc_state[j].bias= 0;
1098 p->vlc_state[j].count= 1;
1105 #if CONFIG_FFV1_ENCODER
1106 static int encode_slice(AVCodecContext *c, void *arg){
1107 FFV1Context *fs= *(void**)arg;
1108 FFV1Context *f= fs->avctx->priv_data;
1109 int width = fs->slice_width;
1110 int height= fs->slice_height;
1113 AVFrame * const p= &f->picture;
1114 const int ps= (f->bits_per_raw_sample>8)+1;
1116 if(f->colorspace==0){
1117 const int chroma_width = -((-width )>>f->chroma_h_shift);
1118 const int chroma_height= -((-height)>>f->chroma_v_shift);
1119 const int cx= x>>f->chroma_h_shift;
1120 const int cy= y>>f->chroma_v_shift;
1122 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1124 if (f->chroma_planes){
1125 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1126 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1128 if (fs->transparency)
1129 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1131 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1138 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1139 FFV1Context *f = avctx->priv_data;
1140 RangeCoder * const c= &f->slice_context[0]->c;
1141 AVFrame *pict = data;
1142 AVFrame * const p= &f->picture;
1144 uint8_t keystate=128;
1148 ff_init_range_encoder(c, buf, buf_size);
1149 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1152 p->pict_type= AV_PICTURE_TYPE_I;
1154 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1155 put_rac(c, &keystate, 1);
1161 put_rac(c, &keystate, 0);
1166 used_count += ff_rac_terminate(c);
1167 //printf("pos=%d\n", used_count);
1168 init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1171 for(i=1; i<256; i++){
1172 c->one_state[i]= f->state_transition[i];
1173 c->zero_state[256-i]= 256-c->one_state[i];
1177 for(i=1; i<f->slice_count; i++){
1178 FFV1Context *fs= f->slice_context[i];
1179 uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1180 int len= buf_size/f->slice_count;
1183 ff_init_range_encoder(&fs->c, start, len);
1185 init_put_bits(&fs->pb, start, len);
1188 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1191 for(i=0; i<f->slice_count; i++){
1192 FFV1Context *fs= f->slice_context[i];
1197 put_rac(&fs->c, &state, 0);
1198 bytes= ff_rac_terminate(&fs->c);
1200 flush_put_bits(&fs->pb); //nicer padding FIXME
1201 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1205 av_assert0(bytes < buf_size/f->slice_count);
1206 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1207 av_assert0(bytes < (1<<24));
1208 AV_WB24(buf_p+bytes, bytes);
1214 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1216 char *p= avctx->stats_out;
1217 char *end= p + STATS_OUT_SIZE;
1219 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1220 for(i=0; i<f->quant_table_count; i++)
1221 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1223 for(j=0; j<f->slice_count; j++){
1224 FFV1Context *fs= f->slice_context[j];
1225 for(i=0; i<256; i++){
1226 f->rc_stat[i][0] += fs->rc_stat[i][0];
1227 f->rc_stat[i][1] += fs->rc_stat[i][1];
1229 for(i=0; i<f->quant_table_count; i++){
1230 for(k=0; k<f->context_count[i]; k++){
1231 for(m=0; m<32; m++){
1232 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1233 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1239 for(j=0; j<256; j++){
1240 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1243 snprintf(p, end-p, "\n");
1245 for(i=0; i<f->quant_table_count; i++){
1246 for(j=0; j<f->context_count[i]; j++){
1247 for(m=0; m<32; m++){
1248 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1253 snprintf(p, end-p, "%d\n", f->gob_count);
1254 } else if(avctx->flags&CODEC_FLAG_PASS1)
1255 avctx->stats_out[0] = '\0';
1257 f->picture_number++;
1260 #endif /* CONFIG_FFV1_ENCODER */
1262 static av_cold int common_end(AVCodecContext *avctx){
1263 FFV1Context *s = avctx->priv_data;
1266 if (avctx->codec->decode && s->picture.data[0])
1267 avctx->release_buffer(avctx, &s->picture);
1269 for(j=0; j<s->slice_count; j++){
1270 FFV1Context *fs= s->slice_context[j];
1271 for(i=0; i<s->plane_count; i++){
1272 PlaneContext *p= &fs->plane[i];
1274 av_freep(&p->state);
1275 av_freep(&p->vlc_state);
1277 av_freep(&fs->sample_buffer);
1280 av_freep(&avctx->stats_out);
1281 for(j=0; j<s->quant_table_count; j++){
1282 av_freep(&s->initial_states[j]);
1283 for(i=0; i<s->slice_count; i++){
1284 FFV1Context *sf= s->slice_context[i];
1285 av_freep(&sf->rc_stat2[j]);
1287 av_freep(&s->rc_stat2[j]);
1290 for(i=0; i<s->slice_count; i++){
1291 av_freep(&s->slice_context[i]);
1297 static av_always_inline void decode_line(FFV1Context *s, int w,
1299 int plane_index, int bits)
1301 PlaneContext * const p= &s->plane[plane_index];
1302 RangeCoder * const c= &s->c;
1306 int run_index= s->run_index;
1309 int diff, context, sign;
1311 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1318 av_assert2(context < p->context_count);
1321 diff= get_symbol_inline(c, p->state[context], 1);
1323 if(context == 0 && run_mode==0) run_mode=1;
1326 if(run_count==0 && run_mode==1){
1327 if(get_bits1(&s->gb)){
1328 run_count = 1<<ff_log2_run[run_index];
1329 if(x + run_count <= w) run_index++;
1331 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1333 if(run_index) run_index--;
1341 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1346 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1348 // 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));
1351 if(sign) diff= -diff;
1353 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1355 s->run_index= run_index;
1358 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1361 sample[0]=s->sample_buffer +3;
1362 sample[1]=s->sample_buffer+w+6+3;
1366 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1369 int16_t *temp = sample[0]; //FIXME try a normal buffer
1371 sample[0]= sample[1];
1374 sample[1][-1]= sample[0][0 ];
1375 sample[0][ w]= sample[0][w-1];
1378 if(s->avctx->bits_per_raw_sample <= 8){
1379 decode_line(s, w, sample, plane_index, 8);
1381 src[x + stride*y]= sample[1][x];
1384 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1385 if(s->packed_at_lsb){
1387 ((uint16_t*)(src + stride*y))[x]= sample[1][x];
1391 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1395 //STOP_TIMER("decode-line")}
1399 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1401 int16_t *sample[4][2];
1403 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1404 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1409 memset(s->sample_buffer, 0, 8*(w+6)*sizeof(*s->sample_buffer));
1412 for(p=0; p<3 + s->transparency; p++){
1413 int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1415 sample[p][0]= sample[p][1];
1418 sample[p][1][-1]= sample[p][0][0 ];
1419 sample[p][0][ w]= sample[p][0][w-1];
1420 decode_line(s, w, sample[p], (p+1)/2, 9);
1423 int g= sample[0][1][x];
1424 int b= sample[1][1][x];
1425 int r= sample[2][1][x];
1426 int a= sample[3][1][x];
1428 // assert(g>=0 && b>=0 && r>=0);
1429 // assert(g<256 && b<512 && r<512);
1437 src[x + stride*y]= b + (g<<8) + (r<<16) + (a<<24);
1442 static int decode_slice(AVCodecContext *c, void *arg){
1443 FFV1Context *fs= *(void**)arg;
1444 FFV1Context *f= fs->avctx->priv_data;
1445 int width = fs->slice_width;
1446 int height= fs->slice_height;
1449 const int ps= (c->bits_per_raw_sample>8)+1;
1450 AVFrame * const p= &f->picture;
1452 av_assert1(width && height);
1453 if(f->colorspace==0){
1454 const int chroma_width = -((-width )>>f->chroma_h_shift);
1455 const int chroma_height= -((-height)>>f->chroma_v_shift);
1456 const int cx= x>>f->chroma_h_shift;
1457 const int cy= y>>f->chroma_v_shift;
1458 decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1460 if (f->chroma_planes){
1461 decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1462 decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1464 if (fs->transparency)
1465 decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1467 decode_rgb_frame(fs, (uint32_t*)p->data[0] + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1475 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1478 uint8_t state[CONTEXT_SIZE];
1480 memset(state, 128, sizeof(state));
1482 for(v=0; i<128 ; v++){
1483 int len= get_symbol(c, state, 0) + 1;
1485 if(len + i > 128) return -1;
1488 quant_table[i] = scale*v;
1491 //if(i%16==0) printf("\n");
1495 for(i=1; i<128; i++){
1496 quant_table[256-i]= -quant_table[i];
1498 quant_table[128]= -quant_table[127];
1503 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1505 int context_count=1;
1508 context_count*= read_quant_table(c, quant_table[i], context_count);
1509 if(context_count > 32768U){
1513 return (context_count+1)/2;
1516 static int read_extra_header(FFV1Context *f){
1517 RangeCoder * const c= &f->c;
1518 uint8_t state[CONTEXT_SIZE];
1520 uint8_t state2[32][CONTEXT_SIZE];
1522 memset(state2, 128, sizeof(state2));
1523 memset(state, 128, sizeof(state));
1525 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1526 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1528 f->version= get_symbol(c, state, 0);
1529 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1531 for(i=1; i<256; i++){
1532 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1535 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1536 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1537 get_rac(c, state); //no chroma = false
1538 f->chroma_h_shift= get_symbol(c, state, 0);
1539 f->chroma_v_shift= get_symbol(c, state, 0);
1540 f->transparency= get_rac(c, state);
1541 f->plane_count= 2 + f->transparency;
1542 f->num_h_slices= 1 + get_symbol(c, state, 0);
1543 f->num_v_slices= 1 + get_symbol(c, state, 0);
1544 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1545 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1549 f->quant_table_count= get_symbol(c, state, 0);
1550 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1552 for(i=0; i<f->quant_table_count; i++){
1553 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1554 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1559 if(allocate_initial_states(f) < 0)
1560 return AVERROR(ENOMEM);
1562 for(i=0; i<f->quant_table_count; i++){
1563 if(get_rac(c, state)){
1564 for(j=0; j<f->context_count[i]; j++){
1565 for(k=0; k<CONTEXT_SIZE; k++){
1566 int pred= j ? f->initial_states[i][j-1][k] : 128;
1567 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1576 static int read_header(FFV1Context *f){
1577 uint8_t state[CONTEXT_SIZE];
1578 int i, j, context_count;
1579 RangeCoder * const c= &f->slice_context[0]->c;
1581 memset(state, 128, sizeof(state));
1584 f->version= get_symbol(c, state, 0);
1585 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1587 for(i=1; i<256; i++){
1588 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1591 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1593 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1594 f->chroma_planes= get_rac(c, state);
1595 f->chroma_h_shift= get_symbol(c, state, 0);
1596 f->chroma_v_shift= get_symbol(c, state, 0);
1597 f->transparency= get_rac(c, state);
1598 f->plane_count= 2 + f->transparency;
1601 if(f->colorspace==0){
1602 if(!f->transparency && !f->chroma_planes){
1603 if (f->avctx->bits_per_raw_sample<=8)
1604 f->avctx->pix_fmt= PIX_FMT_GRAY8;
1606 f->avctx->pix_fmt= PIX_FMT_GRAY16;
1607 }else if(f->avctx->bits_per_raw_sample<=8 && !f->transparency){
1608 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1609 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1610 case 0x01: f->avctx->pix_fmt= PIX_FMT_YUV440P; break;
1611 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1612 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1613 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1614 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1616 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1619 }else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
1620 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1621 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
1622 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
1624 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1627 }else if(f->avctx->bits_per_raw_sample==9) {
1628 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1629 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1630 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1631 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P9 ; f->packed_at_lsb=1; break;
1633 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1636 }else if(f->avctx->bits_per_raw_sample==10) {
1637 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1638 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1639 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P10; f->packed_at_lsb=1; break;
1640 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P10; f->packed_at_lsb=1; break;
1642 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1646 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1647 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1648 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1649 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1651 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1655 }else if(f->colorspace==1){
1656 if(f->chroma_h_shift || f->chroma_v_shift){
1657 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1660 if(f->transparency) f->avctx->pix_fmt= PIX_FMT_RGB32;
1661 else f->avctx->pix_fmt= PIX_FMT_0RGB32;
1663 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1667 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1669 context_count= read_quant_tables(c, f->quant_table);
1670 if(context_count < 0){
1671 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1675 f->slice_count= get_symbol(c, state, 0);
1676 if(f->slice_count > (unsigned)MAX_SLICES)
1680 for(j=0; j<f->slice_count; j++){
1681 FFV1Context *fs= f->slice_context[j];
1683 fs->packed_at_lsb= f->packed_at_lsb;
1685 if(f->version >= 2){
1686 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1687 fs->slice_y = get_symbol(c, state, 0) *f->height;
1688 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1689 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1691 fs->slice_x /= f->num_h_slices;
1692 fs->slice_y /= f->num_v_slices;
1693 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1694 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1695 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1697 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1698 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1702 for(i=0; i<f->plane_count; i++){
1703 PlaneContext * const p= &fs->plane[i];
1705 if(f->version >= 2){
1706 int idx=get_symbol(c, state, 0);
1707 if(idx > (unsigned)f->quant_table_count){
1708 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1711 p->quant_table_index= idx;
1712 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1713 context_count= f->context_count[idx];
1715 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1718 if(p->context_count < context_count){
1719 av_freep(&p->state);
1720 av_freep(&p->vlc_state);
1722 p->context_count= context_count;
1729 static av_cold int decode_init(AVCodecContext *avctx)
1731 FFV1Context *f = avctx->priv_data;
1735 if(avctx->extradata && read_extra_header(f) < 0)
1738 if(init_slice_contexts(f) < 0)
1744 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1745 const uint8_t *buf = avpkt->data;
1746 int buf_size = avpkt->size;
1747 FFV1Context *f = avctx->priv_data;
1748 RangeCoder * const c= &f->slice_context[0]->c;
1749 AVFrame * const p= &f->picture;
1751 uint8_t keystate= 128;
1752 const uint8_t *buf_p;
1754 AVFrame *picture = data;
1756 /* release previously stored data */
1758 avctx->release_buffer(avctx, p);
1760 ff_init_range_decoder(c, buf, buf_size);
1761 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1764 p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1765 if(get_rac(c, &keystate)){
1767 if(read_header(f) < 0)
1769 if(init_slice_state(f) < 0)
1778 for(i=1; i<256; i++){
1779 c->one_state[i]= f->state_transition[i];
1780 c->zero_state[256-i]= 256-c->one_state[i];
1785 if(avctx->get_buffer(avctx, p) < 0){
1786 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1790 if(avctx->debug&FF_DEBUG_PICT_INFO)
1791 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1794 bytes_read = c->bytestream - c->bytestream_start - 1;
1795 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1796 //printf("pos=%d\n", bytes_read);
1797 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, (buf_size - bytes_read) * 8);
1799 bytes_read = 0; /* avoid warning */
1802 buf_p= buf + buf_size;
1803 for(i=f->slice_count-1; i>0; i--){
1804 FFV1Context *fs= f->slice_context[i];
1805 int v= AV_RB24(buf_p-3)+3;
1806 if(buf_p - buf <= v){
1807 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1812 ff_init_range_decoder(&fs->c, buf_p, v);
1814 init_get_bits(&fs->gb, buf_p, v * 8);
1818 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1819 f->picture_number++;
1822 *data_size = sizeof(AVFrame);
1827 AVCodec ff_ffv1_decoder = {
1829 .type = AVMEDIA_TYPE_VIDEO,
1830 .id = CODEC_ID_FFV1,
1831 .priv_data_size = sizeof(FFV1Context),
1832 .init = decode_init,
1833 .close = common_end,
1834 .decode = decode_frame,
1835 .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ | CODEC_CAP_SLICE_THREADS,
1836 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1839 #if CONFIG_FFV1_ENCODER
1840 AVCodec ff_ffv1_encoder = {
1842 .type = AVMEDIA_TYPE_VIDEO,
1843 .id = CODEC_ID_FFV1,
1844 .priv_data_size = sizeof(FFV1Context),
1845 .init = encode_init,
1846 .encode = encode_frame,
1847 .close = common_end,
1848 .capabilities = CODEC_CAP_SLICE_THREADS,
1849 .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUVA420P, PIX_FMT_YUV444P, PIX_FMT_YUVA444P, PIX_FMT_YUV440P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_0RGB32, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_YUV420P9, PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_GRAY16, PIX_FMT_GRAY8, PIX_FMT_NONE},
1850 .long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),