Revision 7d9a6a0f

View differences:

libavcodec/vc1.c
47 47
#define AC_VLC_BITS 9
48 48
static const uint16_t table_mb_intra[64][2];
49 49

  
50
/** Available Profiles */
51
//@{
52
enum Profile {
53
    PROFILE_SIMPLE,
54
    PROFILE_MAIN,
55
    PROFILE_COMPLEX, ///< TODO: WMV9 specific
56
    PROFILE_ADVANCED
57
};
58
//@}
59

  
60
/** Sequence quantizer mode */
61
//@{
62
enum QuantMode {
63
    QUANT_FRAME_IMPLICIT,    ///< Implicitly specified at frame level
64
    QUANT_FRAME_EXPLICIT,    ///< Explicitly specified at frame level
65
    QUANT_NON_UNIFORM,       ///< Non-uniform quant used for all frames
66
    QUANT_UNIFORM            ///< Uniform quant used for all frames
67
};
68
//@}
69

  
70
/** Where quant can be changed */
71
//@{
72
enum DQProfile {
73
    DQPROFILE_FOUR_EDGES,
74
    DQPROFILE_DOUBLE_EDGES,
75
    DQPROFILE_SINGLE_EDGE,
76
    DQPROFILE_ALL_MBS
77
};
78
//@}
79

  
80
/** @name Where quant can be changed
81
 */
82
//@{
83
enum DQSingleEdge {
84
    DQSINGLE_BEDGE_LEFT,
85
    DQSINGLE_BEDGE_TOP,
86
    DQSINGLE_BEDGE_RIGHT,
87
    DQSINGLE_BEDGE_BOTTOM
88
};
89
//@}
90

  
91
/** Which pair of edges is quantized with ALTPQUANT */
92
//@{
93
enum DQDoubleEdge {
94
    DQDOUBLE_BEDGE_TOPLEFT,
95
    DQDOUBLE_BEDGE_TOPRIGHT,
96
    DQDOUBLE_BEDGE_BOTTOMRIGHT,
97
    DQDOUBLE_BEDGE_BOTTOMLEFT
98
};
99
//@}
100

  
101
/** MV modes for P frames */
102
//@{
103
enum MVModes {
104
    MV_PMODE_1MV_HPEL_BILIN,
105
    MV_PMODE_1MV,
106
    MV_PMODE_1MV_HPEL,
107
    MV_PMODE_MIXED_MV,
108
    MV_PMODE_INTENSITY_COMP
109
};
110
//@}
111

  
112
/** @name MV types for B frames */
113
//@{
114
enum BMVTypes {
115
    BMV_TYPE_BACKWARD,
116
    BMV_TYPE_FORWARD,
117
    BMV_TYPE_INTERPOLATED
118
};
119
//@}
120

  
121
/** @name Block types for P/B frames */
122
//@{
123
enum TransformTypes {
124
    TT_8X8,
125
    TT_8X4_BOTTOM,
126
    TT_8X4_TOP,
127
    TT_8X4, //Both halves
128
    TT_4X8_RIGHT,
129
    TT_4X8_LEFT,
130
    TT_4X8, //Both halves
131
    TT_4X4
132
};
133
//@}
134

  
135
/** Table for conversion between TTBLK and TTMB */
136
static const int ttblk_to_tt[3][8] = {
137
  { TT_8X4, TT_4X8, TT_8X8, TT_4X4, TT_8X4_TOP, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT },
138
  { TT_8X8, TT_4X8_RIGHT, TT_4X8_LEFT, TT_4X4, TT_8X4, TT_4X8, TT_8X4_BOTTOM, TT_8X4_TOP },
139
  { TT_8X8, TT_4X8, TT_4X4, TT_8X4_BOTTOM, TT_4X8_RIGHT, TT_4X8_LEFT, TT_8X4, TT_8X4_TOP }
140
};
141

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

  
144
/** MV P mode - the 5th element is only used for mode 1 */
145
static const uint8_t mv_pmode_table[2][5] = {
146
  { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_MIXED_MV },
147
  { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_INTENSITY_COMP, MV_PMODE_1MV_HPEL_BILIN }
148
};
149
static const uint8_t mv_pmode_table2[2][4] = {
150
  { MV_PMODE_1MV_HPEL_BILIN, MV_PMODE_1MV, MV_PMODE_1MV_HPEL, MV_PMODE_MIXED_MV },
151
  { MV_PMODE_1MV, MV_PMODE_MIXED_MV, MV_PMODE_1MV_HPEL, MV_PMODE_1MV_HPEL_BILIN }
152
};
153

  
154
/** One more frame type */
155
#define BI_TYPE 7
156

  
157
static const int fps_nr[5] = { 24, 25, 30, 50, 60 },
158
  fps_dr[2] = { 1000, 1001 };
159
static const uint8_t pquant_table[3][32] = {
160
  {  /* Implicit quantizer */
161
     0,  1,  2,  3,  4,  5,  6,  7,  8,  6,  7,  8,  9, 10, 11, 12,
162
    13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 29, 31
163
  },
164
  {  /* Explicit quantizer, pquantizer uniform */
165
     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
166
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
167
  },
168
  {  /* Explicit quantizer, pquantizer non-uniform */
169
     0,  1,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
170
    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 31
171
  }
172
};
173

  
174
/** @name VC-1 VLC tables and defines
175
 *  @todo TODO move this into the context
176
 */
