ffv1.c
Go to the documentation of this file.
1 /*
2  * FFV1 codec for libavcodec
3  *
4  * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg 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  * FFmpeg 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 FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * FF Video Codec 1 (a lossless codec)
26  */
27 
28 #include "libavutil/avassert.h"
29 #include "libavutil/crc.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/pixdesc.h"
33 #include "libavutil/timer.h"
34 #include "avcodec.h"
35 #include "internal.h"
36 #include "rangecoder.h"
37 #include "golomb.h"
38 #include "mathops.h"
39 #include "ffv1.h"
40 
42 {
43  FFV1Context *s = avctx->priv_data;
44 
45  if (!avctx->width || !avctx->height)
46  return AVERROR_INVALIDDATA;
47 
48  s->avctx = avctx;
49  s->flags = avctx->flags;
50 
52 
53  ff_dsputil_init(&s->dsp, avctx);
54 
55  s->width = avctx->width;
56  s->height = avctx->height;
57 
58  // defaults
59  s->num_h_slices = 1;
60  s->num_v_slices = 1;
61 
62  return 0;
63 }
64 
66 {
67  int j;
68 
69  fs->plane_count = f->plane_count;
70  fs->transparency = f->transparency;
71  for (j = 0; j < f->plane_count; j++) {
72  PlaneContext *const p = &fs->plane[j];
73 
74  if (fs->ac) {
75  if (!p->state)
77  sizeof(uint8_t));
78  if (!p->state)
79  return AVERROR(ENOMEM);
80  } else {
81  if (!p->vlc_state)
82  p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
83  if (!p->vlc_state)
84  return AVERROR(ENOMEM);
85  }
86  }
87 
88  if (fs->ac > 1) {
89  //FIXME only redo if state_transition changed
90  for (j = 1; j < 256; j++) {
91  fs->c. one_state[ j] = f->state_transition[j];
92  fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
93  }
94  }
95 
96  return 0;
97 }
98 
100 {
101  int i, ret;
102  for (i = 0; i < f->slice_count; i++) {
103  FFV1Context *fs = f->slice_context[i];
104  if ((ret = ffv1_init_slice_state(f, fs)) < 0)
105  return AVERROR(ENOMEM);
106  }
107  return 0;
108 }
109 
111 {
112  int i;
113 
115  av_assert0(f->slice_count > 0);
116 
117  for (i = 0; i < f->slice_count; i++) {
118  FFV1Context *fs = av_mallocz(sizeof(*fs));
119  int sx = i % f->num_h_slices;
120  int sy = i / f->num_h_slices;
121  int sxs = f->avctx->width * sx / f->num_h_slices;
122  int sxe = f->avctx->width * (sx + 1) / f->num_h_slices;
123  int sys = f->avctx->height * sy / f->num_v_slices;
124  int sye = f->avctx->height * (sy + 1) / f->num_v_slices;
125 
126  if (!fs)
127  return AVERROR(ENOMEM);
128 
129  f->slice_context[i] = fs;
130  memcpy(fs, f, sizeof(*fs));
131  memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
132 
133  fs->slice_width = sxe - sxs;
134  fs->slice_height = sye - sys;
135  fs->slice_x = sxs;
136  fs->slice_y = sys;
137 
138  fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
139  sizeof(*fs->sample_buffer));
140  if (!fs->sample_buffer)
141  return AVERROR(ENOMEM);
142  }
143  return 0;
144 }
145 
147 {
148  int i;
149 
150  for (i = 0; i < f->quant_table_count; i++) {
152  sizeof(*f->initial_states[i]));
153  if (!f->initial_states[i])
154  return AVERROR(ENOMEM);
155  memset(f->initial_states[i], 128,
156  f->context_count[i] * sizeof(*f->initial_states[i]));
157  }
158  return 0;
159 }
160 
162 {
163  int i, j;
164 
165  for (i = 0; i < f->plane_count; i++) {
166  PlaneContext *p = &fs->plane[i];
167 
168  p->interlace_bit_state[0] = 128;
169  p->interlace_bit_state[1] = 128;
170 
171  if (fs->ac) {
172  if (f->initial_states[p->quant_table_index]) {
173  memcpy(p->state, f->initial_states[p->quant_table_index],
175  } else
176  memset(p->state, 128, CONTEXT_SIZE * p->context_count);
177  } else {
178  for (j = 0; j < p->context_count; j++) {
179  p->vlc_state[j].drift = 0;
180  p->vlc_state[j].error_sum = 4; //FFMAX((RANGE + 32)/64, 2);
181  p->vlc_state[j].bias = 0;
182  p->vlc_state[j].count = 1;
183  }
184  }
185  }
186 }
187 
188 
190 {
191  FFV1Context *s = avctx->priv_data;
192  int i, j;
193 
195 
196  for (j = 0; j < s->slice_count; j++) {
197  FFV1Context *fs = s->slice_context[j];
198  for (i = 0; i < s->plane_count; i++) {
199  PlaneContext *p = &fs->plane[i];
200 
201  av_freep(&p->state);
202  av_freep(&p->vlc_state);
203  }
204  av_freep(&fs->sample_buffer);
205  }
206 
207  av_freep(&avctx->stats_out);
208  for (j = 0; j < s->quant_table_count; j++) {
209  av_freep(&s->initial_states[j]);
210  for (i = 0; i < s->slice_count; i++) {
211  FFV1Context *sf = s->slice_context[i];
212  av_freep(&sf->rc_stat2[j]);
213  }
214  av_freep(&s->rc_stat2[j]);
215  }
216 
217  for (i = 0; i < s->slice_count; i++)
218  av_freep(&s->slice_context[i]);
219 
220  return 0;
221 }
int ffv1_allocate_initial_states(FFV1Context *f)
Definition: ffv1.c:146
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:205
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
av_cold int ffv1_common_init(AVCodecContext *avctx)
Definition: ffv1.c:41
int flags
Definition: ffv1.h:90
misc image utilities
int quant_table_count
Definition: ffv1.h:116
int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
Definition: ffv1.c:65
int slice_height
Definition: ffv1.h:125
int16_t * sample_buffer
Definition: ffv1.h:106
uint8_t zero_state[256]
Definition: rangecoder.h:40
Range coder.
Sinusoidal phase f
uint64_t(*[MAX_QUANT_TABLES] rc_stat2)[32][2]
Definition: ffv1.h:83
FF Video Codec 1 (a lossless codec)
int height
Definition: ffv1.h:86
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:198
int plane_count
Definition: ffv1.h:95
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
uint8_t
#define av_cold
Definition: attributes.h:78
AVOptions.
int8_t bias
Definition: ffv1.h:61
RangeCoder c
Definition: ffv1.h:79
int slice_y
Definition: ffv1.h:127
uint8_t(*[MAX_QUANT_TABLES] initial_states)[32]
Definition: ffv1.h:103
uint8_t count
Definition: ffv1.h:62
VlcState * vlc_state
Definition: ffv1.h:70
char * stats_out
pass1 encoding statistics output buffer
high precision timer, useful to profile code
int slice_width
Definition: ffv1.h:124
int ffv1_init_slices_state(FFV1Context *f)
Definition: ffv1.c:99
int context_count
Definition: ffv1.h:68
int flags
CODEC_FLAG_*.
simple assert() macros that are a bit more flexible than ISO C assert().
external API header
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:96
Definition: ffv1.h:58
uint8_t state_transition[256]
Definition: ffv1.h:102
AVFrame last_picture
Definition: ffv1.h:92
int num_h_slices
Definition: ffv1.h:123
ret
Definition: avfilter.c:821
int width
picture width / height.
DSPContext dsp
Definition: ffv1.h:118
#define MAX_PLANES
Definition: ffv1.h:50
int slice_count
Definition: ffv1.h:121
int16_t drift
Definition: ffv1.h:59
av_cold int ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:110
int context_count[MAX_QUANT_TABLES]
Definition: ffv1.h:101
main external API structure.
void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
Definition: ffv1.c:161
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:73
void avcodec_get_frame_defaults(AVFrame *frame)
Set the fields of the given AVFrame to default values.
synthesis window for stochastic i
AVFrame picture
Definition: ffv1.h:92
uint16_t error_sum
Definition: ffv1.h:60
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:330
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define CONTEXT_SIZE
Definition: ffv1.h:51
int quant_table_index
Definition: ffv1.h:67
common internal api header.
function fs
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:69
PlaneContext plane[MAX_PLANES]
Definition: ffv1.h:98
int transparency
Definition: ffv1.h:89
av_cold int ffv1_close(AVCodecContext *avctx)
Definition: ffv1.c:189
struct FFV1Context * slice_context[MAX_SLICES]
Definition: ffv1.h:120
uint8_t interlace_bit_state[2]
Definition: ffv1.h:71
int num_v_slices
Definition: ffv1.h:122
exp golomb vlc stuff
AVCodecContext * avctx
Definition: ffv1.h:78
int slice_x
Definition: ffv1.h:126
int width
Definition: ffv1.h:86