Mercurial > libavcodec.hg
annotate vc1.h @ 5876:731ee5ad6bde libavcodec
Correct assignment of interlaced_frame; was being set on output frames,
in display order, based on decoding information in decoding order. Now
set properly, immediately upon completion of decode.
Based on original patch from Reinhard Nissl, rnisssl % gmx , de
Original Thread: [FFmpeg-devel] H.264 + PAFF: BBC HD recording shows
extreme interlacing artefacts, Thu, 01 Nov 2007 22:43:09
author | heydowns |
---|---|
date | Mon, 05 Nov 2007 18:16:42 +0000 |
parents | 1d83e9c34641 |
children | 83ac4620c6ed |
rev | line source |
---|---|
4900 | 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 | |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5299
diff
changeset
|
23 #ifndef FFMPEG_VC1_H |
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5299
diff
changeset
|
24 #define FFMPEG_VC1_H |
5163 | 25 |
4927
270c8a34f234
Make vc1_parser.c compilable without special defines
kostya
parents:
4926
diff
changeset
|
26 #include "avcodec.h" |
270c8a34f234
Make vc1_parser.c compilable without special defines
kostya
parents:
4926
diff
changeset
|
27 #include "mpegvideo.h" |
270c8a34f234
Make vc1_parser.c compilable without special defines
kostya
parents:
4926
diff
changeset
|
28 |
4903 | 29 /** Markers used in VC-1 AP frame data */ |
4900 | 30 //@{ |
31 enum VC1Code{ | |
32 VC1_CODE_RES0 = 0x00000100, | |
33 VC1_CODE_ENDOFSEQ = 0x0000010A, | |
34 VC1_CODE_SLICE, | |
35 VC1_CODE_FIELD, | |
36 VC1_CODE_FRAME, | |
37 VC1_CODE_ENTRYPOINT, | |
38 VC1_CODE_SEQHDR, | |
39 }; | |
40 //@} | |
41 | |
42 #define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0) | |
4902 | 43 |
44 /** Available Profiles */ | |
45 //@{ | |
46 enum Profile { | |
47 PROFILE_SIMPLE, | |
48 PROFILE_MAIN, | |
49 PROFILE_COMPLEX, ///< TODO: WMV9 specific | |
50 PROFILE_ADVANCED | |
51 }; | |
52 //@} | |
53 | |
54 /** Sequence quantizer mode */ | |
55 //@{ | |
56 enum QuantMode { | |
57 QUANT_FRAME_IMPLICIT, ///< Implicitly specified at frame level | |
58 QUANT_FRAME_EXPLICIT, ///< Explicitly specified at frame level | |
59 QUANT_NON_UNIFORM, ///< Non-uniform quant used for all frames | |
60 QUANT_UNIFORM ///< Uniform quant used for all frames | |
61 }; | |
62 //@} | |
63 | |
64 /** Where quant can be changed */ | |
65 //@{ | |
66 enum DQProfile { | |
67 DQPROFILE_FOUR_EDGES, | |
68 DQPROFILE_DOUBLE_EDGES, | |
69 DQPROFILE_SINGLE_EDGE, | |
70 DQPROFILE_ALL_MBS | |
71 }; | |
72 //@} | |
73 | |
74 /** @name Where quant can be changed | |
75 */ | |
76 //@{ | |
77 enum DQSingleEdge { | |
78 DQSINGLE_BEDGE_LEFT, | |
79 DQSINGLE_BEDGE_TOP, | |
80 DQSINGLE_BEDGE_RIGHT, | |
81 DQSINGLE_BEDGE_BOTTOM | |
82 }; | |
83 //@} | |
84 | |
85 /** Which pair of edges is quantized with ALTPQUANT */ | |
86 //@{ | |
87 enum DQDoubleEdge { | |
88 DQDOUBLE_BEDGE_TOPLEFT, | |
89 DQDOUBLE_BEDGE_TOPRIGHT, | |
90 DQDOUBLE_BEDGE_BOTTOMRIGHT, | |
91 DQDOUBLE_BEDGE_BOTTOMLEFT | |
92 }; | |
93 //@} | |
94 | |
95 /** MV modes for P frames */ | |
96 //@{ | |
97 enum MVModes { | |
98 MV_PMODE_1MV_HPEL_BILIN, | |
99 MV_PMODE_1MV, | |
100 MV_PMODE_1MV_HPEL, | |
101 MV_PMODE_MIXED_MV, | |
102 MV_PMODE_INTENSITY_COMP | |
103 }; | |
104 //@} | |
105 | |
106 /** @name MV types for B frames */ | |
107 //@{ | |
108 enum BMVTypes { | |
109 BMV_TYPE_BACKWARD, | |
110 BMV_TYPE_FORWARD, | |
111 BMV_TYPE_INTERPOLATED | |
112 }; | |
113 //@} | |
114 | |
115 /** @name Block types for P/B frames */ | |
116 //@{ | |
117 enum TransformTypes { | |
118 TT_8X8, | |
119 TT_8X4_BOTTOM, | |
120 TT_8X4_TOP, | |
121 TT_8X4, //Both halves | |
122 TT_4X8_RIGHT, | |
123 TT_4X8_LEFT, | |
124 TT_4X8, //Both halves | |
125 TT_4X4 | |
126 }; | |
127 //@} | |
128 | |
129 /** One more frame type */ | |
130 #define BI_TYPE 7 | |
131 | |
132 enum CodingSet { | |
133 CS_HIGH_MOT_INTRA = 0, | |
134 CS_HIGH_MOT_INTER, | |
135 CS_LOW_MOT_INTRA, | |
136 CS_LOW_MOT_INTER, | |
137 CS_MID_RATE_INTRA, | |
138 CS_MID_RATE_INTER, | |
139 CS_HIGH_RATE_INTRA, | |
140 CS_HIGH_RATE_INTER | |
141 }; | |
142 | |
143 /** @name Overlap conditions for Advanced Profile */ | |
144 //@{ | |
145 enum COTypes { | |
146 CONDOVER_NONE = 0, | |
147 CONDOVER_ALL, | |
148 CONDOVER_SELECT | |
149 }; | |
150 //@} | |
151 | |
152 | |
153 /** The VC1 Context | |
5299
4623928e3b9e
Replace non-existing @fixme doxygen tags with @todo.
diego
parents:
5169
diff
changeset
|
154 * @todo Change size wherever another size is more efficient |
4902 | 155 * Many members are only used for Advanced Profile |
156 */ | |
157 typedef struct VC1Context{ | |
158 MpegEncContext s; | |
159 | |
160 int bits; | |
161 | |
162 /** Simple/Main Profile sequence header */ | |
163 //@{ | |
164 int res_sm; ///< reserved, 2b | |
165 int res_x8; ///< reserved | |
166 int multires; ///< frame-level RESPIC syntax element present | |
167 int res_fasttx; ///< reserved, always 1 | |
168 int res_transtab; ///< reserved, always 0 | |
169 int rangered; ///< RANGEREDFRM (range reduction) syntax element present | |
170 ///< at frame level | |
171 int res_rtm_flag; ///< reserved, set to 1 | |
172 int reserved; ///< reserved | |
173 //@} | |
174 | |
175 /** Advanced Profile */ | |
176 //@{ | |
177 int level; ///< 3bits, for Advanced/Simple Profile, provided by TS layer | |
178 int chromaformat; ///< 2bits, 2=4:2:0, only defined | |
179 int postprocflag; ///< Per-frame processing suggestion flag present | |
180 int broadcast; ///< TFF/RFF present | |
181 int interlace; ///< Progressive/interlaced (RPTFTM syntax element) | |
182 int tfcntrflag; ///< TFCNTR present | |
183 int panscanflag; ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present | |
184 int extended_dmv; ///< Additional extended dmv range at P/B frame-level | |
185 int color_prim; ///< 8bits, chroma coordinates of the color primaries | |
186 int transfer_char; ///< 8bits, Opto-electronic transfer characteristics | |
187 int matrix_coef; ///< 8bits, Color primaries->YCbCr transform matrix | |
188 int hrd_param_flag; ///< Presence of Hypothetical Reference | |
189 ///< Decoder parameters | |
190 int psf; ///< Progressive Segmented Frame | |
191 //@} | |
192 | |
193 /** Sequence header data for all Profiles | |
194 * TODO: choose between ints, uint8_ts and monobit flags | |
195 */ | |
196 //@{ | |
197 int profile; ///< 2bits, Profile | |
198 int frmrtq_postproc; ///< 3bits, | |
199 int bitrtq_postproc; ///< 5bits, quantized framerate-based postprocessing strength | |
200 int fastuvmc; ///< Rounding of qpel vector to hpel ? (not in Simple) | |
201 int extended_mv; ///< Ext MV in P/B (not in Simple) | |
202 int dquant; ///< How qscale varies with MBs, 2bits (not in Simple) | |
203 int vstransform; ///< variable-size [48]x[48] transform type + info | |
204 int overlap; ///< overlapped transforms in use | |
205 int quantizer_mode; ///< 2bits, quantizer mode used for sequence, see QUANT_* | |
206 int finterpflag; ///< INTERPFRM present | |
207 //@} | |
208 | |
209 /** Frame decoding info for all profiles */ | |
210 //@{ | |
211 uint8_t mv_mode; ///< MV coding monde | |
212 uint8_t mv_mode2; ///< Secondary MV coding mode (B frames) | |
213 int k_x; ///< Number of bits for MVs (depends on MV range) | |
214 int k_y; ///< Number of bits for MVs (depends on MV range) | |
215 int range_x, range_y; ///< MV range | |
216 uint8_t pq, altpq; ///< Current/alternate frame quantizer scale | |
217 /** pquant parameters */ | |
218 //@{ | |
219 uint8_t dquantfrm; | |
220 uint8_t dqprofile; | |
221 uint8_t dqsbedge; | |
222 uint8_t dqbilevel; | |
223 //@} | |
224 /** AC coding set indexes | |
225 * @see 8.1.1.10, p(1)10 | |
226 */ | |
227 //@{ | |
228 int c_ac_table_index; ///< Chroma index from ACFRM element | |
229 int y_ac_table_index; ///< Luma index from AC2FRM element | |
230 //@} | |
231 int ttfrm; ///< Transform type info present at frame level | |
232 uint8_t ttmbf; ///< Transform type flag | |
233 uint8_t ttblk4x4; ///< Value of ttblk which indicates a 4x4 transform | |
234 int codingset; ///< index of current table set from 11.8 to use for luma block decoding | |
235 int codingset2; ///< index of current table set from 11.8 to use for chroma block decoding | |
236 int pqindex; ///< raw pqindex used in coding set selection | |
237 int a_avail, c_avail; | |
238 uint8_t *mb_type_base, *mb_type[3]; | |
239 | |
240 | |
241 /** Luma compensation parameters */ | |
242 //@{ | |
243 uint8_t lumscale; | |
244 uint8_t lumshift; | |
245 //@} | |
246 int16_t bfraction; ///< Relative position % anchors=> how to scale MVs | |
247 uint8_t halfpq; ///< Uniform quant over image and qp+.5 | |
248 uint8_t respic; ///< Frame-level flag for resized images | |
249 int buffer_fullness; ///< HRD info | |
250 /** Ranges: | |
251 * -# 0 -> [-64n 63.f] x [-32, 31.f] | |
252 * -# 1 -> [-128, 127.f] x [-64, 63.f] | |
253 * -# 2 -> [-512, 511.f] x [-128, 127.f] | |
254 * -# 3 -> [-1024, 1023.f] x [-256, 255.f] | |
255 */ | |
256 uint8_t mvrange; | |
257 uint8_t pquantizer; ///< Uniform (over sequence) quantizer in use | |
258 VLC *cbpcy_vlc; ///< CBPCY VLC table | |
259 int tt_index; ///< Index for Transform Type tables | |
260 uint8_t* mv_type_mb_plane; ///< bitplane for mv_type == (4MV) | |
261 uint8_t* direct_mb_plane; ///< bitplane for "direct" MBs | |
262 int mv_type_is_raw; ///< mv type mb plane is not coded | |
263 int dmb_is_raw; ///< direct mb plane is raw | |
264 int skip_is_raw; ///< skip mb plane is not coded | |
265 uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation | |
266 int use_ic; ///< use intensity compensation in B-frames | |
267 int rnd; ///< rounding control | |
268 | |
269 /** Frame decoding info for S/M profiles only */ | |
270 //@{ | |
271 uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128) | |
272 uint8_t interpfrm; | |
273 //@} | |
274 | |
275 /** Frame decoding info for Advanced profile */ | |
276 //@{ | |
277 uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace | |
278 uint8_t numpanscanwin; | |
279 uint8_t tfcntr; | |
280 uint8_t rptfrm, tff, rff; | |
281 uint16_t topleftx; | |
282 uint16_t toplefty; | |
283 uint16_t bottomrightx; | |
284 uint16_t bottomrighty; | |
285 uint8_t uvsamp; | |
286 uint8_t postproc; | |
287 int hrd_num_leaky_buckets; | |
288 uint8_t bit_rate_exponent; | |
289 uint8_t buffer_size_exponent; | |
290 uint8_t* acpred_plane; ///< AC prediction flags bitplane | |
291 int acpred_is_raw; | |
292 uint8_t* over_flags_plane; ///< Overflags bitplane | |
293 int overflg_is_raw; | |
294 uint8_t condover; | |
295 uint16_t *hrd_rate, *hrd_buffer; | |
296 uint8_t *hrd_fullness; | |
297 uint8_t range_mapy_flag; | |
298 uint8_t range_mapuv_flag; | |
299 uint8_t range_mapy; | |
300 uint8_t range_mapuv; | |
301 //@} | |
302 | |
303 int p_frame_skipped; | |
304 int bi_type; | |
305 } VC1Context; | |
5163 | 306 |
5830
1d83e9c34641
Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents:
5299
diff
changeset
|
307 #endif /* FFMPEG_VC1_H */ |