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