Statistics
| Branch: | Revision:

ffmpeg / libavcodec / vc1.h @ de53b04b

History | View | Annotate | Download (9.3 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
#include "avcodec.h"
24
#include "mpegvideo.h"
25

    
26
/** Markers used in VC-1 AP frame data */
27
//@{
28
enum VC1Code{
29
    VC1_CODE_RES0       = 0x00000100,
30
    VC1_CODE_ENDOFSEQ   = 0x0000010A,
31
    VC1_CODE_SLICE,
32
    VC1_CODE_FIELD,
33
    VC1_CODE_FRAME,
34
    VC1_CODE_ENTRYPOINT,
35
    VC1_CODE_SEQHDR,
36
};
37
//@}
38

    
39
#define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0)
40

    
41
/** Available Profiles */
42
//@{
43
enum Profile {
44
    PROFILE_SIMPLE,
45
    PROFILE_MAIN,
46
    PROFILE_COMPLEX, ///< TODO: WMV9 specific
47
    PROFILE_ADVANCED
48
};
49
//@}
50

    
51
/** Sequence quantizer mode */
52
//@{
53
enum QuantMode {
54
    QUANT_FRAME_IMPLICIT,    ///< Implicitly specified at frame level
55
    QUANT_FRAME_EXPLICIT,    ///< Explicitly specified at frame level
56
    QUANT_NON_UNIFORM,       ///< Non-uniform quant used for all frames
57
    QUANT_UNIFORM            ///< Uniform quant used for all frames
58
};
59
//@}
60

    
61
/** Where quant can be changed */
62
//@{
63
enum DQProfile {
64
    DQPROFILE_FOUR_EDGES,
65
    DQPROFILE_DOUBLE_EDGES,
66
    DQPROFILE_SINGLE_EDGE,
67
    DQPROFILE_ALL_MBS
68
};
69
//@}
70

    
71
/** @name Where quant can be changed
72
 */
73
//@{
74
enum DQSingleEdge {
75
    DQSINGLE_BEDGE_LEFT,
76
    DQSINGLE_BEDGE_TOP,
77
    DQSINGLE_BEDGE_RIGHT,
78
    DQSINGLE_BEDGE_BOTTOM
79
};
80
//@}
81

    
82
/** Which pair of edges is quantized with ALTPQUANT */
83
//@{
84
enum DQDoubleEdge {
85
    DQDOUBLE_BEDGE_TOPLEFT,
86
    DQDOUBLE_BEDGE_TOPRIGHT,
87
    DQDOUBLE_BEDGE_BOTTOMRIGHT,
88
    DQDOUBLE_BEDGE_BOTTOMLEFT
89
};
90
//@}
91

    
92
/** MV modes for P frames */
93
//@{
94
enum MVModes {
95
    MV_PMODE_1MV_HPEL_BILIN,
96
    MV_PMODE_1MV,
97
    MV_PMODE_1MV_HPEL,
98
    MV_PMODE_MIXED_MV,
99
    MV_PMODE_INTENSITY_COMP
100
};
101
//@}
102

    
103
/** @name MV types for B frames */
104
//@{
105
enum BMVTypes {
106
    BMV_TYPE_BACKWARD,
107
    BMV_TYPE_FORWARD,
108
    BMV_TYPE_INTERPOLATED
109
};
110
//@}
111

    
112
/** @name Block types for P/B frames */
113
//@{
114
enum TransformTypes {
115
    TT_8X8,
116
    TT_8X4_BOTTOM,
117
    TT_8X4_TOP,
118
    TT_8X4, //Both halves
119
    TT_4X8_RIGHT,
120
    TT_4X8_LEFT,
121
    TT_4X8, //Both halves
122
    TT_4X4
123
};
124
//@}
125

    
126
/** One more frame type */
127
#define BI_TYPE 7
128

    
129
enum CodingSet {
130
    CS_HIGH_MOT_INTRA = 0,
131
    CS_HIGH_MOT_INTER,
132
    CS_LOW_MOT_INTRA,
133
    CS_LOW_MOT_INTER,
134
    CS_MID_RATE_INTRA,
135
    CS_MID_RATE_INTER,
136
    CS_HIGH_RATE_INTRA,
137
    CS_HIGH_RATE_INTER
138
};
139

    
140
/** @name Overlap conditions for Advanced Profile */
141
//@{
142
enum COTypes {
143
    CONDOVER_NONE = 0,
144
    CONDOVER_ALL,
145
    CONDOVER_SELECT
146
};
147
//@}
148

    
149

    
150
/** The VC1 Context
151
 * @fixme Change size wherever another size is more efficient
152
 * Many members are only used for Advanced Profile
153
 */
154
typedef struct VC1Context{
155
    MpegEncContext s;
156

    
157
    int bits;
158

    
159
    /** Simple/Main Profile sequence header */
160
    //@{
161
    int res_sm;           ///< reserved, 2b
162
    int res_x8;           ///< reserved
163
    int multires;         ///< frame-level RESPIC syntax element present
164
    int res_fasttx;       ///< reserved, always 1
165
    int res_transtab;     ///< reserved, always 0
166
    int rangered;         ///< RANGEREDFRM (range reduction) syntax element present
167
                          ///< at frame level
168
    int res_rtm_flag;     ///< reserved, set to 1
169
    int reserved;         ///< reserved
170
    //@}
171

    
172
    /** Advanced Profile */
173
    //@{
174
    int level;            ///< 3bits, for Advanced/Simple Profile, provided by TS layer
175
    int chromaformat;     ///< 2bits, 2=4:2:0, only defined
176
    int postprocflag;     ///< Per-frame processing suggestion flag present
177
    int broadcast;        ///< TFF/RFF present
178
    int interlace;        ///< Progressive/interlaced (RPTFTM syntax element)
179
    int tfcntrflag;       ///< TFCNTR present
180
    int panscanflag;      ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
181
    int extended_dmv;     ///< Additional extended dmv range at P/B frame-level
182
    int color_prim;       ///< 8bits, chroma coordinates of the color primaries
183
    int transfer_char;    ///< 8bits, Opto-electronic transfer characteristics
184
    int matrix_coef;      ///< 8bits, Color primaries->YCbCr transform matrix
185
    int hrd_param_flag;   ///< Presence of Hypothetical Reference
186
                          ///< Decoder parameters
187
    int psf;              ///< Progressive Segmented Frame
188
    //@}
189

    
190
    /** Sequence header data for all Profiles
191
     * TODO: choose between ints, uint8_ts and monobit flags
192
     */
193
    //@{
194
    int profile;          ///< 2bits, Profile
195
    int frmrtq_postproc;  ///< 3bits,
196
    int bitrtq_postproc;  ///< 5bits, quantized framerate-based postprocessing strength
197
    int fastuvmc;         ///< Rounding of qpel vector to hpel ? (not in Simple)
198
    int extended_mv;      ///< Ext MV in P/B (not in Simple)
199
    int dquant;           ///< How qscale varies with MBs, 2bits (not in Simple)
200
    int vstransform;      ///< variable-size [48]x[48] transform type + info
201
    int overlap;          ///< overlapped transforms in use
202
    int quantizer_mode;   ///< 2bits, quantizer mode used for sequence, see QUANT_*
203
    int finterpflag;      ///< INTERPFRM present
204
    //@}
205

    
206
    /** Frame decoding info for all profiles */
207
    //@{
208
    uint8_t mv_mode;      ///< MV coding monde
209
    uint8_t mv_mode2;     ///< Secondary MV coding mode (B frames)
210
    int k_x;              ///< Number of bits for MVs (depends on MV range)
211
    int k_y;              ///< Number of bits for MVs (depends on MV range)
212
    int range_x, range_y; ///< MV range
213
    uint8_t pq, altpq;    ///< Current/alternate frame quantizer scale
214
    /** pquant parameters */
215
    //@{
216
    uint8_t dquantfrm;
217
    uint8_t dqprofile;
218
    uint8_t dqsbedge;
219
    uint8_t dqbilevel;
220
    //@}
221
    /** AC coding set indexes
222
     * @see 8.1.1.10, p(1)10
223
     */
224
    //@{
225
    int c_ac_table_index; ///< Chroma index from ACFRM element
226
    int y_ac_table_index; ///< Luma index from AC2FRM element
227
    //@}
228
    int ttfrm;            ///< Transform type info present at frame level
229
    uint8_t ttmbf;        ///< Transform type flag
230
    uint8_t ttblk4x4;     ///< Value of ttblk which indicates a 4x4 transform
231
    int codingset;        ///< index of current table set from 11.8 to use for luma block decoding
232
    int codingset2;       ///< index of current table set from 11.8 to use for chroma block decoding
233
    int pqindex;          ///< raw pqindex used in coding set selection
234
    int a_avail, c_avail;
235
    uint8_t *mb_type_base, *mb_type[3];
236

    
237

    
238
    /** Luma compensation parameters */
239
    //@{
240
    uint8_t lumscale;
241
    uint8_t lumshift;
242
    //@}
243
    int16_t bfraction;    ///< Relative position % anchors=> how to scale MVs
244
    uint8_t halfpq;       ///< Uniform quant over image and qp+.5
245
    uint8_t respic;       ///< Frame-level flag for resized images
246
    int buffer_fullness;  ///< HRD info
247
    /** Ranges:
248
     * -# 0 -> [-64n 63.f] x [-32, 31.f]
249
     * -# 1 -> [-128, 127.f] x [-64, 63.f]
250
     * -# 2 -> [-512, 511.f] x [-128, 127.f]
251
     * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
252
     */
253
    uint8_t mvrange;
254
    uint8_t pquantizer;           ///< Uniform (over sequence) quantizer in use
255
    VLC *cbpcy_vlc;               ///< CBPCY VLC table
256
    int tt_index;                 ///< Index for Transform Type tables
257
    uint8_t* mv_type_mb_plane;    ///< bitplane for mv_type == (4MV)
258
    uint8_t* direct_mb_plane;     ///< bitplane for "direct" MBs
259
    int mv_type_is_raw;           ///< mv type mb plane is not coded
260
    int dmb_is_raw;               ///< direct mb plane is raw
261
    int skip_is_raw;              ///< skip mb plane is not coded
262
    uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
263
    int use_ic;                   ///< use intensity compensation in B-frames
264
    int rnd;                      ///< rounding control
265

    
266
    /** Frame decoding info for S/M profiles only */
267
    //@{
268
    uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
269
    uint8_t interpfrm;
270
    //@}
271

    
272
    /** Frame decoding info for Advanced profile */
273
    //@{
274
    uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
275
    uint8_t numpanscanwin;
276
    uint8_t tfcntr;
277
    uint8_t rptfrm, tff, rff;
278
    uint16_t topleftx;
279
    uint16_t toplefty;
280
    uint16_t bottomrightx;
281
    uint16_t bottomrighty;
282
    uint8_t uvsamp;
283
    uint8_t postproc;
284
    int hrd_num_leaky_buckets;
285
    uint8_t bit_rate_exponent;
286
    uint8_t buffer_size_exponent;
287
    uint8_t* acpred_plane;       ///< AC prediction flags bitplane
288
    int acpred_is_raw;
289
    uint8_t* over_flags_plane;   ///< Overflags bitplane
290
    int overflg_is_raw;
291
    uint8_t condover;
292
    uint16_t *hrd_rate, *hrd_buffer;
293
    uint8_t *hrd_fullness;
294
    uint8_t range_mapy_flag;
295
    uint8_t range_mapuv_flag;
296
    uint8_t range_mapy;
297
    uint8_t range_mapuv;
298
    //@}
299

    
300
    int p_frame_skipped;
301
    int bi_type;
302
} VC1Context;