lavc decoders: work with refcounted frames.
[FFMpeg-mirror/mplayer-patches.git] / libavcodec / ffv1.c
blob81c684c2fee39a6391285db0b5c2189888ca9293
1 /*
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
23 /**
24 * @file
25 * FF Video Codec 1 (a lossless codec)
28 #include "libavutil/avassert.h"
29 #include "avcodec.h"
30 #include "get_bits.h"
31 #include "put_bits.h"
32 #include "rangecoder.h"
33 #include "golomb.h"
34 #include "mathops.h"
35 #include "ffv1.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;
137 s->avctx = avctx;
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;
150 // defaults
151 s->num_h_slices = 1;
152 s->num_v_slices = 1;
154 return 0;
157 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
159 int j;
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];
166 if (fs->ac) {
167 if (!p->state)
168 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
169 sizeof(uint8_t));
170 if (!p->state)
171 return AVERROR(ENOMEM);
172 } else {
173 if (!p->vlc_state)
174 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
175 if (!p->vlc_state)
176 return AVERROR(ENOMEM);
180 if (fs->ac > 1) {
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];
188 return 0;
191 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
193 int i;
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;
211 fs->slice_x = sxs;
212 fs->slice_y = 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);
219 return 0;
222 int ffv1_allocate_initial_states(FFV1Context *f)
224 int i;
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]));
234 return 0;
237 void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
239 int i, j;
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;
247 if (fs->ac) {
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);
251 } else
252 memset(p->state, 128, CONTEXT_SIZE * p->context_count);
253 } else {
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;
267 int i, j;
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];
276 av_freep(&p->state);
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]);
295 return 0;