Libav
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 "
dsputil.h
"
30
#include "
get_bits.h
"
31
#include "
hpeldsp.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
enum
{
41
VP56_FRAME_NONE
=-1,
42
VP56_FRAME_CURRENT
= 0,
43
VP56_FRAME_PREVIOUS
= 1,
44
VP56_FRAME_GOLDEN
= 2,
45
VP56_FRAME_GOLDEN2
= 3,
46
}
VP56Frame
;
47
48
typedef
enum
{
49
VP56_MB_INTER_NOVEC_PF
= 0,
50
VP56_MB_INTRA
= 1,
51
VP56_MB_INTER_DELTA_PF
= 2,
52
VP56_MB_INTER_V1_PF
= 3,
53
VP56_MB_INTER_V2_PF
= 4,
54
VP56_MB_INTER_NOVEC_GF
= 5,
55
VP56_MB_INTER_DELTA_GF
= 6,
56
VP56_MB_INTER_4V
= 7,
57
VP56_MB_INTER_V1_GF
= 8,
58
VP56_MB_INTER_V2_GF
= 9,
59
}
VP56mb
;
60
61
typedef
struct
VP56Tree
{
62
int8_t
val
;
63
int8_t
prob_idx
;
64
}
VP56Tree
;
65
66
typedef
struct
VP56mv
{
67
DECLARE_ALIGNED
(4, int16_t,
x
);
68
int16_t
y
;
69
}
VP56mv
;
70
71
#define VP56_SIZE_CHANGE 1
72
73
typedef
void
(*
VP56ParseVectorAdjustment
)(VP56Context *s,
74
VP56mv
*vect);
75
typedef
void
(*
VP56Filter
)(VP56Context *s,
uint8_t
*dst,
uint8_t
*src,
76
int
offset1,
int
offset2,
int
stride
,
77
VP56mv
mv
,
int
mask
,
int
select,
int
luma);
78
typedef
void
(*
VP56ParseCoeff
)(VP56Context *s);
79
typedef
void
(*
VP56DefaultModelsInit
)(VP56Context *s);
80
typedef
void
(*
VP56ParseVectorModels
)(VP56Context *s);
81
typedef
int (*
VP56ParseCoeffModels
)(VP56Context *s);
82
typedef
int (*
VP56ParseHeader
)(VP56Context *s,
const
uint8_t
*buf,
83
int
buf_size,
int
*golden_frame);
84
85
typedef
struct
VP56RangeCoder
{
86
int
high
;
87
int
bits
;
/* stored negated (i.e. negative "bits" is a positive number of
88
bits left) in order to eliminate a negate in cache refilling */
89
const
uint8_t
*
buffer
;
90
const
uint8_t
*
end
;
91
unsigned
int
code_word
;
92
}
VP56RangeCoder
;
93
94
typedef
struct
VP56RefDc
{
95
uint8_t
not_null_dc
;
96
VP56Frame
ref_frame
;
97
int16_t
dc_coeff
;
98
}
VP56RefDc
;
99
100
typedef
struct
VP56Macroblock
{
101
uint8_t
type
;
102
VP56mv
mv
;
103
}
VP56Macroblock
;
104
105
typedef
struct
VP56Model
{
106
uint8_t
coeff_reorder
[64];
/* used in vp6 only */
107
uint8_t
coeff_index_to_pos
[64];
/* used in vp6 only */
108
uint8_t
vector_sig
[2];
/* delta sign */
109
uint8_t
vector_dct
[2];
/* delta coding types */
110
uint8_t
vector_pdi
[2][2];
/* predefined delta init */
111
uint8_t
vector_pdv
[2][7];
/* predefined delta values */
112
uint8_t
vector_fdv
[2][8];
/* 8 bit delta value definition */
113
uint8_t
coeff_dccv
[2][11];
/* DC coeff value */
114
uint8_t
coeff_ract
[2][3][6][11];
/* Run/AC coding type and AC coeff value */
115
uint8_t
coeff_acct
[2][3][3][6][5];
/* vp5 only AC coding type for coding group < 3 */
116
uint8_t
coeff_dcct
[2][36][5];
/* DC coeff coding type */
117
uint8_t
coeff_runv
[2][14];
/* run value (vp6 only) */
118
uint8_t
mb_type
[3][10][10];
/* model for decoding MB type */
119
uint8_t
mb_types_stats
[3][10][2];
/* contextual, next MB type stats */
120
}
VP56Model
;
121
122
struct
vp56_context
{
123
AVCodecContext
*
avctx
;
124
H264ChromaContext
h264chroma
;
125
HpelDSPContext
hdsp
;
126
VideoDSPContext
vdsp
;
127
VP3DSPContext
vp3dsp
;
128
VP56DSPContext
vp56dsp
;
129
uint8_t
idct_scantable
[64];
130
AVFrame
*
frames
[4];
131
uint8_t
*
edge_emu_buffer_alloc
;
132
uint8_t
*
edge_emu_buffer
;
133
VP56RangeCoder
c
;
134
VP56RangeCoder
cc
;
135
VP56RangeCoder
*
ccp
;
136
int
sub_version
;
137
138
/* frame info */
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
VP56Model
*
modelp
;
194
VP56Model
models
[2];
195
196
/* huffman decoding */
197
int
use_huffman
;
198
GetBitContext
gb
;
199
VLC
dccv_vlc
[2];
200
VLC
runv_vlc
[2];
201
VLC
ract_vlc
[2][3][6];
202
unsigned
int
nb_null
[2][2];
/* number of consecutive NULL DC/AC */
203
};
204
205
206
int
ff_vp56_init
(
AVCodecContext
*avctx,
int
flip
,
int
has_alpha);
207
int
ff_vp56_free
(
AVCodecContext
*avctx);
208
void
ff_vp56_init_dequant
(VP56Context *s,
int
quantizer);
209
int
ff_vp56_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
int
*got_frame,
210
AVPacket
*avpkt);
211
212
217
extern
const
uint8_t
ff_vp56_norm_shift
[256];
218
void
ff_vp56_init_range_decoder
(
VP56RangeCoder
*c,
const
uint8_t
*buf,
int
buf_size);
219
220
static
av_always_inline
unsigned
int
vp56_rac_renorm
(
VP56RangeCoder
*c)
221
{
222
int
shift =
ff_vp56_norm_shift
[c->
high
];
223
int
bits
= c->
bits
;
224
unsigned
int
code_word = c->
code_word
;
225
226
c->
high
<<= shift;
227
code_word <<= shift;
228
bits += shift;
229
if
(bits >= 0 && c->
buffer
< c->
end
) {
230
code_word |= bytestream_get_be16(&c->
buffer
) <<
bits
;
231
bits -= 16;
232
}
233
c->
bits
=
bits
;
234
return
code_word;
235
}
236
237
#if ARCH_ARM
238
#include "
arm/vp56_arith.h
"
239
#elif ARCH_X86
240
#include "
x86/vp56_arith.h
"
241
#endif
242
243
#ifndef vp56_rac_get_prob
244
#define vp56_rac_get_prob vp56_rac_get_prob
245
static
av_always_inline
int
vp56_rac_get_prob
(
VP56RangeCoder
*c,
uint8_t
prob)
246
{
247
unsigned
int
code_word =
vp56_rac_renorm
(c);
248
unsigned
int
low = 1 + (((c->
high
- 1) * prob) >> 8);
249
unsigned
int
low_shift = low << 16;
250
int
bit = code_word >= low_shift;
251
252
c->
high
= bit ? c->
high
- low : low;
253
c->
code_word
= bit ? code_word - low_shift : code_word;
254
255
return
bit;
256
}
257
#endif
258
259
#ifndef vp56_rac_get_prob_branchy
260
// branchy variant, to be used where there's a branch based on the bit decoded
261
static
av_always_inline
int
vp56_rac_get_prob_branchy
(
VP56RangeCoder
*c,
int
prob)
262
{
263
unsigned
long
code_word =
vp56_rac_renorm
(c);
264
unsigned
low = 1 + (((c->
high
- 1) * prob) >> 8);
265
unsigned
low_shift = low << 16;
266
267
if
(code_word >= low_shift) {
268
c->
high
-= low;
269
c->
code_word
= code_word - low_shift;
270
return
1;
271
}
272
273
c->
high
= low;
274
c->
code_word
= code_word;
275
return
0;
276
}
277
#endif
278
279
static
av_always_inline
int
vp56_rac_get
(
VP56RangeCoder
*c)
280
{
281
unsigned
int
code_word =
vp56_rac_renorm
(c);
282
/* equiprobable */
283
int
low = (c->
high
+ 1) >> 1;
284
unsigned
int
low_shift = low << 16;
285
int
bit = code_word >= low_shift;
286
if
(bit) {
287
c->
high
-= low;
288
code_word -= low_shift;
289
}
else
{
290
c->
high
= low;
291
}
292
293
c->
code_word
= code_word;
294
return
bit;
295
}
296
297
// rounding is different than vp56_rac_get, is vp56_rac_get wrong?
298
static
av_always_inline
int
vp8_rac_get
(
VP56RangeCoder
*c)
299
{
300
return
vp56_rac_get_prob
(c, 128);
301
}
302
303
static
av_unused
int
vp56_rac_gets
(
VP56RangeCoder
*c,
int
bits
)
304
{
305
int
value = 0;
306
307
while
(bits--) {
308
value = (value << 1) |
vp56_rac_get
(c);
309
}
310
311
return
value;
312
}
313
314
static
av_unused
int
vp8_rac_get_uint
(
VP56RangeCoder
*c,
int
bits
)
315
{
316
int
value = 0;
317
318
while
(bits--) {
319
value = (value << 1) |
vp8_rac_get
(c);
320
}
321
322
return
value;
323
}
324
325
// fixme: add 1 bit to all the calls to this?
326
static
av_unused
int
vp8_rac_get_sint
(
VP56RangeCoder
*c,
int
bits
)
327
{
328
int
v;
329
330
if
(!
vp8_rac_get
(c))
331
return
0;
332
333
v =
vp8_rac_get_uint
(c, bits);
334
335
if
(
vp8_rac_get
(c))
336
v = -v;
337
338
return
v;
339
}
340
341
// P(7)
342
static
av_unused
int
vp56_rac_gets_nn
(
VP56RangeCoder
*c,
int
bits
)
343
{
344
int
v =
vp56_rac_gets
(c, 7) << 1;
345
return
v + !v;
346
}
347
348
static
av_unused
int
vp8_rac_get_nn
(
VP56RangeCoder
*c)
349
{
350
int
v =
vp8_rac_get_uint
(c, 7) << 1;
351
return
v + !v;
352
}
353
354
static
av_always_inline
355
int
vp56_rac_get_tree
(
VP56RangeCoder
*c,
356
const
VP56Tree
*tree,
357
const
uint8_t
*probs)
358
{
359
while
(tree->
val
> 0) {
360
if
(
vp56_rac_get_prob
(c, probs[tree->
prob_idx
]))
361
tree += tree->
val
;
362
else
363
tree++;
364
}
365
return
-tree->
val
;
366
}
367
373
static
av_always_inline
374
int
vp8_rac_get_tree_with_offset
(
VP56RangeCoder
*c,
const
int8_t (*tree)[2],
375
const
uint8_t
*probs,
int
i)
376
{
377
do
{
378
i = tree[i][
vp56_rac_get_prob
(c, probs[i])];
379
}
while
(i > 0);
380
381
return
-i;
382
}
383
384
// how probabilities are associated with decisions is different I think
385
// well, the new scheme fits in the old but this way has one fewer branches per decision
386
static
av_always_inline
387
int
vp8_rac_get_tree
(
VP56RangeCoder
*c,
const
int8_t (*tree)[2],
388
const
uint8_t
*probs)
389
{
390
return
vp8_rac_get_tree_with_offset
(c, tree, probs, 0);
391
}
392
393
// DCTextra
394
static
av_always_inline
int
vp8_rac_get_coeff
(
VP56RangeCoder
*c,
const
uint8_t
*prob)
395
{
396
int
v = 0;
397
398
do
{
399
v = (v<<1) +
vp56_rac_get_prob
(c, *prob++);
400
}
while
(*prob);
401
402
return
v;
403
}
404
405
#endif
/* AVCODEC_VP56_H */
Generated on Thu Sep 30 2021 23:03:17 for Libav by
1.8.1.2