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)
33 #include "rangecoder.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/avassert.h"
40 #define CONTEXT_SIZE 32
42 #define MAX_QUANT_TABLES 8
43 #define MAX_CONTEXT_INPUTS 5
45 extern const uint8_t ff_log2_run[41];
47 static const int8_t quant5_10bit[256]={
48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,-2,
60 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-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,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
63 -1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
66 static const int8_t quant5[256]={
67 0, 1, 1, 1, 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,-2,-2,-2,
82 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
85 static const int8_t quant9_10bit[256]={
86 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
87 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 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,-4,-4,-4,-4,-4,-4,-4,
98 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
99 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
100 -3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
101 -2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
104 static const int8_t quant11[256]={
105 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 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,-5,-5,
118 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-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,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
123 static const uint8_t ver2_state[256]= {
124 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
125 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
126 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
127 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
128 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
129 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
130 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
131 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
132 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
133 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
134 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
135 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
136 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
137 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
138 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
139 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
142 typedef struct VlcState{
149 typedef struct PlaneContext{
150 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
151 int quant_table_index;
153 uint8_t (*state)[CONTEXT_SIZE];
155 uint8_t interlace_bit_state[2];
158 #define MAX_SLICES 256
160 typedef struct FFV1Context{
161 AVCodecContext *avctx;
165 uint64_t rc_stat[256][2];
166 uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
170 int chroma_h_shift, chroma_v_shift;
177 int ac; ///< 1=range coder <-> 0=golomb rice
178 PlaneContext plane[MAX_PLANES];
179 int16_t quant_table[MAX_CONTEXT_INPUTS][256];
180 int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
181 int context_count[MAX_QUANT_TABLES];
182 uint8_t state_transition[256];
183 uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
186 int16_t *sample_buffer;
190 int quant_table_count;
194 struct FFV1Context *slice_context[MAX_SLICES];
202 int bits_per_raw_sample;
205 static av_always_inline int fold(int diff, int bits){
217 static inline int predict(int16_t *src, int16_t *last)
219 const int LT= last[-1];
220 const int T= last[ 0];
221 const int L = src[-1];
223 return mid_pred(L, L + T - LT, T);
226 static inline int get_context(PlaneContext *p, int16_t *src,
227 int16_t *last, int16_t *last2)
229 const int LT= last[-1];
230 const int T= last[ 0];
231 const int RT= last[ 1];
232 const int L = src[-1];
234 if(p->quant_table[3][127]){
235 const int TT= last2[0];
236 const int LL= src[-2];
237 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
238 +p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
240 return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
243 static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
248 l2tab[i]= log2(i/256.0);
250 for(i=0; i<256; i++){
251 double best_len[256];
257 for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
261 for(k=0; k<256; k++){
262 double newocc[256]={0};
263 for(m=0; m<256; m++){
265 len -=occ[m]*( p *l2tab[ m]
266 + (1-p)*l2tab[256-m]);
269 if(len < best_len[k]){
273 for(m=0; m<256; m++){
275 newocc[ one_state[ m]] += occ[m]* p ;
276 newocc[256-one_state[256-m]] += occ[m]*(1-p);
279 memcpy(occ, newocc, sizeof(occ));
285 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]){
288 #define put_rac(C,S,B) \
292 rc_stat2[(S)-state][B]++;\
298 const int a= FFABS(v);
299 const int e= av_log2(a);
300 put_rac(c, state+0, 0);
303 put_rac(c, state+1+i, 1); //1..10
305 put_rac(c, state+1+i, 0);
307 for(i=e-1; i>=0; i--){
308 put_rac(c, state+22+i, (a>>i)&1); //22..31
312 put_rac(c, state+11 + e, v < 0); //11..21
315 put_rac(c, state+1+FFMIN(i,9), 1); //1..10
317 put_rac(c, state+1+9, 0);
319 for(i=e-1; i>=0; i--){
320 put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
324 put_rac(c, state+11 + 10, v < 0); //11..21
327 put_rac(c, state+0, 1);
332 static av_noinline void put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
333 put_symbol_inline(c, state, v, is_signed, NULL, NULL);
336 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
337 if(get_rac(c, state+0))
342 while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
347 for(i=e-1; i>=0; i--){
348 a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
351 e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
356 static av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
357 return get_symbol_inline(c, state, is_signed);
360 static inline void update_vlc_state(VlcState * const state, const int v){
361 int drift= state->drift;
362 int count= state->count;
363 state->error_sum += FFABS(v);
366 if(count == 128){ //FIXME variable
369 state->error_sum >>= 1;
374 if(state->bias > -128) state->bias--;
380 if(state->bias < 127) state->bias++;
391 static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
393 //printf("final: %d ", v);
394 v = fold(v - state->bias, bits);
398 while(i < state->error_sum){ //FIXME optimize
406 if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
409 code= v ^ ((2*state->drift + state->count)>>31);
412 //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);
413 set_sr_golomb(pb, code, k, 12, bits);
415 update_vlc_state(state, v);
418 static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
423 while(i < state->error_sum){ //FIXME optimize
430 v= get_sr_golomb(gb, k, 12, bits);
431 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
434 if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
436 v ^= ((2*state->drift + state->count)>>31);
439 ret= fold(v + state->bias, bits);
441 update_vlc_state(state, v);
442 //printf("final: %d\n", ret);
446 #if CONFIG_FFV1_ENCODER
447 static av_always_inline int encode_line(FFV1Context *s, int w,
449 int plane_index, int bits)
451 PlaneContext * const p= &s->plane[plane_index];
452 RangeCoder * const c= &s->c;
454 int run_index= s->run_index;
459 if(c->bytestream_end - c->bytestream < w*20){
460 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
464 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
465 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
473 context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
474 diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
481 diff= fold(diff, bits);
484 if(s->flags & CODEC_FLAG_PASS1){
485 put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
487 put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
490 if(context == 0) run_mode=1;
495 while(run_count >= 1<<ff_log2_run[run_index]){
496 run_count -= 1<<ff_log2_run[run_index];
498 put_bits(&s->pb, 1, 1);
501 put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
502 if(run_index) run_index--;
511 // 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));
514 put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
518 while(run_count >= 1<<ff_log2_run[run_index]){
519 run_count -= 1<<ff_log2_run[run_index];
521 put_bits(&s->pb, 1, 1);
525 put_bits(&s->pb, 1, 1);
527 s->run_index= run_index;
532 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
534 const int ring_size= s->avctx->context_model ? 3 : 2;
538 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
541 for(i=0; i<ring_size; i++)
542 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
544 sample[0][-1]= sample[1][0 ];
545 sample[1][ w]= sample[1][w-1];
547 if(s->bits_per_raw_sample<=8){
549 sample[0][x]= src[x + stride*y];
551 encode_line(s, w, sample, plane_index, 8);
553 if(s->packed_at_lsb){
555 sample[0][x]= ((uint16_t*)(src + stride*y))[x];
559 sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->bits_per_raw_sample);
562 encode_line(s, w, sample, plane_index, s->bits_per_raw_sample);
564 //STOP_TIMER("encode line")}
568 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
570 const int ring_size= s->avctx->context_model ? 3 : 2;
571 int16_t *sample[4][3];
574 memset(s->sample_buffer, 0, ring_size*4*(w+6)*sizeof(*s->sample_buffer));
577 for(i=0; i<ring_size; i++)
579 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
582 unsigned v= src[x + stride*y];
594 // assert(g>=0 && b>=0 && r>=0);
595 // assert(g<256 && b<512 && r<512);
601 for(p=0; p<3 + s->transparency; p++){
602 sample[p][0][-1]= sample[p][1][0 ];
603 sample[p][1][ w]= sample[p][1][w-1];
604 encode_line(s, w, sample[p], (p+1)/2, 9);
609 static void write_quant_table(RangeCoder *c, int16_t *quant_table){
612 uint8_t state[CONTEXT_SIZE];
613 memset(state, 128, sizeof(state));
615 for(i=1; i<128 ; i++){
616 if(quant_table[i] != quant_table[i-1]){
617 put_symbol(c, state, i-last-1, 0);
621 put_symbol(c, state, i-last-1, 0);
624 static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
627 write_quant_table(c, quant_table[i]);
630 static void write_header(FFV1Context *f){
631 uint8_t state[CONTEXT_SIZE];
633 RangeCoder * const c= &f->slice_context[0]->c;
635 memset(state, 128, sizeof(state));
638 put_symbol(c, state, f->version, 0);
639 put_symbol(c, state, f->ac, 0);
641 for(i=1; i<256; i++){
642 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
645 put_symbol(c, state, f->colorspace, 0); //YUV cs type
647 put_symbol(c, state, f->bits_per_raw_sample, 0);
648 put_rac(c, state, f->chroma_planes);
649 put_symbol(c, state, f->chroma_h_shift, 0);
650 put_symbol(c, state, f->chroma_v_shift, 0);
651 put_rac(c, state, f->transparency);
653 write_quant_tables(c, f->quant_table);
655 put_symbol(c, state, f->slice_count, 0);
656 for(i=0; i<f->slice_count; i++){
657 FFV1Context *fs= f->slice_context[i];
658 put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
659 put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
660 put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
661 put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
662 for(j=0; j<f->plane_count; j++){
663 put_symbol(c, state, f->plane[j].quant_table_index, 0);
664 av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
669 #endif /* CONFIG_FFV1_ENCODER */
671 static av_cold int common_init(AVCodecContext *avctx){
672 FFV1Context *s = avctx->priv_data;
675 s->flags= avctx->flags;
677 avcodec_get_frame_defaults(&s->picture);
679 ff_dsputil_init(&s->dsp, avctx);
681 s->width = avctx->width;
682 s->height= avctx->height;
684 assert(s->width && s->height);
693 static int init_slice_state(FFV1Context *f){
696 for(i=0; i<f->slice_count; i++){
697 FFV1Context *fs= f->slice_context[i];
698 fs->plane_count= f->plane_count;
699 fs->transparency= f->transparency;
700 for(j=0; j<f->plane_count; j++){
701 PlaneContext * const p= &fs->plane[j];
704 if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
706 return AVERROR(ENOMEM);
708 if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
710 return AVERROR(ENOMEM);
715 //FIXME only redo if state_transition changed
716 for(j=1; j<256; j++){
717 fs->c.one_state [ j]= fs->state_transition[j];
718 fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
726 static av_cold int init_slice_contexts(FFV1Context *f){
729 f->slice_count= f->num_h_slices * f->num_v_slices;
731 for(i=0; i<f->slice_count; i++){
732 FFV1Context *fs= av_mallocz(sizeof(*fs));
733 int sx= i % f->num_h_slices;
734 int sy= i / f->num_h_slices;
735 int sxs= f->avctx->width * sx / f->num_h_slices;
736 int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
737 int sys= f->avctx->height* sy / f->num_v_slices;
738 int sye= f->avctx->height*(sy+1) / f->num_v_slices;
739 f->slice_context[i]= fs;
740 memcpy(fs, f, sizeof(*fs));
741 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
743 fs->slice_width = sxe - sxs;
744 fs->slice_height= sye - sys;
748 fs->sample_buffer = av_malloc(3*4 * (fs->width+6) * sizeof(*fs->sample_buffer));
749 if (!fs->sample_buffer)
750 return AVERROR(ENOMEM);
755 static int allocate_initial_states(FFV1Context *f){
758 for(i=0; i<f->quant_table_count; i++){
759 f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
760 if(!f->initial_states[i])
761 return AVERROR(ENOMEM);
762 memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
767 #if CONFIG_FFV1_ENCODER
768 static int write_extra_header(FFV1Context *f){
769 RangeCoder * const c= &f->c;
770 uint8_t state[CONTEXT_SIZE];
772 uint8_t state2[32][CONTEXT_SIZE];
774 memset(state2, 128, sizeof(state2));
775 memset(state, 128, sizeof(state));
777 f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
778 ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
779 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
781 put_symbol(c, state, f->version, 0);
783 put_symbol(c, state, f->minor_version, 0);
784 put_symbol(c, state, f->ac, 0);
786 for(i=1; i<256; i++){
787 put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
790 put_symbol(c, state, f->colorspace, 0); //YUV cs type
791 put_symbol(c, state, f->bits_per_raw_sample, 0);
792 put_rac(c, state, f->chroma_planes);
793 put_symbol(c, state, f->chroma_h_shift, 0);
794 put_symbol(c, state, f->chroma_v_shift, 0);
795 put_rac(c, state, f->transparency);
796 put_symbol(c, state, f->num_h_slices-1, 0);
797 put_symbol(c, state, f->num_v_slices-1, 0);
799 put_symbol(c, state, f->quant_table_count, 0);
800 for(i=0; i<f->quant_table_count; i++)
801 write_quant_tables(c, f->quant_tables[i]);
803 for(i=0; i<f->quant_table_count; i++){
804 for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
805 if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
807 if(j<f->context_count[i]*CONTEXT_SIZE){
808 put_rac(c, state, 1);
809 for(j=0; j<f->context_count[i]; j++){
810 for(k=0; k<CONTEXT_SIZE; k++){
811 int pred= j ? f->initial_states[i][j-1][k] : 128;
812 put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
816 put_rac(c, state, 0);
820 f->avctx->extradata_size= ff_rac_terminate(c);
825 static int sort_stt(FFV1Context *s, uint8_t stt[256]){
826 int i,i2,changed,print=0;
830 for(i=12; i<244; i++){
831 for(i2=i+1; i2<245 && i2<i+4; i2++){
832 #define COST(old, new) \
833 s->rc_stat[old][0]*-log2((256-(new))/256.0)\
834 +s->rc_stat[old][1]*-log2( (new) /256.0)
836 #define COST2(old, new) \
838 +COST(256-(old), 256-(new))
840 double size0= COST2(i, i ) + COST2(i2, i2);
841 double sizeX= COST2(i, i2) + COST2(i2, i );
842 if(sizeX < size0 && i!=128 && i2!=128){
844 FFSWAP(int, stt[ i], stt[ i2]);
845 FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
846 FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
848 FFSWAP(int, stt[256-i], stt[256-i2]);
849 FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
850 FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
852 for(j=1; j<256; j++){
853 if (stt[j] == i ) stt[j] = i2;
854 else if(stt[j] == i2) stt[j] = i ;
856 if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
857 else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
868 static av_cold int encode_init(AVCodecContext *avctx)
870 FFV1Context *s = avctx->priv_data;
877 if((avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)) || avctx->slices>1)
878 s->version = FFMAX(s->version, 2);
880 if(s->version >= 2 && avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
881 av_log(avctx, AV_LOG_ERROR, "Version 2 needed for requested features but version 2 is experimental and not enabled\n");
885 s->ac= avctx->coder_type ? 2:0;
889 s->state_transition[i]=ver2_state[i];
892 switch(avctx->pix_fmt){
893 case PIX_FMT_YUV444P9:
894 case PIX_FMT_YUV422P9:
895 case PIX_FMT_YUV420P9:
896 if (!avctx->bits_per_raw_sample)
897 s->bits_per_raw_sample = 9;
898 case PIX_FMT_YUV444P10:
899 case PIX_FMT_YUV420P10:
900 case PIX_FMT_YUV422P10:
901 s->packed_at_lsb = 1;
902 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample)
903 s->bits_per_raw_sample = 10;
905 case PIX_FMT_YUV444P16:
906 case PIX_FMT_YUV422P16:
907 case PIX_FMT_YUV420P16:
908 if (!avctx->bits_per_raw_sample && !s->bits_per_raw_sample) {
909 s->bits_per_raw_sample = 16;
910 } else if (!s->bits_per_raw_sample){
911 s->bits_per_raw_sample = avctx->bits_per_raw_sample;
913 if(s->bits_per_raw_sample <=8){
914 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
918 av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
921 s->version= FFMAX(s->version, 1);
923 case PIX_FMT_YUV444P:
924 case PIX_FMT_YUV440P:
925 case PIX_FMT_YUV422P:
926 case PIX_FMT_YUV420P:
927 case PIX_FMT_YUV411P:
928 case PIX_FMT_YUV410P:
929 s->chroma_planes= av_pix_fmt_descriptors[avctx->pix_fmt].nb_components < 3 ? 0 : 1;
932 case PIX_FMT_YUVA444P:
933 case PIX_FMT_YUVA420P:
946 av_log(avctx, AV_LOG_ERROR, "format not supported\n");
949 if (s->transparency) {
950 av_log(avctx, AV_LOG_WARNING, "Storing alpha plane, this will require a recent FFV1 decoder to playback!\n");
952 if (avctx->context_model > 1U) {
953 av_log(avctx, AV_LOG_ERROR, "Invalid context model %d, valid values are 0 and 1\n", avctx->context_model);
954 return AVERROR(EINVAL);
957 for(i=0; i<256; i++){
958 s->quant_table_count=2;
959 if(s->bits_per_raw_sample <=8){
960 s->quant_tables[0][0][i]= quant11[i];
961 s->quant_tables[0][1][i]= 11*quant11[i];
962 s->quant_tables[0][2][i]= 11*11*quant11[i];
963 s->quant_tables[1][0][i]= quant11[i];
964 s->quant_tables[1][1][i]= 11*quant11[i];
965 s->quant_tables[1][2][i]= 11*11*quant5 [i];
966 s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
967 s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
969 s->quant_tables[0][0][i]= quant9_10bit[i];
970 s->quant_tables[0][1][i]= 11*quant9_10bit[i];
971 s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
972 s->quant_tables[1][0][i]= quant9_10bit[i];
973 s->quant_tables[1][1][i]= 11*quant9_10bit[i];
974 s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
975 s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
976 s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
979 s->context_count[0]= (11*11*11+1)/2;
980 s->context_count[1]= (11*11*5*5*5+1)/2;
981 memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
983 for(i=0; i<s->plane_count; i++){
984 PlaneContext * const p= &s->plane[i];
986 memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
987 p->quant_table_index= avctx->context_model;
988 p->context_count= s->context_count[p->quant_table_index];
991 if(allocate_initial_states(s) < 0)
992 return AVERROR(ENOMEM);
994 avctx->coded_frame= &s->picture;
997 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
1001 if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
1002 for(i=0; i<s->quant_table_count; i++){
1003 s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
1005 return AVERROR(ENOMEM);
1008 if(avctx->stats_in){
1009 char *p= avctx->stats_in;
1010 uint8_t best_state[256][256];
1014 av_assert0(s->version>=2);
1017 for(j=0; j<256; j++){
1019 s->rc_stat[j][i]= strtol(p, &next, 0);
1021 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1027 for(i=0; i<s->quant_table_count; i++){
1028 for(j=0; j<s->context_count[i]; j++){
1029 for(k=0; k<32; k++){
1031 s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1033 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1041 gob_count= strtol(p, &next, 0);
1042 if(next==p || gob_count <0){
1043 av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1047 while(*p=='\n' || *p==' ') p++;
1050 sort_stt(s, s->state_transition);
1052 find_best_state(best_state, s->state_transition);
1054 for(i=0; i<s->quant_table_count; i++){
1055 for(j=0; j<s->context_count[i]; j++){
1056 for(k=0; k<32; k++){
1058 if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1059 p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1061 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)];
1068 for(s->num_v_slices=2; s->num_v_slices<9; s->num_v_slices++){
1069 for(s->num_h_slices=s->num_v_slices; s->num_h_slices<2*s->num_v_slices; s->num_h_slices++){
1070 if(avctx->slices == s->num_h_slices * s->num_v_slices && avctx->slices <= 64)
1074 av_log(avctx, AV_LOG_ERROR, "Unsupported number %d of slices requested\n", avctx->slices);
1077 write_extra_header(s);
1080 if(init_slice_contexts(s) < 0)
1082 if(init_slice_state(s) < 0)
1085 #define STATS_OUT_SIZE 1024*1024*6
1086 if(avctx->flags & CODEC_FLAG_PASS1){
1087 avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1088 for(i=0; i<s->quant_table_count; i++){
1089 for(j=0; j<s->slice_count; j++){
1090 FFV1Context *sf= s->slice_context[j];
1091 av_assert0(!sf->rc_stat2[i]);
1092 sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1093 if(!sf->rc_stat2[i])
1094 return AVERROR(ENOMEM);
1101 #endif /* CONFIG_FFV1_ENCODER */
1104 static void clear_state(FFV1Context *f){
1107 for(si=0; si<f->slice_count; si++){
1108 FFV1Context *fs= f->slice_context[si];
1109 for(i=0; i<f->plane_count; i++){
1110 PlaneContext *p= &fs->plane[i];
1112 p->interlace_bit_state[0]= 128;
1113 p->interlace_bit_state[1]= 128;
1116 if(f->initial_states[p->quant_table_index]){
1117 memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1119 memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1121 for(j=0; j<p->context_count; j++){
1122 p->vlc_state[j].drift= 0;
1123 p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1124 p->vlc_state[j].bias= 0;
1125 p->vlc_state[j].count= 1;
1132 #if CONFIG_FFV1_ENCODER
1133 static int encode_slice(AVCodecContext *c, void *arg){
1134 FFV1Context *fs= *(void**)arg;
1135 FFV1Context *f= fs->avctx->priv_data;
1136 int width = fs->slice_width;
1137 int height= fs->slice_height;
1140 AVFrame * const p= &f->picture;
1141 const int ps= (f->bits_per_raw_sample>8)+1;
1143 if(f->colorspace==0){
1144 const int chroma_width = -((-width )>>f->chroma_h_shift);
1145 const int chroma_height= -((-height)>>f->chroma_v_shift);
1146 const int cx= x>>f->chroma_h_shift;
1147 const int cy= y>>f->chroma_v_shift;
1149 encode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1151 if (f->chroma_planes){
1152 encode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1153 encode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1155 if (fs->transparency)
1156 encode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1158 encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1165 static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
1166 const AVFrame *pict, int *got_packet)
1168 FFV1Context *f = avctx->priv_data;
1169 RangeCoder * const c= &f->slice_context[0]->c;
1170 AVFrame * const p= &f->picture;
1172 uint8_t keystate=128;
1176 if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*((8*2+1+1)*4)/8
1177 + FF_MIN_BUFFER_SIZE)) < 0)
1180 ff_init_range_encoder(c, pkt->data, pkt->size);
1181 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1184 p->pict_type= AV_PICTURE_TYPE_I;
1186 if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1187 put_rac(c, &keystate, 1);
1193 put_rac(c, &keystate, 0);
1198 used_count += ff_rac_terminate(c);
1199 //printf("pos=%d\n", used_count);
1200 init_put_bits(&f->slice_context[0]->pb, pkt->data + used_count, pkt->size - used_count);
1203 for(i=1; i<256; i++){
1204 c->one_state[i]= f->state_transition[i];
1205 c->zero_state[256-i]= 256-c->one_state[i];
1209 for(i=1; i<f->slice_count; i++){
1210 FFV1Context *fs= f->slice_context[i];
1211 uint8_t *start = pkt->data + (pkt->size-used_count)*i/f->slice_count;
1212 int len = pkt->size/f->slice_count;
1215 ff_init_range_encoder(&fs->c, start, len);
1217 init_put_bits(&fs->pb, start, len);
1220 avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1223 for(i=0; i<f->slice_count; i++){
1224 FFV1Context *fs= f->slice_context[i];
1229 put_rac(&fs->c, &state, 0);
1230 bytes= ff_rac_terminate(&fs->c);
1232 flush_put_bits(&fs->pb); //nicer padding FIXME
1233 bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1237 av_assert0(bytes < pkt->size/f->slice_count);
1238 memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1239 av_assert0(bytes < (1<<24));
1240 AV_WB24(buf_p+bytes, bytes);
1246 if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1248 char *p= avctx->stats_out;
1249 char *end= p + STATS_OUT_SIZE;
1251 memset(f->rc_stat, 0, sizeof(f->rc_stat));
1252 for(i=0; i<f->quant_table_count; i++)
1253 memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1255 for(j=0; j<f->slice_count; j++){
1256 FFV1Context *fs= f->slice_context[j];
1257 for(i=0; i<256; i++){
1258 f->rc_stat[i][0] += fs->rc_stat[i][0];
1259 f->rc_stat[i][1] += fs->rc_stat[i][1];
1261 for(i=0; i<f->quant_table_count; i++){
1262 for(k=0; k<f->context_count[i]; k++){
1263 for(m=0; m<32; m++){
1264 f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1265 f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1271 for(j=0; j<256; j++){
1272 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1275 snprintf(p, end-p, "\n");
1277 for(i=0; i<f->quant_table_count; i++){
1278 for(j=0; j<f->context_count[i]; j++){
1279 for(m=0; m<32; m++){
1280 snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1285 snprintf(p, end-p, "%d\n", f->gob_count);
1286 } else if(avctx->flags&CODEC_FLAG_PASS1)
1287 avctx->stats_out[0] = '\0';
1289 f->picture_number++;
1290 pkt->size = buf_p - pkt->data;
1291 pkt->flags |= AV_PKT_FLAG_KEY*p->key_frame;
1296 #endif /* CONFIG_FFV1_ENCODER */
1298 static av_cold int common_end(AVCodecContext *avctx){
1299 FFV1Context *s = avctx->priv_data;
1302 if (avctx->codec->decode && s->picture.data[0])
1303 avctx->release_buffer(avctx, &s->picture);
1305 for(j=0; j<s->slice_count; j++){
1306 FFV1Context *fs= s->slice_context[j];
1307 for(i=0; i<s->plane_count; i++){
1308 PlaneContext *p= &fs->plane[i];
1310 av_freep(&p->state);
1311 av_freep(&p->vlc_state);
1313 av_freep(&fs->sample_buffer);
1316 av_freep(&avctx->stats_out);
1317 for(j=0; j<s->quant_table_count; j++){
1318 av_freep(&s->initial_states[j]);
1319 for(i=0; i<s->slice_count; i++){
1320 FFV1Context *sf= s->slice_context[i];
1321 av_freep(&sf->rc_stat2[j]);
1323 av_freep(&s->rc_stat2[j]);
1326 for(i=0; i<s->slice_count; i++){
1327 av_freep(&s->slice_context[i]);
1333 static av_always_inline void decode_line(FFV1Context *s, int w,
1335 int plane_index, int bits)
1337 PlaneContext * const p= &s->plane[plane_index];
1338 RangeCoder * const c= &s->c;
1342 int run_index= s->run_index;
1345 int diff, context, sign;
1347 context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1354 av_assert2(context < p->context_count);
1357 diff= get_symbol_inline(c, p->state[context], 1);
1359 if(context == 0 && run_mode==0) run_mode=1;
1362 if(run_count==0 && run_mode==1){
1363 if(get_bits1(&s->gb)){
1364 run_count = 1<<ff_log2_run[run_index];
1365 if(x + run_count <= w) run_index++;
1367 if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1369 if(run_index) run_index--;
1377 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1382 diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1384 // 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));
1387 if(sign) diff= -diff;
1389 sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1391 s->run_index= run_index;
1394 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1397 sample[0]=s->sample_buffer +3;
1398 sample[1]=s->sample_buffer+w+6+3;
1402 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1405 int16_t *temp = sample[0]; //FIXME try a normal buffer
1407 sample[0]= sample[1];
1410 sample[1][-1]= sample[0][0 ];
1411 sample[0][ w]= sample[0][w-1];
1414 if(s->avctx->bits_per_raw_sample <= 8){
1415 decode_line(s, w, sample, plane_index, 8);
1417 src[x + stride*y]= sample[1][x];
1420 decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1421 if(s->packed_at_lsb){
1423 ((uint16_t*)(src + stride*y))[x]= sample[1][x];
1427 ((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1431 //STOP_TIMER("decode-line")}
1435 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1437 int16_t *sample[4][2];
1439 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1440 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1445 memset(s->sample_buffer, 0, 8*(w+6)*sizeof(*s->sample_buffer));
1448 for(p=0; p<3 + s->transparency; p++){
1449 int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1451 sample[p][0]= sample[p][1];
1454 sample[p][1][-1]= sample[p][0][0 ];
1455 sample[p][0][ w]= sample[p][0][w-1];
1456 decode_line(s, w, sample[p], (p+1)/2, 9);
1459 int g= sample[0][1][x];
1460 int b= sample[1][1][x];
1461 int r= sample[2][1][x];
1462 int a= sample[3][1][x];
1464 // assert(g>=0 && b>=0 && r>=0);
1465 // assert(g<256 && b<512 && r<512);
1473 src[x + stride*y]= b + (g<<8) + (r<<16) + (a<<24);
1478 static int decode_slice(AVCodecContext *c, void *arg){
1479 FFV1Context *fs= *(void**)arg;
1480 FFV1Context *f= fs->avctx->priv_data;
1481 int width = fs->slice_width;
1482 int height= fs->slice_height;
1485 const int ps= (c->bits_per_raw_sample>8)+1;
1486 AVFrame * const p= &f->picture;
1488 av_assert1(width && height);
1489 if(f->colorspace==0){
1490 const int chroma_width = -((-width )>>f->chroma_h_shift);
1491 const int chroma_height= -((-height)>>f->chroma_v_shift);
1492 const int cx= x>>f->chroma_h_shift;
1493 const int cy= y>>f->chroma_v_shift;
1494 decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0);
1496 if (f->chroma_planes){
1497 decode_plane(fs, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1498 decode_plane(fs, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1500 if (fs->transparency)
1501 decode_plane(fs, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], 2);
1503 decode_rgb_frame(fs, (uint32_t*)p->data[0] + ps*x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1511 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1514 uint8_t state[CONTEXT_SIZE];
1516 memset(state, 128, sizeof(state));
1518 for(v=0; i<128 ; v++){
1519 int len= get_symbol(c, state, 0) + 1;
1521 if(len + i > 128) return -1;
1524 quant_table[i] = scale*v;
1527 //if(i%16==0) printf("\n");
1531 for(i=1; i<128; i++){
1532 quant_table[256-i]= -quant_table[i];
1534 quant_table[128]= -quant_table[127];
1539 static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1541 int context_count=1;
1544 context_count*= read_quant_table(c, quant_table[i], context_count);
1545 if(context_count > 32768U){
1549 return (context_count+1)/2;
1552 static int read_extra_header(FFV1Context *f){
1553 RangeCoder * const c= &f->c;
1554 uint8_t state[CONTEXT_SIZE];
1556 uint8_t state2[32][CONTEXT_SIZE];
1558 memset(state2, 128, sizeof(state2));
1559 memset(state, 128, sizeof(state));
1561 ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1562 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1564 f->version= get_symbol(c, state, 0);
1566 f->minor_version= get_symbol(c, state, 0);
1567 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1569 for(i=1; i<256; i++){
1570 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1573 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1574 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1575 f->chroma_planes= get_rac(c, state);
1576 f->chroma_h_shift= get_symbol(c, state, 0);
1577 f->chroma_v_shift= get_symbol(c, state, 0);
1578 f->transparency= get_rac(c, state);
1579 f->plane_count= 2 + f->transparency;
1580 f->num_h_slices= 1 + get_symbol(c, state, 0);
1581 f->num_v_slices= 1 + get_symbol(c, state, 0);
1582 if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1583 av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1587 f->quant_table_count= get_symbol(c, state, 0);
1588 if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1590 for(i=0; i<f->quant_table_count; i++){
1591 if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1592 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1597 if(allocate_initial_states(f) < 0)
1598 return AVERROR(ENOMEM);
1600 for(i=0; i<f->quant_table_count; i++){
1601 if(get_rac(c, state)){
1602 for(j=0; j<f->context_count[i]; j++){
1603 for(k=0; k<CONTEXT_SIZE; k++){
1604 int pred= j ? f->initial_states[i][j-1][k] : 128;
1605 f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1614 static int read_header(FFV1Context *f){
1615 uint8_t state[CONTEXT_SIZE];
1616 int i, j, context_count;
1617 RangeCoder * const c= &f->slice_context[0]->c;
1619 memset(state, 128, sizeof(state));
1622 f->version= get_symbol(c, state, 0);
1623 f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1625 for(i=1; i<256; i++){
1626 f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1629 f->colorspace= get_symbol(c, state, 0); //YUV cs type
1631 f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1632 f->chroma_planes= get_rac(c, state);
1633 f->chroma_h_shift= get_symbol(c, state, 0);
1634 f->chroma_v_shift= get_symbol(c, state, 0);
1635 f->transparency= get_rac(c, state);
1636 f->plane_count= 2 + f->transparency;
1639 if(f->colorspace==0){
1640 if(!f->transparency && !f->chroma_planes){
1641 if (f->avctx->bits_per_raw_sample<=8)
1642 f->avctx->pix_fmt= PIX_FMT_GRAY8;
1644 f->avctx->pix_fmt= PIX_FMT_GRAY16;
1645 }else if(f->avctx->bits_per_raw_sample<=8 && !f->transparency){
1646 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1647 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1648 case 0x01: f->avctx->pix_fmt= PIX_FMT_YUV440P; break;
1649 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1650 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1651 case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1652 case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1654 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1657 }else if(f->avctx->bits_per_raw_sample<=8 && f->transparency){
1658 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1659 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUVA444P; break;
1660 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUVA420P; break;
1662 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1665 }else if(f->avctx->bits_per_raw_sample==9) {
1667 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1668 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P9; break;
1669 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P9; break;
1670 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P9; break;
1672 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1675 }else if(f->avctx->bits_per_raw_sample==10) {
1677 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1678 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P10; break;
1679 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P10; break;
1680 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P10; break;
1682 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1686 switch(16*f->chroma_h_shift + f->chroma_v_shift){
1687 case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1688 case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1689 case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1691 av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1695 }else if(f->colorspace==1){
1696 if(f->chroma_h_shift || f->chroma_v_shift){
1697 av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1700 if(f->transparency) f->avctx->pix_fmt= PIX_FMT_RGB32;
1701 else f->avctx->pix_fmt= PIX_FMT_0RGB32;
1703 av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1707 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1709 context_count= read_quant_tables(c, f->quant_table);
1710 if(context_count < 0){
1711 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1715 f->slice_count= get_symbol(c, state, 0);
1716 if(f->slice_count > (unsigned)MAX_SLICES)
1720 for(j=0; j<f->slice_count; j++){
1721 FFV1Context *fs= f->slice_context[j];
1723 fs->packed_at_lsb= f->packed_at_lsb;
1725 if(f->version >= 2){
1726 fs->slice_x = get_symbol(c, state, 0) *f->width ;
1727 fs->slice_y = get_symbol(c, state, 0) *f->height;
1728 fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1729 fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1731 fs->slice_x /= f->num_h_slices;
1732 fs->slice_y /= f->num_v_slices;
1733 fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1734 fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1735 if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1737 if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1738 || (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1742 for(i=0; i<f->plane_count; i++){
1743 PlaneContext * const p= &fs->plane[i];
1745 if(f->version >= 2){
1746 int idx=get_symbol(c, state, 0);
1747 if(idx > (unsigned)f->quant_table_count){
1748 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1751 p->quant_table_index= idx;
1752 memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1753 context_count= f->context_count[idx];
1755 memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1758 if(p->context_count < context_count){
1759 av_freep(&p->state);
1760 av_freep(&p->vlc_state);
1762 p->context_count= context_count;
1769 static av_cold int decode_init(AVCodecContext *avctx)
1771 FFV1Context *f = avctx->priv_data;
1775 if(avctx->extradata && read_extra_header(f) < 0)
1778 if(init_slice_contexts(f) < 0)
1784 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1785 const uint8_t *buf = avpkt->data;
1786 int buf_size = avpkt->size;
1787 FFV1Context *f = avctx->priv_data;
1788 RangeCoder * const c= &f->slice_context[0]->c;
1789 AVFrame * const p= &f->picture;
1791 uint8_t keystate= 128;
1792 const uint8_t *buf_p;
1794 AVFrame *picture = data;
1796 /* release previously stored data */
1798 avctx->release_buffer(avctx, p);
1800 ff_init_range_decoder(c, buf, buf_size);
1801 ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1804 p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1805 if(get_rac(c, &keystate)){
1807 if(read_header(f) < 0)
1809 if(init_slice_state(f) < 0)
1818 for(i=1; i<256; i++){
1819 c->one_state[i]= f->state_transition[i];
1820 c->zero_state[256-i]= 256-c->one_state[i];
1825 if(avctx->get_buffer(avctx, p) < 0){
1826 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1830 if(avctx->debug&FF_DEBUG_PICT_INFO)
1831 av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1834 bytes_read = c->bytestream - c->bytestream_start - 1;
1835 if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1836 //printf("pos=%d\n", bytes_read);
1837 init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, (buf_size - bytes_read) * 8);
1839 bytes_read = 0; /* avoid warning */
1842 buf_p= buf + buf_size;
1843 for(i=f->slice_count-1; i>0; i--){
1844 FFV1Context *fs= f->slice_context[i];
1845 int v= AV_RB24(buf_p-3)+3;
1846 if(buf_p - buf <= v){
1847 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1852 ff_init_range_decoder(&fs->c, buf_p, v);
1854 init_get_bits(&fs->gb, buf_p, v * 8);
1858 avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1859 f->picture_number++;
1862 *data_size = sizeof(AVFrame);
1867 AVCodec ff_ffv1_decoder = {
1869 .type = AVMEDIA_TYPE_VIDEO,
1870 .id = CODEC_ID_FFV1,
1871 .priv_data_size = sizeof(FFV1Context),
1872 .init = decode_init,
1873 .close = common_end,
1874 .decode = decode_frame,
1875 .capabilities = CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ |
1876 CODEC_CAP_SLICE_THREADS,
1877 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1880 #if CONFIG_FFV1_ENCODER
1881 AVCodec ff_ffv1_encoder = {
1883 .type = AVMEDIA_TYPE_VIDEO,
1884 .id = CODEC_ID_FFV1,
1885 .priv_data_size = sizeof(FFV1Context),
1886 .init = encode_init,
1887 .encode2 = encode_frame,
1888 .close = common_end,
1889 .capabilities = CODEC_CAP_SLICE_THREADS,
1890 .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_YUV444P9, PIX_FMT_YUV422P9, PIX_FMT_YUV420P9, PIX_FMT_YUV420P10, PIX_FMT_YUV422P10, PIX_FMT_YUV444P10, PIX_FMT_GRAY16, PIX_FMT_GRAY8, PIX_FMT_NONE},
1891 .long_name = NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),