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 (an experimental lossless codec)
29 #include "bitstream.h"
31 #include "rangecoder.h"
35 #define CONTEXT_SIZE 32
37 static const int8_t quant3
[256]={
38 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
42 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
47 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
48 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
49 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
50 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
55 static const int8_t quant5
[256]={
56 0, 1, 1, 1, 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, 2,
61 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
62 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
63 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
64 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
65 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
66 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
67 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
68 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
69 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
71 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
73 static const int8_t quant7
[256]={
74 0, 1, 1, 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, 3, 3, 3, 3, 3, 3, 3, 3,
77 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
78 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
79 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
80 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
81 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
82 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
83 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
84 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
85 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
86 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
87 -3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
88 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89 -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
91 static const int8_t quant9
[256]={
92 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
93 3, 3, 3, 3, 3, 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, 4, 4, 4, 4, 4, 4, 4,
99 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
100 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
101 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
102 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
103 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
104 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
105 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
106 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
107 -3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
109 static const int8_t quant11
[256]={
110 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
111 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
112 4, 4, 4, 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,-5,-5,
119 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
120 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
121 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
122 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
123 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
124 -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125 -4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
127 static const int8_t quant13
[256]={
128 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
129 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
130 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
131 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
132 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
133 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
134 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
135 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
136 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
137 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
138 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
139 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
140 -6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
141 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
142 -5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
143 -4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
146 static const uint8_t log2_run
[32]={
147 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,
148 4, 4, 5, 5, 6, 6, 7, 7,
149 8, 9,10,11,12,13,14,15,
152 typedef struct VlcState
{
159 typedef struct PlaneContext
{
161 uint8_t (*state
)[CONTEXT_SIZE
];
163 uint8_t interlace_bit_state
[2];
166 typedef struct FFV1Context
{
167 AVCodecContext
*avctx
;
173 int chroma_h_shift
, chroma_v_shift
;
178 int ac
; ///< 1-> CABAC 0-> golomb rice
179 PlaneContext plane
[MAX_PLANES
];
180 int16_t quant_table
[5][256];
187 static av_always_inline
int fold(int diff
, int bits
){
199 static inline int predict(int_fast16_t *src
, int_fast16_t *last
){
200 const int LT
= last
[-1];
201 const int T
= last
[ 0];
202 const int L
= src
[-1];
204 return mid_pred(L
, L
+ T
- LT
, T
);
207 static inline int get_context(FFV1Context
*f
, int_fast16_t *src
, int_fast16_t *last
, int_fast16_t *last2
){
208 const int LT
= last
[-1];
209 const int T
= last
[ 0];
210 const int RT
= last
[ 1];
211 const int L
= src
[-1];
213 if(f
->quant_table
[3][127]){
214 const int TT
= last2
[0];
215 const int LL
= src
[-2];
216 return f
->quant_table
[0][(L
-LT
) & 0xFF] + f
->quant_table
[1][(LT
-T
) & 0xFF] + f
->quant_table
[2][(T
-RT
) & 0xFF]
217 +f
->quant_table
[3][(LL
-L
) & 0xFF] + f
->quant_table
[4][(TT
-T
) & 0xFF];
219 return f
->quant_table
[0][(L
-LT
) & 0xFF] + f
->quant_table
[1][(LT
-T
) & 0xFF] + f
->quant_table
[2][(T
-RT
) & 0xFF];
222 static inline void put_symbol(RangeCoder
*c
, uint8_t *state
, int v
, int is_signed
){
226 const int a
= FFABS(v
);
227 const int e
= av_log2(a
);
228 put_rac(c
, state
+0, 0);
233 put_rac(c
, state
+1+i
, 1); //1..10
235 put_rac(c
, state
+1+i
, 0);
237 for(i
=e
-1; i
>=0; i
--){
238 put_rac(c
, state
+22+i
, (a
>>i
)&1); //22..31
242 put_rac(c
, state
+11 + e
, v
< 0); //11..21
244 put_rac(c
, state
+0, 1);
248 static inline int get_symbol(RangeCoder
*c
, uint8_t *state
, int is_signed
){
249 if(get_rac(c
, state
+0))
254 while(get_rac(c
, state
+1 + e
)){ //1..10
260 for(i
=e
-1; i
>=0; i
--){
261 a
+= a
+ get_rac(c
, state
+22 + i
); //22..31
264 if(is_signed
&& get_rac(c
, state
+11 + e
)) //11..21
271 static inline void update_vlc_state(VlcState
* const state
, const int v
){
272 int drift
= state
->drift
;
273 int count
= state
->count
;
274 state
->error_sum
+= FFABS(v
);
277 if(count
== 128){ //FIXME variable
280 state
->error_sum
>>= 1;
285 if(state
->bias
> -128) state
->bias
--;
291 if(state
->bias
< 127) state
->bias
++;
302 static inline void put_vlc_symbol(PutBitContext
*pb
, VlcState
* const state
, int v
, int bits
){
304 //printf("final: %d ", v);
305 v
= fold(v
- state
->bias
, bits
);
309 while(i
< state
->error_sum
){ //FIXME optimize
317 if(k
==0 && 2*state
->drift
<= - state
->count
) code
= v
^ (-1);
320 code
= v
^ ((2*state
->drift
+ state
->count
)>>31);
323 //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);
324 set_sr_golomb(pb
, code
, k
, 12, bits
);
326 update_vlc_state(state
, v
);
329 static inline int get_vlc_symbol(GetBitContext
*gb
, VlcState
* const state
, int bits
){
334 while(i
< state
->error_sum
){ //FIXME optimize
341 v
= get_sr_golomb(gb
, k
, 12, bits
);
342 //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
345 if(k
==0 && 2*state
->drift
<= - state
->count
) v
^= (-1);
347 v
^= ((2*state
->drift
+ state
->count
)>>31);
350 ret
= fold(v
+ state
->bias
, bits
);
352 update_vlc_state(state
, v
);
353 //printf("final: %d\n", ret);
357 #ifdef CONFIG_ENCODERS
358 static inline int encode_line(FFV1Context
*s
, int w
, int_fast16_t *sample
[2], int plane_index
, int bits
){
359 PlaneContext
* const p
= &s
->plane
[plane_index
];
360 RangeCoder
* const c
= &s
->c
;
362 int run_index
= s
->run_index
;
367 if(c
->bytestream_end
- c
->bytestream
< w
*20){
368 av_log(s
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
372 if(s
->pb
.buf_end
- s
->pb
.buf
- (put_bits_count(&s
->pb
)>>3) < w
*4){
373 av_log(s
->avctx
, AV_LOG_ERROR
, "encoded frame too large\n");
381 context
= get_context(s
, sample
[0]+x
, sample
[1]+x
, sample
[2]+x
);
382 diff
= sample
[0][x
] - predict(sample
[0]+x
, sample
[1]+x
);
389 diff
= fold(diff
, bits
);
392 put_symbol(c
, p
->state
[context
], diff
, 1);
394 if(context
== 0) run_mode
=1;
399 while(run_count
>= 1<<log2_run
[run_index
]){
400 run_count
-= 1<<log2_run
[run_index
];
402 put_bits(&s
->pb
, 1, 1);
405 put_bits(&s
->pb
, 1 + log2_run
[run_index
], run_count
);
406 if(run_index
) run_index
--;
415 // 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));
418 put_vlc_symbol(&s
->pb
, &p
->vlc_state
[context
], diff
, bits
);
422 while(run_count
>= 1<<log2_run
[run_index
]){
423 run_count
-= 1<<log2_run
[run_index
];
425 put_bits(&s
->pb
, 1, 1);
429 put_bits(&s
->pb
, 1, 1);
431 s
->run_index
= run_index
;
436 static void encode_plane(FFV1Context
*s
, uint8_t *src
, int w
, int h
, int stride
, int plane_index
){
438 const int ring_size
= s
->avctx
->context_model
? 3 : 2;
439 int_fast16_t sample_buffer
[ring_size
][w
+6], *sample
[ring_size
];
442 memset(sample_buffer
, 0, sizeof(sample_buffer
));
445 for(i
=0; i
<ring_size
; i
++)
446 sample
[i
]= sample_buffer
[(h
+i
-y
)%ring_size
]+3;
448 sample
[0][-1]= sample
[1][0 ];
449 sample
[1][ w
]= sample
[1][w
-1];
452 sample
[0][x
]= src
[x
+ stride
*y
];
454 encode_line(s
, w
, sample
, plane_index
, 8);
455 //STOP_TIMER("encode line")}
459 static void encode_rgb_frame(FFV1Context
*s
, uint32_t *src
, int w
, int h
, int stride
){
461 const int ring_size
= s
->avctx
->context_model
? 3 : 2;
462 int_fast16_t sample_buffer
[3][ring_size
][w
+6], *sample
[3][ring_size
];
465 memset(sample_buffer
, 0, sizeof(sample_buffer
));
468 for(i
=0; i
<ring_size
; i
++)
470 sample
[p
][i
]= sample_buffer
[p
][(h
+i
-y
)%ring_size
]+3;
473 int v
= src
[x
+ stride
*y
];
484 // assert(g>=0 && b>=0 && r>=0);
485 // assert(g<256 && b<512 && r<512);
491 sample
[p
][0][-1]= sample
[p
][1][0 ];
492 sample
[p
][1][ w
]= sample
[p
][1][w
-1];
493 encode_line(s
, w
, sample
[p
], FFMIN(p
, 1), 9);
498 static void write_quant_table(RangeCoder
*c
, int16_t *quant_table
){
501 uint8_t state
[CONTEXT_SIZE
];
502 memset(state
, 128, sizeof(state
));
504 for(i
=1; i
<128 ; i
++){
505 if(quant_table
[i
] != quant_table
[i
-1]){
506 put_symbol(c
, state
, i
-last
-1, 0);
510 put_symbol(c
, state
, i
-last
-1, 0);
513 static void write_header(FFV1Context
*f
){
514 uint8_t state
[CONTEXT_SIZE
];
516 RangeCoder
* const c
= &f
->c
;
518 memset(state
, 128, sizeof(state
));
520 put_symbol(c
, state
, f
->version
, 0);
521 put_symbol(c
, state
, f
->avctx
->coder_type
, 0);
522 put_symbol(c
, state
, f
->colorspace
, 0); //YUV cs type
523 put_rac(c
, state
, 1); //chroma planes
524 put_symbol(c
, state
, f
->chroma_h_shift
, 0);
525 put_symbol(c
, state
, f
->chroma_v_shift
, 0);
526 put_rac(c
, state
, 0); //no transparency plane
529 write_quant_table(c
, f
->quant_table
[i
]);
531 #endif /* CONFIG_ENCODERS */
533 static av_cold
int common_init(AVCodecContext
*avctx
){
534 FFV1Context
*s
= avctx
->priv_data
;
538 s
->flags
= avctx
->flags
;
540 dsputil_init(&s
->dsp
, avctx
);
542 width
= s
->width
= avctx
->width
;
543 height
= s
->height
= avctx
->height
;
545 assert(width
&& height
);
550 #ifdef CONFIG_ENCODERS
551 static av_cold
int encode_init(AVCodecContext
*avctx
)
553 FFV1Context
*s
= avctx
->priv_data
;
559 s
->ac
= avctx
->coder_type
;
562 for(i
=0; i
<256; i
++){
563 s
->quant_table
[0][i
]= quant11
[i
];
564 s
->quant_table
[1][i
]= 11*quant11
[i
];
565 if(avctx
->context_model
==0){
566 s
->quant_table
[2][i
]= 11*11*quant11
[i
];
567 s
->quant_table
[3][i
]=
568 s
->quant_table
[4][i
]=0;
570 s
->quant_table
[2][i
]= 11*11*quant5
[i
];
571 s
->quant_table
[3][i
]= 5*11*11*quant5
[i
];
572 s
->quant_table
[4][i
]= 5*5*11*11*quant5
[i
];
576 for(i
=0; i
<s
->plane_count
; i
++){
577 PlaneContext
* const p
= &s
->plane
[i
];
579 if(avctx
->context_model
==0){
580 p
->context_count
= (11*11*11+1)/2;
582 p
->context_count
= (11*11*5*5*5+1)/2;
586 if(!p
->state
) p
->state
= av_malloc(CONTEXT_SIZE
*p
->context_count
*sizeof(uint8_t));
588 if(!p
->vlc_state
) p
->vlc_state
= av_malloc(p
->context_count
*sizeof(VlcState
));
592 avctx
->coded_frame
= &s
->picture
;
593 switch(avctx
->pix_fmt
){
594 case PIX_FMT_YUV444P
:
595 case PIX_FMT_YUV422P
:
596 case PIX_FMT_YUV420P
:
597 case PIX_FMT_YUV411P
:
598 case PIX_FMT_YUV410P
:
605 av_log(avctx
, AV_LOG_ERROR
, "format not supported\n");
608 avcodec_get_chroma_sub_sample(avctx
->pix_fmt
, &s
->chroma_h_shift
, &s
->chroma_v_shift
);
614 #endif /* CONFIG_ENCODERS */
617 static void clear_state(FFV1Context
*f
){
620 for(i
=0; i
<f
->plane_count
; i
++){
621 PlaneContext
*p
= &f
->plane
[i
];
623 p
->interlace_bit_state
[0]= 128;
624 p
->interlace_bit_state
[1]= 128;
626 for(j
=0; j
<p
->context_count
; j
++){
628 memset(p
->state
[j
], 128, sizeof(uint8_t)*CONTEXT_SIZE
);
630 p
->vlc_state
[j
].drift
= 0;
631 p
->vlc_state
[j
].error_sum
= 4; //FFMAX((RANGE + 32)/64, 2);
632 p
->vlc_state
[j
].bias
= 0;
633 p
->vlc_state
[j
].count
= 1;
639 #ifdef CONFIG_ENCODERS
640 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
641 FFV1Context
*f
= avctx
->priv_data
;
642 RangeCoder
* const c
= &f
->c
;
643 AVFrame
*pict
= data
;
644 const int width
= f
->width
;
645 const int height
= f
->height
;
646 AVFrame
* const p
= &f
->picture
;
648 uint8_t keystate
=128;
650 ff_init_range_encoder(c
, buf
, buf_size
);
651 // ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64);
652 ff_build_rac_states(c
, 0.05*(1LL<<32), 256-8);
655 p
->pict_type
= FF_I_TYPE
;
657 if(avctx
->gop_size
==0 || f
->picture_number
% avctx
->gop_size
== 0){
658 put_rac(c
, &keystate
, 1);
663 put_rac(c
, &keystate
, 0);
668 used_count
+= ff_rac_terminate(c
);
669 //printf("pos=%d\n", used_count);
670 init_put_bits(&f
->pb
, buf
+ used_count
, buf_size
- used_count
);
673 if(f
->colorspace
==0){
674 const int chroma_width
= -((-width
)>>f
->chroma_h_shift
);
675 const int chroma_height
= -((-height
)>>f
->chroma_v_shift
);
677 encode_plane(f
, p
->data
[0], width
, height
, p
->linesize
[0], 0);
679 encode_plane(f
, p
->data
[1], chroma_width
, chroma_height
, p
->linesize
[1], 1);
680 encode_plane(f
, p
->data
[2], chroma_width
, chroma_height
, p
->linesize
[2], 1);
682 encode_rgb_frame(f
, (uint32_t*)(p
->data
[0]), width
, height
, p
->linesize
[0]/4);
689 return ff_rac_terminate(c
);
691 flush_put_bits(&f
->pb
); //nicer padding FIXME
692 return used_count
+ (put_bits_count(&f
->pb
)+7)/8;
695 #endif /* CONFIG_ENCODERS */
697 static av_cold
int common_end(AVCodecContext
*avctx
){
698 FFV1Context
*s
= avctx
->priv_data
;
701 for(i
=0; i
<s
->plane_count
; i
++){
702 PlaneContext
*p
= &s
->plane
[i
];
705 av_freep(&p
->vlc_state
);
711 static inline void decode_line(FFV1Context
*s
, int w
, int_fast16_t *sample
[2], int plane_index
, int bits
){
712 PlaneContext
* const p
= &s
->plane
[plane_index
];
713 RangeCoder
* const c
= &s
->c
;
717 int run_index
= s
->run_index
;
720 int diff
, context
, sign
;
722 context
= get_context(s
, sample
[1] + x
, sample
[0] + x
, sample
[1] + x
);
731 diff
= get_symbol(c
, p
->state
[context
], 1);
733 if(context
== 0 && run_mode
==0) run_mode
=1;
736 if(run_count
==0 && run_mode
==1){
737 if(get_bits1(&s
->gb
)){
738 run_count
= 1<<log2_run
[run_index
];
739 if(x
+ run_count
<= w
) run_index
++;
741 if(log2_run
[run_index
]) run_count
= get_bits(&s
->gb
, log2_run
[run_index
]);
743 if(run_index
) run_index
--;
751 diff
= get_vlc_symbol(&s
->gb
, &p
->vlc_state
[context
], bits
);
756 diff
= get_vlc_symbol(&s
->gb
, &p
->vlc_state
[context
], bits
);
758 // 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));
761 if(sign
) diff
= -diff
;
763 sample
[1][x
]= (predict(sample
[1] + x
, sample
[0] + x
) + diff
) & ((1<<bits
)-1);
765 s
->run_index
= run_index
;
768 static void decode_plane(FFV1Context
*s
, uint8_t *src
, int w
, int h
, int stride
, int plane_index
){
770 int_fast16_t sample_buffer
[2][w
+6];
771 int_fast16_t *sample
[2];
772 sample
[0]=sample_buffer
[0]+3;
773 sample
[1]=sample_buffer
[1]+3;
777 memset(sample_buffer
, 0, sizeof(sample_buffer
));
780 int_fast16_t *temp
= sample
[0]; //FIXME try a normal buffer
782 sample
[0]= sample
[1];
785 sample
[1][-1]= sample
[0][0 ];
786 sample
[0][ w
]= sample
[0][w
-1];
789 decode_line(s
, w
, sample
, plane_index
, 8);
791 src
[x
+ stride
*y
]= sample
[1][x
];
793 //STOP_TIMER("decode-line")}
797 static void decode_rgb_frame(FFV1Context
*s
, uint32_t *src
, int w
, int h
, int stride
){
799 int_fast16_t sample_buffer
[3][2][w
+6];
800 int_fast16_t *sample
[3][2];
802 sample
[x
][0] = sample_buffer
[x
][0]+3;
803 sample
[x
][1] = sample_buffer
[x
][1]+3;
808 memset(sample_buffer
, 0, sizeof(sample_buffer
));
812 int_fast16_t *temp
= sample
[p
][0]; //FIXME try a normal buffer
814 sample
[p
][0]= sample
[p
][1];
817 sample
[p
][1][-1]= sample
[p
][0][0 ];
818 sample
[p
][0][ w
]= sample
[p
][0][w
-1];
819 decode_line(s
, w
, sample
[p
], FFMIN(p
, 1), 9);
822 int g
= sample
[0][1][x
];
823 int b
= sample
[1][1][x
];
824 int r
= sample
[2][1][x
];
826 // assert(g>=0 && b>=0 && r>=0);
827 // assert(g<256 && b<512 && r<512);
835 src
[x
+ stride
*y
]= b
+ (g
<<8) + (r
<<16);
840 static int read_quant_table(RangeCoder
*c
, int16_t *quant_table
, int scale
){
843 uint8_t state
[CONTEXT_SIZE
];
845 memset(state
, 128, sizeof(state
));
847 for(v
=0; i
<128 ; v
++){
848 int len
= get_symbol(c
, state
, 0) + 1;
850 if(len
+ i
> 128) return -1;
853 quant_table
[i
] = scale
*v
;
856 //if(i%16==0) printf("\n");
860 for(i
=1; i
<128; i
++){
861 quant_table
[256-i
]= -quant_table
[i
];
863 quant_table
[128]= -quant_table
[127];
868 static int read_header(FFV1Context
*f
){
869 uint8_t state
[CONTEXT_SIZE
];
870 int i
, context_count
;
871 RangeCoder
* const c
= &f
->c
;
873 memset(state
, 128, sizeof(state
));
875 f
->version
= get_symbol(c
, state
, 0);
876 f
->ac
= f
->avctx
->coder_type
= get_symbol(c
, state
, 0);
877 f
->colorspace
= get_symbol(c
, state
, 0); //YUV cs type
878 get_rac(c
, state
); //no chroma = false
879 f
->chroma_h_shift
= get_symbol(c
, state
, 0);
880 f
->chroma_v_shift
= get_symbol(c
, state
, 0);
881 get_rac(c
, state
); //transparency plane
884 if(f
->colorspace
==0){
885 switch(16*f
->chroma_h_shift
+ f
->chroma_v_shift
){
886 case 0x00: f
->avctx
->pix_fmt
= PIX_FMT_YUV444P
; break;
887 case 0x10: f
->avctx
->pix_fmt
= PIX_FMT_YUV422P
; break;
888 case 0x11: f
->avctx
->pix_fmt
= PIX_FMT_YUV420P
; break;
889 case 0x20: f
->avctx
->pix_fmt
= PIX_FMT_YUV411P
; break;
890 case 0x22: f
->avctx
->pix_fmt
= PIX_FMT_YUV410P
; break;
892 av_log(f
->avctx
, AV_LOG_ERROR
, "format not supported\n");
895 }else if(f
->colorspace
==1){
896 if(f
->chroma_h_shift
|| f
->chroma_v_shift
){
897 av_log(f
->avctx
, AV_LOG_ERROR
, "chroma subsampling not supported in this colorspace\n");
900 f
->avctx
->pix_fmt
= PIX_FMT_RGB32
;
902 av_log(f
->avctx
, AV_LOG_ERROR
, "colorspace not supported\n");
906 //printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
910 context_count
*= read_quant_table(c
, f
->quant_table
[i
], context_count
);
911 if(context_count
< 0 || context_count
> 32768){
912 av_log(f
->avctx
, AV_LOG_ERROR
, "read_quant_table error\n");
916 context_count
= (context_count
+1)/2;
918 for(i
=0; i
<f
->plane_count
; i
++){
919 PlaneContext
* const p
= &f
->plane
[i
];
921 p
->context_count
= context_count
;
924 if(!p
->state
) p
->state
= av_malloc(CONTEXT_SIZE
*p
->context_count
*sizeof(uint8_t));
926 if(!p
->vlc_state
) p
->vlc_state
= av_malloc(p
->context_count
*sizeof(VlcState
));
933 static av_cold
int decode_init(AVCodecContext
*avctx
)
935 // FFV1Context *s = avctx->priv_data;
942 static int decode_frame(AVCodecContext
*avctx
, void *data
, int *data_size
, const uint8_t *buf
, int buf_size
){
943 FFV1Context
*f
= avctx
->priv_data
;
944 RangeCoder
* const c
= &f
->c
;
945 const int width
= f
->width
;
946 const int height
= f
->height
;
947 AVFrame
* const p
= &f
->picture
;
949 uint8_t keystate
= 128;
951 AVFrame
*picture
= data
;
953 ff_init_range_decoder(c
, buf
, buf_size
);
954 ff_build_rac_states(c
, 0.05*(1LL<<32), 256-8);
957 p
->pict_type
= FF_I_TYPE
; //FIXME I vs. P
958 if(get_rac(c
, &keystate
)){
960 if(read_header(f
) < 0)
966 if(!f
->plane
[0].state
&& !f
->plane
[0].vlc_state
)
970 if(avctx
->get_buffer(avctx
, p
) < 0){
971 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
975 if(avctx
->debug
&FF_DEBUG_PICT_INFO
)
976 av_log(avctx
, AV_LOG_ERROR
, "keyframe:%d coder:%d\n", p
->key_frame
, f
->ac
);
979 bytes_read
= c
->bytestream
- c
->bytestream_start
- 1;
980 if(bytes_read
==0) av_log(avctx
, AV_LOG_ERROR
, "error at end of AC stream\n"); //FIXME
981 //printf("pos=%d\n", bytes_read);
982 init_get_bits(&f
->gb
, buf
+ bytes_read
, buf_size
- bytes_read
);
984 bytes_read
= 0; /* avoid warning */
987 if(f
->colorspace
==0){
988 const int chroma_width
= -((-width
)>>f
->chroma_h_shift
);
989 const int chroma_height
= -((-height
)>>f
->chroma_v_shift
);
990 decode_plane(f
, p
->data
[0], width
, height
, p
->linesize
[0], 0);
992 decode_plane(f
, p
->data
[1], chroma_width
, chroma_height
, p
->linesize
[1], 1);
993 decode_plane(f
, p
->data
[2], chroma_width
, chroma_height
, p
->linesize
[2], 1);
995 decode_rgb_frame(f
, (uint32_t*)p
->data
[0], width
, height
, p
->linesize
[0]/4);
1000 f
->picture_number
++;
1004 avctx
->release_buffer(avctx
, p
); //FIXME
1006 *data_size
= sizeof(AVFrame
);
1009 bytes_read
= c
->bytestream
- c
->bytestream_start
- 1;
1010 if(bytes_read
==0) av_log(f
->avctx
, AV_LOG_ERROR
, "error at end of frame\n");
1012 bytes_read
+= (get_bits_count(&f
->gb
)+7)/8;
1018 AVCodec ffv1_decoder
= {
1022 sizeof(FFV1Context
),
1027 CODEC_CAP_DR1
/*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1029 .long_name
= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),
1032 #ifdef CONFIG_ENCODERS
1033 AVCodec ffv1_encoder
= {
1037 sizeof(FFV1Context
),
1041 .pix_fmts
= (enum PixelFormat
[]){PIX_FMT_YUV420P
, PIX_FMT_YUV444P
, PIX_FMT_YUV422P
, PIX_FMT_YUV411P
, PIX_FMT_YUV410P
, PIX_FMT_RGB32
, PIX_FMT_NONE
},
1042 .long_name
= NULL_IF_CONFIG_SMALL("FFmpeg codec #1"),