d1a6a83b1350794028e054ffb47b5071f9110784
[libav.git] / libavcodec / ffv1.c
1 /*
2 * FFV1 codec for libavcodec
3 *
4 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of Libav.
7 *
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.
12 *
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.
17 *
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
21 */
22
23 /**
24 * @file
25 * FF Video Codec 1 (a lossless codec)
26 */
27
28 #include "libavutil/attributes.h"
29 #include "libavutil/avassert.h"
30 #include "avcodec.h"
31 #include "get_bits.h"
32 #include "put_bits.h"
33 #include "rangecoder.h"
34 #include "golomb.h"
35 #include "mathops.h"
36 #include "ffv1.h"
37
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,
55 };
56
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,
74 };
75
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,
93 };
94
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,
112 };
113
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,
131 };
132
133
134 av_cold int ffv1_common_init(AVCodecContext *avctx)
135 {
136 FFV1Context *s = avctx->priv_data;
137
138 s->avctx = avctx;
139 s->flags = avctx->flags;
140
141 if (!avctx->width || !avctx->height)
142 return AVERROR_INVALIDDATA;
143
144 s->width = avctx->width;
145 s->height = avctx->height;
146
147 // defaults
148 s->num_h_slices = 1;
149 s->num_v_slices = 1;
150
151 return 0;
152 }
153
154 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
155 {
156 int j;
157
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];
162
163 if (fs->ac) {
164 if (!p->state)
165 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
166 sizeof(uint8_t));
167 if (!p->state)
168 return AVERROR(ENOMEM);
169 } else {
170 if (!p->vlc_state)
171 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
172 if (!p->vlc_state)
173 return AVERROR(ENOMEM);
174 }
175 }
176
177 if (fs->ac > 1) {
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];
182 }
183 }
184
185 return 0;
186 }
187
188 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
189 {
190 int i;
191
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);
196 }
197
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));
209
210 fs->slice_width = sxe - sxs;
211 fs->slice_height = sye - sys;
212 fs->slice_x = sxs;
213 fs->slice_y = sys;
214
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);
219 }
220 return 0;
221 }
222
223 int ffv1_allocate_initial_states(FFV1Context *f)
224 {
225 int i;
226
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]));
234 }
235 return 0;
236 }
237
238 void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
239 {
240 int i, j;
241
242 for (i = 0; i < f->plane_count; i++) {
243 PlaneContext *p = &fs->plane[i];
244
245 p->interlace_bit_state[0] = 128;
246 p->interlace_bit_state[1] = 128;
247
248 if (fs->ac) {
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);
252 } else
253 memset(p->state, 128, CONTEXT_SIZE * p->context_count);
254 } else {
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;
260 }
261 }
262 }
263 }
264
265 av_cold int ffv1_close(AVCodecContext *avctx)
266 {
267 FFV1Context *s = avctx->priv_data;
268 int i, j;
269
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];
274
275 av_freep(&p->state);
276 av_freep(&p->vlc_state);
277 }
278 av_freep(&fs->sample_buffer);
279 }
280
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]);
287 }
288 av_freep(&s->rc_stat2[j]);
289 }
290
291 for (i = 0; i < s->slice_count; i++)
292 av_freep(&s->slice_context[i]);
293
294 return 0;
295 }