Libav
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/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 
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  ff_dsputil_init(&s->dsp, avctx);
145 
146  s->width = avctx->width;
147  s->height = avctx->height;
148 
149  // defaults
150  s->num_h_slices = 1;
151  s->num_v_slices = 1;
152 
153  return 0;
154 }
155 
157 {
158  int j;
159 
160  fs->plane_count = f->plane_count;
161  fs->transparency = f->transparency;
162  for (j = 0; j < f->plane_count; j++) {
163  PlaneContext *const p = &fs->plane[j];
164 
165  if (fs->ac) {
166  if (!p->state)
168  sizeof(uint8_t));
169  if (!p->state)
170  return AVERROR(ENOMEM);
171  } else {
172  if (!p->vlc_state)
173  p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
174  if (!p->vlc_state)
175  return AVERROR(ENOMEM);
176  }
177  }
178 
179  if (fs->ac > 1) {
180  //FIXME only redo if state_transition changed
181  for (j = 1; j < 256; j++) {
182  fs->c.one_state[j] = f->state_transition[j];
183  fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
184  }
185  }
186 
187  return 0;
188 }
189 
191 {
192  int i;
193 
195  if (f->slice_count <= 0) {
196  av_log(f->avctx, AV_LOG_ERROR, "Invalid number of slices\n");
197  return AVERROR(EINVAL);
198  }
199 
200  for (i = 0; i < f->slice_count; i++) {
201  FFV1Context *fs = av_mallocz(sizeof(*fs));
202  int sx = i % f->num_h_slices;
203  int sy = i / f->num_h_slices;
204  int sxs = f->avctx->width * sx / f->num_h_slices;
205  int sxe = f->avctx->width * (sx + 1) / f->num_h_slices;
206  int sys = f->avctx->height * sy / f->num_v_slices;
207  int sye = f->avctx->height * (sy + 1) / f->num_v_slices;
208  f->slice_context[i] = fs;
209  memcpy(fs, f, sizeof(*fs));
210  memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
211 
212  fs->slice_width = sxe - sxs;
213  fs->slice_height = sye - sys;
214  fs->slice_x = sxs;
215  fs->slice_y = sys;
216 
217  fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
218  sizeof(*fs->sample_buffer));
219  if (!fs->sample_buffer)
220  return AVERROR(ENOMEM);
221  }
222  return 0;
223 }
224 
226 {
227  int i;
228 
229  for (i = 0; i < f->quant_table_count; i++) {
230  f->initial_states[i] = av_malloc(f->context_count[i] *
231  sizeof(*f->initial_states[i]));
232  if (!f->initial_states[i])
233  return AVERROR(ENOMEM);
234  memset(f->initial_states[i], 128,
235  f->context_count[i] * sizeof(*f->initial_states[i]));
236  }
237  return 0;
238 }
239 
241 {
242  int i, j;
243 
244  for (i = 0; i < f->plane_count; i++) {
245  PlaneContext *p = &fs->plane[i];
246 
247  p->interlace_bit_state[0] = 128;
248  p->interlace_bit_state[1] = 128;
249 
250  if (fs->ac) {
251  if (f->initial_states[p->quant_table_index]) {
252  memcpy(p->state, f->initial_states[p->quant_table_index],
254  } else
255  memset(p->state, 128, CONTEXT_SIZE * p->context_count);
256  } else {
257  for (j = 0; j < p->context_count; j++) {
258  p->vlc_state[j].drift = 0;
259  p->vlc_state[j].error_sum = 4; //FFMAX((RANGE + 32)/64, 2);
260  p->vlc_state[j].bias = 0;
261  p->vlc_state[j].count = 1;
262  }
263  }
264  }
265 }
266 
268 {
269  FFV1Context *s = avctx->priv_data;
270  int i, j;
271 
272  for (j = 0; j < s->slice_count; j++) {
273  FFV1Context *fs = s->slice_context[j];
274  for (i = 0; i < s->plane_count; i++) {
275  PlaneContext *p = &fs->plane[i];
276 
277  av_freep(&p->state);
278  av_freep(&p->vlc_state);
279  }
280  av_freep(&fs->sample_buffer);
281  }
282 
283  av_freep(&avctx->stats_out);
284  for (j = 0; j < s->quant_table_count; j++) {
285  av_freep(&s->initial_states[j]);
286  for (i = 0; i < s->slice_count; i++) {
287  FFV1Context *sf = s->slice_context[i];
288  av_freep(&sf->rc_stat2[j]);
289  }
290  av_freep(&s->rc_stat2[j]);
291  }
292 
293  for (i = 0; i < s->slice_count; i++)
294  av_freep(&s->slice_context[i]);
295 
296  return 0;
297 }