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.h
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
#ifndef AVCODEC_FFV1_H
24
#define AVCODEC_FFV1_H
25
26
/**
27
* @file
28
* FF Video Codec 1 (a lossless codec)
29
*/
30
31
#include "
libavutil/avassert.h
"
32
#include "
libavutil/crc.h
"
33
#include "
libavutil/opt.h
"
34
#include "
libavutil/imgutils.h
"
35
#include "
libavutil/pixdesc.h
"
36
#include "
libavutil/timer.h
"
37
#include "
avcodec.h
"
38
#include "
dsputil.h
"
39
#include "
get_bits.h
"
40
#include "
internal.h
"
41
#include "
mathops.h
"
42
#include "
put_bits.h
"
43
#include "
rangecoder.h
"
44
#include "
thread.h
"
45
46
#ifdef __INTEL_COMPILER
47
#undef av_flatten
48
#define av_flatten
49
#endif
50
51
#define MAX_PLANES 4
52
#define CONTEXT_SIZE 32
53
54
#define MAX_QUANT_TABLES 8
55
#define MAX_CONTEXT_INPUTS 5
56
57
extern
const
uint8_t
ff_log2_run
[41];
58
59
typedef
struct
VlcState
{
60
int16_t
drift
;
61
uint16_t
error_sum
;
62
int8_t
bias
;
63
uint8_t
count
;
64
}
VlcState
;
65
66
typedef
struct
PlaneContext
{
67
int16_t
quant_table
[
MAX_CONTEXT_INPUTS
][256];
68
int
quant_table_index
;
69
int
context_count
;
70
uint8_t
(*
state
)[
CONTEXT_SIZE
];
71
VlcState
*
vlc_state
;
72
uint8_t
interlace_bit_state
[2];
73
}
PlaneContext
;
74
75
#define MAX_SLICES 256
76
77
typedef
struct
FFV1Context
{
78
AVClass
*
class
;
79
AVCodecContext
*
avctx
;
80
RangeCoder
c
;
81
GetBitContext
gb
;
82
PutBitContext
pb
;
83
uint64_t
rc_stat
[256][2];
84
uint64_t (*
rc_stat2
[
MAX_QUANT_TABLES
])[32][2];
85
int
version
;
86
int
micro_version
;
87
int
width
,
height
;
88
int
chroma_planes
;
89
int
chroma_h_shift
,
chroma_v_shift
;
90
int
transparency
;
91
int
flags
;
92
int
picture_number
;
93
ThreadFrame
picture
,
last_picture
;
94
struct
FFV1Context
*
fsrc
;
95
96
AVFrame
*
cur
;
97
int
plane_count
;
98
int
ac
;
///< 1=range coder <-> 0=golomb rice
99
int
ac_byte_count
;
///< number of bytes used for AC coding
100
PlaneContext
plane
[
MAX_PLANES
];
101
int16_t
quant_table
[
MAX_CONTEXT_INPUTS
][256];
102
int16_t
quant_tables
[
MAX_QUANT_TABLES
][
MAX_CONTEXT_INPUTS
][256];
103
int
context_count
[
MAX_QUANT_TABLES
];
104
uint8_t
state_transition
[256];
105
uint8_t
(*
initial_states
[
MAX_QUANT_TABLES
])[32];
106
int
run_index
;
107
int
colorspace
;
108
int16_t *
sample_buffer
;
109
110
int
ec
;
111
int
intra
;
112
int
slice_damaged
;
113
int
key_frame_ok
;
114
115
int
bits_per_raw_sample
;
116
int
packed_at_lsb
;
117
118
int
gob_count
;
119
int
quant_table_count
;
120
121
DSPContext
dsp
;
122
123
struct
FFV1Context
*
slice_context
[
MAX_SLICES
];
124
int
slice_count
;
125
int
num_v_slices
;
126
int
num_h_slices
;
127
int
slice_width
;
128
int
slice_height
;
129
int
slice_x
;
130
int
slice_y
;
131
int
slice_reset_contexts
;
132
int
slice_coding_mode
;
133
int
slice_rct_by_coef
;
134
int
slice_rct_ry_coef
;
135
}
FFV1Context
;
136
137
int
ffv1_common_init
(
AVCodecContext
*
avctx
);
138
int
ffv1_init_slice_state
(
FFV1Context
*f,
FFV1Context
*fs);
139
int
ffv1_init_slices_state
(
FFV1Context
*f);
140
int
ffv1_init_slice_contexts
(
FFV1Context
*f);
141
int
ffv1_allocate_initial_states
(
FFV1Context
*f);
142
void
ffv1_clear_slice_state
(
FFV1Context
*f,
FFV1Context
*fs);
143
int
ffv1_close
(
AVCodecContext
*
avctx
);
144
145
static
av_always_inline
int
fold
(
int
diff,
int
bits
)
146
{
147
if
(bits == 8)
148
diff = (int8_t)diff;
149
else
{
150
diff += 1 << (bits - 1);
151
diff &= (1 <<
bits
) - 1;
152
diff -= 1 << (bits - 1);
153
}
154
155
return
diff;
156
}
157
158
static
inline
int
predict
(int16_t *
src
, int16_t *last)
159
{
160
const
int
LT = last[-1];
161
const
int
T
= last[0];
162
const
int
L
= src[-1];
163
164
return
mid_pred
(L, L + T - LT, T);
165
}
166
167
static
inline
int
get_context
(
PlaneContext
*p, int16_t *
src
,
168
int16_t *last, int16_t *last2)
169
{
170
const
int
LT = last[-1];
171
const
int
T
= last[0];
172
const
int
RT = last[1];
173
const
int
L
= src[-1];
174
175
if
(p->
quant_table
[3][127]) {
176
const
int
TT = last2[0];
177
const
int
LL = src[-2];
178
return
p->
quant_table
[0][(L - LT) & 0xFF] +
179
p->
quant_table
[1][(LT - T) & 0xFF] +
180
p->
quant_table
[2][(T - RT) & 0xFF] +
181
p->
quant_table
[3][(LL - L) & 0xFF] +
182
p->
quant_table
[4][(TT -
T
) & 0xFF];
183
}
else
184
return
p->
quant_table
[0][(L - LT) & 0xFF] +
185
p->
quant_table
[1][(LT - T) & 0xFF] +
186
p->
quant_table
[2][(T - RT) & 0xFF];
187
}
188
189
static
inline
void
update_vlc_state
(
VlcState
*
const
state
,
const
int
v
)
190
{
191
int
drift = state->
drift
;
192
int
count
= state->
count
;
193
state->
error_sum
+=
FFABS
(v);
194
drift +=
v
;
195
196
if
(count == 128) {
// FIXME: variable
197
count >>= 1;
198
drift >>= 1;
199
state->
error_sum
>>= 1;
200
}
201
count++;
202
203
if
(drift <= -count) {
204
if
(state->
bias
> -128)
205
state->
bias
--;
206
207
drift +=
count
;
208
if
(drift <= -count)
209
drift = -count + 1;
210
}
else
if
(drift > 0) {
211
if
(state->
bias
< 127)
212
state->
bias
++;
213
214
drift -=
count
;
215
if
(drift > 0)
216
drift = 0;
217
}
218
219
state->
drift
= drift;
220
state->
count
=
count
;
221
}
222
223
#endif
/* AVCODEC_FFV1_H */
Generated on Sun Mar 23 2014 23:49:54 for FFmpeg by
1.8.2