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