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