Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
vp8.h
Go to the documentation of this file.
1
/*
2
* VP8 compatible video decoder
3
*
4
* Copyright (C) 2010 David Conrad
5
* Copyright (C) 2010 Ronald S. Bultje
6
* Copyright (C) 2010 Jason Garrett-Glaser
7
* Copyright (C) 2012 Daniel Kang
8
*
9
* This file is part of Libav.
10
*
11
* Libav is free software; you can redistribute it and/or
12
* modify it under the terms of the GNU Lesser General Public
13
* License as published by the Free Software Foundation; either
14
* version 2.1 of the License, or (at your option) any later version.
15
*
16
* Libav is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19
* Lesser General Public License for more details.
20
*
21
* You should have received a copy of the GNU Lesser General Public
22
* License along with Libav; if not, write to the Free Software
23
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
*/
25
26
#ifndef AVCODEC_VP8_H
27
#define AVCODEC_VP8_H
28
29
#include "
vp56.h
"
30
#include "
vp56data.h
"
31
#include "
vp8dsp.h
"
32
#include "
h264pred.h
"
33
#if HAVE_PTHREADS
34
#include <pthread.h>
35
#elif HAVE_W32THREADS
36
#include "
w32pthreads.h
"
37
#endif
38
39
#define VP8_MAX_QUANT 127
40
41
enum
dct_token
{
42
DCT_0
,
43
DCT_1
,
44
DCT_2
,
45
DCT_3
,
46
DCT_4
,
47
DCT_CAT1
,
48
DCT_CAT2
,
49
DCT_CAT3
,
50
DCT_CAT4
,
51
DCT_CAT5
,
52
DCT_CAT6
,
53
DCT_EOB
,
54
55
NUM_DCT_TOKENS
56
};
57
58
// used to signal 4x4 intra pred in luma MBs
59
#define MODE_I4x4 4
60
61
enum
inter_mvmode
{
62
VP8_MVMODE_ZERO
=
MODE_I4x4
+ 1,
63
VP8_MVMODE_MV
,
64
VP8_MVMODE_SPLIT
65
};
66
67
enum
inter_splitmvmode
{
68
VP8_SPLITMVMODE_16x8
= 0,
69
VP8_SPLITMVMODE_8x16
,
70
VP8_SPLITMVMODE_8x8
,
71
VP8_SPLITMVMODE_4x4
,
72
VP8_SPLITMVMODE_NONE
,
73
};
74
75
typedef
struct
VP8FilterStrength
{
76
uint8_t
filter_level
;
77
uint8_t
inner_limit
;
78
uint8_t
inner_filter
;
79
}
VP8FilterStrength
;
80
81
typedef
struct
VP8Macroblock
{
82
uint8_t
skip
;
83
// todo: make it possible to check for at least (i4x4 or split_mv)
84
// in one op. are others needed?
85
uint8_t
mode
;
86
uint8_t
ref_frame
;
87
uint8_t
partitioning
;
88
uint8_t
chroma_pred_mode
;
89
uint8_t
segment
;
90
uint8_t
intra4x4_pred_mode_mb
[16];
91
uint8_t
intra4x4_pred_mode_top
[4];
92
VP56mv
mv
;
93
VP56mv
bmv
[16];
94
}
VP8Macroblock
;
95
96
typedef
struct
VP8ThreadData
{
97
DECLARE_ALIGNED
(16,
DCTELEM
,
block
)[6][4][16];
98
DECLARE_ALIGNED
(16,
DCTELEM
,
block_dc
)[16];
106
DECLARE_ALIGNED
(16,
uint8_t
,
non_zero_count_cache
)[6][4];
113
DECLARE_ALIGNED
(8,
uint8_t
,
left_nnz
)[9];
114
int
thread_nr
;
115
#if HAVE_THREADS
116
pthread_mutex_t
lock;
117
pthread_cond_t
cond;
118
#endif
119
int
thread_mb_pos
;
// (mb_y << 16) | (mb_x & 0xFFFF)
120
int
wait_mb_pos
;
// What the current thread is waiting on.
121
uint8_t
*
edge_emu_buffer
;
122
VP8FilterStrength
*
filter_strength
;
123
}
VP8ThreadData
;
124
125
#define MAX_THREADS 8
126
typedef
struct
VP8Context
{
127
VP8ThreadData
*
thread_data
;
128
AVCodecContext
*
avctx
;
129
AVFrame
*
framep
[4];
130
AVFrame
*
next_framep
[4];
131
AVFrame
*
curframe
;
132
AVFrame
*
prev_frame
;
133
134
uint16_t
mb_width
;
/* number of horizontal MB */
135
uint16_t
mb_height
;
/* number of vertical MB */
136
int
linesize
;
137
int
uvlinesize
;
138
139
uint8_t
keyframe
;
140
uint8_t
deblock_filter
;
141
uint8_t
mbskip_enabled
;
142
uint8_t
profile
;
143
VP56mv
mv_min
;
144
VP56mv
mv_max
;
145
146
int8_t
sign_bias
[4];
147
int
ref_count
[3];
148
154
struct
{
155
uint8_t
enabled
;
156
uint8_t
absolute_vals
;
157
uint8_t
update_map
;
158
int8_t
base_quant
[4];
159
int8_t
filter_level
[4];
160
}
segmentation
;
161
162
struct
{
163
uint8_t
simple
;
164
uint8_t
level
;
165
uint8_t
sharpness
;
166
}
filter
;
167
168
VP8Macroblock
*
macroblocks
;
169
170
uint8_t
*
intra4x4_pred_mode_top
;
171
uint8_t
intra4x4_pred_mode_left
[4];
172
178
struct
{
179
// [0] - DC qmul [1] - AC qmul
180
int16_t
luma_qmul
[2];
181
int16_t
luma_dc_qmul
[2];
182
int16_t
chroma_qmul
[2];
183
}
qmat
[4];
184
185
struct
{
186
uint8_t
enabled
;
187
197
int8_t
mode
[
VP8_MVMODE_SPLIT
+1];
198
206
int8_t
ref
[4];
207
}
lf_delta
;
208
209
uint8_t
(*
top_border
)[16+8+8];
210
uint8_t
(*
top_nnz
)[9];
211
212
VP56RangeCoder
c
;
213
220
struct
{
221
uint8_t
segmentid
[3];
222
uint8_t
mbskip
;
223
uint8_t
intra
;
224
uint8_t
last
;
225
uint8_t
golden
;
226
uint8_t
pred16x16
[4];
227
uint8_t
pred8x8c
[3];
228
uint8_t
token
[4][16][3][
NUM_DCT_TOKENS
-1];
229
uint8_t
mvc
[2][19];
230
}
prob
[2];
231
232
VP8Macroblock
*
macroblocks_base
;
233
int
invisible
;
234
int
update_last
;
235
int
update_golden
;
236
int
update_altref
;
237
242
int
update_probabilities
;
243
248
int
num_coeff_partitions
;
249
VP56RangeCoder
coeff_partition
[8];
250
VideoDSPContext
vdsp
;
251
VP8DSPContext
vp8dsp
;
252
H264PredContext
hpc
;
253
vp8_mc_func
put_pixels_tab
[3][3][3];
254
AVFrame
frames
[5];
255
262
uint8_t
*
segmentation_maps
[5];
263
int
num_maps_to_be_freed
;
264
int
maps_are_invalid
;
265
int
num_jobs
;
271
int
mb_layout
;
272
}
VP8Context
;
273
274
#endif
/* AVCODEC_VP8_H */