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
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 FFmpeg.
10
*
11
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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 "
libavutil/buffer.h
"
30
31
#include "
vp56.h
"
32
#include "
vp8dsp.h
"
33
#include "
h264pred.h
"
34
#include "
thread.h
"
35
#if HAVE_PTHREADS
36
#include <pthread.h>
37
#elif HAVE_OS2THREADS
38
#include "
compat/os2threads.h
"
39
#elif HAVE_W32THREADS
40
#include "
compat/w32pthreads.h
"
41
#endif
42
43
#define VP8_MAX_QUANT 127
44
45
enum
dct_token
{
46
DCT_0
,
47
DCT_1
,
48
DCT_2
,
49
DCT_3
,
50
DCT_4
,
51
DCT_CAT1
,
52
DCT_CAT2
,
53
DCT_CAT3
,
54
DCT_CAT4
,
55
DCT_CAT5
,
56
DCT_CAT6
,
57
DCT_EOB
,
58
59
NUM_DCT_TOKENS
60
};
61
62
// used to signal 4x4 intra pred in luma MBs
63
#define MODE_I4x4 4
64
65
enum
inter_mvmode
{
66
VP8_MVMODE_ZERO
=
MODE_I4x4
+ 1,
67
VP8_MVMODE_MV
,
68
VP8_MVMODE_SPLIT
69
};
70
71
enum
inter_splitmvmode
{
72
VP8_SPLITMVMODE_16x8
= 0,
///< 2 16x8 blocks (vertical)
73
VP8_SPLITMVMODE_8x16
,
///< 2 8x16 blocks (horizontal)
74
VP8_SPLITMVMODE_8x8
,
///< 2x2 blocks of 8x8px each
75
VP8_SPLITMVMODE_4x4
,
///< 4x4 blocks of 4x4px each
76
VP8_SPLITMVMODE_NONE
,
///< (only used in prediction) no split MVs
77
};
78
79
typedef
struct
VP8FilterStrength
{
80
uint8_t
filter_level
;
81
uint8_t
inner_limit
;
82
uint8_t
inner_filter
;
83
}
VP8FilterStrength
;
84
85
typedef
struct
VP8Macroblock
{
86
uint8_t
skip
;
87
// todo: make it possible to check for at least (i4x4 or split_mv)
88
// in one op. are others needed?
89
uint8_t
mode
;
90
uint8_t
ref_frame
;
91
uint8_t
partitioning
;
92
uint8_t
chroma_pred_mode
;
93
uint8_t
segment
;
94
uint8_t
intra4x4_pred_mode_mb
[16];
95
uint8_t
intra4x4_pred_mode_top
[4];
96
VP56mv
mv
;
97
VP56mv
bmv
[16];
98
}
VP8Macroblock
;
99
100
typedef
struct
VP8ThreadData
{
101
DECLARE_ALIGNED
(16, int16_t,
block
)[6][4][16];
102
DECLARE_ALIGNED
(16, int16_t,
block_dc
)[16];
103
/**
104
* This is the index plus one of the last non-zero coeff
105
* for each of the blocks in the current macroblock.
106
* So, 0 -> no coeffs
107
* 1 -> dc-only (special transform)
108
* 2+-> full transform
109
*/
110
DECLARE_ALIGNED
(16,
uint8_t
,
non_zero_count_cache
)[6][4];
111
/**
112
* For coeff decode, we need to know whether the above block had non-zero
113
* coefficients. This means for each macroblock, we need data for 4 luma
114
* blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
115
* per macroblock. We keep the last row in top_nnz.
116
*/
117
DECLARE_ALIGNED
(8,
uint8_t
,
left_nnz
)[9];
118
int
thread_nr
;
119
#if HAVE_THREADS
120
pthread_mutex_t
lock;
121
pthread_cond_t
cond;
122
#endif
123
int
thread_mb_pos
;
// (mb_y << 16) | (mb_x & 0xFFFF)
124
int
wait_mb_pos
;
// What the current thread is waiting on.
125
DECLARE_ALIGNED
(16,
uint8_t
,
edge_emu_buffer
)[21*32];
126
VP8FilterStrength
*
filter_strength
;
127
}
VP8ThreadData
;
128
129
typedef
struct
VP8Frame
{
130
ThreadFrame
tf
;
131
AVBufferRef
*
seg_map
;
132
}
VP8Frame
;
133
134
#define MAX_THREADS 8
135
typedef
struct
VP8Context
{
136
VP8ThreadData
*
thread_data
;
137
AVCodecContext
*
avctx
;
138
VP8Frame
*
framep
[4];
139
VP8Frame
*
next_framep
[4];
140
VP8Frame
*
curframe
;
141
VP8Frame
*
prev_frame
;
142
143
uint16_t
mb_width
;
/* number of horizontal MB */
144
uint16_t
mb_height
;
/* number of vertical MB */
145
int
linesize
;
146
int
uvlinesize
;
147
148
uint8_t
keyframe
;
149
uint8_t
deblock_filter
;
150
uint8_t
mbskip_enabled
;
151
uint8_t
profile
;
152
VP56mv
mv_min
;
153
VP56mv
mv_max
;
154
155
int8_t
sign_bias
[4];
///< one state [0, 1] per ref frame type
156
int
ref_count
[3];
157
158
/**
159
* Base parameters for segmentation, i.e. per-macroblock parameters.
160
* These must be kept unchanged even if segmentation is not used for
161
* a frame, since the values persist between interframes.
162
*/
163
struct
{
164
uint8_t
enabled
;
165
uint8_t
absolute_vals
;
166
uint8_t
update_map
;
167
int8_t
base_quant
[4];
168
int8_t
filter_level
[4];
///< base loop filter level
169
}
segmentation
;
170
171
struct
{
172
uint8_t
simple
;
173
uint8_t
level
;
174
uint8_t
sharpness
;
175
}
filter
;
176
177
VP8Macroblock
*
macroblocks
;
178
179
uint8_t
*
intra4x4_pred_mode_top
;
180
uint8_t
intra4x4_pred_mode_left
[4];
181
182
/**
183
* Macroblocks can have one of 4 different quants in a frame when
184
* segmentation is enabled.
185
* If segmentation is disabled, only the first segment's values are used.
186
*/
187
struct
{
188
// [0] - DC qmul [1] - AC qmul
189
int16_t
luma_qmul
[2];
190
int16_t
luma_dc_qmul
[2];
///< luma dc-only block quant
191
int16_t
chroma_qmul
[2];
192
}
qmat
[4];
193
194
struct
{
195
uint8_t
enabled
;
///< whether each mb can have a different strength based on mode/ref
196
197
/**
198
* filter strength adjustment for the following macroblock modes:
199
* [0-3] - i16x16 (always zero)
200
* [4] - i4x4
201
* [5] - zero mv
202
* [6] - inter modes except for zero or split mv
203
* [7] - split mv
204
* i16x16 modes never have any adjustment
205
*/
206
int8_t
mode
[
VP8_MVMODE_SPLIT
+1];
207
208
/**
209
* filter strength adjustment for macroblocks that reference:
210
* [0] - intra / VP56_FRAME_CURRENT
211
* [1] - VP56_FRAME_PREVIOUS
212
* [2] - VP56_FRAME_GOLDEN
213
* [3] - altref / VP56_FRAME_GOLDEN2
214
*/
215
int8_t
ref
[4];
216
}
lf_delta
;
217
218
uint8_t
(*
top_border
)[16+8+8];
219
uint8_t
(*
top_nnz
)[9];
220
221
VP56RangeCoder
c
;
///< header context, includes mb modes and motion vectors
222
223
/**
224
* These are all of the updatable probabilities for binary decisions.
225
* They are only implictly reset on keyframes, making it quite likely
226
* for an interframe to desync if a prior frame's header was corrupt
227
* or missing outright!
228
*/
229
struct
{
230
uint8_t
segmentid
[3];
231
uint8_t
mbskip
;
232
uint8_t
intra
;
233
uint8_t
last
;
234
uint8_t
golden
;
235
uint8_t
pred16x16
[4];
236
uint8_t
pred8x8c
[3];
237
uint8_t
token
[4][16][3][
NUM_DCT_TOKENS
-1];
238
uint8_t
mvc
[2][19];
239
}
prob
[2];
240
241
VP8Macroblock
*
macroblocks_base
;
242
int
invisible
;
243
int
update_last
;
///< update VP56_FRAME_PREVIOUS with the current one
244
int
update_golden
;
///< VP56_FRAME_NONE if not updated, or which frame to copy if so
245
int
update_altref
;
246
247
/**
248
* If this flag is not set, all the probability updates
249
* are discarded after this frame is decoded.
250
*/
251
int
update_probabilities
;
252
253
/**
254
* All coefficients are contained in separate arith coding contexts.
255
* There can be 1, 2, 4, or 8 of these after the header context.
256
*/
257
int
num_coeff_partitions
;
258
VP56RangeCoder
coeff_partition
[8];
259
VideoDSPContext
vdsp
;
260
VP8DSPContext
vp8dsp
;
261
H264PredContext
hpc
;
262
vp8_mc_func
put_pixels_tab
[3][3][3];
263
VP8Frame
frames
[5];
264
265
int
num_jobs
;
266
/**
267
* This describes the macroblock memory layout.
268
* 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread).
269
* 1 -> Macroblocks for entire frame alloced (sliced thread).
270
*/
271
int
mb_layout
;
272
}
VP8Context
;
273
274
int
ff_vp8_decode_init
(
AVCodecContext
*avctx);
275
276
int
ff_vp8_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
277
AVPacket
*avpkt);
278
279
int
ff_vp8_decode_free
(
AVCodecContext
*avctx);
280
281
#endif
/* AVCODEC_VP8_H */
Generated on Sat Jan 25 2014 19:51:44 for FFmpeg by
1.8.2