Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef VP9_ENCODER_VP9_BLOCK_H_
     12 #define VP9_ENCODER_VP9_BLOCK_H_
     13 
     14 #include "vp9/common/vp9_onyx.h"
     15 #include "vp9/common/vp9_entropymv.h"
     16 #include "vp9/common/vp9_entropy.h"
     17 #include "vpx_ports/mem.h"
     18 #include "vp9/common/vp9_onyxc_int.h"
     19 
     20 // motion search site
     21 typedef struct {
     22   MV mv;
     23   int offset;
     24 } search_site;
     25 
     26 typedef struct {
     27   struct {
     28     MB_PREDICTION_MODE mode;
     29   } bmi[4];
     30 } PARTITION_INFO;
     31 
     32 // Structure to hold snapshot of coding context during the mode picking process
     33 // TODO Do we need all of these?
     34 typedef struct {
     35   MODE_INFO mic;
     36   PARTITION_INFO partition_info;
     37   int skip;
     38   int_mv best_ref_mv;
     39   int_mv second_best_ref_mv;
     40   int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
     41   int rate;
     42   int distortion;
     43   int64_t intra_error;
     44   int best_mode_index;
     45   int rddiv;
     46   int rdmult;
     47   int hybrid_pred_diff;
     48   int comp_pred_diff;
     49   int single_pred_diff;
     50   int64_t tx_rd_diff[TX_MODES];
     51   int64_t best_filter_diff[SWITCHABLE_FILTERS + 1];
     52 
     53   // motion vector cache for adaptive motion search control in partition
     54   // search loop
     55   int_mv pred_mv[MAX_REF_FRAMES];
     56 
     57   // Bit flag for each mode whether it has high error in comparison to others.
     58   unsigned int modes_with_high_error;
     59 
     60   // Bit flag for each ref frame whether it has high error compared to others.
     61   unsigned int frames_with_high_error;
     62 } PICK_MODE_CONTEXT;
     63 
     64 struct macroblock_plane {
     65   DECLARE_ALIGNED(16, int16_t, src_diff[64*64]);
     66   DECLARE_ALIGNED(16, int16_t, coeff[64*64]);
     67   struct buf_2d src;
     68 
     69   // Quantizer setings
     70   int16_t *quant;
     71   int16_t *quant_shift;
     72   int16_t *zbin;
     73   int16_t *round;
     74 
     75   // Zbin Over Quant value
     76   int16_t zbin_extra;
     77 };
     78 
     79 /* The [2] dimension is for whether we skip the EOB node (i.e. if previous
     80  * coefficient in this block was zero) or not. */
     81 typedef unsigned int vp9_coeff_cost[BLOCK_TYPES][REF_TYPES][COEF_BANDS][2]
     82                                    [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
     83 
     84 typedef struct macroblock MACROBLOCK;
     85 struct macroblock {
     86   struct macroblock_plane plane[MAX_MB_PLANE];
     87 
     88   MACROBLOCKD e_mbd;
     89   int skip_block;
     90   PARTITION_INFO *partition_info; /* work pointer */
     91   PARTITION_INFO *pi;   /* Corresponds to upper left visible macroblock */
     92   PARTITION_INFO *pip;  /* Base of allocated array */
     93 
     94   search_site *ss;
     95   int ss_count;
     96   int searches_per_step;
     97 
     98   int errorperbit;
     99   int sadperbit16;
    100   int sadperbit4;
    101   int rddiv;
    102   int rdmult;
    103   unsigned int *mb_activity_ptr;
    104   int *mb_norm_activity_ptr;
    105   signed int act_zbin_adj;
    106 
    107   int mv_best_ref_index[MAX_REF_FRAMES];
    108   unsigned int max_mv_context[MAX_REF_FRAMES];
    109   unsigned int source_variance;
    110 
    111   int nmvjointcost[MV_JOINTS];
    112   int nmvcosts[2][MV_VALS];
    113   int *nmvcost[2];
    114   int nmvcosts_hp[2][MV_VALS];
    115   int *nmvcost_hp[2];
    116   int **mvcost;
    117 
    118   int nmvjointsadcost[MV_JOINTS];
    119   int nmvsadcosts[2][MV_VALS];
    120   int *nmvsadcost[2];
    121   int nmvsadcosts_hp[2][MV_VALS];
    122   int *nmvsadcost_hp[2];
    123   int **mvsadcost;
    124 
    125   int mbmode_cost[MB_MODE_COUNT];
    126   unsigned inter_mode_cost[INTER_MODE_CONTEXTS][MB_MODE_COUNT - NEARESTMV];
    127   int intra_uv_mode_cost[2][MB_MODE_COUNT];
    128   int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
    129   int switchable_interp_costs[SWITCHABLE_FILTERS + 1]
    130                              [SWITCHABLE_FILTERS];
    131 
    132   // These define limits to motion vector components to prevent them
    133   // from extending outside the UMV borders
    134   int mv_col_min;
    135   int mv_col_max;
    136   int mv_row_min;
    137   int mv_row_max;
    138 
    139   int skip;
    140 
    141   int encode_breakout;
    142 
    143   unsigned char *active_ptr;
    144 
    145   // note that token_costs is the cost when eob node is skipped
    146   vp9_coeff_cost token_costs[TX_SIZES];
    147 
    148   int optimize;
    149 
    150   // indicate if it is in the rd search loop or encoding process
    151   int use_lp32x32fdct;
    152   int skip_encode;
    153 
    154   // Used to store sub partition's choices.
    155   int fast_ms;
    156   int_mv pred_mv[MAX_REF_FRAMES];
    157   int subblock_ref;
    158 
    159   // TODO(jingning): Need to refactor the structure arrays that buffers the
    160   // coding mode decisions of each partition type.
    161   PICK_MODE_CONTEXT ab4x4_context[4][4][4];
    162   PICK_MODE_CONTEXT sb8x4_context[4][4][4];
    163   PICK_MODE_CONTEXT sb4x8_context[4][4][4];
    164   PICK_MODE_CONTEXT sb8x8_context[4][4][4];
    165   PICK_MODE_CONTEXT sb8x16_context[4][4][2];
    166   PICK_MODE_CONTEXT sb16x8_context[4][4][2];
    167   PICK_MODE_CONTEXT mb_context[4][4];
    168   PICK_MODE_CONTEXT sb32x16_context[4][2];
    169   PICK_MODE_CONTEXT sb16x32_context[4][2];
    170   // when 4 MBs share coding parameters:
    171   PICK_MODE_CONTEXT sb32_context[4];
    172   PICK_MODE_CONTEXT sb32x64_context[2];
    173   PICK_MODE_CONTEXT sb64x32_context[2];
    174   PICK_MODE_CONTEXT sb64_context;
    175   int partition_cost[NUM_PARTITION_CONTEXTS][PARTITION_TYPES];
    176 
    177   BLOCK_SIZE b_partitioning[4][4][4];
    178   BLOCK_SIZE mb_partitioning[4][4];
    179   BLOCK_SIZE sb_partitioning[4];
    180   BLOCK_SIZE sb64_partitioning;
    181 
    182   void (*fwd_txm4x4)(int16_t *input, int16_t *output, int pitch);
    183   void (*fwd_txm8x4)(int16_t *input, int16_t *output, int pitch);
    184   void (*fwd_txm8x8)(int16_t *input, int16_t *output, int pitch);
    185   void (*fwd_txm16x16)(int16_t *input, int16_t *output, int pitch);
    186   void (*quantize_b_4x4)(MACROBLOCK *x, int b_idx, TX_TYPE tx_type,
    187                          int y_blocks);
    188 };
    189 
    190 #endif  // VP9_ENCODER_VP9_BLOCK_H_
    191