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