ffv1.c
Go to the documentation of this file.
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 
28 #include "libavutil/avassert.h"
29 #include "avcodec.h"
30 #include "get_bits.h"
31 #include "put_bits.h"
32 #include "dsputil.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 
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 
145 
146  ff_dsputil_init(&s->dsp, avctx);
147 
148  s->width = avctx->width;
149  s->height = avctx->height;
150 
151  // defaults
152  s->num_h_slices = 1;
153  s->num_v_slices = 1;
154 
155  return 0;
156 }
157 
159 {
160  int j;
161 
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];
166 
167  if (fs->ac) {
168  if (!p->state)
170  sizeof(uint8_t));
171  if (!p->state)
172  return AVERROR(ENOMEM);
173  } else {
174  if (!p->vlc_state)
175  p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
176  if (!p->vlc_state)
177  return AVERROR(ENOMEM);
178  }
179  }
180 
181  if (fs->ac > 1) {
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];
186  }
187  }
188 
189  return 0;
190 }
191 
193 {
194  int i;
195 
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 
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 
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],
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 
266 {
267  FFV1Context *s = avctx->priv_data;
268  int i, j;
269 
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);
274 
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];
279 
280  av_freep(&p->state);
281  av_freep(&p->vlc_state);
282  }
283  av_freep(&fs->sample_buffer);
284  }
285 
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]);
292  }
293  av_freep(&s->rc_stat2[j]);
294  }
295 
296  for (i = 0; i < s->slice_count; i++)
297  av_freep(&s->slice_context[i]);
298 
299  return 0;
300 }