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  if (f->slice_count <= 0) {
198  av_log(f->avctx, AV_LOG_ERROR, "Invalid number of slices\n");
199  return AVERROR(EINVAL);
200  }
201 
202  for (i = 0; i < f->slice_count; i++) {
203  FFV1Context *fs = av_mallocz(sizeof(*fs));
204  int sx = i % f->num_h_slices;
205  int sy = i / f->num_h_slices;
206  int sxs = f->avctx->width * sx / f->num_h_slices;
207  int sxe = f->avctx->width * (sx + 1) / f->num_h_slices;
208  int sys = f->avctx->height * sy / f->num_v_slices;
209  int sye = f->avctx->height * (sy + 1) / f->num_v_slices;
210  f->slice_context[i] = fs;
211  memcpy(fs, f, sizeof(*fs));
212  memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
213 
214  fs->slice_width = sxe - sxs;
215  fs->slice_height = sye - sys;
216  fs->slice_x = sxs;
217  fs->slice_y = sys;
218 
219  fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
220  sizeof(*fs->sample_buffer));
221  if (!fs->sample_buffer)
222  return AVERROR(ENOMEM);
223  }
224  return 0;
225 }
226 
228 {
229  int i;
230 
231  for (i = 0; i < f->quant_table_count; i++) {
232  f->initial_states[i] = av_malloc(f->context_count[i] *
233  sizeof(*f->initial_states[i]));
234  if (!f->initial_states[i])
235  return AVERROR(ENOMEM);
236  memset(f->initial_states[i], 128,
237  f->context_count[i] * sizeof(*f->initial_states[i]));
238  }
239  return 0;
240 }
241 
243 {
244  int i, j;
245 
246  for (i = 0; i < f->plane_count; i++) {
247  PlaneContext *p = &fs->plane[i];
248 
249  p->interlace_bit_state[0] = 128;
250  p->interlace_bit_state[1] = 128;
251 
252  if (fs->ac) {
253  if (f->initial_states[p->quant_table_index]) {
254  memcpy(p->state, f->initial_states[p->quant_table_index],
256  } else
257  memset(p->state, 128, CONTEXT_SIZE * p->context_count);
258  } else {
259  for (j = 0; j < p->context_count; j++) {
260  p->vlc_state[j].drift = 0;
261  p->vlc_state[j].error_sum = 4; //FFMAX((RANGE + 32)/64, 2);
262  p->vlc_state[j].bias = 0;
263  p->vlc_state[j].count = 1;
264  }
265  }
266  }
267 }
268 
270 {
271  FFV1Context *s = avctx->priv_data;
272  int i, j;
273 
274  if (avctx->codec->decode && s->picture.data[0])
275  avctx->release_buffer(avctx, &s->picture);
276  if (avctx->codec->decode && s->last_picture.data[0])
277  avctx->release_buffer(avctx, &s->last_picture);
278 
279  for (j = 0; j < s->slice_count; j++) {
280  FFV1Context *fs = s->slice_context[j];
281  for (i = 0; i < s->plane_count; i++) {
282  PlaneContext *p = &fs->plane[i];
283 
284  av_freep(&p->state);
285  av_freep(&p->vlc_state);
286  }
287  av_freep(&fs->sample_buffer);
288  }
289 
290  av_freep(&avctx->stats_out);
291  for (j = 0; j < s->quant_table_count; j++) {
292  av_freep(&s->initial_states[j]);
293  for (i = 0; i < s->slice_count; i++) {
294  FFV1Context *sf = s->slice_context[i];
295  av_freep(&sf->rc_stat2[j]);
296  }
297  av_freep(&s->rc_stat2[j]);
298  }
299 
300  for (i = 0; i < s->slice_count; i++)
301  av_freep(&s->slice_context[i]);
302 
303  return 0;
304 }