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