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