• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  #ifndef AVCODEC_VC1_H
24  #define AVCODEC_VC1_H
25  
26  #include "avcodec.h"
27  #include "h264chroma.h"
28  #include "mpegvideo.h"
29  #include "intrax8.h"
30  #include "vc1_common.h"
31  #include "vc1dsp.h"
32  
33  #define AC_VLC_BITS 9
34  
35  /** Sequence quantizer mode */
36  //@{
37  enum QuantMode {
38      QUANT_FRAME_IMPLICIT,    ///< Implicitly specified at frame level
39      QUANT_FRAME_EXPLICIT,    ///< Explicitly specified at frame level
40      QUANT_NON_UNIFORM,       ///< Non-uniform quant used for all frames
41      QUANT_UNIFORM            ///< Uniform quant used for all frames
42  };
43  //@}
44  
45  /** Where quant can be changed */
46  //@{
47  enum DQProfile {
48      DQPROFILE_FOUR_EDGES,
49      DQPROFILE_DOUBLE_EDGES,
50      DQPROFILE_SINGLE_EDGE,
51      DQPROFILE_ALL_MBS
52  };
53  //@}
54  
55  /** @name Where quant can be changed
56   */
57  //@{
58  enum DQSingleEdge {
59      DQSINGLE_BEDGE_LEFT,
60      DQSINGLE_BEDGE_TOP,
61      DQSINGLE_BEDGE_RIGHT,
62      DQSINGLE_BEDGE_BOTTOM
63  };
64  //@}
65  
66  /** Which pair of edges is quantized with ALTPQUANT */
67  //@{
68  enum DQDoubleEdge {
69      DQDOUBLE_BEDGE_TOPLEFT,
70      DQDOUBLE_BEDGE_TOPRIGHT,
71      DQDOUBLE_BEDGE_BOTTOMRIGHT,
72      DQDOUBLE_BEDGE_BOTTOMLEFT
73  };
74  //@}
75  
76  /** MV modes for P-frames */
77  //@{
78  enum MVModes {
79      MV_PMODE_1MV_HPEL_BILIN,
80      MV_PMODE_1MV,
81      MV_PMODE_1MV_HPEL,
82      MV_PMODE_MIXED_MV,
83      MV_PMODE_INTENSITY_COMP
84  };
85  //@}
86  
87  /** MBMODE for interlaced frame P-picture */
88  //@{
89  enum MBModesIntfr {
90      MV_PMODE_INTFR_1MV,
91      MV_PMODE_INTFR_2MV_FIELD,
92      MV_PMODE_INTFR_2MV,
93      MV_PMODE_INTFR_4MV_FIELD,
94      MV_PMODE_INTFR_4MV,
95      MV_PMODE_INTFR_INTRA,
96  };
97  //@}
98  
99  /** @name MV types for B-frames */
100  //@{
101  enum BMVTypes {
102      BMV_TYPE_BACKWARD,
103      BMV_TYPE_FORWARD,
104      BMV_TYPE_INTERPOLATED,
105      BMV_TYPE_DIRECT
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  enum CodingSet {
124      CS_HIGH_MOT_INTRA = 0,
125      CS_HIGH_MOT_INTER,
126      CS_LOW_MOT_INTRA,
127      CS_LOW_MOT_INTER,
128      CS_MID_RATE_INTRA,
129      CS_MID_RATE_INTER,
130      CS_HIGH_RATE_INTRA,
131      CS_HIGH_RATE_INTER
132  };
133  
134  /** @name Overlap conditions for Advanced Profile */
135  //@{
136  enum COTypes {
137      CONDOVER_NONE = 0,
138      CONDOVER_ALL,
139      CONDOVER_SELECT
140  };
141  //@}
142  
143  /**
144   * FCM Frame Coding Mode
145   * @note some content might be marked interlaced
146   * but have fcm set to 0 as well (e.g. HD-DVD)
147   */
148  enum FrameCodingMode {
149      PROGRESSIVE = 0,    ///<  in the bitstream is reported as 00b
150      ILACE_FRAME,        ///<  in the bitstream is reported as 10b
151      ILACE_FIELD         ///<  in the bitstream is reported as 11b
152  };
153  
154  /**
155   * Imode types
156   * @{
157   */
158  enum Imode {
159      IMODE_RAW,
160      IMODE_NORM2,
161      IMODE_DIFF2,
162      IMODE_NORM6,
163      IMODE_DIFF6,
164      IMODE_ROWSKIP,
165      IMODE_COLSKIP
166  };
167  /** @} */ //imode defines
168  
169  /** The VC1 Context
170   * @todo Change size wherever another size is more efficient
171   * Many members are only used for Advanced Profile
172   */
173  typedef struct VC1Context{
174      MpegEncContext s;
175      IntraX8Context x8;
176      H264ChromaContext h264chroma;
177      VC1DSPContext vc1dsp;
178  
179      /** Simple/Main Profile sequence header */
180      //@{
181      int res_sprite;       ///< reserved, sprite mode
182      int res_y411;         ///< reserved, old interlaced mode
183      int res_x8;           ///< reserved
184      int multires;         ///< frame-level RESPIC syntax element present
185      int res_fasttx;       ///< reserved, always 1
186      int res_transtab;     ///< reserved, always 0
187      int rangered;         ///< RANGEREDFRM (range reduction) syntax element present
188                            ///< at frame level
189      int res_rtm_flag;     ///< reserved, set to 1
190      int reserved;         ///< reserved
191      //@}
192  
193      /** Advanced Profile */
194      //@{
195      int level;            ///< 3 bits, for Advanced/Simple Profile, provided by TS layer
196      int chromaformat;     ///< 2 bits, 2=4:2:0, only defined
197      int postprocflag;     ///< Per-frame processing suggestion flag present
198      int broadcast;        ///< TFF/RFF present
199      int interlace;        ///< Progressive/interlaced (RPTFTM syntax element)
200      int tfcntrflag;       ///< TFCNTR present
201      int panscanflag;      ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
202      int refdist_flag;     ///< REFDIST syntax element present in II, IP, PI or PP field picture headers
203      int extended_dmv;     ///< Additional extended dmv range at P/B-frame-level
204      int color_prim;       ///< 8 bits, chroma coordinates of the color primaries
205      int transfer_char;    ///< 8 bits, Opto-electronic transfer characteristics
206      int matrix_coef;      ///< 8 bits, Color primaries->YCbCr transform matrix
207      int hrd_param_flag;   ///< Presence of Hypothetical Reference
208                            ///< Decoder parameters
209      int psf;              ///< Progressive Segmented Frame
210      //@}
211  
212      /** Sequence header data for all Profiles
213       * TODO: choose between ints, uint8_ts and monobit flags
214       */
215      //@{
216      int profile;          ///< 2 bits, Profile
217      int frmrtq_postproc;  ///< 3 bits,
218      int bitrtq_postproc;  ///< 5 bits, quantized framerate-based postprocessing strength
219      int max_coded_width, max_coded_height;
220      int fastuvmc;         ///< Rounding of qpel vector to hpel ? (not in Simple)
221      int extended_mv;      ///< Ext MV in P/B (not in Simple)
222      int dquant;           ///< How qscale varies with MBs, 2 bits (not in Simple)
223      int vstransform;      ///< variable-size [48]x[48] transform type + info
224      int overlap;          ///< overlapped transforms in use
225      int quantizer_mode;   ///< 2 bits, quantizer mode used for sequence, see QUANT_*
226      int finterpflag;      ///< INTERPFRM present
227      //@}
228  
229      /** Frame decoding info for all profiles */
230      //@{
231      uint8_t mv_mode;             ///< MV coding mode
232      uint8_t mv_mode2;            ///< Secondary MV coding mode (B-frames)
233      int k_x;                     ///< Number of bits for MVs (depends on MV range)
234      int k_y;                     ///< Number of bits for MVs (depends on MV range)
235      int range_x, range_y;        ///< MV range
236      uint8_t pq, altpq;           ///< Current/alternate frame quantizer scale
237      uint8_t zz_8x8[4][64];       ///< Zigzag table for TT_8x8, permuted for IDCT
238      int left_blk_sh, top_blk_sh; ///< Either 3 or 0, positions of l/t in blk[]
239      const uint8_t* zz_8x4;       ///< Zigzag scan table for TT_8x4 coding mode
240      const uint8_t* zz_4x8;       ///< Zigzag scan table for TT_4x8 coding mode
241      /** pquant parameters */
242      //@{
243      uint8_t dquantfrm;
244      uint8_t dqprofile;
245      uint8_t dqsbedge;
246      uint8_t dqbilevel;
247      //@}
248      /** AC coding set indexes
249       * @see 8.1.1.10, p(1)10
250       */
251      //@{
252      int c_ac_table_index;    ///< Chroma index from ACFRM element
253      int y_ac_table_index;    ///< Luma index from AC2FRM element
254      //@}
255      int ttfrm;               ///< Transform type info present at frame level
256      uint8_t ttmbf;           ///< Transform type flag
257      int *ttblk_base, *ttblk; ///< Transform type at the block level
258      int codingset;           ///< index of current table set from 11.8 to use for luma block decoding
259      int codingset2;          ///< index of current table set from 11.8 to use for chroma block decoding
260      int pqindex;             ///< raw pqindex used in coding set selection
261      int a_avail, c_avail;
262      uint8_t *mb_type_base, *mb_type[3];
263  
264  
265      /** Luma compensation parameters */
266      //@{
267      uint8_t lumscale;
268      uint8_t lumshift;
269      //@}
270      int16_t bfraction;    ///< Relative position % anchors=> how to scale MVs
271      uint8_t halfpq;       ///< Uniform quant over image and qp+.5
272      uint8_t respic;       ///< Frame-level flag for resized images
273      int buffer_fullness;  ///< HRD info
274      /** Ranges:
275       * -# 0 -> [-64n 63.f] x [-32, 31.f]
276       * -# 1 -> [-128, 127.f] x [-64, 63.f]
277       * -# 2 -> [-512, 511.f] x [-128, 127.f]
278       * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
279       */
280      uint8_t mvrange;                ///< Extended MV range flag
281      uint8_t pquantizer;             ///< Uniform (over sequence) quantizer in use
282      VLC *cbpcy_vlc;                 ///< CBPCY VLC table
283      int tt_index;                   ///< Index for Transform Type tables (to decode TTMB)
284      uint8_t* mv_type_mb_plane;      ///< bitplane for mv_type == (4MV)
285      uint8_t* direct_mb_plane;       ///< bitplane for "direct" MBs
286      uint8_t* forward_mb_plane;      ///< bitplane for "forward" MBs
287      int mv_type_is_raw;             ///< mv type mb plane is not coded
288      int dmb_is_raw;                 ///< direct mb plane is raw
289      int fmb_is_raw;                 ///< forward mb plane is raw
290      int skip_is_raw;                ///< skip mb plane is not coded
291      uint8_t last_luty[2][256], last_lutuv[2][256];  ///< lookup tables used for intensity compensation
292      uint8_t  aux_luty[2][256],  aux_lutuv[2][256];  ///< lookup tables used for intensity compensation
293      uint8_t next_luty[2][256], next_lutuv[2][256];  ///< lookup tables used for intensity compensation
294      uint8_t (*curr_luty)[256]  ,(*curr_lutuv)[256];
295      int last_use_ic, *curr_use_ic, next_use_ic, aux_use_ic;
296      int rnd;                        ///< rounding control
297      int cbptab;
298  
299      /** Frame decoding info for S/M profiles only */
300      //@{
301      uint8_t rangeredfrm;            ///< out_sample = CLIP((in_sample-128)*2+128)
302      uint8_t interpfrm;
303      //@}
304  
305      /** Frame decoding info for Advanced profile */
306      //@{
307      enum FrameCodingMode fcm;
308      uint8_t numpanscanwin;
309      uint8_t tfcntr;
310      uint8_t rptfrm, tff, rff;
311      uint16_t topleftx;
312      uint16_t toplefty;
313      uint16_t bottomrightx;
314      uint16_t bottomrighty;
315      uint8_t uvsamp;
316      uint8_t postproc;
317      int hrd_num_leaky_buckets;
318      uint8_t bit_rate_exponent;
319      uint8_t buffer_size_exponent;
320      uint8_t* acpred_plane;       ///< AC prediction flags bitplane
321      int acpred_is_raw;
322      uint8_t* over_flags_plane;   ///< Overflags bitplane
323      int overflg_is_raw;
324      uint8_t condover;
325      uint8_t range_mapy_flag;
326      uint8_t range_mapuv_flag;
327      uint8_t range_mapy;
328      uint8_t range_mapuv;
329      //@}
330  
331      /** Frame decoding info for interlaced picture */
332      uint8_t dmvrange;   ///< Extended differential MV range flag
333      int fourmvswitch;
334      int intcomp;
335      uint8_t lumscale2;  ///< for interlaced field P picture
336      uint8_t lumshift2;
337      VLC* mbmode_vlc;
338      VLC* imv_vlc;
339      VLC* twomvbp_vlc;
340      VLC* fourmvbp_vlc;
341      uint8_t twomvbp;
342      uint8_t fourmvbp;
343      uint8_t* fieldtx_plane;
344      int fieldtx_is_raw;
345      uint8_t zzi_8x8[64];
346      uint8_t *blk_mv_type_base, *blk_mv_type;    ///< 0: frame MV, 1: field MV (interlaced frame)
347      uint8_t *mv_f_base, *mv_f[2];               ///< 0: MV obtained from same field, 1: opposite field
348      uint8_t *mv_f_next_base, *mv_f_next[2];
349      int field_mode;         ///< 1 for interlaced field pictures
350      int fptype;
351      int second_field;
352      int refdist;            ///< distance of the current picture from reference
353      int numref;             ///< number of past field pictures used as reference
354                              // 0 corresponds to 1 and 1 corresponds to 2 references
355      int reffield;           ///< if numref = 0 (1 reference) then reffield decides which
356                              // field to use among the two fields from previous frame
357      int intcompfield;       ///< which of the two fields to be intensity compensated
358                              // 0: both fields, 1: bottom field, 2: top field
359      int cur_field_type;     ///< 0: top, 1: bottom
360      int ref_field_type[2];  ///< forward and backward reference field type (top or bottom)
361      int blocks_off, mb_off;
362      int qs_last;            ///< if qpel has been used in the previous (tr.) picture
363      int bmvtype;
364      int frfd, brfd;         ///< reference frame distance (forward or backward)
365      int first_pic_header_flag;
366      int pic_header_flag;
367      int mbmodetab;
368      int icbptab;
369      int imvtab;
370      int twomvbptab;
371      int fourmvbptab;
372  
373      /** Frame decoding info for sprite modes */
374      //@{
375      int new_sprite;
376      int two_sprites;
377      AVFrame *sprite_output_frame;
378      int output_width, output_height, sprite_width, sprite_height;
379      uint8_t* sr_rows[2][2];      ///< Sprite resizer line cache
380      //@}
381  
382      int p_frame_skipped;
383      int bi_type;
384      int x8_type;
385  
386      int16_t (*block)[6][64];
387      int n_allocated_blks, cur_blk_idx, left_blk_idx, topleft_blk_idx, top_blk_idx;
388      uint32_t *cbp_base, *cbp;
389      uint8_t *is_intra_base, *is_intra;
390      int16_t (*luma_mv_base)[2], (*luma_mv)[2];
391      uint8_t bfraction_lut_index; ///< Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[])
392      uint8_t broken_link;         ///< Broken link flag (BROKEN_LINK syntax element)
393      uint8_t closed_entry;        ///< Closed entry point flag (CLOSED_ENTRY syntax element)
394  
395      int end_mb_x;                ///< Horizontal macroblock limit (used only by mss2)
396  
397      int parse_only;              ///< Context is used within parser
398      int resync_marker;           ///< could this stream contain resync markers
399  } VC1Context;
400  
401  /**
402   * Decode Simple/Main Profiles sequence header
403   * @see Figure 7-8, p16-17
404   * @param avctx Codec context
405   * @param gb GetBit context initialized from Codec context extra_data
406   * @return Status
407   */
408  int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
409  
410  int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
411  
412  int ff_vc1_parse_frame_header    (VC1Context *v, GetBitContext *gb);
413  int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext *gb);
414  void ff_vc1_init_common(VC1Context *v);
415  
416  int  ff_vc1_decode_init_alloc_tables(VC1Context *v);
417  void ff_vc1_init_transposed_scantables(VC1Context *v);
418  int  ff_vc1_decode_end(AVCodecContext *avctx);
419  void ff_vc1_decode_blocks(VC1Context *v);
420  
421  void ff_vc1_i_overlap_filter(VC1Context *v);
422  void ff_vc1_p_overlap_filter(VC1Context *v);
423  void ff_vc1_i_loop_filter(VC1Context *v);
424  void ff_vc1_p_loop_filter(VC1Context *v);
425  void ff_vc1_p_intfr_loop_filter(VC1Context *v);
426  void ff_vc1_b_intfi_loop_filter(VC1Context *v);
427  
428  void ff_vc1_mc_1mv(VC1Context *v, int dir);
429  void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg);
430  void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir);
431  void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg);
432  
433  void ff_vc1_interp_mc(VC1Context *v);
434  
435  #endif /* AVCODEC_VC1_H */
436