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