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