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 "
dsputil.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
avcodec_get_frame_defaults
(&s->
picture
);
53
54
ff_dsputil_init
(&s->
dsp
, avctx);
55
56
s->
width
= avctx->
width
;
57
s->
height
= avctx->
height
;
58
59
// defaults
60
s->
num_h_slices
= 1;
61
s->
num_v_slices
= 1;
62
63
return
0;
64
}
65
66
int
ffv1_init_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
67
{
68
int
j;
69
70
fs->
plane_count
= f->
plane_count
;
71
fs->
transparency
= f->
transparency
;
72
for
(j = 0; j < f->
plane_count
; j++) {
73
PlaneContext
*
const
p = &fs->
plane
[j];
74
75
if
(fs->
ac
) {
76
if
(!p->
state
)
77
p->
state
=
av_malloc
(
CONTEXT_SIZE
* p->
context_count
*
78
sizeof
(
uint8_t
));
79
if
(!p->
state
)
80
return
AVERROR
(ENOMEM);
81
}
else
{
82
if
(!p->
vlc_state
)
83
p->
vlc_state
=
av_malloc
(p->
context_count
*
sizeof
(
VlcState
));
84
if
(!p->
vlc_state
)
85
return
AVERROR
(ENOMEM);
86
}
87
}
88
89
if
(fs->
ac
> 1) {
90
//FIXME only redo if state_transition changed
91
for
(j = 1; j < 256; j++) {
92
fs->
c
. one_state[ j] = f->
state_transition
[j];
93
fs->
c
.
zero_state
[256 - j] = 256 - fs->
c
.
one_state
[j];
94
}
95
}
96
97
return
0;
98
}
99
100
int
ffv1_init_slices_state
(
FFV1Context
*f)
101
{
102
int
i, ret;
103
for
(i = 0; i < f->
slice_count
; i++) {
104
FFV1Context
*fs = f->
slice_context
[i];
105
if
((ret =
ffv1_init_slice_state
(f, fs)) < 0)
106
return
AVERROR
(ENOMEM);
107
}
108
return
0;
109
}
110
111
av_cold
int
ffv1_init_slice_contexts
(
FFV1Context
*f)
112
{
113
int
i;
114
115
f->
slice_count
= f->
num_h_slices
* f->
num_v_slices
;
116
av_assert0
(f->
slice_count
> 0);
117
118
for
(i = 0; i < f->
slice_count
; i++) {
119
FFV1Context
*fs =
av_mallocz
(
sizeof
(*fs));
120
int
sx = i % f->
num_h_slices
;
121
int
sy = i / f->
num_h_slices
;
122
int
sxs = f->
avctx
->
width
* sx / f->
num_h_slices
;
123
int
sxe = f->
avctx
->
width
* (sx + 1) / f->
num_h_slices
;
124
int
sys = f->
avctx
->
height
* sy / f->
num_v_slices
;
125
int
sye = f->
avctx
->
height
* (sy + 1) / f->
num_v_slices
;
126
f->
slice_context
[i] = fs;
127
memcpy(fs, f,
sizeof
(*fs));
128
memset(fs->
rc_stat2
, 0,
sizeof
(fs->
rc_stat2
));
129
130
fs->
slice_width
= sxe - sxs;
131
fs->
slice_height
= sye - sys;
132
fs->
slice_x
= sxs;
133
fs->
slice_y
= sys;
134
135
fs->
sample_buffer
=
av_malloc
(3 *
MAX_PLANES
* (fs->
width
+ 6) *
136
sizeof
(*fs->
sample_buffer
));
137
if
(!fs->
sample_buffer
)
138
return
AVERROR
(ENOMEM);
139
}
140
return
0;
141
}
142
143
int
ffv1_allocate_initial_states
(
FFV1Context
*f)
144
{
145
int
i;
146
147
for
(i = 0; i < f->
quant_table_count
; i++) {
148
f->
initial_states
[i] =
av_malloc
(f->
context_count
[i] *
149
sizeof
(*f->
initial_states
[i]));
150
if
(!f->
initial_states
[i])
151
return
AVERROR
(ENOMEM);
152
memset(f->
initial_states
[i], 128,
153
f->
context_count
[i] *
sizeof
(*f->
initial_states
[i]));
154
}
155
return
0;
156
}
157
158
void
ffv1_clear_slice_state
(
FFV1Context
*f,
FFV1Context
*fs)
159
{
160
int
i, j;
161
162
for
(i = 0; i < f->
plane_count
; i++) {
163
PlaneContext
*p = &fs->
plane
[i];
164
165
p->
interlace_bit_state
[0] = 128;
166
p->
interlace_bit_state
[1] = 128;
167
168
if
(fs->
ac
) {
169
if
(f->
initial_states
[p->
quant_table_index
]) {
170
memcpy(p->
state
, f->
initial_states
[p->
quant_table_index
],
171
CONTEXT_SIZE
* p->
context_count
);
172
}
else
173
memset(p->
state
, 128,
CONTEXT_SIZE
* p->
context_count
);
174
}
else
{
175
for
(j = 0; j < p->
context_count
; j++) {
176
p->
vlc_state
[j].
drift
= 0;
177
p->
vlc_state
[j].
error_sum
= 4;
//FFMAX((RANGE + 32)/64, 2);
178
p->
vlc_state
[j].
bias
= 0;
179
p->
vlc_state
[j].
count
= 1;
180
}
181
}
182
}
183
}
184
185
186
av_cold
int
ffv1_close
(
AVCodecContext
*avctx)
187
{
188
FFV1Context
*s = avctx->
priv_data
;
189
int
i, j;
190
191
if
(avctx->
codec
->
decode
&& s->
picture
.
data
[0])
192
avctx->
release_buffer
(avctx, &s->
picture
);
193
if
(avctx->
codec
->
decode
&& s->
last_picture
.
data
[0])
194
avctx->
release_buffer
(avctx, &s->
last_picture
);
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
}
Generated on Sat May 25 2013 03:58:33 for FFmpeg by
1.8.2