177
//@{
178
#define VC1_BFRACTION_VLC_BITS 7
179
static VLC vc1_bfraction_vlc;
180
#define VC1_IMODE_VLC_BITS 4
181
static VLC vc1_imode_vlc;
182
#define VC1_NORM2_VLC_BITS 3
183
static VLC vc1_norm2_vlc;
184
#define VC1_NORM6_VLC_BITS 9
185
static VLC vc1_norm6_vlc;
186
/* Could be optimized, one table only needs 8 bits */
187
#define VC1_TTMB_VLC_BITS 9 //12
188
static VLC vc1_ttmb_vlc[3];
189
#define VC1_MV_DIFF_VLC_BITS 9 //15
190
static VLC vc1_mv_diff_vlc[4];
191
#define VC1_CBPCY_P_VLC_BITS 9 //14
192
static VLC vc1_cbpcy_p_vlc[4];
193
#define VC1_4MV_BLOCK_PATTERN_VLC_BITS 6
194
static VLC vc1_4mv_block_pattern_vlc[4];
195
#define VC1_TTBLK_VLC_BITS 5
196
static VLC vc1_ttblk_vlc[3];
197
#define VC1_SUBBLKPAT_VLC_BITS 6
198
static VLC vc1_subblkpat_vlc[3];
199

  
200
static VLC vc1_ac_coeff_table[8];
201
//@}
202

  
203
enum CodingSet {
204
    CS_HIGH_MOT_INTRA = 0,
205
    CS_HIGH_MOT_INTER,
206
    CS_LOW_MOT_INTRA,
207
    CS_LOW_MOT_INTER,
208
    CS_MID_RATE_INTRA,
209
    CS_MID_RATE_INTER,
210
    CS_HIGH_RATE_INTRA,
211
    CS_HIGH_RATE_INTER
212
};
213

  
214
/** @name Overlap conditions for Advanced Profile */
215
//@{
216
enum COTypes {
217
    CONDOVER_NONE = 0,
218
    CONDOVER_ALL,
219
    CONDOVER_SELECT
220
};
221
//@}
222

  
223

  
224
/** The VC1 Context
225
 * @fixme Change size wherever another size is more efficient
226
 * Many members are only used for Advanced Profile
227
 */
228
typedef struct VC1Context{
229
    MpegEncContext s;
230

  
231
    int bits;
232

  
233
    /** Simple/Main Profile sequence header */
234
    //@{
235
    int res_sm;           ///< reserved, 2b
236
    int res_x8;           ///< reserved
237
    int multires;         ///< frame-level RESPIC syntax element present
238
    int res_fasttx;       ///< reserved, always 1
239
    int res_transtab;     ///< reserved, always 0
240
    int rangered;         ///< RANGEREDFRM (range reduction) syntax element present
241
                          ///< at frame level
242
    int res_rtm_flag;     ///< reserved, set to 1
243
    int reserved;         ///< reserved
244
    //@}
245

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

  
264
    /** Sequence header data for all Profiles
265
     * TODO: choose between ints, uint8_ts and monobit flags
266
     */
267
    //@{
268
    int profile;          ///< 2bits, Profile
269
    int frmrtq_postproc;  ///< 3bits,
270
    int bitrtq_postproc;  ///< 5bits, quantized framerate-based postprocessing strength
271
    int fastuvmc;         ///< Rounding of qpel vector to hpel ? (not in Simple)
272
    int extended_mv;      ///< Ext MV in P/B (not in Simple)
273
    int dquant;           ///< How qscale varies with MBs, 2bits (not in Simple)
274
    int vstransform;      ///< variable-size [48]x[48] transform type + info
275
    int overlap;          ///< overlapped transforms in use
276
    int quantizer_mode;   ///< 2bits, quantizer mode used for sequence, see QUANT_*
277
    int finterpflag;      ///< INTERPFRM present
278
    //@}
279

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

  
311

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

  
340
    /** Frame decoding info for S/M profiles only */
341
    //@{
342
    uint8_t rangeredfrm; ///< out_sample = CLIP((in_sample-128)*2+128)
343
    uint8_t interpfrm;
344
    //@}
345

  
346
    /** Frame decoding info for Advanced profile */
347
    //@{
348
    uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
349
    uint8_t numpanscanwin;
350
    uint8_t tfcntr;
351
    uint8_t rptfrm, tff, rff;
352
    uint16_t topleftx;
353
    uint16_t toplefty;
354
    uint16_t bottomrightx;
355
    uint16_t bottomrighty;
356
    uint8_t uvsamp;
357
    uint8_t postproc;
358
    int hrd_num_leaky_buckets;
359
    uint8_t bit_rate_exponent;
360
    uint8_t buffer_size_exponent;
361
    uint8_t* acpred_plane;       ///< AC prediction flags bitplane
362
    int acpred_is_raw;
363
    uint8_t* over_flags_plane;   ///< Overflags bitplane
364
    int overflg_is_raw;
365
    uint8_t condover;
366
    uint16_t *hrd_rate, *hrd_buffer;
367
    uint8_t *hrd_fullness;
368
    uint8_t range_mapy_flag;
369
    uint8_t range_mapuv_flag;
370
    uint8_t range_mapy;
371
    uint8_t range_mapuv;
372
    //@}
373

  
374
    int p_frame_skipped;
375
    int bi_type;
376
} VC1Context;
377 50

  
378 51
/**
379 52
 * Get unary code of limited length
libavcodec/vc1.h
34 34
//@}
35 35

  
36 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;

Also available in: Unified diff