Statistics
| Branch: | Revision:

ffmpeg / libavcodec / vc1.h @ 7d9a6a0f

History | View | Annotate | Download (11.7 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
/** Markers used if VC-1 AP frame data */
24
//@{
25
enum VC1Code{
26
    VC1_CODE_RES0       = 0x00000100,
27
    VC1_CODE_ENDOFSEQ   = 0x0000010A,
28
    VC1_CODE_SLICE,
29
    VC1_CODE_FIELD,
30
    VC1_CODE_FRAME,
31
    VC1_CODE_ENTRYPOINT,
32
    VC1_CODE_SEQHDR,
33
};
34
//@}
35

    
36
#define IS_MARKER(x) (((x) & ~0xFF) == VC1_CODE_RES0)
37

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

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

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

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

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

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

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

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

    
123
/** Table for conversion between TTBLK and TTMB */
124
static const int ttblk_to_tt[3][8] = {
125
  { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
126
  { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
127
  { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
128
};
129

    
130
static const int ttfrm_to_tt[4] = { TT_8X8, TT_8X4, TT_4X8, TT_4X4 };
131

    
132
/** MV P mode - the 5th element is only used for mode 1 */
133
static const uint8_t mv_pmode_table[2][5] = {
134
  { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
135
  { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
136
};
137
static const uint8_t mv_pmode_table2[2][4] = {
138
  { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
139
  { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
140
};
141

    
142
/** One more frame type */
143
#define BI_TYPE 7
144

    
145
static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
146
  fps_dr[2] = { 1000, 1001 };
147
static const uint8_t pquant_table[3][32] = {
148
  {  /* Implicit quantizer */
149
     0,  1,  2,  3,  4,  5,  6,  7,  8,  6,  7,  8,  9, 10, 11, 12,
150
    13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
151
  },
152
  {  /* Explicit quantizer, pquantizer uniform */
153
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
154
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
155
  },
156
  {  /* Explicit quantizer, pquantizer non-uniform */
157
     0,  1,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
158
    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
159
  }
160
};
161

    
162
/** @name VC-1 VLC tables and defines
163
 *  @todo TODO move this into the context
164
 */
165
//@{
166
#define VC1_BFRACTION_VLC_BITS 7
167
static VLC vc1_bfraction_vlc;
168
#define VC1_IMODE_VLC_BITS 4
169
static VLC vc1_imode_vlc;
170
#define VC1_NORM2_VLC_BITS 3
171
static VLC vc1_norm2_vlc;
172
#define VC1_NORM6_VLC_BITS 9
173
static VLC vc1_norm6_vlc;
174
/* Could be optimized, one table only needs 8 bits */
175
#define VC1_TTMB_VLC_BITS 9 //12
176
static VLC vc1_ttmb_vlc[3];
177
#define VC1_MV_DIFF_VLC_BITS 9 //15
178
static VLC vc1_mv_diff_vlc[4];
179
#define VC1_CBPCY_P_VLC_BITS 9 //14
180
static VLC vc1_cbpcy_p_vlc[4];
181
#define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
182
static VLC vc1_4mv_block_pattern_vlc[4];
183
#define VC1_TTBLK_VLC_BITS 5
184
static VLC vc1_ttblk_vlc[3];
185
#define VC1_SUBBLKPAT_VLC_BITS 6
186
static VLC vc1_subblkpat_vlc[3];
187

    
188
static VLC vc1_ac_coeff_table[8];
189
//@}
190

    
191
enum CodingSet {
192
    CS_HIGH_MOT_INTRA = 0,
193
    CS_HIGH_MOT_INTER,
194
    CS_LOW_MOT_INTRA,
195
    CS_LOW_MOT_INTER,
196
    CS_MID_RATE_INTRA,
197
    CS_MID_RATE_INTER,
198
    CS_HIGH_RATE_INTRA,
199
    CS_HIGH_RATE_INTER
200
};
201

    
202
/** @name Overlap conditions for Advanced Profile */
203
//@{
204
enum COTypes {
205
    CONDOVER_NONE = 0,
206
    CONDOVER_ALL,
207
    CONDOVER_SELECT
208
};
209
//@}
210

    
211

    
212
/** The VC1 Context
213
 * @fixme Change size wherever another size is more efficient
214
 * Many members are only used for Advanced Profile
215
 */
216
typedef struct VC1Context{
217
    MpegEncContext s;
218

    
219
    int bits;
220

    
221
    /** Simple/Main Profile sequence header */
222
    //@{
223
    int res_sm;           ///< reserved, 2b
224
    int res_x8;           ///< reserved
225
    int multires;         ///< frame-level RESPIC syntax element present
226
    int res_fasttx;       ///< reserved, always 1
227
    int res_transtab;     ///< reserved, always 0
228
    int rangered;         ///< RANGEREDFRM (range reduction) syntax element present
229
                          ///< at frame level
230
    int res_rtm_flag;     ///< reserved, set to 1
231
    int reserved;         ///< reserved
232
    //@}
233

    
234
    /** Advanced Profile */
235
    //@{
236
    int level;            ///< 3bits, for Advanced/Simple Profile, provided by TS layer
237
    int chromaformat;     ///< 2bits, 2=4:2:0, only defined
238
    int postprocflag;     ///< Per-frame processing suggestion flag present
239
    int broadcast;        ///< TFF/RFF present
240
    int interlace;        ///< Progressive/interlaced (RPTFTM syntax element)
241
    int tfcntrflag;       ///< TFCNTR present
242
    int panscanflag;      ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
243
    int extended_dmv;     ///< Additional extended dmv range at P/B frame-level
244
    int color_prim;       ///< 8bits, chroma coordinates of the color primaries
245
    int transfer_char;    ///< 8bits, Opto-electronic transfer characteristics
246
    int matrix_coef;      ///< 8bits, Color primaries->YCbCr transform matrix
247
    int hrd_param_flag;   ///< Presence of Hypothetical Reference
248
                          ///< Decoder parameters
249
    int psf;              ///< Progressive Segmented Frame
250
    //@}
251

    
252
    /** Sequence header data for all Profiles
253
     * TODO: choose between ints, uint8_ts and monobit flags
254
     */
255
    //@{
256
    int profile;          ///< 2bits, Profile
257
    int frmrtq_postproc;  ///< 3bits,
258
    int bitrtq_postproc;  ///< 5bits, quantized framerate-based postprocessing strength
259
    int fastuvmc;         ///< Rounding of qpel vector to hpel ? (not in Simple)
260
    int extended_mv;      ///< Ext MV in P/B (not in Simple)
261
    int dquant;           ///< How qscale varies with MBs, 2bits (not in Simple)
262
    int vstransform;      ///< variable-size [48]x[48] transform type + info
263
    int overlap;          ///< overlapped transforms in use
264
    int quantizer_mode;   ///< 2bits, quantizer mode used for sequence, see QUANT_*
265
    int finterpflag;      ///< INTERPFRM present
266
    //@}
267

    
268
    /** Frame decoding info for all profiles */
269
    //@{
270
    uint8_t mv_mode;      ///< MV coding monde
271
    uint8_t mv_mode2;     ///< Secondary MV coding mode (B frames)
272
    int k_x;              ///< Number of bits for MVs (depends on MV range)
273
    int k_y;              ///< Number of bits for MVs (depends on MV range)
274
    int range_x, range_y; ///< MV range
275
    uint8_t pq, altpq;    ///< Current/alternate frame quantizer scale
276
    /** pquant parameters */
277
    //@{
278
    uint8_t dquantfrm;
279
    uint8_t dqprofile;
280
    uint8_t dqsbedge;
281
    uint8_t dqbilevel;
282
    //@}
283
    /** AC coding set indexes
284
     * @see 8.1.1.10, p(1)10
285
     */
286
    //@{
287
    int c_ac_table_index; ///< Chroma index from ACFRM element
288
    int y_ac_table_index; ///< Luma index from AC2FRM element
289
    //@}
290
    int ttfrm;            ///< Transform type info present at frame level
291
    uint8_t ttmbf;        ///< Transform type flag
292
    uint8_t ttblk4x4;     ///< Value of ttblk which indicates a 4x4 transform
293
    int codingset;        ///< index of current table set from 11.8 to use for luma block decoding
294
    int codingset2;       ///< index of current table set from 11.8 to use for chroma block decoding
295
    int pqindex;          ///< raw pqindex used in coding set selection
296
    int a_avail, c_avail;
297
    uint8_t *mb_type_base, *mb_type[3];
298

    
299

    
300
    /** Luma compensation parameters */
301
    //@{
302
    uint8_t lumscale;
303
    uint8_t lumshift;
304
    //@}
305
    int16_t bfraction;    ///< Relative position % anchors=> how to scale MVs
306
    uint8_t halfpq;       ///< Uniform quant over image and qp+.5
307
    uint8_t respic;       ///< Frame-level flag for resized images
308
    int buffer_fullness;  ///< HRD info
309
    /** Ranges:
310
     * -# 0 -> [-64n 63.f] x [-32, 31.f]
311
     * -# 1 -> [-128, 127.f] x [-64, 63.f]
312
     * -# 2 -> [-512, 511.f] x [-128, 127.f]
313
     * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
314
     */
315
    uint8_t mvrange;
316
    uint8_t pquantizer;           ///< Uniform (over sequence) quantizer in use
317
    VLC *cbpcy_vlc;               ///< CBPCY VLC table
318
    int tt_index;                 ///< Index for Transform Type tables
319
    uint8_t* mv_type_mb_plane;    ///< bitplane for mv_type == (4MV)
320
    uint8_t* direct_mb_plane;     ///< bitplane for "direct" MBs
321
    int mv_type_is_raw;           ///< mv type mb plane is not coded
322
    int dmb_is_raw;               ///< direct mb plane is raw
323
    int skip_is_raw;              ///< skip mb plane is not coded
324
    uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
325
    int use_ic;                   ///< use intensity compensation in B-frames
326
    int rnd;                      ///< rounding control
327

    
328
    /** Frame decoding info for S/M profiles only */
329
    //@{
330
    uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
331
    uint8_t interpfrm;
332
    //@}
333

    
334
    /** Frame decoding info for Advanced profile */
335
    //@{
336
    uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
337
    uint8_t numpanscanwin;
338
    uint8_t tfcntr;
339
    uint8_t rptfrm, tff, rff;
340
    uint16_t topleftx;
341
    uint16_t toplefty;
342
    uint16_t bottomrightx;
343
    uint16_t bottomrighty;
344
    uint8_t uvsamp;
345
    uint8_t postproc;
346
    int hrd_num_leaky_buckets;
347
    uint8_t bit_rate_exponent;
348
    uint8_t buffer_size_exponent;
349
    uint8_t* acpred_plane;       ///< AC prediction flags bitplane
350
    int acpred_is_raw;
351
    uint8_t* over_flags_plane;   ///< Overflags bitplane
352
    int overflg_is_raw;
353
    uint8_t condover;
354
    uint16_t *hrd_rate, *hrd_buffer;
355
    uint8_t *hrd_fullness;
356
    uint8_t range_mapy_flag;
357
    uint8_t range_mapuv_flag;
358
    uint8_t range_mapy;
359
    uint8_t range_mapuv;
360
    //@}
361

    
362
    int p_frame_skipped;
363
    int bi_type;
364
} VC1Context;