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"
37
#define CONTEXT_SIZE 32
39
extern const uint8_t ff_log2_run[32];
41
static const int8_t quant3[256]={
42
0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
43
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
44
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
45
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
46
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
47
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
48
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
51
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
52
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
53
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
54
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
55
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
56
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
57
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
60
static const int8_t quant5_10bit[256]={
61
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
62
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
63
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
64
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
65
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
66
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
67
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
68
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
69
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
70
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
71
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
72
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
73
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,
74
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
75
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
76
-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
79
static const int8_t quant5[256]={
80
0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
81
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
82
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
83
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
84
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
85
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
86
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
87
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
88
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
89
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
90
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
91
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
92
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
93
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
94
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
95
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,-1,
97
static const int8_t quant7[256]={
98
0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
101
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
102
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
107
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
108
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
109
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
110
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
111
-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
112
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
113
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
115
static const int8_t quant9[256]={
116
0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
117
3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
118
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
119
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
120
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
121
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
122
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
123
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
124
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
125
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
126
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
127
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
128
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
129
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
130
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
131
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
133
static const int8_t quant9_10bit[256]={
134
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
135
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
136
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137
3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
138
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
139
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
140
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
141
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
142
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
143
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
144
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
145
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
146
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
147
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
148
-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
149
-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
152
static const int8_t quant11[256]={
153
0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
154
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
155
4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
156
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
157
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
158
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
159
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
160
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
161
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
162
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
163
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
164
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
165
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
166
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
167
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
168
-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
170
static const int8_t quant13[256]={
171
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
172
4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
173
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
174
5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
175
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
176
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
177
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
178
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
179
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
180
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
181
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
182
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
183
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
184
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
185
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
186
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
189
static const uint8_t ver2_state[256]= {
190
0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
191
59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
192
40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
193
53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
194
87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
195
85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
196
105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
197
115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
198
165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
199
147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
200
172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
201
175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
202
197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
203
209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
204
226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
205
241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
208
typedef struct VlcState{
215
typedef struct PlaneContext{
217
uint8_t (*state)[CONTEXT_SIZE];
219
uint8_t interlace_bit_state[2];
222
typedef struct FFV1Context{
223
AVCodecContext *avctx;
229
int chroma_h_shift, chroma_v_shift;
234
int ac; ///< 1=range coder <-> 0=golomb rice
235
PlaneContext plane[MAX_PLANES];
236
int16_t quant_table[5][256];
237
uint8_t state_transition[256];
244
static av_always_inline int fold(int diff, int bits){
256
static inline int predict(int_fast16_t *src, int_fast16_t *last){
257
const int LT= last[-1];
258
const int T= last[ 0];
259
const int L = src[-1];
261
return mid_pred(L, L + T - LT, T);
264
static inline int get_context(FFV1Context *f, int_fast16_t *src, int_fast16_t *last, int_fast16_t *last2){
265
const int LT= last[-1];
266
const int T= last[ 0];
267
const int RT= last[ 1];
268
const int L = src[-1];
270
if(f->quant_table[3][127]){
271
const int TT= last2[0];
272
const int LL= src[-2];
273
return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF]
274
+f->quant_table[3][(LL-L) & 0xFF] + f->quant_table[4][(TT-T) & 0xFF];
276
return f->quant_table[0][(L-LT) & 0xFF] + f->quant_table[1][(LT-T) & 0xFF] + f->quant_table[2][(T-RT) & 0xFF];
279
static inline void put_symbol_inline(RangeCoder *c, uint8_t *state, int v, int is_signed){
283
const int a= FFABS(v);
284
const int e= av_log2(a);
285
put_rac(c, state+0, 0);
288
put_rac(c, state+1+i, 1); //1..10
290
put_rac(c, state+1+i, 0);
292
for(i=e-1; i>=0; i--){
293
put_rac(c, state+22+i, (a>>i)&1); //22..31
297
put_rac(c, state+11 + e, v < 0); //11..21
300
put_rac(c, state+1+FFMIN(i,9), 1); //1..10
302
put_rac(c, state+1+9, 0);
304
for(i=e-1; i>=0; i--){
305
put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
309
put_rac(c, state+11 + 10, v < 0); //11..21
312
put_rac(c, state+0, 1);
316
static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
317
put_symbol_inline(c, state, v, is_signed);
320
static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
321
if(get_rac(c, state+0))
326
while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
331
for(i=e-1; i>=0; i--){
332
a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
335
e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
340
static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
341
return get_symbol_inline(c, state, is_signed);
344
static inline void update_vlc_state(VlcState * const state, const int v){
345
int drift= state->drift;
346
int count= state->count;
347
state->error_sum += FFABS(v);
350
if(count == 128){ //FIXME variable
353
state->error_sum >>= 1;
358
if(state->bias > -128) state->bias--;
364
if(state->bias < 127) state->bias++;
375
static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
377
//printf("final: %d ", v);
378
v = fold(v - state->bias, bits);
382
while(i < state->error_sum){ //FIXME optimize
390
if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
393
code= v ^ ((2*state->drift + state->count)>>31);
396
//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);
397
set_sr_golomb(pb, code, k, 12, bits);
399
update_vlc_state(state, v);
402
static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
407
while(i < state->error_sum){ //FIXME optimize
414
v= get_sr_golomb(gb, k, 12, bits);
415
//printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
418
if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
420
v ^= ((2*state->drift + state->count)>>31);
423
ret= fold(v + state->bias, bits);
425
update_vlc_state(state, v);
426
//printf("final: %d\n", ret);
430
#if CONFIG_FFV1_ENCODER
431
static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
432
PlaneContext * const p= &s->plane[plane_index];
433
RangeCoder * const c= &s->c;
435
int run_index= s->run_index;
440
if(c->bytestream_end - c->bytestream < w*20){
441
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
445
if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
446
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
454
context= get_context(s, sample[0]+x, sample[1]+x, sample[2]+x);
455
diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
462
diff= fold(diff, bits);
465
put_symbol_inline(c, p->state[context], diff, 1);
467
if(context == 0) run_mode=1;
472
while(run_count >= 1<<ff_log2_run[run_index]){
473
run_count -= 1<<ff_log2_run[run_index];
475
put_bits(&s->pb, 1, 1);
478
put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
479
if(run_index) run_index--;
488
// 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));
491
put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
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);
502
put_bits(&s->pb, 1, 1);
504
s->run_index= run_index;
509
static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
511
const int ring_size= s->avctx->context_model ? 3 : 2;
512
int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size];
515
memset(sample_buffer, 0, sizeof(sample_buffer));
518
for(i=0; i<ring_size; i++)
519
sample[i]= sample_buffer[(h+i-y)%ring_size]+3;
521
sample[0][-1]= sample[1][0 ];
522
sample[1][ w]= sample[1][w-1];
524
if(s->avctx->bits_per_raw_sample<=8){
526
sample[0][x]= src[x + stride*y];
528
encode_line(s, w, sample, plane_index, 8);
531
sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
533
encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
535
//STOP_TIMER("encode line")}
539
static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
541
const int ring_size= s->avctx->context_model ? 3 : 2;
542
int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size];
545
memset(sample_buffer, 0, sizeof(sample_buffer));
548
for(i=0; i<ring_size; i++)
550
sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3;
553
int v= src[x + stride*y];
564
// assert(g>=0 && b>=0 && r>=0);
565
// assert(g<256 && b<512 && r<512);
571
sample[p][0][-1]= sample[p][1][0 ];
572
sample[p][1][ w]= sample[p][1][w-1];
573
encode_line(s, w, sample[p], FFMIN(p, 1), 9);
578
static void write_quant_table(RangeCoder *c, int16_t *quant_table){
581
uint8_t state[CONTEXT_SIZE];
582
memset(state, 128, sizeof(state));
584
for(i=1; i<128 ; i++){
585
if(quant_table[i] != quant_table[i-1]){
586
put_symbol(c, state, i-last-1, 0);
590
put_symbol(c, state, i-last-1, 0);
593
static void write_header(FFV1Context *f){
594
uint8_t state[CONTEXT_SIZE];
596
RangeCoder * const c= &f->c;
598
memset(state, 128, sizeof(state));
600
put_symbol(c, state, f->version, 0);
601
put_symbol(c, state, f->ac, 0);
603
for(i=1; i<256; i++){
604
f->state_transition[i]=ver2_state[i];
605
put_symbol(c, state, ver2_state[i] - c->one_state[i], 1);
608
put_symbol(c, state, f->colorspace, 0); //YUV cs type
610
put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
611
put_rac(c, state, 1); //chroma planes
612
put_symbol(c, state, f->chroma_h_shift, 0);
613
put_symbol(c, state, f->chroma_v_shift, 0);
614
put_rac(c, state, 0); //no transparency plane
617
write_quant_table(c, f->quant_table[i]);
619
#endif /* CONFIG_FFV1_ENCODER */
621
static av_cold int common_init(AVCodecContext *avctx){
622
FFV1Context *s = avctx->priv_data;
625
s->flags= avctx->flags;
627
dsputil_init(&s->dsp, avctx);
629
s->width = avctx->width;
630
s->height= avctx->height;
632
assert(s->width && s->height);
637
#if CONFIG_FFV1_ENCODER
638
static av_cold int encode_init(AVCodecContext *avctx)
640
FFV1Context *s = avctx->priv_data;
646
s->ac= avctx->coder_type ? 2:0;
649
for(i=0; i<256; i++){
650
if(avctx->bits_per_raw_sample <=8){
651
s->quant_table[0][i]= quant11[i];
652
s->quant_table[1][i]= 11*quant11[i];
653
if(avctx->context_model==0){
654
s->quant_table[2][i]= 11*11*quant11[i];
655
s->quant_table[3][i]=
656
s->quant_table[4][i]=0;
658
s->quant_table[2][i]= 11*11*quant5 [i];
659
s->quant_table[3][i]= 5*11*11*quant5 [i];
660
s->quant_table[4][i]= 5*5*11*11*quant5 [i];
663
s->quant_table[0][i]= quant9_10bit[i];
664
s->quant_table[1][i]= 11*quant9_10bit[i];
665
if(avctx->context_model==0){
666
s->quant_table[2][i]= 11*11*quant9_10bit[i];
667
s->quant_table[3][i]=
668
s->quant_table[4][i]=0;
670
s->quant_table[2][i]= 11*11*quant5_10bit[i];
671
s->quant_table[3][i]= 5*11*11*quant5_10bit[i];
672
s->quant_table[4][i]= 5*5*11*11*quant5_10bit[i];
677
for(i=0; i<s->plane_count; i++){
678
PlaneContext * const p= &s->plane[i];
680
if(avctx->context_model==0){
681
p->context_count= (11*11*11+1)/2;
683
p->context_count= (11*11*5*5*5+1)/2;
687
if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
689
if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
693
avctx->coded_frame= &s->picture;
694
switch(avctx->pix_fmt){
695
case PIX_FMT_YUV444P16:
696
case PIX_FMT_YUV422P16:
697
case PIX_FMT_YUV420P16:
698
if(avctx->bits_per_raw_sample <=8){
699
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
703
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
707
case PIX_FMT_YUV444P:
708
case PIX_FMT_YUV422P:
709
case PIX_FMT_YUV420P:
710
case PIX_FMT_YUV411P:
711
case PIX_FMT_YUV410P:
718
av_log(avctx, AV_LOG_ERROR, "format not supported\n");
721
avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
727
#endif /* CONFIG_FFV1_ENCODER */
730
static void clear_state(FFV1Context *f){
733
for(i=0; i<f->plane_count; i++){
734
PlaneContext *p= &f->plane[i];
736
p->interlace_bit_state[0]= 128;
737
p->interlace_bit_state[1]= 128;
739
for(j=0; j<p->context_count; j++){
741
memset(p->state[j], 128, sizeof(uint8_t)*CONTEXT_SIZE);
743
p->vlc_state[j].drift= 0;
744
p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
745
p->vlc_state[j].bias= 0;
746
p->vlc_state[j].count= 1;
752
#if CONFIG_FFV1_ENCODER
753
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
754
FFV1Context *f = avctx->priv_data;
755
RangeCoder * const c= &f->c;
756
AVFrame *pict = data;
757
const int width= f->width;
758
const int height= f->height;
759
AVFrame * const p= &f->picture;
761
uint8_t keystate=128;
763
ff_init_range_encoder(c, buf, buf_size);
764
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
767
p->pict_type= FF_I_TYPE;
769
if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
770
put_rac(c, &keystate, 1);
775
put_rac(c, &keystate, 0);
780
used_count += ff_rac_terminate(c);
781
//printf("pos=%d\n", used_count);
782
init_put_bits(&f->pb, buf + used_count, buf_size - used_count);
785
for(i=1; i<256; i++){
786
c->one_state[i]= f->state_transition[i];
787
c->zero_state[256-i]= 256-c->one_state[i];
791
if(f->colorspace==0){
792
const int chroma_width = -((-width )>>f->chroma_h_shift);
793
const int chroma_height= -((-height)>>f->chroma_v_shift);
795
encode_plane(f, p->data[0], width, height, p->linesize[0], 0);
797
encode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
798
encode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
800
encode_rgb_frame(f, (uint32_t*)(p->data[0]), width, height, p->linesize[0]/4);
807
return ff_rac_terminate(c);
809
flush_put_bits(&f->pb); //nicer padding FIXME
810
return used_count + (put_bits_count(&f->pb)+7)/8;
813
#endif /* CONFIG_FFV1_ENCODER */
815
static av_cold int common_end(AVCodecContext *avctx){
816
FFV1Context *s = avctx->priv_data;
819
for(i=0; i<s->plane_count; i++){
820
PlaneContext *p= &s->plane[i];
823
av_freep(&p->vlc_state);
829
static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){
830
PlaneContext * const p= &s->plane[plane_index];
831
RangeCoder * const c= &s->c;
835
int run_index= s->run_index;
838
int diff, context, sign;
840
context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);
849
diff= get_symbol_inline(c, p->state[context], 1);
851
if(context == 0 && run_mode==0) run_mode=1;
854
if(run_count==0 && run_mode==1){
855
if(get_bits1(&s->gb)){
856
run_count = 1<<ff_log2_run[run_index];
857
if(x + run_count <= w) run_index++;
859
if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
861
if(run_index) run_index--;
869
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
874
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
876
// 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));
879
if(sign) diff= -diff;
881
sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
883
s->run_index= run_index;
886
static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
888
int_fast16_t sample_buffer[2][w+6];
889
int_fast16_t *sample[2];
890
sample[0]=sample_buffer[0]+3;
891
sample[1]=sample_buffer[1]+3;
895
memset(sample_buffer, 0, sizeof(sample_buffer));
898
int_fast16_t *temp= sample[0]; //FIXME try a normal buffer
900
sample[0]= sample[1];
903
sample[1][-1]= sample[0][0 ];
904
sample[0][ w]= sample[0][w-1];
907
if(s->avctx->bits_per_raw_sample <= 8){
908
decode_line(s, w, sample, plane_index, 8);
910
src[x + stride*y]= sample[1][x];
913
decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
915
((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
918
//STOP_TIMER("decode-line")}
922
static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
924
int_fast16_t sample_buffer[3][2][w+6];
925
int_fast16_t *sample[3][2];
927
sample[x][0] = sample_buffer[x][0]+3;
928
sample[x][1] = sample_buffer[x][1]+3;
933
memset(sample_buffer, 0, sizeof(sample_buffer));
937
int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer
939
sample[p][0]= sample[p][1];
942
sample[p][1][-1]= sample[p][0][0 ];
943
sample[p][0][ w]= sample[p][0][w-1];
944
decode_line(s, w, sample[p], FFMIN(p, 1), 9);
947
int g= sample[0][1][x];
948
int b= sample[1][1][x];
949
int r= sample[2][1][x];
951
// assert(g>=0 && b>=0 && r>=0);
952
// assert(g<256 && b<512 && r<512);
960
src[x + stride*y]= b + (g<<8) + (r<<16);
965
static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
968
uint8_t state[CONTEXT_SIZE];
970
memset(state, 128, sizeof(state));
972
for(v=0; i<128 ; v++){
973
int len= get_symbol(c, state, 0) + 1;
975
if(len + i > 128) return -1;
978
quant_table[i] = scale*v;
981
//if(i%16==0) printf("\n");
985
for(i=1; i<128; i++){
986
quant_table[256-i]= -quant_table[i];
988
quant_table[128]= -quant_table[127];
993
static int read_header(FFV1Context *f){
994
uint8_t state[CONTEXT_SIZE];
995
int i, context_count;
996
RangeCoder * const c= &f->c;
998
memset(state, 128, sizeof(state));
1000
f->version= get_symbol(c, state, 0);
1001
f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1003
for(i=1; i<256; i++){
1004
f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1007
f->colorspace= get_symbol(c, state, 0); //YUV cs type
1009
f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1010
get_rac(c, state); //no chroma = false
1011
f->chroma_h_shift= get_symbol(c, state, 0);
1012
f->chroma_v_shift= get_symbol(c, state, 0);
1013
get_rac(c, state); //transparency plane
1016
if(f->colorspace==0){
1017
if(f->avctx->bits_per_raw_sample<=8){
1018
switch(16*f->chroma_h_shift + f->chroma_v_shift){
1019
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1020
case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1021
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1022
case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1023
case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1025
av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1029
switch(16*f->chroma_h_shift + f->chroma_v_shift){
1030
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1031
case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1032
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1034
av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1038
}else if(f->colorspace==1){
1039
if(f->chroma_h_shift || f->chroma_v_shift){
1040
av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1043
f->avctx->pix_fmt= PIX_FMT_RGB32;
1045
av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1049
//printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1053
context_count*= read_quant_table(c, f->quant_table[i], context_count);
1054
if(context_count < 0 || context_count > 32768){
1055
av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1059
context_count= (context_count+1)/2;
1061
for(i=0; i<f->plane_count; i++){
1062
PlaneContext * const p= &f->plane[i];
1064
p->context_count= context_count;
1067
if(!p->state) p->state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
1069
if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
1076
static av_cold int decode_init(AVCodecContext *avctx)
1078
// FFV1Context *s = avctx->priv_data;
1085
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1086
const uint8_t *buf = avpkt->data;
1087
int buf_size = avpkt->size;
1088
FFV1Context *f = avctx->priv_data;
1089
RangeCoder * const c= &f->c;
1090
const int width= f->width;
1091
const int height= f->height;
1092
AVFrame * const p= &f->picture;
1094
uint8_t keystate= 128;
1096
AVFrame *picture = data;
1098
ff_init_range_decoder(c, buf, buf_size);
1099
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1102
p->pict_type= FF_I_TYPE; //FIXME I vs. P
1103
if(get_rac(c, &keystate)){
1105
if(read_header(f) < 0)
1113
for(i=1; i<256; i++){
1114
c->one_state[i]= f->state_transition[i];
1115
c->zero_state[256-i]= 256-c->one_state[i];
1119
if(!f->plane[0].state && !f->plane[0].vlc_state)
1123
if(avctx->get_buffer(avctx, p) < 0){
1124
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1128
if(avctx->debug&FF_DEBUG_PICT_INFO)
1129
av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1132
bytes_read = c->bytestream - c->bytestream_start - 1;
1133
if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1134
//printf("pos=%d\n", bytes_read);
1135
init_get_bits(&f->gb, buf + bytes_read, buf_size - bytes_read);
1137
bytes_read = 0; /* avoid warning */
1140
if(f->colorspace==0){
1141
const int chroma_width = -((-width )>>f->chroma_h_shift);
1142
const int chroma_height= -((-height)>>f->chroma_v_shift);
1143
decode_plane(f, p->data[0], width, height, p->linesize[0], 0);
1145
decode_plane(f, p->data[1], chroma_width, chroma_height, p->linesize[1], 1);
1146
decode_plane(f, p->data[2], chroma_width, chroma_height, p->linesize[2], 1);
1148
decode_rgb_frame(f, (uint32_t*)p->data[0], width, height, p->linesize[0]/4);
1153
f->picture_number++;
1157
avctx->release_buffer(avctx, p); //FIXME
1159
*data_size = sizeof(AVFrame);
1162
bytes_read= c->bytestream - c->bytestream_start - 1;
1163
if(bytes_read ==0) av_log(f->avctx, AV_LOG_ERROR, "error at end of frame\n");
1165
bytes_read+= (get_bits_count(&f->gb)+7)/8;
1171
AVCodec ffv1_decoder = {
1175
sizeof(FFV1Context),
1180
CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/,
1182
.long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1185
#if CONFIG_FFV1_ENCODER
1186
AVCodec ffv1_encoder = {
1190
sizeof(FFV1Context),
1194
.pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV444P, PIX_FMT_YUV422P, PIX_FMT_YUV411P, PIX_FMT_YUV410P, PIX_FMT_RGB32, PIX_FMT_YUV420P16, PIX_FMT_YUV422P16, PIX_FMT_YUV444P16, PIX_FMT_NONE},
1195
.long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),