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