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
vc1.h
Go to the documentation of this file.
1
/*
2
* VC-1 and WMV3 decoder
3
* Copyright (c) 2006-2007 Konstantin Shishkov
4
* Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#ifndef AVCODEC_VC1_H
24
#define AVCODEC_VC1_H
25
26
#include "
avcodec.h
"
27
#include "
mpegvideo.h
"
28
#include "
intrax8.h
"
29
#include "
vc1dsp.h
"
30
31
#define AC_VLC_BITS 9
32
33
/** Markers used in VC-1 AP frame data */
34
//@{
35
enum
VC1Code
{
36
VC1_CODE_RES0
= 0x00000100,
37
VC1_CODE_ENDOFSEQ
= 0x0000010A,
38
VC1_CODE_SLICE
,
39
VC1_CODE_FIELD
,
40
VC1_CODE_FRAME
,
41
VC1_CODE_ENTRYPOINT
,
42
VC1_CODE_SEQHDR
,
43
};
44
//@}
45
46
#define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0)
47
48
/** Available Profiles */
49
//@{
50
enum
Profile
{
51
PROFILE_SIMPLE
,
52
PROFILE_MAIN
,
53
PROFILE_COMPLEX
,
///< TODO: WMV9 specific
54
PROFILE_ADVANCED
55
};
56
//@}
57
58
/** Sequence quantizer mode */
59
//@{
60
enum
QuantMode
{
61
QUANT_FRAME_IMPLICIT
,
///< Implicitly specified at frame level
62
QUANT_FRAME_EXPLICIT
,
///< Explicitly specified at frame level
63
QUANT_NON_UNIFORM
,
///< Non-uniform quant used for all frames
64
QUANT_UNIFORM
///< Uniform quant used for all frames
65
};
66
//@}
67
68
/** Where quant can be changed */
69
//@{
70
enum
DQProfile
{
71
DQPROFILE_FOUR_EDGES
,
72
DQPROFILE_DOUBLE_EDGES
,
73
DQPROFILE_SINGLE_EDGE
,
74
DQPROFILE_ALL_MBS
75
};
76
//@}
77
78
/** @name Where quant can be changed
79
*/
80
//@{
81
enum
DQSingleEdge
{
82
DQSINGLE_BEDGE_LEFT
,
83
DQSINGLE_BEDGE_TOP
,
84
DQSINGLE_BEDGE_RIGHT
,
85
DQSINGLE_BEDGE_BOTTOM
86
};
87
//@}
88
89
/** Which pair of edges is quantized with ALTPQUANT */
90
//@{
91
enum
DQDoubleEdge
{
92
DQDOUBLE_BEDGE_TOPLEFT
,
93
DQDOUBLE_BEDGE_TOPRIGHT
,
94
DQDOUBLE_BEDGE_BOTTOMRIGHT
,
95
DQDOUBLE_BEDGE_BOTTOMLEFT
96
};
97
//@}
98
99
/** MV modes for P frames */
100
//@{
101
enum
MVModes
{
102
MV_PMODE_1MV_HPEL_BILIN
,
103
MV_PMODE_1MV
,
104
MV_PMODE_1MV_HPEL
,
105
MV_PMODE_MIXED_MV
,
106
MV_PMODE_INTENSITY_COMP
107
};
108
//@}
109
110
/** MBMODE for interlaced frame P-picture */
111
//@{
112
enum
MBModesIntfr
{
113
MV_PMODE_INTFR_1MV
,
114
MV_PMODE_INTFR_2MV_FIELD
,
115
MV_PMODE_INTFR_2MV
,
116
MV_PMODE_INTFR_4MV_FIELD
,
117
MV_PMODE_INTFR_4MV
,
118
MV_PMODE_INTFR_INTRA
,
119
};
120
//@}
121
122
/** @name MV types for B frames */
123
//@{
124
enum
BMVTypes
{
125
BMV_TYPE_BACKWARD
,
126
BMV_TYPE_FORWARD
,
127
BMV_TYPE_INTERPOLATED
,
128
BMV_TYPE_DIRECT
129
};
130
//@}
131
132
/** @name Block types for P/B frames */
133
//@{
134
enum
TransformTypes
{
135
TT_8X8
,
136
TT_8X4_BOTTOM
,
137
TT_8X4_TOP
,
138
TT_8X4
,
// both halves
139
TT_4X8_RIGHT
,
140
TT_4X8_LEFT
,
141
TT_4X8
,
// both halves
142
TT_4X4
143
};
144
//@}
145
146
enum
CodingSet
{
147
CS_HIGH_MOT_INTRA
= 0,
148
CS_HIGH_MOT_INTER
,
149
CS_LOW_MOT_INTRA
,
150
CS_LOW_MOT_INTER
,
151
CS_MID_RATE_INTRA
,
152
CS_MID_RATE_INTER
,
153
CS_HIGH_RATE_INTRA
,
154
CS_HIGH_RATE_INTER
155
};
156
157
/** @name Overlap conditions for Advanced Profile */
158
//@{
159
enum
COTypes
{
160
CONDOVER_NONE
= 0,
161
CONDOVER_ALL
,
162
CONDOVER_SELECT
163
};
164
//@}
165
166
/**
167
* FCM Frame Coding Mode
168
* @note some content might be marked interlaced
169
* but have fcm set to 0 as well (e.g. HD-DVD)
170
*/
171
enum
FrameCodingMode
{
172
PROGRESSIVE
= 0,
///< in the bitstream is reported as 00b
173
ILACE_FRAME
,
///< in the bitstream is reported as 10b
174
ILACE_FIELD
///< in the bitstream is reported as 11b
175
};
176
177
/** The VC1 Context
178
* @todo Change size wherever another size is more efficient
179
* Many members are only used for Advanced Profile
180
*/
181
typedef
struct
VC1Context
{
182
MpegEncContext
s
;
183
IntraX8Context
x8
;
184
VC1DSPContext
vc1dsp
;
185
186
int
bits
;
187
188
/** Simple/Main Profile sequence header */
189
//@{
190
int
res_sprite
;
///< reserved, sprite mode
191
int
res_y411
;
///< reserved, old interlaced mode
192
int
res_x8
;
///< reserved
193
int
multires
;
///< frame-level RESPIC syntax element present
194
int
res_fasttx
;
///< reserved, always 1
195
int
res_transtab
;
///< reserved, always 0
196
int
rangered
;
///< RANGEREDFRM (range reduction) syntax element present
197
///< at frame level
198
int
res_rtm_flag
;
///< reserved, set to 1
199
int
reserved
;
///< reserved
200
//@}
201
202
/** Advanced Profile */
203
//@{
204
int
level
;
///< 3bits, for Advanced/Simple Profile, provided by TS layer
205
int
chromaformat
;
///< 2bits, 2=4:2:0, only defined
206
int
postprocflag
;
///< Per-frame processing suggestion flag present
207
int
broadcast
;
///< TFF/RFF present
208
int
interlace
;
///< Progressive/interlaced (RPTFTM syntax element)
209
int
tfcntrflag
;
///< TFCNTR present
210
int
panscanflag
;
///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
211
int
refdist_flag
;
///< REFDIST syntax element present in II, IP, PI or PP field picture headers
212
int
extended_dmv
;
///< Additional extended dmv range at P/B frame-level
213
int
hrd_param_flag
;
///< Presence of Hypothetical Reference
214
///< Decoder parameters
215
int
psf
;
///< Progressive Segmented Frame
216
//@}
217
218
/** Sequence header data for all Profiles
219
* TODO: choose between ints, uint8_ts and monobit flags
220
*/
221
//@{
222
int
profile
;
///< 2bits, Profile
223
int
frmrtq_postproc
;
///< 3bits,
224
int
bitrtq_postproc
;
///< 5bits, quantized framerate-based postprocessing strength
225
int
max_coded_width
,
max_coded_height
;
226
int
fastuvmc
;
///< Rounding of qpel vector to hpel ? (not in Simple)
227
int
extended_mv
;
///< Ext MV in P/B (not in Simple)
228
int
dquant
;
///< How qscale varies with MBs, 2bits (not in Simple)
229
int
vstransform
;
///< variable-size [48]x[48] transform type + info
230
int
overlap
;
///< overlapped transforms in use
231
int
quantizer_mode
;
///< 2bits, quantizer mode used for sequence, see QUANT_*
232
int
finterpflag
;
///< INTERPFRM present
233
//@}
234
235
/** Frame decoding info for all profiles */
236
//@{
237
uint8_t
mv_mode
;
///< MV coding monde
238
uint8_t
mv_mode2
;
///< Secondary MV coding mode (B frames)
239
int
k_x
;
///< Number of bits for MVs (depends on MV range)
240
int
k_y
;
///< Number of bits for MVs (depends on MV range)
241
int
range_x
,
range_y
;
///< MV range
242
uint8_t
pq
,
altpq
;
///< Current/alternate frame quantizer scale
243
uint8_t
zz_8x8
[4][64];
///< Zigzag table for TT_8x8, permuted for IDCT
244
int
left_blk_sh
,
top_blk_sh
;
///< Either 3 or 0, positions of l/t in blk[]
245
const
uint8_t
*
zz_8x4
;
///< Zigzag scan table for TT_8x4 coding mode
246
const
uint8_t
*
zz_4x8
;
///< Zigzag scan table for TT_4x8 coding mode
247
/** pquant parameters */
248
//@{
249
uint8_t
dquantfrm
;
250
uint8_t
dqprofile
;
251
uint8_t
dqsbedge
;
252
uint8_t
dqbilevel
;
253
//@}
254
/** AC coding set indexes
255
* @see 8.1.1.10, p(1)10
256
*/
257
//@{
258
int
c_ac_table_index
;
///< Chroma index from ACFRM element
259
int
y_ac_table_index
;
///< Luma index from AC2FRM element
260
//@}
261
int
ttfrm
;
///< Transform type info present at frame level
262
uint8_t
ttmbf
;
///< Transform type flag
263
int
*
ttblk_base
, *
ttblk
;
///< Transform type at the block level
264
int
codingset
;
///< index of current table set from 11.8 to use for luma block decoding
265
int
codingset2
;
///< index of current table set from 11.8 to use for chroma block decoding
266
int
pqindex
;
///< raw pqindex used in coding set selection
267
int
a_avail
,
c_avail
;
268
uint8_t
*
mb_type_base
, *
mb_type
[3];
269
270
271
/** Luma compensation parameters */
272
//@{
273
uint8_t
lumscale
;
274
uint8_t
lumshift
;
275
//@}
276
int16_t
bfraction
;
///< Relative position % anchors=> how to scale MVs
277
uint8_t
halfpq
;
///< Uniform quant over image and qp+.5
278
uint8_t
respic
;
///< Frame-level flag for resized images
279
int
buffer_fullness
;
///< HRD info
280
/** Ranges:
281
* -# 0 -> [-64n 63.f] x [-32, 31.f]
282
* -# 1 -> [-128, 127.f] x [-64, 63.f]
283
* -# 2 -> [-512, 511.f] x [-128, 127.f]
284
* -# 3 -> [-1024, 1023.f] x [-256, 255.f]
285
*/
286
uint8_t
mvrange
;
///< Extended MV range flag
287
uint8_t
pquantizer
;
///< Uniform (over sequence) quantizer in use
288
VLC
*
cbpcy_vlc
;
///< CBPCY VLC table
289
int
tt_index
;
///< Index for Transform Type tables (to decode TTMB)
290
uint8_t
*
mv_type_mb_plane
;
///< bitplane for mv_type == (4MV)
291
uint8_t
*
direct_mb_plane
;
///< bitplane for "direct" MBs
292
uint8_t
*
forward_mb_plane
;
///< bitplane for "forward" MBs
293
int
mv_type_is_raw
;
///< mv type mb plane is not coded
294
int
dmb_is_raw
;
///< direct mb plane is raw
295
int
fmb_is_raw
;
///< forward mb plane is raw
296
int
skip_is_raw
;
///< skip mb plane is not coded
297
uint8_t
luty
[256],
lutuv
[256];
///< lookup tables used for intensity compensation
298
int
use_ic
;
///< use intensity compensation in B-frames
299
int
rnd
;
///< rounding control
300
301
/** Frame decoding info for S/M profiles only */
302
//@{
303
uint8_t
rangeredfrm
;
///< out_sample = CLIP((in_sample-128)*2+128)
304
uint8_t
interpfrm
;
305
//@}
306
307
/** Frame decoding info for Advanced profile */
308
//@{
309
enum
FrameCodingMode
fcm
;
310
uint8_t
numpanscanwin
;
311
uint8_t
tfcntr
;
312
uint8_t
rptfrm
,
tff
,
rff
;
313
uint16_t
topleftx
;
314
uint16_t
toplefty
;
315
uint16_t
bottomrightx
;
316
uint16_t
bottomrighty
;
317
uint8_t
uvsamp
;
318
uint8_t
postproc
;
319
int
hrd_num_leaky_buckets
;
320
uint8_t
bit_rate_exponent
;
321
uint8_t
buffer_size_exponent
;
322
uint8_t
*
acpred_plane
;
///< AC prediction flags bitplane
323
int
acpred_is_raw
;
324
uint8_t
*
over_flags_plane
;
///< Overflags bitplane
325
int
overflg_is_raw
;
326
uint8_t
condover
;
327
uint16_t *
hrd_rate
, *
hrd_buffer
;
328
uint8_t
*
hrd_fullness
;
329
uint8_t
range_mapy_flag
;
330
uint8_t
range_mapuv_flag
;
331
uint8_t
range_mapy
;
332
uint8_t
range_mapuv
;
333
//@}
334
335
/** Frame decoding info for interlaced picture */
336
uint8_t
dmvrange
;
///< Extended differential MV range flag
337
int
fourmvswitch
;
338
int
intcomp
;
339
uint8_t
lumscale2
;
///< for interlaced field P picture
340
uint8_t
lumshift2
;
341
uint8_t
luty2
[256],
lutuv2
[256];
// lookup tables used for intensity compensation
342
VLC
*
mbmode_vlc
;
343
VLC
*
imv_vlc
;
344
VLC
*
twomvbp_vlc
;
345
VLC
*
fourmvbp_vlc
;
346
uint8_t
twomvbp
;
347
uint8_t
fourmvbp
;
348
uint8_t
*
fieldtx_plane
;
349
int
fieldtx_is_raw
;
350
uint8_t
zzi_8x8
[64];
351
uint8_t
*
blk_mv_type_base
, *
blk_mv_type
;
///< 0: frame MV, 1: field MV (interlaced frame)
352
uint8_t
*
mv_f_base
, *
mv_f
[2];
///< 0: MV obtained from same field, 1: opposite field
353
uint8_t
*
mv_f_last_base
, *
mv_f_last
[2];
354
uint8_t
*
mv_f_next_base
, *
mv_f_next
[2];
355
int
field_mode
;
///< 1 for interlaced field pictures
356
int
fptype
;
357
int
second_field
;
358
int
refdist
;
///< distance of the current picture from reference
359
int
numref
;
///< number of past field pictures used as reference
360
// 0 corresponds to 1 and 1 corresponds to 2 references
361
int
reffield
;
///< if numref = 0 (1 reference) then reffield decides which
362
// field to use among the two fields from previous frame
363
int
intcompfield
;
///< which of the two fields to be intensity compensated
364
// 0: both fields, 1: bottom field, 2: top field
365
int
cur_field_type
;
///< 0: top, 1: bottom
366
int
ref_field_type
[2];
///< forward and backward reference field type (top or bottom)
367
int
blocks_off
,
mb_off
;
368
int
qs_last
;
///< if qpel has been used in the previous (tr.) picture
369
int
bmvtype
;
370
int
frfd
,
brfd
;
///< reference frame distance (forward or backward)
371
int
first_pic_header_flag
;
372
int
pic_header_flag
;
373
374
/** Frame decoding info for sprite modes */
375
//@{
376
int
new_sprite
;
377
int
two_sprites
;
378
AVFrame
sprite_output_frame
;
379
int
output_width
,
output_height
,
sprite_width
,
sprite_height
;
380
uint8_t
*
sr_rows
[2][2];
///< Sprite resizer line cache
381
//@}
382
383
int
p_frame_skipped
;
384
int
bi_type
;
385
int
x8_type
;
386
387
DCTELEM
(*
block
)[6][64];
388
int
n_allocated_blks
,
cur_blk_idx
,
left_blk_idx
,
topleft_blk_idx
,
top_blk_idx
;
389
uint32_t *
cbp_base
, *
cbp
;
390
uint8_t
*
is_intra_base
, *
is_intra
;
391
int16_t (*
luma_mv_base
)[2], (*luma_mv)[2];
392
uint8_t
bfraction_lut_index
;
///< Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[])
393
uint8_t
broken_link
;
///< Broken link flag (BROKEN_LINK syntax element)
394
uint8_t
closed_entry
;
///< Closed entry point flag (CLOSED_ENTRY syntax element)
395
396
int
end_mb_x
;
///< Horizontal macroblock limit (used only by mss2)
397
398
int
parse_only
;
///< Context is used within parser
399
400
int
warn_interlaced
;
401
}
VC1Context
;
402
403
/** Find VC-1 marker in buffer
404
* @return position where next marker starts or end of buffer if no marker found
405
*/
406
static
av_always_inline
const
uint8_t
*
find_next_marker
(
const
uint8_t
*src,
const
uint8_t
*
end
)
407
{
408
uint32_t mrk = 0xFFFFFFFF;
409
410
if
(end-src < 4)
411
return
end
;
412
while
(src < end) {
413
mrk = (mrk << 8) | *src++;
414
if
(
IS_MARKER
(mrk))
415
return
src - 4;
416
}
417
return
end
;
418
}
419
420
static
av_always_inline
int
vc1_unescape_buffer
(
const
uint8_t
*src,
int
size
,
uint8_t
*
dst
)
421
{
422
int
dsize = 0, i;
423
424
if
(size < 4) {
425
for
(dsize = 0; dsize <
size
; dsize++)
426
*dst++ = *src++;
427
return
size
;
428
}
429
for
(i = 0; i <
size
; i++, src++) {
430
if
(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
431
dst[dsize++] = src[1];
432
src++;
433
i++;
434
}
else
435
dst[dsize++] = *src;
436
}
437
return
dsize;
438
}
439
440
/**
441
* Decode Simple/Main Profiles sequence header
442
* @see Figure 7-8, p16-17
443
* @param avctx Codec context
444
* @param gb GetBit context initialized from Codec context extra_data
445
* @return Status
446
*/
447
int
ff_vc1_decode_sequence_header
(
AVCodecContext
*avctx,
VC1Context
*v,
GetBitContext
*gb);
448
449
int
ff_vc1_decode_entry_point
(
AVCodecContext
*avctx,
VC1Context
*v,
GetBitContext
*gb);
450
451
int
ff_vc1_parse_frame_header
(
VC1Context
*v,
GetBitContext
*gb);
452
int
ff_vc1_parse_frame_header_adv
(
VC1Context
*v,
GetBitContext
*gb);
453
int
ff_vc1_init_common
(
VC1Context
*v);
454
455
av_cold
int
ff_vc1_decode_init_alloc_tables
(
VC1Context
*v);
456
av_cold
void
ff_vc1_init_transposed_scantables
(
VC1Context
*v);
457
av_cold
int
ff_vc1_decode_end
(
AVCodecContext
*avctx);
458
void
ff_vc1_decode_blocks
(
VC1Context
*v);
459
460
#endif
/* AVCODEC_VC1_H */
Generated on Sat May 25 2013 03:58:42 for FFmpeg by
1.8.2