Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.     int bits;
  180.  
  181.     /** Simple/Main Profile sequence header */
  182.     //@{
  183.     int res_sprite;       ///< reserved, sprite mode
  184.     int res_y411;         ///< reserved, old interlaced mode
  185.     int res_x8;           ///< reserved
  186.     int multires;         ///< frame-level RESPIC syntax element present
  187.     int res_fasttx;       ///< reserved, always 1
  188.     int res_transtab;     ///< reserved, always 0
  189.     int rangered;         ///< RANGEREDFRM (range reduction) syntax element present
  190.                           ///< at frame level
  191.     int res_rtm_flag;     ///< reserved, set to 1
  192.     int reserved;         ///< reserved
  193.     //@}
  194.  
  195.     /** Advanced Profile */
  196.     //@{
  197.     int level;            ///< 3bits, for Advanced/Simple Profile, provided by TS layer
  198.     int chromaformat;     ///< 2bits, 2=4:2:0, only defined
  199.     int postprocflag;     ///< Per-frame processing suggestion flag present
  200.     int broadcast;        ///< TFF/RFF present
  201.     int interlace;        ///< Progressive/interlaced (RPTFTM syntax element)
  202.     int tfcntrflag;       ///< TFCNTR present
  203.     int panscanflag;      ///< NUMPANSCANWIN, TOPLEFT{X,Y}, BOTRIGHT{X,Y} present
  204.     int refdist_flag;     ///< REFDIST syntax element present in II, IP, PI or PP field picture headers
  205.     int extended_dmv;     ///< Additional extended dmv range at P/B frame-level
  206.     int color_prim;       ///< 8bits, chroma coordinates of the color primaries
  207.     int transfer_char;    ///< 8bits, Opto-electronic transfer characteristics
  208.     int matrix_coef;      ///< 8bits, Color primaries->YCbCr transform matrix
  209.     int hrd_param_flag;   ///< Presence of Hypothetical Reference
  210.                           ///< Decoder parameters
  211.     int psf;              ///< Progressive Segmented Frame
  212.     //@}
  213.  
  214.     /** Sequence header data for all Profiles
  215.      * TODO: choose between ints, uint8_ts and monobit flags
  216.      */
  217.     //@{
  218.     int profile;          ///< 2bits, Profile
  219.     int frmrtq_postproc;  ///< 3bits,
  220.     int bitrtq_postproc;  ///< 5bits, quantized framerate-based postprocessing strength
  221.     int max_coded_width, max_coded_height;
  222.     int fastuvmc;         ///< Rounding of qpel vector to hpel ? (not in Simple)
  223.     int extended_mv;      ///< Ext MV in P/B (not in Simple)
  224.     int dquant;           ///< How qscale varies with MBs, 2bits (not in Simple)
  225.     int vstransform;      ///< variable-size [48]x[48] transform type + info
  226.     int overlap;          ///< overlapped transforms in use
  227.     int quantizer_mode;   ///< 2bits, quantizer mode used for sequence, see QUANT_*
  228.     int finterpflag;      ///< INTERPFRM present
  229.     //@}
  230.  
  231.     /** Frame decoding info for all profiles */
  232.     //@{
  233.     uint8_t mv_mode;             ///< MV coding monde
  234.     uint8_t mv_mode2;            ///< Secondary MV coding mode (B frames)
  235.     int k_x;                     ///< Number of bits for MVs (depends on MV range)
  236.     int k_y;                     ///< Number of bits for MVs (depends on MV range)
  237.     int range_x, range_y;        ///< MV range
  238.     uint8_t pq, altpq;           ///< Current/alternate frame quantizer scale
  239.     uint8_t zz_8x8[4][64];       ///< Zigzag table for TT_8x8, permuted for IDCT
  240.     int left_blk_sh, top_blk_sh; ///< Either 3 or 0, positions of l/t in blk[]
  241.     const uint8_t* zz_8x4;       ///< Zigzag scan table for TT_8x4 coding mode
  242.     const uint8_t* zz_4x8;       ///< Zigzag scan table for TT_4x8 coding mode
  243.     /** pquant parameters */
  244.     //@{
  245.     uint8_t dquantfrm;
  246.     uint8_t dqprofile;
  247.     uint8_t dqsbedge;
  248.     uint8_t dqbilevel;
  249.     //@}
  250.     /** AC coding set indexes
  251.      * @see 8.1.1.10, p(1)10
  252.      */
  253.     //@{
  254.     int c_ac_table_index;    ///< Chroma index from ACFRM element
  255.     int y_ac_table_index;    ///< Luma index from AC2FRM element
  256.     //@}
  257.     int ttfrm;               ///< Transform type info present at frame level
  258.     uint8_t ttmbf;           ///< Transform type flag
  259.     int *ttblk_base, *ttblk; ///< Transform type at the block level
  260.     int codingset;           ///< index of current table set from 11.8 to use for luma block decoding
  261.     int codingset2;          ///< index of current table set from 11.8 to use for chroma block decoding
  262.     int pqindex;             ///< raw pqindex used in coding set selection
  263.     int a_avail, c_avail;
  264.     uint8_t *mb_type_base, *mb_type[3];
  265.  
  266.  
  267.     /** Luma compensation parameters */
  268.     //@{
  269.     uint8_t lumscale;
  270.     uint8_t lumshift;
  271.     //@}
  272.     int16_t bfraction;    ///< Relative position % anchors=> how to scale MVs
  273.     uint8_t halfpq;       ///< Uniform quant over image and qp+.5
  274.     uint8_t respic;       ///< Frame-level flag for resized images
  275.     int buffer_fullness;  ///< HRD info
  276.     /** Ranges:
  277.      * -# 0 -> [-64n 63.f] x [-32, 31.f]
  278.      * -# 1 -> [-128, 127.f] x [-64, 63.f]
  279.      * -# 2 -> [-512, 511.f] x [-128, 127.f]
  280.      * -# 3 -> [-1024, 1023.f] x [-256, 255.f]
  281.      */
  282.     uint8_t mvrange;                ///< Extended MV range flag
  283.     uint8_t pquantizer;             ///< Uniform (over sequence) quantizer in use
  284.     VLC *cbpcy_vlc;                 ///< CBPCY VLC table
  285.     int tt_index;                   ///< Index for Transform Type tables (to decode TTMB)
  286.     uint8_t* mv_type_mb_plane;      ///< bitplane for mv_type == (4MV)
  287.     uint8_t* direct_mb_plane;       ///< bitplane for "direct" MBs
  288.     uint8_t* forward_mb_plane;      ///< bitplane for "forward" MBs
  289.     int mv_type_is_raw;             ///< mv type mb plane is not coded
  290.     int dmb_is_raw;                 ///< direct mb plane is raw
  291.     int fmb_is_raw;                 ///< forward mb plane is raw
  292.     int skip_is_raw;                ///< skip mb plane is not coded
  293.     uint8_t last_luty[2][256], last_lutuv[2][256];  ///< lookup tables used for intensity compensation
  294.     uint8_t  aux_luty[2][256],  aux_lutuv[2][256];  ///< lookup tables used for intensity compensation
  295.     uint8_t next_luty[2][256], next_lutuv[2][256];  ///< lookup tables used for intensity compensation
  296.     uint8_t (*curr_luty)[256]  ,(*curr_lutuv)[256];
  297.     int last_use_ic, *curr_use_ic, next_use_ic, aux_use_ic;
  298.     int rnd;                        ///< rounding control
  299.  
  300.     /** Frame decoding info for S/M profiles only */
  301.     //@{
  302.     uint8_t rangeredfrm;            ///< out_sample = CLIP((in_sample-128)*2+128)
  303.     uint8_t interpfrm;
  304.     //@}
  305.  
  306.     /** Frame decoding info for Advanced profile */
  307.     //@{
  308.     enum FrameCodingMode fcm;
  309.     uint8_t numpanscanwin;
  310.     uint8_t tfcntr;
  311.     uint8_t rptfrm, tff, rff;
  312.     uint16_t topleftx;
  313.     uint16_t toplefty;
  314.     uint16_t bottomrightx;
  315.     uint16_t bottomrighty;
  316.     uint8_t uvsamp;
  317.     uint8_t postproc;
  318.     int hrd_num_leaky_buckets;
  319.     uint8_t bit_rate_exponent;
  320.     uint8_t buffer_size_exponent;
  321.     uint8_t* acpred_plane;       ///< AC prediction flags bitplane
  322.     int acpred_is_raw;
  323.     uint8_t* over_flags_plane;   ///< Overflags bitplane
  324.     int overflg_is_raw;
  325.     uint8_t condover;
  326.     uint16_t *hrd_rate, *hrd_buffer;
  327.     uint8_t *hrd_fullness;
  328.     uint8_t range_mapy_flag;
  329.     uint8_t range_mapuv_flag;
  330.     uint8_t range_mapy;
  331.     uint8_t range_mapuv;
  332.     //@}
  333.  
  334.     /** Frame decoding info for interlaced picture */
  335.     uint8_t dmvrange;   ///< Extended differential MV range flag
  336.     int fourmvswitch;
  337.     int intcomp;
  338.     uint8_t lumscale2;  ///< for interlaced field P picture
  339.     uint8_t lumshift2;
  340.     VLC* mbmode_vlc;
  341.     VLC* imv_vlc;
  342.     VLC* twomvbp_vlc;
  343.     VLC* fourmvbp_vlc;
  344.     uint8_t twomvbp;
  345.     uint8_t fourmvbp;
  346.     uint8_t* fieldtx_plane;
  347.     int fieldtx_is_raw;
  348.     uint8_t zzi_8x8[64];
  349.     uint8_t *blk_mv_type_base, *blk_mv_type;    ///< 0: frame MV, 1: field MV (interlaced frame)
  350.     uint8_t *mv_f_base, *mv_f[2];               ///< 0: MV obtained from same field, 1: opposite field
  351.     uint8_t *mv_f_next_base, *mv_f_next[2];
  352.     int field_mode;         ///< 1 for interlaced field pictures
  353.     int fptype;
  354.     int second_field;
  355.     int refdist;            ///< distance of the current picture from reference
  356.     int numref;             ///< number of past field pictures used as reference
  357.                             // 0 corresponds to 1 and 1 corresponds to 2 references
  358.     int reffield;           ///< if numref = 0 (1 reference) then reffield decides which
  359.                             // field to use among the two fields from previous frame
  360.     int intcompfield;       ///< which of the two fields to be intensity compensated
  361.                             // 0: both fields, 1: bottom field, 2: top field
  362.     int cur_field_type;     ///< 0: top, 1: bottom
  363.     int ref_field_type[2];  ///< forward and backward reference field type (top or bottom)
  364.     int blocks_off, mb_off;
  365.     int qs_last;            ///< if qpel has been used in the previous (tr.) picture
  366.     int bmvtype;
  367.     int frfd, brfd;         ///< reference frame distance (forward or backward)
  368.     int first_pic_header_flag;
  369.     int pic_header_flag;
  370.  
  371.     /** Frame decoding info for sprite modes */
  372.     //@{
  373.     int new_sprite;
  374.     int two_sprites;
  375.     AVFrame *sprite_output_frame;
  376.     int output_width, output_height, sprite_width, sprite_height;
  377.     uint8_t* sr_rows[2][2];      ///< Sprite resizer line cache
  378.     //@}
  379.  
  380.     int p_frame_skipped;
  381.     int bi_type;
  382.     int x8_type;
  383.  
  384.     int16_t (*block)[6][64];
  385.     int n_allocated_blks, cur_blk_idx, left_blk_idx, topleft_blk_idx, top_blk_idx;
  386.     uint32_t *cbp_base, *cbp;
  387.     uint8_t *is_intra_base, *is_intra;
  388.     int16_t (*luma_mv_base)[2], (*luma_mv)[2];
  389.     uint8_t bfraction_lut_index; ///< Index for BFRACTION value (see Table 40, reproduced into ff_vc1_bfraction_lut[])
  390.     uint8_t broken_link;         ///< Broken link flag (BROKEN_LINK syntax element)
  391.     uint8_t closed_entry;        ///< Closed entry point flag (CLOSED_ENTRY syntax element)
  392.  
  393.     int end_mb_x;                ///< Horizontal macroblock limit (used only by mss2)
  394.  
  395.     int parse_only;              ///< Context is used within parser
  396.     int resync_marker;           ///< could this stream contain resync markers
  397. } VC1Context;
  398.  
  399. /**
  400.  * Decode Simple/Main Profiles sequence header
  401.  * @see Figure 7-8, p16-17
  402.  * @param avctx Codec context
  403.  * @param gb GetBit context initialized from Codec context extra_data
  404.  * @return Status
  405.  */
  406. int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
  407.  
  408. int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb);
  409.  
  410. int ff_vc1_parse_frame_header    (VC1Context *v, GetBitContext *gb);
  411. int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext *gb);
  412. int ff_vc1_init_common(VC1Context *v);
  413.  
  414. int  ff_vc1_decode_init_alloc_tables(VC1Context *v);
  415. void ff_vc1_init_transposed_scantables(VC1Context *v);
  416. int  ff_vc1_decode_end(AVCodecContext *avctx);
  417. void ff_vc1_decode_blocks(VC1Context *v);
  418.  
  419. void ff_vc1_loop_filter_iblk(VC1Context *v, int pq);
  420. void ff_vc1_loop_filter_iblk_delayed(VC1Context *v, int pq);
  421. void ff_vc1_smooth_overlap_filter_iblk(VC1Context *v);
  422. void ff_vc1_apply_p_loop_filter(VC1Context *v);
  423.  
  424. void ff_vc1_mc_1mv(VC1Context *v, int dir);
  425. void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg);
  426. void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir);
  427. void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg);
  428.  
  429. void ff_vc1_interp_mc(VC1Context *v);
  430.  
  431. #endif /* AVCODEC_VC1_H */
  432.