media/libvpx/vp9/encoder/vp9_block.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  */
    11 #ifndef VP9_ENCODER_VP9_BLOCK_H_
    12 #define VP9_ENCODER_VP9_BLOCK_H_
    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"
    20 // motion search site
    21 typedef struct {
    22   MV mv;
    23   int offset;
    24 } search_site;
    26 // Structure to hold snapshot of coding context during the mode picking process
    27 typedef struct {
    28   MODE_INFO mic;
    29   uint8_t *zcoeff_blk;
    30   int16_t *coeff[MAX_MB_PLANE][3];
    31   int16_t *qcoeff[MAX_MB_PLANE][3];
    32   int16_t *dqcoeff[MAX_MB_PLANE][3];
    33   uint16_t *eobs[MAX_MB_PLANE][3];
    35   // dual buffer pointers, 0: in use, 1: best in store
    36   int16_t *coeff_pbuf[MAX_MB_PLANE][3];
    37   int16_t *qcoeff_pbuf[MAX_MB_PLANE][3];
    38   int16_t *dqcoeff_pbuf[MAX_MB_PLANE][3];
    39   uint16_t *eobs_pbuf[MAX_MB_PLANE][3];
    41   int is_coded;
    42   int num_4x4_blk;
    43   int skip;
    44   int_mv best_ref_mv;
    45   int_mv second_best_ref_mv;
    46   int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
    47   int rate;
    48   int distortion;
    49   int64_t intra_error;
    50   int best_mode_index;
    51   int rddiv;
    52   int rdmult;
    53   int hybrid_pred_diff;
    54   int comp_pred_diff;
    55   int single_pred_diff;
    56   int64_t tx_rd_diff[TX_MODES];
    57   int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
    59   // motion vector cache for adaptive motion search control in partition
    60   // search loop
    61   int_mv pred_mv[MAX_REF_FRAMES];
    63   // Bit flag for each mode whether it has high error in comparison to others.
    64   unsigned int modes_with_high_error;
    66   // Bit flag for each ref frame whether it has high error compared to others.
    67   unsigned int frames_with_high_error;
    68 } PICK_MODE_CONTEXT;
    70 struct macroblock_plane {
    71   DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]);
    72   int16_t *coeff;
    73   struct buf_2d src;
    75   // Quantizer setings
    76   int16_t *quant;
    77   int16_t *quant_shift;
    78   int16_t *zbin;
    79   int16_t *round;
    81   // Zbin Over Quant value
    82   int16_t zbin_extra;
    83 };
    85 /* The [2] dimension is for whether we skip the EOB node (i.e. if previous
    86  * coefficient in this block was zero) or not. */
    87 typedef unsigned int vp9_coeff_cost[BLOCK_TYPES][REF_TYPES][COEF_BANDS][2]
    88                                    [PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS];
    90 typedef struct macroblock MACROBLOCK;
    91 struct macroblock {
    92   struct macroblock_plane plane[MAX_MB_PLANE];
    94   MACROBLOCKD e_mbd;
    95   int skip_block;
    96   int select_txfm_size;
    97   int skip_recode;
    98   int skip_optimize;
    99   int q_index;
   101   search_site *ss;
   102   int ss_count;
   103   int searches_per_step;
   105   int errorperbit;
   106   int sadperbit16;
   107   int sadperbit4;
   108   int rddiv;
   109   int rdmult;
   110   unsigned int mb_energy;
   111   unsigned int *mb_activity_ptr;
   112   int *mb_norm_activity_ptr;
   113   signed int act_zbin_adj;
   115   int mv_best_ref_index[MAX_REF_FRAMES];
   116   unsigned int max_mv_context[MAX_REF_FRAMES];
   117   unsigned int source_variance;
   119   int nmvjointcost[MV_JOINTS];
   120   int nmvcosts[2][MV_VALS];
   121   int *nmvcost[2];
   122   int nmvcosts_hp[2][MV_VALS];
   123   int *nmvcost_hp[2];
   124   int **mvcost;
   126   int nmvjointsadcost[MV_JOINTS];
   127   int nmvsadcosts[2][MV_VALS];
   128   int *nmvsadcost[2];
   129   int nmvsadcosts_hp[2][MV_VALS];
   130   int *nmvsadcost_hp[2];
   131   int **mvsadcost;
   133   int mbmode_cost[MB_MODE_COUNT];
   134   unsigned inter_mode_cost[INTER_MODE_CONTEXTS][INTER_MODES];
   135   int intra_uv_mode_cost[2][MB_MODE_COUNT];
   136   int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES];
   137   int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS];
   139   unsigned char sb_index;   // index of 32x32 block inside the 64x64 block
   140   unsigned char mb_index;   // index of 16x16 block inside the 32x32 block
   141   unsigned char b_index;    // index of 8x8 block inside the 16x16 block
   142   unsigned char ab_index;   // index of 4x4 block inside the 8x8 block
   144   // These define limits to motion vector components to prevent them
   145   // from extending outside the UMV borders
   146   int mv_col_min;
   147   int mv_col_max;
   148   int mv_row_min;
   149   int mv_row_max;
   151   uint8_t zcoeff_blk[TX_SIZES][256];
   152   int skip;
   154   int encode_breakout;
   156   unsigned char *active_ptr;
   158   // note that token_costs is the cost when eob node is skipped
   159   vp9_coeff_cost token_costs[TX_SIZES];
   160   DECLARE_ALIGNED(16, uint8_t, token_cache[1024]);
   162   int optimize;
   164   // indicate if it is in the rd search loop or encoding process
   165   int use_lp32x32fdct;
   166   int skip_encode;
   168   // Used to store sub partition's choices.
   169   int fast_ms;
   170   int_mv pred_mv[MAX_REF_FRAMES];
   171   int subblock_ref;
   173   // TODO(jingning): Need to refactor the structure arrays that buffers the
   174   // coding mode decisions of each partition type.
   175   PICK_MODE_CONTEXT ab4x4_context[4][4][4];
   176   PICK_MODE_CONTEXT sb8x4_context[4][4][4];
   177   PICK_MODE_CONTEXT sb4x8_context[4][4][4];
   178   PICK_MODE_CONTEXT sb8x8_context[4][4][4];
   179   PICK_MODE_CONTEXT sb8x16_context[4][4][2];
   180   PICK_MODE_CONTEXT sb16x8_context[4][4][2];
   181   PICK_MODE_CONTEXT mb_context[4][4];
   182   PICK_MODE_CONTEXT sb32x16_context[4][2];
   183   PICK_MODE_CONTEXT sb16x32_context[4][2];
   184   // when 4 MBs share coding parameters:
   185   PICK_MODE_CONTEXT sb32_context[4];
   186   PICK_MODE_CONTEXT sb32x64_context[2];
   187   PICK_MODE_CONTEXT sb64x32_context[2];
   188   PICK_MODE_CONTEXT sb64_context;
   189   int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES];
   191   BLOCK_SIZE b_partitioning[4][4][4];
   192   BLOCK_SIZE mb_partitioning[4][4];
   193   BLOCK_SIZE sb_partitioning[4];
   194   BLOCK_SIZE sb64_partitioning;
   196   void (*fwd_txm4x4)(const int16_t *input, int16_t *output, int stride);
   197 };
   199 // TODO(jingning): the variables used here are little complicated. need further
   200 // refactoring on organizing the temporary buffers, when recursive
   201 // partition down to 4x4 block size is enabled.
   202 static PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, BLOCK_SIZE bsize) {
   203   switch (bsize) {
   204     case BLOCK_64X64:
   205       return &x->sb64_context;
   206     case BLOCK_64X32:
   207       return &x->sb64x32_context[x->sb_index];
   208     case BLOCK_32X64:
   209       return &x->sb32x64_context[x->sb_index];
   210     case BLOCK_32X32:
   211       return &x->sb32_context[x->sb_index];
   212     case BLOCK_32X16:
   213       return &x->sb32x16_context[x->sb_index][x->mb_index];
   214     case BLOCK_16X32:
   215       return &x->sb16x32_context[x->sb_index][x->mb_index];
   216     case BLOCK_16X16:
   217       return &x->mb_context[x->sb_index][x->mb_index];
   218     case BLOCK_16X8:
   219       return &x->sb16x8_context[x->sb_index][x->mb_index][x->b_index];
   220     case BLOCK_8X16:
   221       return &x->sb8x16_context[x->sb_index][x->mb_index][x->b_index];
   222     case BLOCK_8X8:
   223       return &x->sb8x8_context[x->sb_index][x->mb_index][x->b_index];
   224     case BLOCK_8X4:
   225       return &x->sb8x4_context[x->sb_index][x->mb_index][x->b_index];
   226     case BLOCK_4X8:
   227       return &x->sb4x8_context[x->sb_index][x->mb_index][x->b_index];
   228     case BLOCK_4X4:
   229       return &x->ab4x4_context[x->sb_index][x->mb_index][x->b_index];
   230     default:
   231       assert(0);
   232       return NULL;
   233   }
   234 }
   236 struct rdcost_block_args {
   237   MACROBLOCK *x;
   238   ENTROPY_CONTEXT t_above[16];
   239   ENTROPY_CONTEXT t_left[16];
   240   TX_SIZE tx_size;
   241   int bw;
   242   int bh;
   243   int rate;
   244   int64_t dist;
   245   int64_t sse;
   246   int this_rate;
   247   int64_t this_dist;
   248   int64_t this_sse;
   249   int64_t this_rd;
   250   int64_t best_rd;
   251   int skip;
   252   const int16_t *scan, *nb;
   253 };
   255 #endif  // VP9_ENCODER_VP9_BLOCK_H_

mercurial