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 }
int ffv1_allocate_initial_states(FFV1Context *f)
Definition: ffv1.c:227
const struct AVCodec * codec
Definition: avcodec.h:1348
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:61
const int8_t ffv1_quant5[256]
Definition: ffv1.c:57
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2656
int flags
Definition: ffv1.h:80
void(* release_buffer)(struct AVCodecContext *c, AVFrame *pic)
Called to release buffers which were allocated with get_buffer.
Definition: avcodec.h:2259
int quant_table_count
Definition: ffv1.h:104
int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
Definition: ffv1.c:158
int slice_height
Definition: ffv1.h:113
int16_t * sample_buffer
Definition: ffv1.h:94
uint8_t zero_state[256]
Definition: rangecoder.h:40
Range coder.
int(* decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt)
Definition: avcodec.h:3043
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:73
int height
Definition: ffv1.h:76
uint8_t one_state[256]
Definition: rangecoder.h:41
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:151
int plane_count
Definition: ffv1.h:83
const int8_t ffv1_quant11[256]
Definition: ffv1.c:95
const int8_t ffv1_quant5_10bit[256]
Definition: ffv1.c:38
uint8_t
int8_t bias
Definition: ffv1.h:51
int ffv1_common_init(AVCodecContext *avctx)
Definition: ffv1.c:134
RangeCoder c
Definition: ffv1.h:69
int slice_y
Definition: ffv1.h:115
uint8_t(*[MAX_QUANT_TABLES] initial_states)[32]
Definition: ffv1.h:91
uint8_t count
Definition: ffv1.h:52
bitstream reader API header.
VlcState * vlc_state
Definition: ffv1.h:60
char * stats_out
pass1 encoding statistics output buffer
Definition: avcodec.h:2502
int slice_width
Definition: ffv1.h:112
const int8_t ffv1_quant9_10bit[256]
Definition: ffv1.c:76
int context_count
Definition: ffv1.h:58
int flags
CODEC_FLAG_*.
Definition: avcodec.h:1434
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:146
int ac
Definition: ffv1.h:84
Definition: ffv1.h:48
uint8_t state_transition[256]
Definition: ffv1.h:90
AVFrame last_picture
Definition: ffv1.h:82
int num_h_slices
Definition: ffv1.h:111
int width
picture width / height.
Definition: avcodec.h:1508
DSPContext dsp
Definition: ffv1.h:106
const uint8_t ffv1_ver2_state[256]
Definition: ffv1.c:114
#define MAX_PLANES
Definition: ffv1.h:34
int slice_count
Definition: ffv1.h:109
int16_t drift
Definition: ffv1.h:49
av_cold int ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:192
int context_count[MAX_QUANT_TABLES]
Definition: ffv1.h:89
external API header
main external API structure.
Definition: avcodec.h:1339
void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
Definition: ffv1.c:242
void avcodec_get_frame_defaults(AVFrame *frame)
Set the fields of the given AVFrame to default values.
Definition: utils.c:602
AVFrame picture
Definition: ffv1.h:82
uint16_t error_sum
Definition: ffv1.h:50
#define CONTEXT_SIZE
Definition: ffv1.h:35
int quant_table_index
Definition: ffv1.h:57
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: avcodec.h:997
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:59
DSP utils.
void * priv_data
Definition: avcodec.h:1382
PlaneContext plane[MAX_PLANES]
Definition: ffv1.h:86
int transparency
Definition: ffv1.h:79
av_cold int ffv1_close(AVCodecContext *avctx)
Definition: ffv1.c:269
struct FFV1Context * slice_context[MAX_SLICES]
Definition: ffv1.h:108
uint8_t interlace_bit_state[2]
Definition: ffv1.h:61
int num_v_slices
Definition: ffv1.h:110
exp golomb vlc stuff
AVCodecContext * avctx
Definition: ffv1.h:68
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:158
int slice_x
Definition: ffv1.h:114
int width
Definition: ffv1.h:76
bitstream writer API