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
vp56.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
/**
22
* @file
23
* VP5 and VP6 compatible video decoder (common features)
24
*/
25
26
#ifndef AVCODEC_VP56_H
27
#define AVCODEC_VP56_H
28
29
#include "
vp56data.h
"
30
#include "
dsputil.h
"
31
#include "
get_bits.h
"
32
#include "
bytestream.h
"
33
#include "
h264chroma.h
"
34
#include "
videodsp.h
"
35
#include "
vp3dsp.h
"
36
#include "
vp56dsp.h
"
37
38
typedef
struct
vp56_context
VP56Context;
39
40
typedef
struct
VP56mv
{
41
DECLARE_ALIGNED
(4, int16_t,
x
);
42
int16_t
y
;
43
}
VP56mv
;
44
45
#define VP56_SIZE_CHANGE 1
46
47
typedef
void
(*
VP56ParseVectorAdjustment
)(VP56Context *s,
48
VP56mv
*vect);
49
typedef
void
(*
VP56Filter
)(VP56Context *s,
uint8_t
*
dst
,
uint8_t
*src,
50
int
offset1,
int
offset2,
int
stride
,
51
VP56mv
mv
,
int
mask
,
int
select,
int
luma);
52
typedef
void
(*
VP56ParseCoeff
)(VP56Context *s);
53
typedef
void
(*
VP56DefaultModelsInit
)(VP56Context *s);
54
typedef
void
(*
VP56ParseVectorModels
)(VP56Context *s);
55
typedef
int (*
VP56ParseCoeffModels
)(VP56Context *s);
56
typedef
int (*
VP56ParseHeader
)(VP56Context *s,
const
uint8_t
*buf,
57
int
buf_size);
58
59
typedef
struct
VP56RangeCoder
{
60
int
high
;
61
int
bits
;
/* stored negated (i.e. negative "bits" is a positive number of
62
bits left) in order to eliminate a negate in cache refilling */
63
const
uint8_t
*
buffer
;
64
const
uint8_t
*
end
;
65
unsigned
int
code_word
;
66
}
VP56RangeCoder
;
67
68
typedef
struct
VP56RefDc
{
69
uint8_t
not_null_dc
;
70
VP56Frame
ref_frame
;
71
int16_t
dc_coeff
;
72
}
VP56RefDc
;
73
74
typedef
struct
VP56Macroblock
{
75
uint8_t
type
;
76
VP56mv
mv
;
77
}
VP56Macroblock
;
78
79
typedef
struct
VP56Model
{
80
uint8_t
coeff_reorder
[64];
/* used in vp6 only */
81
uint8_t
coeff_index_to_pos
[64];
/* used in vp6 only */
82
uint8_t
vector_sig
[2];
/* delta sign */
83
uint8_t
vector_dct
[2];
/* delta coding types */
84
uint8_t
vector_pdi
[2][2];
/* predefined delta init */
85
uint8_t
vector_pdv
[2][7];
/* predefined delta values */
86
uint8_t
vector_fdv
[2][8];
/* 8 bit delta value definition */
87
uint8_t
coeff_dccv
[2][11];
/* DC coeff value */
88
uint8_t
coeff_ract
[2][3][6][11];
/* Run/AC coding type and AC coeff value */
89
uint8_t
coeff_acct
[2][3][3][6][5];
/* vp5 only AC coding type for coding group < 3 */
90
uint8_t
coeff_dcct
[2][36][5];
/* DC coeff coding type */
91
uint8_t
coeff_runv
[2][14];
/* run value (vp6 only) */
92
uint8_t
mb_type
[3][10][10];
/* model for decoding MB type */
93
uint8_t
mb_types_stats
[3][10][2];
/* contextual, next MB type stats */
94
}
VP56Model
;
95
96
struct
vp56_context
{
97
AVCodecContext
*
avctx
;
98
DSPContext
dsp
;
99
H264ChromaContext
h264chroma
;
100
VideoDSPContext
vdsp
;
101
VP3DSPContext
vp3dsp
;
102
VP56DSPContext
vp56dsp
;
103
ScanTable
scantable
;
104
AVFrame
frames
[4];
105
AVFrame
*
framep
[6];
106
uint8_t
*
edge_emu_buffer_alloc
;
107
uint8_t
*
edge_emu_buffer
;
108
VP56RangeCoder
c
;
109
VP56RangeCoder
cc
;
110
VP56RangeCoder
*
ccp
;
111
int
sub_version
;
112
113
/* frame info */
114
int
golden_frame
;
115
int
plane_width
[4];
116
int
plane_height
[4];
117
int
mb_width
;
/* number of horizontal MB */
118
int
mb_height
;
/* number of vertical MB */
119
int
block_offset
[6];
120
121
int
quantizer
;
122
uint16_t
dequant_dc
;
123
uint16_t
dequant_ac
;
124
int8_t *
qscale_table
;
125
126
/* DC predictors management */
127
VP56RefDc
*
above_blocks
;
128
VP56RefDc
left_block
[4];
129
int
above_block_idx
[6];
130
int16_t
prev_dc
[3][3];
/* [plan][ref_frame] */
131
132
/* blocks / macroblock */
133
VP56mb
mb_type
;
134
VP56Macroblock
*
macroblocks
;
135
DECLARE_ALIGNED
(16, int16_t,
block_coeff
)[6][64];
136
137
/* motion vectors */
138
VP56mv
mv
[6];
/* vectors for each block in MB */
139
VP56mv
vector_candidate
[2];
140
int
vector_candidate_pos
;
141
142
/* filtering hints */
143
int
filter_header
;
/* used in vp6 only */
144
int
deblock_filtering
;
145
int
filter_selection
;
146
int
filter_mode
;
147
int
max_vector_length
;
148
int
sample_variance_threshold
;
149
150
uint8_t
coeff_ctx
[4][64];
/* used in vp5 only */
151
uint8_t
coeff_ctx_last
[4];
/* used in vp5 only */
152
153
int
has_alpha
;
154
155
/* upside-down flipping hints */
156
int
flip
;
/* are we flipping ? */
157
int
frbi
;
/* first row block index in MB */
158
int
srbi
;
/* second row block index in MB */
159
int
stride
[4];
/* stride for each plan */
160
161
const
uint8_t
*
vp56_coord_div
;
162
VP56ParseVectorAdjustment
parse_vector_adjustment
;
163
VP56Filter
filter
;
164
VP56ParseCoeff
parse_coeff
;
165
VP56DefaultModelsInit
default_models_init
;
166
VP56ParseVectorModels
parse_vector_models
;
167
VP56ParseCoeffModels
parse_coeff_models
;
168
VP56ParseHeader
parse_header
;
169
170
/* for "slice" parallelism between YUV and A */
171
VP56Context *
alpha_context
;
172
173
VP56Model
*
modelp
;
174
VP56Model
model
;
175
176
/* huffman decoding */
177
int
use_huffman
;
178
GetBitContext
gb
;
179
VLC
dccv_vlc
[2];
180
VLC
runv_vlc
[2];
181
VLC
ract_vlc
[2][3][6];
182
unsigned
int
nb_null
[2][2];
/* number of consecutive NULL DC/AC */
183
};
184
185
186
void
ff_vp56_init
(
AVCodecContext
*avctx,
int
flip
,
int
has_alpha);
187
void
ff_vp56_init_context
(
AVCodecContext
*avctx, VP56Context *s,
188
int
flip
,
int
has_alpha);
189
int
ff_vp56_free
(
AVCodecContext
*avctx);
190
int
ff_vp56_free_context
(VP56Context *s);
191
void
ff_vp56_init_dequant
(VP56Context *s,
int
quantizer);
192
int
ff_vp56_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
193
AVPacket
*avpkt);
194
195
196
/**
197
* vp56 specific range coder implementation
198
*/
199
200
extern
const
uint8_t
ff_vp56_norm_shift
[256];
201
void
ff_vp56_init_range_decoder
(
VP56RangeCoder
*
c
,
const
uint8_t
*buf,
int
buf_size);
202
203
static
av_always_inline
unsigned
int
vp56_rac_renorm
(
VP56RangeCoder
*
c
)
204
{
205
int
shift
=
ff_vp56_norm_shift
[c->
high
];
206
int
bits
= c->
bits
;
207
unsigned
int
code_word = c->
code_word
;
208
209
c->
high
<<=
shift
;
210
code_word <<=
shift
;
211
bits +=
shift
;
212
if
(bits >= 0 && c->
buffer
< c->
end
) {
213
code_word |= bytestream_get_be16(&c->
buffer
) <<
bits
;
214
bits -= 16;
215
}
216
c->
bits
=
bits
;
217
return
code_word;
218
}
219
220
#if ARCH_ARM
221
#include "
arm/vp56_arith.h
"
222
#elif ARCH_X86
223
#include "
x86/vp56_arith.h
"
224
#endif
225
226
#ifndef vp56_rac_get_prob
227
#define vp56_rac_get_prob vp56_rac_get_prob
228
static
av_always_inline
int
vp56_rac_get_prob
(
VP56RangeCoder
*
c
,
uint8_t
prob)
229
{
230
unsigned
int
code_word =
vp56_rac_renorm
(c);
231
unsigned
int
low = 1 + (((c->
high
- 1) * prob) >> 8);
232
unsigned
int
low_shift = low << 16;
233
int
bit = code_word >= low_shift;
234
235
c->
high
= bit ? c->
high
- low : low;
236
c->
code_word
= bit ? code_word - low_shift : code_word;
237
238
return
bit;
239
}
240
#endif
241
242
#ifndef vp56_rac_get_prob_branchy
243
// branchy variant, to be used where there's a branch based on the bit decoded
244
static
av_always_inline
int
vp56_rac_get_prob_branchy
(
VP56RangeCoder
*
c
,
int
prob)
245
{
246
unsigned
long
code_word =
vp56_rac_renorm
(c);
247
unsigned
low = 1 + (((c->
high
- 1) * prob) >> 8);
248
unsigned
low_shift = low << 16;
249
250
if
(code_word >= low_shift) {
251
c->
high
-= low;
252
c->
code_word
= code_word - low_shift;
253
return
1;
254
}
255
256
c->
high
= low;
257
c->
code_word
= code_word;
258
return
0;
259
}
260
#endif
261
262
static
av_always_inline
int
vp56_rac_get
(
VP56RangeCoder
*
c
)
263
{
264
unsigned
int
code_word =
vp56_rac_renorm
(c);
265
/* equiprobable */
266
int
low = (c->
high
+ 1) >> 1;
267
unsigned
int
low_shift = low << 16;
268
int
bit = code_word >= low_shift;
269
if
(bit) {
270
c->
high
-= low;
271
code_word -= low_shift;
272
}
else
{
273
c->
high
= low;
274
}
275
276
c->
code_word
= code_word;
277
return
bit;
278
}
279
280
// rounding is different than vp56_rac_get, is vp56_rac_get wrong?
281
static
av_always_inline
int
vp8_rac_get
(
VP56RangeCoder
*
c
)
282
{
283
return
vp56_rac_get_prob
(c, 128);
284
}
285
286
static
av_unused
int
vp56_rac_gets
(
VP56RangeCoder
*
c
,
int
bits
)
287
{
288
int
value
= 0;
289
290
while
(bits--) {
291
value = (value << 1) |
vp56_rac_get
(c);
292
}
293
294
return
value
;
295
}
296
297
static
av_unused
int
vp8_rac_get_uint
(
VP56RangeCoder
*
c
,
int
bits
)
298
{
299
int
value
= 0;
300
301
while
(bits--) {
302
value = (value << 1) |
vp8_rac_get
(c);
303
}
304
305
return
value
;
306
}
307
308
// fixme: add 1 bit to all the calls to this?
309
static
av_unused
int
vp8_rac_get_sint
(
VP56RangeCoder
*
c
,
int
bits
)
310
{
311
int
v
;
312
313
if
(!
vp8_rac_get
(c))
314
return
0;
315
316
v =
vp8_rac_get_uint
(c, bits);
317
318
if
(
vp8_rac_get
(c))
319
v = -
v
;
320
321
return
v
;
322
}
323
324
// P(7)
325
static
av_unused
int
vp56_rac_gets_nn
(
VP56RangeCoder
*
c
,
int
bits
)
326
{
327
int
v
=
vp56_rac_gets
(c, 7) << 1;
328
return
v + !
v
;
329
}
330
331
static
av_unused
int
vp8_rac_get_nn
(
VP56RangeCoder
*
c
)
332
{
333
int
v
=
vp8_rac_get_uint
(c, 7) << 1;
334
return
v + !
v
;
335
}
336
337
static
av_always_inline
338
int
vp56_rac_get_tree
(
VP56RangeCoder
*
c
,
339
const
VP56Tree
*tree,
340
const
uint8_t
*probs)
341
{
342
while
(tree->
val
> 0) {
343
if
(
vp56_rac_get_prob
(c, probs[tree->
prob_idx
]))
344
tree += tree->
val
;
345
else
346
tree++;
347
}
348
return
-tree->
val
;
349
}
350
351
// how probabilities are associated with decisions is different I think
352
// well, the new scheme fits in the old but this way has one fewer branches per decision
353
static
av_always_inline
int
vp8_rac_get_tree
(
VP56RangeCoder
*
c
,
const
int8_t (*tree)[2],
354
const
uint8_t
*probs)
355
{
356
int
i = 0;
357
358
do
{
359
i = tree[i][
vp56_rac_get_prob
(c, probs[i])];
360
}
while
(i > 0);
361
362
return
-i;
363
}
364
365
// DCTextra
366
static
av_always_inline
int
vp8_rac_get_coeff
(
VP56RangeCoder
*c,
const
uint8_t
*prob)
367
{
368
int
v
= 0;
369
370
do
{
371
v = (v<<1) +
vp56_rac_get_prob
(c, *prob++);
372
}
while
(*prob);
373
374
return
v
;
375
}
376
377
#endif
/* AVCODEC_VP56_H */
Generated on Sat May 25 2013 04:01:12 for FFmpeg by
1.8.2