2
* FFV1 codec for libavcodec
4
* Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
6
* This file is part of Libav.
8
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25
* FF Video Codec 1 (a lossless codec)
32
#include "rangecoder.h"
35
#include "libavutil/avassert.h"
38
#define CONTEXT_SIZE 32
40
#define MAX_QUANT_TABLES 8
41
#define MAX_CONTEXT_INPUTS 5
43
extern const uint8_t ff_log2_run[41];
45
static const int8_t quant3[256]={
46
0, 0, 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,-1,
58
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
59
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
60
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
61
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,
64
static const int8_t quant5_10bit[256]={
65
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
66
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
67
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
68
1, 1, 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,-1,
78
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
79
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
80
-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,
83
static const int8_t quant5[256]={
84
0, 1, 1, 1, 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,-2,-2,-2,
96
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
97
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
98
-2,-2,-2,-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,-1,-1,-1,
101
static const int8_t quant7[256]={
102
0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
104
2, 2, 2, 2, 2, 2, 2, 2, 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,-3,-3,-3,-3,-3,-3,-3,
112
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
113
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
114
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
115
-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,
116
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
117
-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-1,
119
static const int8_t quant9[256]={
120
0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
121
3, 3, 3, 3, 3, 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,-4,-4,-4,-4,
131
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
132
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
133
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
134
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,
135
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-1,-1,
137
static const int8_t quant9_10bit[256]={
138
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
139
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
140
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
141
3, 3, 3, 3, 3, 3, 3, 3, 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,-4,-4,-4,-4,-4,-4,-4,
147
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
148
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
149
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
150
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,
151
-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,-3,
152
-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
153
-2,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-0,-0,-0,-0,
156
static const int8_t quant11[256]={
157
0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4,
158
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
159
4, 4, 4, 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,-5,-5,
167
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
168
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
169
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
170
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-4,
171
-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
172
-4,-4,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-1,
174
static const int8_t quant13[256]={
175
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
176
4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
177
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
178
5, 5, 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,-6,
184
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
185
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
186
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,
187
-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-6,-5,
188
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
189
-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,
190
-4,-4,-4,-4,-4,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-1,
193
static const uint8_t ver2_state[256]= {
194
0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
195
59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
196
40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
197
53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
198
87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
199
85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
200
105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
201
115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
202
165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
203
147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
204
172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
205
175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
206
197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
207
209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
208
226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
209
241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
212
typedef struct VlcState{
219
typedef struct PlaneContext{
220
int16_t quant_table[MAX_CONTEXT_INPUTS][256];
221
int quant_table_index;
223
uint8_t (*state)[CONTEXT_SIZE];
225
uint8_t interlace_bit_state[2];
228
#define MAX_SLICES 256
230
typedef struct FFV1Context{
231
AVCodecContext *avctx;
235
uint64_t rc_stat[256][2];
236
uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
239
int chroma_h_shift, chroma_v_shift;
244
int ac; ///< 1=range coder <-> 0=golomb rice
245
PlaneContext plane[MAX_PLANES];
246
int16_t quant_table[MAX_CONTEXT_INPUTS][256];
247
int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
248
int context_count[MAX_QUANT_TABLES];
249
uint8_t state_transition[256];
250
uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
253
int16_t *sample_buffer;
256
int quant_table_count;
260
struct FFV1Context *slice_context[MAX_SLICES];
270
static av_always_inline int fold(int diff, int bits){
282
static inline int predict(int16_t *src, int16_t *last)
284
const int LT= last[-1];
285
const int T= last[ 0];
286
const int L = src[-1];
288
return mid_pred(L, L + T - LT, T);
291
static inline int get_context(PlaneContext *p, int16_t *src,
292
int16_t *last, int16_t *last2)
294
const int LT= last[-1];
295
const int T= last[ 0];
296
const int RT= last[ 1];
297
const int L = src[-1];
299
if(p->quant_table[3][127]){
300
const int TT= last2[0];
301
const int LL= src[-2];
302
return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF]
303
+p->quant_table[3][(LL-L) & 0xFF] + p->quant_table[4][(TT-T) & 0xFF];
305
return p->quant_table[0][(L-LT) & 0xFF] + p->quant_table[1][(LT-T) & 0xFF] + p->quant_table[2][(T-RT) & 0xFF];
308
static void find_best_state(uint8_t best_state[256][256], const uint8_t one_state[256]){
313
l2tab[i]= log2(i/256.0);
315
for(i=0; i<256; i++){
316
double best_len[256];
322
for(j=FFMAX(i-10,1); j<FFMIN(i+11,256); j++){
326
for(k=0; k<256; k++){
327
double newocc[256]={0};
328
for(m=0; m<256; m++){
330
len -=occ[m]*( p *l2tab[ m]
331
+ (1-p)*l2tab[256-m]);
334
if(len < best_len[k]){
338
for(m=0; m<256; m++){
340
newocc[ one_state[ m]] += occ[m]* p ;
341
newocc[256-one_state[256-m]] += occ[m]*(1-p);
344
memcpy(occ, newocc, sizeof(occ));
350
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]){
353
#define put_rac(C,S,B) \
357
rc_stat2[(S)-state][B]++;\
363
const int a= FFABS(v);
364
const int e= av_log2(a);
365
put_rac(c, state+0, 0);
368
put_rac(c, state+1+i, 1); //1..10
370
put_rac(c, state+1+i, 0);
372
for(i=e-1; i>=0; i--){
373
put_rac(c, state+22+i, (a>>i)&1); //22..31
377
put_rac(c, state+11 + e, v < 0); //11..21
380
put_rac(c, state+1+FFMIN(i,9), 1); //1..10
382
put_rac(c, state+1+9, 0);
384
for(i=e-1; i>=0; i--){
385
put_rac(c, state+22+FFMIN(i,9), (a>>i)&1); //22..31
389
put_rac(c, state+11 + 10, v < 0); //11..21
392
put_rac(c, state+0, 1);
397
static void av_noinline put_symbol(RangeCoder *c, uint8_t *state, int v, int is_signed){
398
put_symbol_inline(c, state, v, is_signed, NULL, NULL);
401
static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed){
402
if(get_rac(c, state+0))
407
while(get_rac(c, state+1 + FFMIN(e,9))){ //1..10
412
for(i=e-1; i>=0; i--){
413
a += a + get_rac(c, state+22 + FFMIN(i,9)); //22..31
416
e= -(is_signed && get_rac(c, state+11 + FFMIN(e, 10))); //11..21
421
static int av_noinline get_symbol(RangeCoder *c, uint8_t *state, int is_signed){
422
return get_symbol_inline(c, state, is_signed);
425
static inline void update_vlc_state(VlcState * const state, const int v){
426
int drift= state->drift;
427
int count= state->count;
428
state->error_sum += FFABS(v);
431
if(count == 128){ //FIXME variable
434
state->error_sum >>= 1;
439
if(state->bias > -128) state->bias--;
445
if(state->bias < 127) state->bias++;
456
static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int v, int bits){
458
//printf("final: %d ", v);
459
v = fold(v - state->bias, bits);
463
while(i < state->error_sum){ //FIXME optimize
471
if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1);
474
code= v ^ ((2*state->drift + state->count)>>31);
477
//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);
478
set_sr_golomb(pb, code, k, 12, bits);
480
update_vlc_state(state, v);
483
static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state, int bits){
488
while(i < state->error_sum){ //FIXME optimize
495
v= get_sr_golomb(gb, k, 12, bits);
496
//printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k);
499
if(k==0 && 2*state->drift <= - state->count) v ^= (-1);
501
v ^= ((2*state->drift + state->count)>>31);
504
ret= fold(v + state->bias, bits);
506
update_vlc_state(state, v);
507
//printf("final: %d\n", ret);
511
#if CONFIG_FFV1_ENCODER
512
static av_always_inline int encode_line(FFV1Context *s, int w,
514
int plane_index, int bits)
516
PlaneContext * const p= &s->plane[plane_index];
517
RangeCoder * const c= &s->c;
519
int run_index= s->run_index;
524
if(c->bytestream_end - c->bytestream < w*20){
525
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
529
if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < w*4){
530
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
538
context= get_context(p, sample[0]+x, sample[1]+x, sample[2]+x);
539
diff= sample[0][x] - predict(sample[0]+x, sample[1]+x);
546
diff= fold(diff, bits);
549
if(s->flags & CODEC_FLAG_PASS1){
550
put_symbol_inline(c, p->state[context], diff, 1, s->rc_stat, s->rc_stat2[p->quant_table_index][context]);
552
put_symbol_inline(c, p->state[context], diff, 1, NULL, NULL);
555
if(context == 0) run_mode=1;
560
while(run_count >= 1<<ff_log2_run[run_index]){
561
run_count -= 1<<ff_log2_run[run_index];
563
put_bits(&s->pb, 1, 1);
566
put_bits(&s->pb, 1 + ff_log2_run[run_index], run_count);
567
if(run_index) run_index--;
576
// 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));
579
put_vlc_symbol(&s->pb, &p->vlc_state[context], diff, bits);
583
while(run_count >= 1<<ff_log2_run[run_index]){
584
run_count -= 1<<ff_log2_run[run_index];
586
put_bits(&s->pb, 1, 1);
590
put_bits(&s->pb, 1, 1);
592
s->run_index= run_index;
597
static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
599
const int ring_size= s->avctx->context_model ? 3 : 2;
603
memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer));
606
for(i=0; i<ring_size; i++)
607
sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3;
609
sample[0][-1]= sample[1][0 ];
610
sample[1][ w]= sample[1][w-1];
612
if(s->avctx->bits_per_raw_sample<=8){
614
sample[0][x]= src[x + stride*y];
616
encode_line(s, w, sample, plane_index, 8);
619
sample[0][x]= ((uint16_t*)(src + stride*y))[x] >> (16 - s->avctx->bits_per_raw_sample);
621
encode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
623
//STOP_TIMER("encode line")}
627
static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
629
const int ring_size= s->avctx->context_model ? 3 : 2;
630
int16_t *sample[3][3];
633
memset(s->sample_buffer, 0, ring_size*3*(w+6)*sizeof(*s->sample_buffer));
636
for(i=0; i<ring_size; i++)
638
sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3;
641
int v= src[x + stride*y];
652
// assert(g>=0 && b>=0 && r>=0);
653
// assert(g<256 && b<512 && r<512);
659
sample[p][0][-1]= sample[p][1][0 ];
660
sample[p][1][ w]= sample[p][1][w-1];
661
encode_line(s, w, sample[p], FFMIN(p, 1), 9);
666
static void write_quant_table(RangeCoder *c, int16_t *quant_table){
669
uint8_t state[CONTEXT_SIZE];
670
memset(state, 128, sizeof(state));
672
for(i=1; i<128 ; i++){
673
if(quant_table[i] != quant_table[i-1]){
674
put_symbol(c, state, i-last-1, 0);
678
put_symbol(c, state, i-last-1, 0);
681
static void write_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
684
write_quant_table(c, quant_table[i]);
687
static void write_header(FFV1Context *f){
688
uint8_t state[CONTEXT_SIZE];
690
RangeCoder * const c= &f->slice_context[0]->c;
692
memset(state, 128, sizeof(state));
695
put_symbol(c, state, f->version, 0);
696
put_symbol(c, state, f->ac, 0);
698
for(i=1; i<256; i++){
699
put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
702
put_symbol(c, state, f->colorspace, 0); //YUV cs type
704
put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
705
put_rac(c, state, 1); //chroma planes
706
put_symbol(c, state, f->chroma_h_shift, 0);
707
put_symbol(c, state, f->chroma_v_shift, 0);
708
put_rac(c, state, 0); //no transparency plane
710
write_quant_tables(c, f->quant_table);
712
put_symbol(c, state, f->slice_count, 0);
713
for(i=0; i<f->slice_count; i++){
714
FFV1Context *fs= f->slice_context[i];
715
put_symbol(c, state, (fs->slice_x +1)*f->num_h_slices / f->width , 0);
716
put_symbol(c, state, (fs->slice_y +1)*f->num_v_slices / f->height , 0);
717
put_symbol(c, state, (fs->slice_width +1)*f->num_h_slices / f->width -1, 0);
718
put_symbol(c, state, (fs->slice_height+1)*f->num_v_slices / f->height-1, 0);
719
for(j=0; j<f->plane_count; j++){
720
put_symbol(c, state, f->plane[j].quant_table_index, 0);
721
av_assert0(f->plane[j].quant_table_index == f->avctx->context_model);
726
#endif /* CONFIG_FFV1_ENCODER */
728
static av_cold int common_init(AVCodecContext *avctx){
729
FFV1Context *s = avctx->priv_data;
732
s->flags= avctx->flags;
734
dsputil_init(&s->dsp, avctx);
736
s->width = avctx->width;
737
s->height= avctx->height;
739
assert(s->width && s->height);
748
static int init_slice_state(FFV1Context *f){
751
for(i=0; i<f->slice_count; i++){
752
FFV1Context *fs= f->slice_context[i];
753
for(j=0; j<f->plane_count; j++){
754
PlaneContext * const p= &fs->plane[j];
757
if(!p-> state) p-> state= av_malloc(CONTEXT_SIZE*p->context_count*sizeof(uint8_t));
759
return AVERROR(ENOMEM);
761
if(!p->vlc_state) p->vlc_state= av_malloc(p->context_count*sizeof(VlcState));
763
return AVERROR(ENOMEM);
768
//FIXME only redo if state_transition changed
769
for(j=1; j<256; j++){
770
fs->c.one_state [ j]= fs->state_transition[j];
771
fs->c.zero_state[256-j]= 256-fs->c.one_state [j];
779
static av_cold int init_slice_contexts(FFV1Context *f){
782
f->slice_count= f->num_h_slices * f->num_v_slices;
784
for(i=0; i<f->slice_count; i++){
785
FFV1Context *fs= av_mallocz(sizeof(*fs));
786
int sx= i % f->num_h_slices;
787
int sy= i / f->num_h_slices;
788
int sxs= f->avctx->width * sx / f->num_h_slices;
789
int sxe= f->avctx->width *(sx+1) / f->num_h_slices;
790
int sys= f->avctx->height* sy / f->num_v_slices;
791
int sye= f->avctx->height*(sy+1) / f->num_v_slices;
792
f->slice_context[i]= fs;
793
memcpy(fs, f, sizeof(*fs));
794
memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
796
fs->slice_width = sxe - sxs;
797
fs->slice_height= sye - sys;
801
fs->sample_buffer = av_malloc(9 * (fs->width+6) * sizeof(*fs->sample_buffer));
802
if (!fs->sample_buffer)
803
return AVERROR(ENOMEM);
808
static int allocate_initial_states(FFV1Context *f){
811
for(i=0; i<f->quant_table_count; i++){
812
f->initial_states[i]= av_malloc(f->context_count[i]*sizeof(*f->initial_states[i]));
813
if(!f->initial_states[i])
814
return AVERROR(ENOMEM);
815
memset(f->initial_states[i], 128, f->context_count[i]*sizeof(*f->initial_states[i]));
820
#if CONFIG_FFV1_ENCODER
821
static int write_extra_header(FFV1Context *f){
822
RangeCoder * const c= &f->c;
823
uint8_t state[CONTEXT_SIZE];
825
uint8_t state2[32][CONTEXT_SIZE];
827
memset(state2, 128, sizeof(state2));
828
memset(state, 128, sizeof(state));
830
f->avctx->extradata= av_malloc(f->avctx->extradata_size= 10000 + (11*11*5*5*5+11*11*11)*32);
831
ff_init_range_encoder(c, f->avctx->extradata, f->avctx->extradata_size);
832
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
834
put_symbol(c, state, f->version, 0);
835
put_symbol(c, state, f->ac, 0);
837
for(i=1; i<256; i++){
838
put_symbol(c, state, f->state_transition[i] - c->one_state[i], 1);
841
put_symbol(c, state, f->colorspace, 0); //YUV cs type
842
put_symbol(c, state, f->avctx->bits_per_raw_sample, 0);
843
put_rac(c, state, 1); //chroma planes
844
put_symbol(c, state, f->chroma_h_shift, 0);
845
put_symbol(c, state, f->chroma_v_shift, 0);
846
put_rac(c, state, 0); //no transparency plane
847
put_symbol(c, state, f->num_h_slices-1, 0);
848
put_symbol(c, state, f->num_v_slices-1, 0);
850
put_symbol(c, state, f->quant_table_count, 0);
851
for(i=0; i<f->quant_table_count; i++)
852
write_quant_tables(c, f->quant_tables[i]);
854
for(i=0; i<f->quant_table_count; i++){
855
for(j=0; j<f->context_count[i]*CONTEXT_SIZE; j++)
856
if(f->initial_states[i] && f->initial_states[i][0][j] != 128)
858
if(j<f->context_count[i]*CONTEXT_SIZE){
859
put_rac(c, state, 1);
860
for(j=0; j<f->context_count[i]; j++){
861
for(k=0; k<CONTEXT_SIZE; k++){
862
int pred= j ? f->initial_states[i][j-1][k] : 128;
863
put_symbol(c, state2[k], (int8_t)(f->initial_states[i][j][k]-pred), 1);
867
put_rac(c, state, 0);
871
f->avctx->extradata_size= ff_rac_terminate(c);
876
static int sort_stt(FFV1Context *s, uint8_t stt[256]){
877
int i,i2,changed,print=0;
881
for(i=12; i<244; i++){
882
for(i2=i+1; i2<245 && i2<i+4; i2++){
883
#define COST(old, new) \
884
s->rc_stat[old][0]*-log2((256-(new))/256.0)\
885
+s->rc_stat[old][1]*-log2( (new) /256.0)
887
#define COST2(old, new) \
889
+COST(256-(old), 256-(new))
891
double size0= COST2(i, i ) + COST2(i2, i2);
892
double sizeX= COST2(i, i2) + COST2(i2, i );
893
if(sizeX < size0 && i!=128 && i2!=128){
895
FFSWAP(int, stt[ i], stt[ i2]);
896
FFSWAP(int, s->rc_stat[i ][0],s->rc_stat[ i2][0]);
897
FFSWAP(int, s->rc_stat[i ][1],s->rc_stat[ i2][1]);
899
FFSWAP(int, stt[256-i], stt[256-i2]);
900
FFSWAP(int, s->rc_stat[256-i][0],s->rc_stat[256-i2][0]);
901
FFSWAP(int, s->rc_stat[256-i][1],s->rc_stat[256-i2][1]);
903
for(j=1; j<256; j++){
904
if (stt[j] == i ) stt[j] = i2;
905
else if(stt[j] == i2) stt[j] = i ;
907
if (stt[256-j] == 256-i ) stt[256-j] = 256-i2;
908
else if(stt[256-j] == 256-i2) stt[256-j] = 256-i ;
919
static av_cold int encode_init(AVCodecContext *avctx)
921
FFV1Context *s = avctx->priv_data;
927
s->ac= avctx->coder_type ? 2:0;
931
s->state_transition[i]=ver2_state[i];
934
for(i=0; i<256; i++){
935
s->quant_table_count=2;
936
if(avctx->bits_per_raw_sample <=8){
937
s->quant_tables[0][0][i]= quant11[i];
938
s->quant_tables[0][1][i]= 11*quant11[i];
939
s->quant_tables[0][2][i]= 11*11*quant11[i];
940
s->quant_tables[1][0][i]= quant11[i];
941
s->quant_tables[1][1][i]= 11*quant11[i];
942
s->quant_tables[1][2][i]= 11*11*quant5 [i];
943
s->quant_tables[1][3][i]= 5*11*11*quant5 [i];
944
s->quant_tables[1][4][i]= 5*5*11*11*quant5 [i];
946
s->quant_tables[0][0][i]= quant9_10bit[i];
947
s->quant_tables[0][1][i]= 11*quant9_10bit[i];
948
s->quant_tables[0][2][i]= 11*11*quant9_10bit[i];
949
s->quant_tables[1][0][i]= quant9_10bit[i];
950
s->quant_tables[1][1][i]= 11*quant9_10bit[i];
951
s->quant_tables[1][2][i]= 11*11*quant5_10bit[i];
952
s->quant_tables[1][3][i]= 5*11*11*quant5_10bit[i];
953
s->quant_tables[1][4][i]= 5*5*11*11*quant5_10bit[i];
956
s->context_count[0]= (11*11*11+1)/2;
957
s->context_count[1]= (11*11*5*5*5+1)/2;
958
memcpy(s->quant_table, s->quant_tables[avctx->context_model], sizeof(s->quant_table));
960
for(i=0; i<s->plane_count; i++){
961
PlaneContext * const p= &s->plane[i];
963
memcpy(p->quant_table, s->quant_table, sizeof(p->quant_table));
964
p->quant_table_index= avctx->context_model;
965
p->context_count= s->context_count[p->quant_table_index];
968
if(allocate_initial_states(s) < 0)
969
return AVERROR(ENOMEM);
971
avctx->coded_frame= &s->picture;
972
switch(avctx->pix_fmt){
973
case PIX_FMT_YUV444P16:
974
case PIX_FMT_YUV422P16:
975
case PIX_FMT_YUV420P16:
976
if(avctx->bits_per_raw_sample <=8){
977
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample invalid\n");
981
av_log(avctx, AV_LOG_ERROR, "bits_per_raw_sample of more than 8 needs -coder 1 currently\n");
984
s->version= FFMAX(s->version, 1);
985
case PIX_FMT_YUV444P:
986
case PIX_FMT_YUV422P:
987
case PIX_FMT_YUV420P:
988
case PIX_FMT_YUV411P:
989
case PIX_FMT_YUV410P:
996
av_log(avctx, AV_LOG_ERROR, "format not supported\n");
999
avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_h_shift, &s->chroma_v_shift);
1001
s->picture_number=0;
1003
if(avctx->flags & (CODEC_FLAG_PASS1|CODEC_FLAG_PASS2)){
1004
for(i=0; i<s->quant_table_count; i++){
1005
s->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*s->rc_stat2[i]));
1007
return AVERROR(ENOMEM);
1010
if(avctx->stats_in){
1011
char *p= avctx->stats_in;
1012
uint8_t best_state[256][256];
1016
av_assert0(s->version>=2);
1019
for(j=0; j<256; j++){
1021
s->rc_stat[j][i]= strtol(p, &next, 0);
1023
av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d [%s]\n", j,i,p);
1029
for(i=0; i<s->quant_table_count; i++){
1030
for(j=0; j<s->context_count[i]; j++){
1031
for(k=0; k<32; k++){
1033
s->rc_stat2[i][j][k][m]= strtol(p, &next, 0);
1035
av_log(avctx, AV_LOG_ERROR, "2Pass file invalid at %d %d %d %d [%s]\n", i,j,k,m,p);
1043
gob_count= strtol(p, &next, 0);
1044
if(next==p || gob_count <0){
1045
av_log(avctx, AV_LOG_ERROR, "2Pass file invalid\n");
1049
while(*p=='\n' || *p==' ') p++;
1052
sort_stt(s, s->state_transition);
1054
find_best_state(best_state, s->state_transition);
1056
for(i=0; i<s->quant_table_count; i++){
1057
for(j=0; j<s->context_count[i]; j++){
1058
for(k=0; k<32; k++){
1060
if(s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]){
1061
p=256.0*s->rc_stat2[i][j][k][1] / (s->rc_stat2[i][j][k][0]+s->rc_stat2[i][j][k][1]);
1063
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)];
1072
write_extra_header(s);
1075
if(init_slice_contexts(s) < 0)
1077
if(init_slice_state(s) < 0)
1080
#define STATS_OUT_SIZE 1024*1024*6
1081
if(avctx->flags & CODEC_FLAG_PASS1){
1082
avctx->stats_out= av_mallocz(STATS_OUT_SIZE);
1083
for(i=0; i<s->quant_table_count; i++){
1084
for(j=0; j<s->slice_count; j++){
1085
FFV1Context *sf= s->slice_context[j];
1086
av_assert0(!sf->rc_stat2[i]);
1087
sf->rc_stat2[i]= av_mallocz(s->context_count[i]*sizeof(*sf->rc_stat2[i]));
1088
if(!sf->rc_stat2[i])
1089
return AVERROR(ENOMEM);
1096
#endif /* CONFIG_FFV1_ENCODER */
1099
static void clear_state(FFV1Context *f){
1102
for(si=0; si<f->slice_count; si++){
1103
FFV1Context *fs= f->slice_context[si];
1104
for(i=0; i<f->plane_count; i++){
1105
PlaneContext *p= &fs->plane[i];
1107
p->interlace_bit_state[0]= 128;
1108
p->interlace_bit_state[1]= 128;
1111
if(f->initial_states[p->quant_table_index]){
1112
memcpy(p->state, f->initial_states[p->quant_table_index], CONTEXT_SIZE*p->context_count);
1114
memset(p->state, 128, CONTEXT_SIZE*p->context_count);
1116
for(j=0; j<p->context_count; j++){
1117
p->vlc_state[j].drift= 0;
1118
p->vlc_state[j].error_sum= 4; //FFMAX((RANGE + 32)/64, 2);
1119
p->vlc_state[j].bias= 0;
1120
p->vlc_state[j].count= 1;
1127
#if CONFIG_FFV1_ENCODER
1128
static int encode_slice(AVCodecContext *c, void *arg){
1129
FFV1Context *fs= *(void**)arg;
1130
FFV1Context *f= fs->avctx->priv_data;
1131
int width = fs->slice_width;
1132
int height= fs->slice_height;
1135
AVFrame * const p= &f->picture;
1137
if(f->colorspace==0){
1138
const int chroma_width = -((-width )>>f->chroma_h_shift);
1139
const int chroma_height= -((-height)>>f->chroma_v_shift);
1140
const int cx= x>>f->chroma_h_shift;
1141
const int cy= y>>f->chroma_v_shift;
1143
encode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1145
encode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1146
encode_plane(fs, p->data[2] + cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1);
1148
encode_rgb_frame(fs, (uint32_t*)(p->data[0]) + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1155
static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
1156
FFV1Context *f = avctx->priv_data;
1157
RangeCoder * const c= &f->slice_context[0]->c;
1158
AVFrame *pict = data;
1159
AVFrame * const p= &f->picture;
1161
uint8_t keystate=128;
1165
ff_init_range_encoder(c, buf, buf_size);
1166
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1169
p->pict_type= AV_PICTURE_TYPE_I;
1171
if(avctx->gop_size==0 || f->picture_number % avctx->gop_size == 0){
1172
put_rac(c, &keystate, 1);
1178
put_rac(c, &keystate, 0);
1183
used_count += ff_rac_terminate(c);
1184
//printf("pos=%d\n", used_count);
1185
init_put_bits(&f->slice_context[0]->pb, buf + used_count, buf_size - used_count);
1188
for(i=1; i<256; i++){
1189
c->one_state[i]= f->state_transition[i];
1190
c->zero_state[256-i]= 256-c->one_state[i];
1194
for(i=1; i<f->slice_count; i++){
1195
FFV1Context *fs= f->slice_context[i];
1196
uint8_t *start= buf + (buf_size-used_count)*i/f->slice_count;
1197
int len= buf_size/f->slice_count;
1200
ff_init_range_encoder(&fs->c, start, len);
1202
init_put_bits(&fs->pb, start, len);
1205
avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1208
for(i=0; i<f->slice_count; i++){
1209
FFV1Context *fs= f->slice_context[i];
1214
put_rac(&fs->c, &state, 0);
1215
bytes= ff_rac_terminate(&fs->c);
1217
flush_put_bits(&fs->pb); //nicer padding FIXME
1218
bytes= used_count + (put_bits_count(&fs->pb)+7)/8;
1222
av_assert0(bytes < buf_size/f->slice_count);
1223
memmove(buf_p, fs->ac ? fs->c.bytestream_start : fs->pb.buf, bytes);
1224
av_assert0(bytes < (1<<24));
1225
AV_WB24(buf_p+bytes, bytes);
1231
if((avctx->flags&CODEC_FLAG_PASS1) && (f->picture_number&31)==0){
1233
char *p= avctx->stats_out;
1234
char *end= p + STATS_OUT_SIZE;
1236
memset(f->rc_stat, 0, sizeof(f->rc_stat));
1237
for(i=0; i<f->quant_table_count; i++)
1238
memset(f->rc_stat2[i], 0, f->context_count[i]*sizeof(*f->rc_stat2[i]));
1240
for(j=0; j<f->slice_count; j++){
1241
FFV1Context *fs= f->slice_context[j];
1242
for(i=0; i<256; i++){
1243
f->rc_stat[i][0] += fs->rc_stat[i][0];
1244
f->rc_stat[i][1] += fs->rc_stat[i][1];
1246
for(i=0; i<f->quant_table_count; i++){
1247
for(k=0; k<f->context_count[i]; k++){
1248
for(m=0; m<32; m++){
1249
f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
1250
f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
1256
for(j=0; j<256; j++){
1257
snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat[j][0], f->rc_stat[j][1]);
1260
snprintf(p, end-p, "\n");
1262
for(i=0; i<f->quant_table_count; i++){
1263
for(j=0; j<f->context_count[i]; j++){
1264
for(m=0; m<32; m++){
1265
snprintf(p, end-p, "%"PRIu64" %"PRIu64" ", f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
1270
snprintf(p, end-p, "%d\n", f->gob_count);
1271
} else if(avctx->flags&CODEC_FLAG_PASS1)
1272
avctx->stats_out[0] = '\0';
1274
f->picture_number++;
1277
#endif /* CONFIG_FFV1_ENCODER */
1279
static av_cold int common_end(AVCodecContext *avctx){
1280
FFV1Context *s = avctx->priv_data;
1283
if (avctx->codec->decode && s->picture.data[0])
1284
avctx->release_buffer(avctx, &s->picture);
1286
for(j=0; j<s->slice_count; j++){
1287
FFV1Context *fs= s->slice_context[j];
1288
for(i=0; i<s->plane_count; i++){
1289
PlaneContext *p= &fs->plane[i];
1291
av_freep(&p->state);
1292
av_freep(&p->vlc_state);
1294
av_freep(&fs->sample_buffer);
1297
av_freep(&avctx->stats_out);
1298
for(j=0; j<s->quant_table_count; j++){
1299
av_freep(&s->initial_states[j]);
1300
for(i=0; i<s->slice_count; i++){
1301
FFV1Context *sf= s->slice_context[i];
1302
av_freep(&sf->rc_stat2[j]);
1304
av_freep(&s->rc_stat2[j]);
1307
for(i=0; i<s->slice_count; i++){
1308
av_freep(&s->slice_context[i]);
1314
static av_always_inline void decode_line(FFV1Context *s, int w,
1316
int plane_index, int bits)
1318
PlaneContext * const p= &s->plane[plane_index];
1319
RangeCoder * const c= &s->c;
1323
int run_index= s->run_index;
1326
int diff, context, sign;
1328
context= get_context(p, sample[1] + x, sample[0] + x, sample[1] + x);
1335
av_assert2(context < p->context_count);
1338
diff= get_symbol_inline(c, p->state[context], 1);
1340
if(context == 0 && run_mode==0) run_mode=1;
1343
if(run_count==0 && run_mode==1){
1344
if(get_bits1(&s->gb)){
1345
run_count = 1<<ff_log2_run[run_index];
1346
if(x + run_count <= w) run_index++;
1348
if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);
1350
if(run_index) run_index--;
1358
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1363
diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);
1365
// 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));
1368
if(sign) diff= -diff;
1370
sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);
1372
s->run_index= run_index;
1375
static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){
1378
sample[0]=s->sample_buffer +3;
1379
sample[1]=s->sample_buffer+w+6+3;
1383
memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer));
1386
int16_t *temp = sample[0]; //FIXME try a normal buffer
1388
sample[0]= sample[1];
1391
sample[1][-1]= sample[0][0 ];
1392
sample[0][ w]= sample[0][w-1];
1395
if(s->avctx->bits_per_raw_sample <= 8){
1396
decode_line(s, w, sample, plane_index, 8);
1398
src[x + stride*y]= sample[1][x];
1401
decode_line(s, w, sample, plane_index, s->avctx->bits_per_raw_sample);
1403
((uint16_t*)(src + stride*y))[x]= sample[1][x] << (16 - s->avctx->bits_per_raw_sample);
1406
//STOP_TIMER("decode-line")}
1410
static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){
1412
int16_t *sample[3][2];
1414
sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3;
1415
sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3;
1420
memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer));
1424
int16_t *temp = sample[p][0]; //FIXME try a normal buffer
1426
sample[p][0]= sample[p][1];
1429
sample[p][1][-1]= sample[p][0][0 ];
1430
sample[p][0][ w]= sample[p][0][w-1];
1431
decode_line(s, w, sample[p], FFMIN(p, 1), 9);
1434
int g= sample[0][1][x];
1435
int b= sample[1][1][x];
1436
int r= sample[2][1][x];
1438
// assert(g>=0 && b>=0 && r>=0);
1439
// assert(g<256 && b<512 && r<512);
1447
src[x + stride*y]= b + (g<<8) + (r<<16) + (0xFF<<24);
1452
static int decode_slice(AVCodecContext *c, void *arg){
1453
FFV1Context *fs= *(void**)arg;
1454
FFV1Context *f= fs->avctx->priv_data;
1455
int width = fs->slice_width;
1456
int height= fs->slice_height;
1459
AVFrame * const p= &f->picture;
1461
av_assert1(width && height);
1462
if(f->colorspace==0){
1463
const int chroma_width = -((-width )>>f->chroma_h_shift);
1464
const int chroma_height= -((-height)>>f->chroma_v_shift);
1465
const int cx= x>>f->chroma_h_shift;
1466
const int cy= y>>f->chroma_v_shift;
1467
decode_plane(fs, p->data[0] + x + y*p->linesize[0], width, height, p->linesize[0], 0);
1469
decode_plane(fs, p->data[1] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1);
1470
decode_plane(fs, p->data[2] + cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[2], 1);
1472
decode_rgb_frame(fs, (uint32_t*)p->data[0] + x + y*(p->linesize[0]/4), width, height, p->linesize[0]/4);
1480
static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale){
1483
uint8_t state[CONTEXT_SIZE];
1485
memset(state, 128, sizeof(state));
1487
for(v=0; i<128 ; v++){
1488
int len= get_symbol(c, state, 0) + 1;
1490
if(len + i > 128) return -1;
1493
quant_table[i] = scale*v;
1496
//if(i%16==0) printf("\n");
1500
for(i=1; i<128; i++){
1501
quant_table[256-i]= -quant_table[i];
1503
quant_table[128]= -quant_table[127];
1508
static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256]){
1510
int context_count=1;
1513
context_count*= read_quant_table(c, quant_table[i], context_count);
1514
if(context_count > 32768U){
1518
return (context_count+1)/2;
1521
static int read_extra_header(FFV1Context *f){
1522
RangeCoder * const c= &f->c;
1523
uint8_t state[CONTEXT_SIZE];
1525
uint8_t state2[32][CONTEXT_SIZE];
1527
memset(state2, 128, sizeof(state2));
1528
memset(state, 128, sizeof(state));
1530
ff_init_range_decoder(c, f->avctx->extradata, f->avctx->extradata_size);
1531
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1533
f->version= get_symbol(c, state, 0);
1534
f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1536
for(i=1; i<256; i++){
1537
f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1540
f->colorspace= get_symbol(c, state, 0); //YUV cs type
1541
f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1542
get_rac(c, state); //no chroma = false
1543
f->chroma_h_shift= get_symbol(c, state, 0);
1544
f->chroma_v_shift= get_symbol(c, state, 0);
1545
get_rac(c, state); //transparency plane
1547
f->num_h_slices= 1 + get_symbol(c, state, 0);
1548
f->num_v_slices= 1 + get_symbol(c, state, 0);
1549
if(f->num_h_slices > (unsigned)f->width || f->num_v_slices > (unsigned)f->height){
1550
av_log(f->avctx, AV_LOG_ERROR, "too many slices\n");
1554
f->quant_table_count= get_symbol(c, state, 0);
1555
if(f->quant_table_count > (unsigned)MAX_QUANT_TABLES)
1557
for(i=0; i<f->quant_table_count; i++){
1558
if((f->context_count[i]= read_quant_tables(c, f->quant_tables[i])) < 0){
1559
av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1564
if(allocate_initial_states(f) < 0)
1565
return AVERROR(ENOMEM);
1567
for(i=0; i<f->quant_table_count; i++){
1568
if(get_rac(c, state)){
1569
for(j=0; j<f->context_count[i]; j++){
1570
for(k=0; k<CONTEXT_SIZE; k++){
1571
int pred= j ? f->initial_states[i][j-1][k] : 128;
1572
f->initial_states[i][j][k]= (pred+get_symbol(c, state2[k], 1))&0xFF;
1581
static int read_header(FFV1Context *f){
1582
uint8_t state[CONTEXT_SIZE];
1583
int i, j, context_count;
1584
RangeCoder * const c= &f->slice_context[0]->c;
1586
memset(state, 128, sizeof(state));
1589
f->version= get_symbol(c, state, 0);
1590
f->ac= f->avctx->coder_type= get_symbol(c, state, 0);
1592
for(i=1; i<256; i++){
1593
f->state_transition[i]= get_symbol(c, state, 1) + c->one_state[i];
1596
f->colorspace= get_symbol(c, state, 0); //YUV cs type
1598
f->avctx->bits_per_raw_sample= get_symbol(c, state, 0);
1599
get_rac(c, state); //no chroma = false
1600
f->chroma_h_shift= get_symbol(c, state, 0);
1601
f->chroma_v_shift= get_symbol(c, state, 0);
1602
get_rac(c, state); //transparency plane
1606
if(f->colorspace==0){
1607
if(f->avctx->bits_per_raw_sample<=8){
1608
switch(16*f->chroma_h_shift + f->chroma_v_shift){
1609
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P; break;
1610
case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P; break;
1611
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P; break;
1612
case 0x20: f->avctx->pix_fmt= PIX_FMT_YUV411P; break;
1613
case 0x22: f->avctx->pix_fmt= PIX_FMT_YUV410P; break;
1615
av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1619
switch(16*f->chroma_h_shift + f->chroma_v_shift){
1620
case 0x00: f->avctx->pix_fmt= PIX_FMT_YUV444P16; break;
1621
case 0x10: f->avctx->pix_fmt= PIX_FMT_YUV422P16; break;
1622
case 0x11: f->avctx->pix_fmt= PIX_FMT_YUV420P16; break;
1624
av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
1628
}else if(f->colorspace==1){
1629
if(f->chroma_h_shift || f->chroma_v_shift){
1630
av_log(f->avctx, AV_LOG_ERROR, "chroma subsampling not supported in this colorspace\n");
1633
f->avctx->pix_fmt= PIX_FMT_RGB32;
1635
av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
1639
//printf("%d %d %d\n", f->chroma_h_shift, f->chroma_v_shift,f->avctx->pix_fmt);
1641
context_count= read_quant_tables(c, f->quant_table);
1642
if(context_count < 0){
1643
av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
1647
f->slice_count= get_symbol(c, state, 0);
1648
if(f->slice_count > (unsigned)MAX_SLICES)
1652
for(j=0; j<f->slice_count; j++){
1653
FFV1Context *fs= f->slice_context[j];
1656
if(f->version >= 2){
1657
fs->slice_x = get_symbol(c, state, 0) *f->width ;
1658
fs->slice_y = get_symbol(c, state, 0) *f->height;
1659
fs->slice_width =(get_symbol(c, state, 0)+1)*f->width + fs->slice_x;
1660
fs->slice_height=(get_symbol(c, state, 0)+1)*f->height + fs->slice_y;
1662
fs->slice_x /= f->num_h_slices;
1663
fs->slice_y /= f->num_v_slices;
1664
fs->slice_width = fs->slice_width /f->num_h_slices - fs->slice_x;
1665
fs->slice_height = fs->slice_height/f->num_v_slices - fs->slice_y;
1666
if((unsigned)fs->slice_width > f->width || (unsigned)fs->slice_height > f->height)
1668
if( (unsigned)fs->slice_x + (uint64_t)fs->slice_width > f->width
1669
|| (unsigned)fs->slice_y + (uint64_t)fs->slice_height > f->height)
1673
for(i=0; i<f->plane_count; i++){
1674
PlaneContext * const p= &fs->plane[i];
1676
if(f->version >= 2){
1677
int idx=get_symbol(c, state, 0);
1678
if(idx > (unsigned)f->quant_table_count){
1679
av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
1682
p->quant_table_index= idx;
1683
memcpy(p->quant_table, f->quant_tables[idx], sizeof(p->quant_table));
1684
context_count= f->context_count[idx];
1686
memcpy(p->quant_table, f->quant_table, sizeof(p->quant_table));
1689
if(p->context_count < context_count){
1690
av_freep(&p->state);
1691
av_freep(&p->vlc_state);
1693
p->context_count= context_count;
1700
static av_cold int decode_init(AVCodecContext *avctx)
1702
FFV1Context *f = avctx->priv_data;
1706
if(avctx->extradata && read_extra_header(f) < 0)
1709
if(init_slice_contexts(f) < 0)
1715
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt){
1716
const uint8_t *buf = avpkt->data;
1717
int buf_size = avpkt->size;
1718
FFV1Context *f = avctx->priv_data;
1719
RangeCoder * const c= &f->slice_context[0]->c;
1720
AVFrame * const p= &f->picture;
1722
uint8_t keystate= 128;
1723
const uint8_t *buf_p;
1725
AVFrame *picture = data;
1727
/* release previously stored data */
1729
avctx->release_buffer(avctx, p);
1731
ff_init_range_decoder(c, buf, buf_size);
1732
ff_build_rac_states(c, 0.05*(1LL<<32), 256-8);
1735
p->pict_type= AV_PICTURE_TYPE_I; //FIXME I vs. P
1736
if(get_rac(c, &keystate)){
1738
if(read_header(f) < 0)
1740
if(init_slice_state(f) < 0)
1749
for(i=1; i<256; i++){
1750
c->one_state[i]= f->state_transition[i];
1751
c->zero_state[256-i]= 256-c->one_state[i];
1756
if(avctx->get_buffer(avctx, p) < 0){
1757
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1761
if(avctx->debug&FF_DEBUG_PICT_INFO)
1762
av_log(avctx, AV_LOG_ERROR, "keyframe:%d coder:%d\n", p->key_frame, f->ac);
1765
bytes_read = c->bytestream - c->bytestream_start - 1;
1766
if(bytes_read ==0) av_log(avctx, AV_LOG_ERROR, "error at end of AC stream\n"); //FIXME
1767
//printf("pos=%d\n", bytes_read);
1768
init_get_bits(&f->slice_context[0]->gb, buf + bytes_read, buf_size - bytes_read);
1770
bytes_read = 0; /* avoid warning */
1773
buf_p= buf + buf_size;
1774
for(i=f->slice_count-1; i>0; i--){
1775
FFV1Context *fs= f->slice_context[i];
1776
int v= AV_RB24(buf_p-3)+3;
1777
if(buf_p - buf <= v){
1778
av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
1783
ff_init_range_decoder(&fs->c, buf_p, v);
1785
init_get_bits(&fs->gb, buf_p, v);
1789
avctx->execute(avctx, decode_slice, &f->slice_context[0], NULL, f->slice_count, sizeof(void*));
1790
f->picture_number++;
1793
*data_size = sizeof(AVFrame);
1798
AVCodec ff_ffv1_decoder = {
1802
sizeof(FFV1Context),
1807
CODEC_CAP_DR1 /*| CODEC_CAP_DRAW_HORIZ_BAND*/ | CODEC_CAP_SLICE_THREADS,
1809
.long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),
1812
#if CONFIG_FFV1_ENCODER
1813
AVCodec ff_ffv1_encoder = {
1817
sizeof(FFV1Context),
1821
.capabilities = CODEC_CAP_SLICE_THREADS,
1822
.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},
1823
.long_name= NULL_IF_CONFIG_SMALL("FFmpeg video codec #1"),