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