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"
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 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 avcodec_get_frame_defaults(&s->picture);
146 ff_dsputil_init(&s->dsp, avctx);
148 s->width = avctx->width;
149 s->height = avctx->height;
158 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
162 fs->plane_count = f->plane_count;
163 fs->transparency = f->transparency;
164 for (j = 0; j < f->plane_count; j++) {
165 PlaneContext *const p = &fs->plane[j];
169 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
172 return AVERROR(ENOMEM);
175 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
177 return AVERROR(ENOMEM);
182 //FIXME only redo if state_transition changed
183 for (j = 1; j < 256; j++) {
184 fs->c.one_state[j] = f->state_transition[j];
185 fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
192 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
196 f->slice_count = f->num_h_slices * f->num_v_slices;
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 if (avctx->codec->decode && s->picture.data[0])
271 avctx->release_buffer(avctx, &s->picture);
272 if (avctx->codec->decode && s->last_picture.data[0])
273 avctx->release_buffer(avctx, &s->last_picture);
275 for (j = 0; j < s->slice_count; j++) {
276 FFV1Context *fs = s->slice_context[j];
277 for (i = 0; i < s->plane_count; i++) {
278 PlaneContext *p = &fs->plane[i];
281 av_freep(&p->vlc_state);
283 av_freep(&fs->sample_buffer);
286 av_freep(&avctx->stats_out);
287 for (j = 0; j < s->quant_table_count; j++) {
288 av_freep(&s->initial_states[j]);
289 for (i = 0; i < s->slice_count; i++) {
290 FFV1Context *sf = s->slice_context[i];
291 av_freep(&sf->rc_stat2[j]);
293 av_freep(&s->rc_stat2[j]);
296 for (i = 0; i < s->slice_count; i++)
297 av_freep(&s->slice_context[i]);