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 s->width = avctx->width;
145 s->height = avctx->height;
154 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
158 fs->plane_count = f->plane_count;
159 fs->transparency = f->transparency;
160 for (j = 0; j < f->plane_count; j++) {
161 PlaneContext *const p = &fs->plane[j];
165 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
168 return AVERROR(ENOMEM);
171 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
173 return AVERROR(ENOMEM);
178 //FIXME only redo if state_transition changed
179 for (j = 1; j < 256; j++) {
180 fs->c.one_state[j] = f->state_transition[j];
181 fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
188 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
192 f->slice_count = f->num_h_slices * f->num_v_slices;
193 if (f->slice_count <= 0) {
194 av_log(f->avctx, AV_LOG_ERROR, "Invalid number of slices\n");
195 return AVERROR(EINVAL);
198 for (i = 0; i < f->slice_count; i++) {
199 FFV1Context *fs = av_mallocz(sizeof(*fs));
200 int sx = i % f->num_h_slices;
201 int sy = i / f->num_h_slices;
202 int sxs = f->avctx->width * sx / f->num_h_slices;
203 int sxe = f->avctx->width * (sx + 1) / f->num_h_slices;
204 int sys = f->avctx->height * sy / f->num_v_slices;
205 int sye = f->avctx->height * (sy + 1) / f->num_v_slices;
206 f->slice_context[i] = fs;
207 memcpy(fs, f, sizeof(*fs));
208 memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
210 fs->slice_width = sxe - sxs;
211 fs->slice_height = sye - sys;
215 fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
216 sizeof(*fs->sample_buffer));
217 if (!fs->sample_buffer)
218 return AVERROR(ENOMEM);
223 int ffv1_allocate_initial_states(FFV1Context *f)
227 for (i = 0; i < f->quant_table_count; i++) {
228 f->initial_states[i] = av_malloc(f->context_count[i] *
229 sizeof(*f->initial_states[i]));
230 if (!f->initial_states[i])
231 return AVERROR(ENOMEM);
232 memset(f->initial_states[i], 128,
233 f->context_count[i] * sizeof(*f->initial_states[i]));
238 void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
242 for (i = 0; i < f->plane_count; i++) {
243 PlaneContext *p = &fs->plane[i];
245 p->interlace_bit_state[0] = 128;
246 p->interlace_bit_state[1] = 128;
249 if (f->initial_states[p->quant_table_index]) {
250 memcpy(p->state, f->initial_states[p->quant_table_index],
251 CONTEXT_SIZE * p->context_count);
253 memset(p->state, 128, CONTEXT_SIZE * p->context_count);
255 for (j = 0; j < p->context_count; j++) {
256 p->vlc_state[j].drift = 0;
257 p->vlc_state[j].error_sum = 4; //FFMAX((RANGE + 32)/64, 2);
258 p->vlc_state[j].bias = 0;
259 p->vlc_state[j].count = 1;
265 av_cold int ffv1_close(AVCodecContext *avctx)
267 FFV1Context *s = avctx->priv_data;
270 for (j = 0; j < s->slice_count; j++) {
271 FFV1Context *fs = s->slice_context[j];
272 for (i = 0; i < s->plane_count; i++) {
273 PlaneContext *p = &fs->plane[i];
276 av_freep(&p->vlc_state);
278 av_freep(&fs->sample_buffer);
281 av_freep(&avctx->stats_out);
282 for (j = 0; j < s->quant_table_count; j++) {
283 av_freep(&s->initial_states[j]);
284 for (i = 0; i < s->slice_count; i++) {
285 FFV1Context *sf = s->slice_context[i];
286 av_freep(&sf->rc_stat2[j]);
288 av_freep(&s->rc_stat2[j]);
291 for (i = 0; i < s->slice_count; i++)
292 av_freep(&s->slice_context[i]);