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