FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
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
41
av_cold
int
ffv1_common_init
(
AVCodecContext
*avctx)
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
51
avcodec_get_frame_defaults
(&s->
picture
);
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
65
int
ffv1_init_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
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
)
76
p->
state
=
av_malloc
(
CONTEXT_SIZE
* p->
context_count
*
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
99
int
ffv1_init_slices_state
(
FFV1Context
*f)
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
110
av_cold
int
ffv1_init_slice_contexts
(
FFV1Context
*f)
111
{
112
int
i;
113
114
f->
slice_count
= f->
num_h_slices
* f->
num_v_slices
;
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
146
int
ffv1_allocate_initial_states
(
FFV1Context
*f)
147
{
148
int
i;
149
150
for
(i = 0; i < f->
quant_table_count
; i++) {
151
f->
initial_states
[i] =
av_malloc
(f->
context_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
161
void
ffv1_clear_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
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
],
174
CONTEXT_SIZE
* p->
context_count
);
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
189
av_cold
int
ffv1_close
(
AVCodecContext
*avctx)
190
{
191
FFV1Context
*s = avctx->
priv_data
;
192
int
i, j;
193
194
if
(avctx->
codec
->
decode
&& s->
picture
.
data
[0])
195
avctx->
release_buffer
(avctx, &s->
picture
);
196
if
(avctx->
codec
->
decode
&& s->
last_picture
.
data
[0])
197
avctx->
release_buffer
(avctx, &s->
last_picture
);
198
199
for
(j = 0; j < s->
slice_count
; j++) {
200
FFV1Context
*fs = s->
slice_context
[j];
201
for
(i = 0; i < s->
plane_count
; i++) {
202
PlaneContext
*p = &fs->
plane
[i];
203
204
av_freep
(&p->
state
);
205
av_freep
(&p->
vlc_state
);
206
}
207
av_freep
(&fs->
sample_buffer
);
208
}
209
210
av_freep
(&avctx->
stats_out
);
211
for
(j = 0; j < s->
quant_table_count
; j++) {
212
av_freep
(&s->
initial_states
[j]);
213
for
(i = 0; i < s->
slice_count
; i++) {
214
FFV1Context
*sf = s->
slice_context
[i];
215
av_freep
(&sf->
rc_stat2
[j]);
216
}
217
av_freep
(&s->
rc_stat2
[j]);
218
}
219
220
for
(i = 0; i < s->
slice_count
; i++)
221
av_freep
(&s->
slice_context
[i]);
222
223
return
0;
224
}
Generated on Sat May 25 2013 04:01:03 for FFmpeg by
1.8.2