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