FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
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-2013 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/attributes.h
"
29
#include "
libavutil/avassert.h
"
30
#include "
libavutil/crc.h
"
31
#include "
libavutil/opt.h
"
32
#include "
libavutil/imgutils.h
"
33
#include "
libavutil/pixdesc.h
"
34
#include "
libavutil/timer.h
"
35
#include "
avcodec.h
"
36
#include "
internal.h
"
37
#include "
rangecoder.h
"
38
#include "
golomb.h
"
39
#include "
mathops.h
"
40
#include "
ffv1.h
"
41
42
av_cold
int
ffv1_common_init
(
AVCodecContext
*avctx)
43
{
44
FFV1Context
*
s
= avctx->
priv_data
;
45
46
if
(!avctx->
width
|| !avctx->
height
)
47
return
AVERROR_INVALIDDATA
;
48
49
s->
avctx
= avctx;
50
s->
flags
= avctx->
flags
;
51
52
s->
picture
.
f
=
av_frame_alloc
();
53
s->
last_picture
.
f
=
av_frame_alloc
();
54
if
(!s->
picture
.
f
|| !s->
last_picture
.
f
)
55
return
AVERROR
(ENOMEM);
56
57
ff_dsputil_init
(&s->
dsp
, avctx);
58
59
s->
width
= avctx->
width
;
60
s->
height
= avctx->
height
;
61
62
// defaults
63
s->
num_h_slices
= 1;
64
s->
num_v_slices
= 1;
65
66
return
0;
67
}
68
69
av_cold
int
ffv1_init_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
70
{
71
int
j;
72
73
fs->
plane_count
= f->
plane_count
;
74
fs->
transparency
= f->
transparency
;
75
for
(j = 0; j < f->
plane_count
; j++) {
76
PlaneContext
*
const
p = &fs->
plane
[j];
77
78
if
(fs->
ac
) {
79
if
(!p->
state
)
80
p->
state
=
av_malloc
(
CONTEXT_SIZE
* p->
context_count
*
81
sizeof
(
uint8_t
));
82
if
(!p->
state
)
83
return
AVERROR
(ENOMEM);
84
}
else
{
85
if
(!p->
vlc_state
)
86
p->
vlc_state
=
av_malloc
(p->
context_count
*
sizeof
(
VlcState
));
87
if
(!p->
vlc_state
)
88
return
AVERROR
(ENOMEM);
89
}
90
}
91
92
if
(fs->
ac
> 1) {
93
//FIXME only redo if state_transition changed
94
for
(j = 1; j < 256; j++) {
95
fs->
c
. one_state[ j] = f->
state_transition
[j];
96
fs->
c
.
zero_state
[256 - j] = 256 - fs->
c
.
one_state
[j];
97
}
98
}
99
100
return
0;
101
}
102
103
av_cold
int
ffv1_init_slices_state
(
FFV1Context
*f)
104
{
105
int
i,
ret
;
106
for
(i = 0; i < f->
slice_count
; i++) {
107
FFV1Context
*fs = f->
slice_context
[i];
108
if
((ret =
ffv1_init_slice_state
(f, fs)) < 0)
109
return
AVERROR
(ENOMEM);
110
}
111
return
0;
112
}
113
114
av_cold
int
ffv1_init_slice_contexts
(
FFV1Context
*f)
115
{
116
int
i;
117
118
f->
slice_count
= f->
num_h_slices
* f->
num_v_slices
;
119
av_assert0
(f->
slice_count
> 0);
120
121
for
(i = 0; i < f->
slice_count
; i++) {
122
FFV1Context
*fs =
av_mallocz
(
sizeof
(*fs));
123
int
sx = i % f->
num_h_slices
;
124
int
sy = i / f->
num_h_slices
;
125
int
sxs = f->
avctx
->
width
* sx / f->
num_h_slices
;
126
int
sxe = f->
avctx
->
width
* (sx + 1) / f->
num_h_slices
;
127
int
sys = f->
avctx
->
height
* sy / f->
num_v_slices
;
128
int
sye = f->
avctx
->
height
* (sy + 1) / f->
num_v_slices
;
129
130
if
(!fs)
131
return
AVERROR
(ENOMEM);
132
133
f->
slice_context
[i] = fs;
134
memcpy(fs, f,
sizeof
(*fs));
135
memset(fs->
rc_stat2
, 0,
sizeof
(fs->
rc_stat2
));
136
137
fs->
slice_width
= sxe - sxs;
138
fs->
slice_height
= sye - sys;
139
fs->
slice_x
= sxs;
140
fs->
slice_y
= sys;
141
142
fs->
sample_buffer
=
av_malloc
(3 *
MAX_PLANES
* (fs->
width
+ 6) *
143
sizeof
(*fs->
sample_buffer
));
144
if
(!fs->
sample_buffer
)
145
return
AVERROR
(ENOMEM);
146
}
147
return
0;
148
}
149
150
int
ffv1_allocate_initial_states
(
FFV1Context
*f)
151
{
152
int
i;
153
154
for
(i = 0; i < f->
quant_table_count
; i++) {
155
f->
initial_states
[i] =
av_malloc
(f->
context_count
[i] *
156
sizeof
(*f->
initial_states
[i]));
157
if
(!f->
initial_states
[i])
158
return
AVERROR
(ENOMEM);
159
memset(f->
initial_states
[i], 128,
160
f->
context_count
[i] *
sizeof
(*f->
initial_states
[i]));
161
}
162
return
0;
163
}
164
165
void
ffv1_clear_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
166
{
167
int
i, j;
168
169
for
(i = 0; i < f->
plane_count
; i++) {
170
PlaneContext
*p = &fs->
plane
[i];
171
172
p->
interlace_bit_state
[0] = 128;
173
p->
interlace_bit_state
[1] = 128;
174
175
if
(fs->
ac
) {
176
if
(f->
initial_states
[p->
quant_table_index
]) {
177
memcpy(p->
state
, f->
initial_states
[p->
quant_table_index
],
178
CONTEXT_SIZE
* p->
context_count
);
179
}
else
180
memset(p->
state
, 128,
CONTEXT_SIZE
* p->
context_count
);
181
}
else
{
182
for
(j = 0; j < p->
context_count
; j++) {
183
p->
vlc_state
[j].
drift
= 0;
184
p->
vlc_state
[j].
error_sum
= 4;
//FFMAX((RANGE + 32)/64, 2);
185
p->
vlc_state
[j].
bias
= 0;
186
p->
vlc_state
[j].
count
= 1;
187
}
188
}
189
}
190
}
191
192
193
av_cold
int
ffv1_close
(
AVCodecContext
*avctx)
194
{
195
FFV1Context
*
s
= avctx->
priv_data
;
196
int
i, j;
197
198
if
(s->
picture
.
f
)
199
ff_thread_release_buffer
(avctx, &s->
picture
);
200
av_frame_free
(&s->
picture
.
f
);
201
202
if
(s->
last_picture
.
f
)
203
ff_thread_release_buffer
(avctx, &s->
last_picture
);
204
av_frame_free
(&s->
last_picture
.
f
);
205
206
for
(j = 0; j < s->
slice_count
; j++) {
207
FFV1Context
*fs = s->
slice_context
[j];
208
for
(i = 0; i < s->
plane_count
; i++) {
209
PlaneContext
*p = &fs->
plane
[i];
210
211
av_freep
(&p->
state
);
212
av_freep
(&p->
vlc_state
);
213
}
214
av_freep
(&fs->
sample_buffer
);
215
}
216
217
av_freep
(&avctx->
stats_out
);
218
for
(j = 0; j < s->
quant_table_count
; j++) {
219
av_freep
(&s->
initial_states
[j]);
220
for
(i = 0; i < s->
slice_count
; i++) {
221
FFV1Context
*sf = s->
slice_context
[i];
222
av_freep
(&sf->
rc_stat2
[j]);
223
}
224
av_freep
(&s->
rc_stat2
[j]);
225
}
226
227
for
(i = 0; i < s->
slice_count
; i++)
228
av_freep
(&s->
slice_context
[i]);
229
230
return
0;
231
}
Generated on Sun Mar 23 2014 23:49:54 for FFmpeg by
1.8.2