ffmpeg / libavcodec / vc1.h @ 12802ec0
History | View | Annotate | Download (11.6 KB)
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 |
/** Markers used in VC-1 AP frame data */
|
32 |
//@{
|
33 |
enum VC1Code{
|
34 |
VC1_CODE_RES0 = 0x00000100,
|
35 |
VC1_CODE_ENDOFSEQ = 0x0000010A,
|
36 |
VC1_CODE_SLICE, |
37 |
VC1_CODE_FIELD, |
38 |
VC1_CODE_FRAME, |
39 |
VC1_CODE_ENTRYPOINT, |
40 |
VC1_CODE_SEQHDR, |
41 |
}; |
42 |
//@}
|
43 |
|
44 |
#define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0) |
45 |
|
46 |
/** Available Profiles */
|
47 |
//@{
|
48 |
enum Profile {
|
49 |
PROFILE_SIMPLE, |
50 |
PROFILE_MAIN, |
51 |
PROFILE_COMPLEX, ///< TODO: WMV9 specific
|
52 |
PROFILE_ADVANCED |
53 |
}; |
54 |
//@}
|
55 |
|
56 |
/** Sequence quantizer mode */
|
57 |
//@{
|
58 |
enum QuantMode {
|
59 |
QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level
|
60 |
QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level
|
61 |
QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames
|
62 |
QUANT_UNIFORM ///< Uniform quant used for all frames
|
63 |
}; |
64 |
//@}
|
65 |
|
66 |
/** Where quant can be changed */
|
67 |
//@{
|
68 |
enum DQProfile {
|
69 |
DQPROFILE_FOUR_EDGES, |
70 |
DQPROFILE_DOUBLE_EDGES, |
71 |
DQPROFILE_SINGLE_EDGE, |
72 |
DQPROFILE_ALL_MBS |
73 |
}; |
74 |
//@}
|
75 |
|
76 |
/** @name Where quant can be changed
|
77 |
*/
|
78 |
//@{
|
79 |
enum DQSingleEdge {
|
80 |
DQSINGLE_BEDGE_LEFT, |
81 |
DQSINGLE_BEDGE_TOP, |
82 |
DQSINGLE_BEDGE_RIGHT, |
83 |
DQSINGLE_BEDGE_BOTTOM |
84 |
}; |
85 |
//@}
|
86 |
|
87 |
/** Which pair of edges is quantized with ALTPQUANT */
|
88 |
//@{
|
89 |
enum DQDoubleEdge {
|
90 |
DQDOUBLE_BEDGE_TOPLEFT, |
91 |
DQDOUBLE_BEDGE_TOPRIGHT, |
92 |
DQDOUBLE_BEDGE_BOTTOMRIGHT, |
93 |
DQDOUBLE_BEDGE_BOTTOMLEFT |
94 |
}; |
95 |
//@}
|
96 |
|
97 |
/** MV modes for P frames */
|
98 |
//@{
|
99 |
enum MVModes {
|
100 |
MV_PMODE_1MV_HPEL_BILIN, |
101 |
MV_PMODE_1MV, |
102 |
MV_PMODE_1MV_HPEL, |
103 |
MV_PMODE_MIXED_MV, |
104 |
MV_PMODE_INTENSITY_COMP |
105 |
}; |
106 |
//@}
|
107 |
|
108 |
/** @name MV types for B frames */
|
109 |
//@{
|
110 |
enum BMVTypes {
|
111 |
BMV_TYPE_BACKWARD, |
112 |
BMV_TYPE_FORWARD, |
113 |
BMV_TYPE_INTERPOLATED |
114 |
}; |
115 |
//@}
|
116 |
|
117 |
/** @name Block types for P/B frames */
|
118 |
//@{
|
119 |
enum TransformTypes {
|
120 |
TT_8X8, |
121 |
TT_8X4_BOTTOM, |
122 |
TT_8X4_TOP, |
123 |
TT_8X4, //Both halves
|
124 |
TT_4X8_RIGHT, |
125 |
TT_4X8_LEFT, |
126 |
TT_4X8, //Both halves
|
127 |
TT_4X4 |
128 |
}; |
129 |
//@}
|
130 |
|
131 |
enum CodingSet {
|
132 |
CS_HIGH_MOT_INTRA = 0,
|
133 |
CS_HIGH_MOT_INTER, |
134 |
CS_LOW_MOT_INTRA, |
135 |
CS_LOW_MOT_INTER, |
136 |
CS_MID_RATE_INTRA, |
137 |
CS_MID_RATE_INTER, |
138 |
CS_HIGH_RATE_INTRA, |
139 |
CS_HIGH_RATE_INTER |
140 |
}; |
141 |
|
142 |
/** @name Overlap conditions for Advanced Profile */
|
143 |
//@{
|
144 |
enum COTypes {
|
145 |
CONDOVER_NONE = 0,
|
146 |
CONDOVER_ALL, |
147 |
CONDOVER_SELECT |
148 |
}; |
149 |
//@}
|
150 |
|
151 |
|
152 |
/** The VC1 Context
|
153 |
* @todo Change size wherever another size is more efficient
|
154 |
* Many members are only used for Advanced Profile
|
155 |
*/
|
156 |
typedef struct VC1Context{ |
157 |
MpegEncContext s; |
158 |
IntraX8Context x8; |
159 |
VC1DSPContext vc1dsp; |
160 |
|
161 |
int bits;
|
162 |
|
163 |
/** Simple/Main Profile sequence header */
|
164 |
//@{
|
165 |
int res_sprite; ///< reserved, sprite mode |
166 |
int res_y411; ///< reserved, old interlaced mode |
167 |
int res_x8; ///< reserved |
168 |
int multires; ///< frame-level RESPIC syntax element present |
169 |
int res_fasttx; ///< reserved, always 1 |
170 |
int res_transtab; ///< reserved, always 0 |
171 |
int rangered; ///< RANGEREDFRM (range reduction) syntax element present |
172 |
///< at frame level
|
173 |
int res_rtm_flag; ///< reserved, set to 1 |
174 |
int reserved; ///< reserved |
175 |
//@}
|
176 |
|
177 |
/** Advanced Profile */
|
178 |
//@{
|
179 |
int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer |
180 |
int chromaformat; ///< 2bits, 2=4:2:0, only defined |
181 |
int postprocflag; ///< Per-frame processing suggestion flag present |
182 |
int broadcast; ///< TFF/RFF present |
183 |
int interlace; ///< Progressive/interlaced (RPTFTM syntax element) |
184 |
int tfcntrflag; ///< TFCNTR present |
185 |
int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present |
186 |
int refdist_flag; ///< REFDIST syntax element present in II, IP, PI or PP field picture headers |
187 |
int extended_dmv; ///< Additional extended dmv range at P/B frame-level |
188 |
int color_prim; ///< 8bits, chroma coordinates of the color primaries |
189 |
int transfer_char; ///< 8bits, Opto-electronic transfer characteristics |
190 |
int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix |
191 |
int hrd_param_flag; ///< Presence of Hypothetical Reference |
192 |
///< Decoder parameters
|
193 |
int psf; ///< Progressive Segmented Frame |
194 |
//@}
|
195 |
|
196 |
/** Sequence header data for all Profiles
|
197 |
* TODO: choose between ints, uint8_ts and monobit flags
|
198 |
*/
|
199 |
//@{
|
200 |
int profile; ///< 2bits, Profile |
201 |
int frmrtq_postproc; ///< 3bits, |
202 |
int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength |
203 |
int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple) |
204 |
int extended_mv; ///< Ext MV in P/B (not in Simple) |
205 |
int dquant; ///< How qscale varies with MBs, 2bits (not in Simple) |
206 |
int vstransform; ///< variable-size [48]x[48] transform type + info |
207 |
int overlap; ///< overlapped transforms in use |
208 |
int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_* |
209 |
int finterpflag; ///< INTERPFRM present |
210 |
//@}
|
211 |
|
212 |
/** Frame decoding info for all profiles */
|
213 |
//@{
|
214 |
uint8_t mv_mode; ///< MV coding monde
|
215 |
uint8_t mv_mode2; ///< Secondary MV coding mode (B frames)
|
216 |
int k_x; ///< Number of bits for MVs (depends on MV range) |
217 |
int k_y; ///< Number of bits for MVs (depends on MV range) |
218 |
int range_x, range_y; ///< MV range |
219 |
uint8_t pq, altpq; ///< Current/alternate frame quantizer scale
|
220 |
uint8_t zz_8x8[4][64];///< Zigzag table for TT_8x8, permuted for IDCT |
221 |
const uint8_t* zz_8x4;///< Zigzag scan table for TT_8x4 coding mode |
222 |
const uint8_t* zz_4x8;///< Zigzag scan table for TT_4x8 coding mode |
223 |
/** pquant parameters */
|
224 |
//@{
|
225 |
uint8_t dquantfrm; |
226 |
uint8_t dqprofile; |
227 |
uint8_t dqsbedge; |
228 |
uint8_t dqbilevel; |
229 |
//@}
|
230 |
/** AC coding set indexes
|
231 |
* @see 8.1.1.10, p(1)10
|
232 |
*/
|
233 |
//@{
|
234 |
int c_ac_table_index; ///< Chroma index from ACFRM element |
235 |
int y_ac_table_index; ///< Luma index from AC2FRM element |
236 |
//@}
|
237 |
int ttfrm; ///< Transform type info present at frame level |
238 |
uint8_t ttmbf; ///< Transform type flag
|
239 |
uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform
|
240 |
int codingset; ///< index of current table set from 11.8 to use for luma block decoding |
241 |
int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding |
242 |
int pqindex; ///< raw pqindex used in coding set selection |
243 |
int a_avail, c_avail;
|
244 |
uint8_t *mb_type_base, *mb_type[3];
|
245 |
|
246 |
|
247 |
/** Luma compensation parameters */
|
248 |
//@{
|
249 |
uint8_t lumscale; |
250 |
uint8_t lumshift; |
251 |
//@}
|
252 |
int16_t bfraction; ///< Relative position % anchors=> how to scale MVs
|
253 |
uint8_t halfpq; ///< Uniform quant over image and qp+.5
|
254 |
uint8_t respic; ///< Frame-level flag for resized images
|
255 |
int buffer_fullness; ///< HRD info |
256 |
/** Ranges:
|
257 |
* -# 0 -> [-64n 63.f] x [-32, 31.f]
|
258 |
* -# 1 -> [-128, 127.f] x [-64, 63.f]
|
259 |
* -# 2 -> [-512, 511.f] x [-128, 127.f]
|
260 |
* -# 3 -> [-1024, 1023.f] x [-256, 255.f]
|
261 |
*/
|
262 |
uint8_t mvrange; |
263 |
uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use
|
264 |
VLC *cbpcy_vlc; ///< CBPCY VLC table
|
265 |
int tt_index; ///< Index for Transform Type tables |
266 |
uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV)
|
267 |
uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs
|
268 |
int mv_type_is_raw; ///< mv type mb plane is not coded |
269 |
int dmb_is_raw; ///< direct mb plane is raw |
270 |
int skip_is_raw; ///< skip mb plane is not coded |
271 |
uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation |
272 |
int use_ic; ///< use intensity compensation in B-frames |
273 |
int rnd; ///< rounding control |
274 |
|
275 |
/** Frame decoding info for S/M profiles only */
|
276 |
//@{
|
277 |
uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
|
278 |
uint8_t interpfrm; |
279 |
//@}
|
280 |
|
281 |
/** Frame decoding info for Advanced profile */
|
282 |
//@{
|
283 |
uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
|
284 |
uint8_t numpanscanwin; |
285 |
uint8_t tfcntr; |
286 |
uint8_t rptfrm, tff, rff; |
287 |
uint16_t topleftx; |
288 |
uint16_t toplefty; |
289 |
uint16_t bottomrightx; |
290 |
uint16_t bottomrighty; |
291 |
uint8_t uvsamp; |
292 |
uint8_t postproc; |
293 |
int hrd_num_leaky_buckets;
|
294 |
uint8_t bit_rate_exponent; |
295 |
uint8_t buffer_size_exponent; |
296 |
uint8_t* acpred_plane; ///< AC prediction flags bitplane
|
297 |
int acpred_is_raw;
|
298 |
uint8_t* over_flags_plane; ///< Overflags bitplane
|
299 |
int overflg_is_raw;
|
300 |
uint8_t condover; |
301 |
uint16_t *hrd_rate, *hrd_buffer; |
302 |
uint8_t *hrd_fullness; |
303 |
uint8_t range_mapy_flag; |
304 |
uint8_t range_mapuv_flag; |
305 |
uint8_t range_mapy; |
306 |
uint8_t range_mapuv; |
307 |
//@}
|
308 |
|
309 |
int p_frame_skipped;
|
310 |
int bi_type;
|
311 |
int x8_type;
|
312 |
|
313 |
uint32_t *cbp_base, *cbp; |
314 |
uint8_t bfraction_lut_index;///< Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[])
|
315 |
uint8_t broken_link; ///< Broken link flag (BROKEN_LINK syntax element)
|
316 |
uint8_t closed_entry; ///< Closed entry point flag (CLOSED_ENTRY syntax element)
|
317 |
|
318 |
int parse_only; ///< Context is used within parser |
319 |
|
320 |
int warn_interlaced;
|
321 |
} VC1Context; |
322 |
|
323 |
/** Find VC-1 marker in buffer
|
324 |
* @return position where next marker starts or end of buffer if no marker found
|
325 |
*/
|
326 |
static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end) |
327 |
{ |
328 |
uint32_t mrk = 0xFFFFFFFF;
|
329 |
|
330 |
if(end-src < 4) return end; |
331 |
while(src < end){
|
332 |
mrk = (mrk << 8) | *src++;
|
333 |
if(IS_MARKER(mrk))
|
334 |
return src-4; |
335 |
} |
336 |
return end;
|
337 |
} |
338 |
|
339 |
static av_always_inline int vc1_unescape_buffer(const uint8_t *src, int size, uint8_t *dst) |
340 |
{ |
341 |
int dsize = 0, i; |
342 |
|
343 |
if(size < 4){ |
344 |
for(dsize = 0; dsize < size; dsize++) *dst++ = *src++; |
345 |
return size;
|
346 |
} |
347 |
for(i = 0; i < size; i++, src++) { |
348 |
if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) { |
349 |
dst[dsize++] = src[1];
|
350 |
src++; |
351 |
i++; |
352 |
} else
|
353 |
dst[dsize++] = *src; |
354 |
} |
355 |
return dsize;
|
356 |
} |
357 |
|
358 |
/**
|
359 |
* Decode Simple/Main Profiles sequence header
|
360 |
* @see Figure 7-8, p16-17
|
361 |
* @param avctx Codec context
|
362 |
* @param gb GetBit context initialized from Codec context extra_data
|
363 |
* @return Status
|
364 |
*/
|
365 |
int vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
|
366 |
|
367 |
int vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
|
368 |
|
369 |
int vc1_parse_frame_header (VC1Context *v, GetBitContext *gb);
|
370 |
int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext *gb);
|
371 |
|
372 |
#endif /* AVCODEC_VC1_H */ |