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