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)
28 #include "libavutil/avassert.h"
32 #include "rangecoder.h"
37 const int8_t ffv1_quant5_10bit
[256] = {
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
42 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
43 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
44 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
45 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
46 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
47 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
48 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
49 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
50 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -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, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
56 const int8_t ffv1_quant5
[256] = {
57 0, 1, 1, 1, 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, -2, -2, -2,
72 -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
75 const int8_t ffv1_quant9_10bit
[256] = {
76 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 4, 4, 4, 4, 4, 4, 4, 4,
80 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
81 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
82 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
83 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
84 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
85 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
86 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
87 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
88 -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
89 -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
90 -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
91 -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
94 const int8_t ffv1_quant11
[256] = {
95 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
98 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
99 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
100 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
101 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
102 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
103 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
104 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
105 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
106 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
107 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
108 -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
109 -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
110 -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
113 const uint8_t ffv1_ver2_state
[256] = {
114 0, 10, 10, 10, 10, 16, 16, 16, 28, 16, 16, 29, 42, 49, 20, 49,
115 59, 25, 26, 26, 27, 31, 33, 33, 33, 34, 34, 37, 67, 38, 39, 39,
116 40, 40, 41, 79, 43, 44, 45, 45, 48, 48, 64, 50, 51, 52, 88, 52,
117 53, 74, 55, 57, 58, 58, 74, 60, 101, 61, 62, 84, 66, 66, 68, 69,
118 87, 82, 71, 97, 73, 73, 82, 75, 111, 77, 94, 78, 87, 81, 83, 97,
119 85, 83, 94, 86, 99, 89, 90, 99, 111, 92, 93, 134, 95, 98, 105, 98,
120 105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
121 115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
122 165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
123 147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
124 172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
125 175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
126 197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
127 209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
128 226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
129 241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
133 int ffv1_common_init(AVCodecContext
*avctx
)
135 FFV1Context
*s
= avctx
->priv_data
;
138 s
->flags
= avctx
->flags
;
140 if (!avctx
->width
|| !avctx
->height
)
141 return AVERROR_INVALIDDATA
;
143 avcodec_get_frame_defaults(&s
->picture
);
145 ff_dsputil_init(&s
->dsp
, avctx
);
147 s
->width
= avctx
->width
;
148 s
->height
= avctx
->height
;
157 int ffv1_init_slice_state(FFV1Context
*f
, FFV1Context
*fs
)
161 fs
->plane_count
= f
->plane_count
;
162 fs
->transparency
= f
->transparency
;
163 for (j
= 0; j
< f
->plane_count
; j
++) {
164 PlaneContext
*const p
= &fs
->plane
[j
];
168 p
->state
= av_malloc(CONTEXT_SIZE
* p
->context_count
*
171 return AVERROR(ENOMEM
);
174 p
->vlc_state
= av_malloc(p
->context_count
* sizeof(VlcState
));
176 return AVERROR(ENOMEM
);
181 //FIXME only redo if state_transition changed
182 for (j
= 1; j
< 256; j
++) {
183 fs
->c
.one_state
[j
] = f
->state_transition
[j
];
184 fs
->c
.zero_state
[256 - j
] = 256 - fs
->c
.one_state
[j
];
191 av_cold
int ffv1_init_slice_contexts(FFV1Context
*f
)
195 f
->slice_count
= f
->num_h_slices
* f
->num_v_slices
;
197 for (i
= 0; i
< f
->slice_count
; i
++) {
198 FFV1Context
*fs
= av_mallocz(sizeof(*fs
));
199 int sx
= i
% f
->num_h_slices
;
200 int sy
= i
/ f
->num_h_slices
;
201 int sxs
= f
->avctx
->width
* sx
/ f
->num_h_slices
;
202 int sxe
= f
->avctx
->width
* (sx
+ 1) / f
->num_h_slices
;
203 int sys
= f
->avctx
->height
* sy
/ f
->num_v_slices
;
204 int sye
= f
->avctx
->height
* (sy
+ 1) / f
->num_v_slices
;
205 f
->slice_context
[i
] = fs
;
206 memcpy(fs
, f
, sizeof(*fs
));
207 memset(fs
->rc_stat2
, 0, sizeof(fs
->rc_stat2
));
209 fs
->slice_width
= sxe
- sxs
;
210 fs
->slice_height
= sye
- sys
;
214 fs
->sample_buffer
= av_malloc(3 * MAX_PLANES
* (fs
->width
+ 6) *
215 sizeof(*fs
->sample_buffer
));
216 if (!fs
->sample_buffer
)
217 return AVERROR(ENOMEM
);
222 int ffv1_allocate_initial_states(FFV1Context
*f
)
226 for (i
= 0; i
< f
->quant_table_count
; i
++) {
227 f
->initial_states
[i
] = av_malloc(f
->context_count
[i
] *
228 sizeof(*f
->initial_states
[i
]));
229 if (!f
->initial_states
[i
])
230 return AVERROR(ENOMEM
);
231 memset(f
->initial_states
[i
], 128,
232 f
->context_count
[i
] * sizeof(*f
->initial_states
[i
]));
237 void ffv1_clear_slice_state(FFV1Context
*f
, FFV1Context
*fs
)
241 for (i
= 0; i
< f
->plane_count
; i
++) {
242 PlaneContext
*p
= &fs
->plane
[i
];
244 p
->interlace_bit_state
[0] = 128;
245 p
->interlace_bit_state
[1] = 128;
248 if (f
->initial_states
[p
->quant_table_index
]) {
249 memcpy(p
->state
, f
->initial_states
[p
->quant_table_index
],
250 CONTEXT_SIZE
* p
->context_count
);
252 memset(p
->state
, 128, CONTEXT_SIZE
* p
->context_count
);
254 for (j
= 0; j
< p
->context_count
; j
++) {
255 p
->vlc_state
[j
].drift
= 0;
256 p
->vlc_state
[j
].error_sum
= 4; //FFMAX((RANGE + 32)/64, 2);
257 p
->vlc_state
[j
].bias
= 0;
258 p
->vlc_state
[j
].count
= 1;
264 av_cold
int ffv1_close(AVCodecContext
*avctx
)
266 FFV1Context
*s
= avctx
->priv_data
;
269 av_frame_unref(&s
->last_picture
);
271 for (j
= 0; j
< s
->slice_count
; j
++) {
272 FFV1Context
*fs
= s
->slice_context
[j
];
273 for (i
= 0; i
< s
->plane_count
; i
++) {
274 PlaneContext
*p
= &fs
->plane
[i
];
277 av_freep(&p
->vlc_state
);
279 av_freep(&fs
->sample_buffer
);
282 av_freep(&avctx
->stats_out
);
283 for (j
= 0; j
< s
->quant_table_count
; j
++) {
284 av_freep(&s
->initial_states
[j
]);
285 for (i
= 0; i
< s
->slice_count
; i
++) {
286 FFV1Context
*sf
= s
->slice_context
[i
];
287 av_freep(&sf
->rc_stat2
[j
]);
289 av_freep(&s
->rc_stat2
[j
]);
292 for (i
= 0; i
< s
->slice_count
; i
++)
293 av_freep(&s
->slice_context
[i
]);