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 
     12 #ifndef __INC_BLOCK_H
     13 #define __INC_BLOCK_H
     14 
     15 #include "vp8/common/onyx.h"
     16 #include "vp8/common/blockd.h"
     17 #include "vp8/common/entropymv.h"
     18 #include "vp8/common/entropy.h"
     19 #include "vpx_ports/mem.h"
     20 
     21 #define MAX_MODES 20
     22 #define MAX_ERROR_BINS 1024
     23 
     24 /* motion search site */
     25 typedef struct
     26 {
     27     MV mv;
     28     int offset;
     29 } search_site;
     30 
     31 typedef struct block
     32 {
     33     /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
     34     short *src_diff;
     35     short *coeff;
     36 
     37     /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
     38     short *quant;
     39     short *quant_fast;
     40     short *quant_shift;
     41     short *zbin;
     42     short *zrun_zbin_boost;
     43     short *round;
     44 
     45     /* Zbin Over Quant value */
     46     short zbin_extra;
     47 
     48     unsigned char **base_src;
     49     int src;
     50     int src_stride;
     51 } BLOCK;
     52 
     53 typedef struct
     54 {
     55     int count;
     56     struct
     57     {
     58         B_PREDICTION_MODE mode;
     59         int_mv mv;
     60     } bmi[16];
     61 } PARTITION_INFO;
     62 
     63 typedef struct macroblock
     64 {
     65     DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */
     66     DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */
     67     DECLARE_ALIGNED(16, unsigned char, thismb[256]);
     68 
     69     unsigned char *thismb_ptr;
     70     /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */
     71     BLOCK block[25];
     72 
     73     YV12_BUFFER_CONFIG src;
     74 
     75     MACROBLOCKD e_mbd;
     76     PARTITION_INFO *partition_info; /* work pointer */
     77     PARTITION_INFO *pi;   /* Corresponds to upper left visible macroblock */
     78     PARTITION_INFO *pip;  /* Base of allocated array */
     79 
     80     int ref_frame_cost[MAX_REF_FRAMES];
     81 
     82     search_site *ss;
     83     int ss_count;
     84     int searches_per_step;
     85 
     86     int errorperbit;
     87     int sadperbit16;
     88     int sadperbit4;
     89     int rddiv;
     90     int rdmult;
     91     unsigned int * mb_activity_ptr;
     92     int * mb_norm_activity_ptr;
     93     signed int act_zbin_adj;
     94     signed int last_act_zbin_adj;
     95 
     96     int *mvcost[2];
     97     int *mvsadcost[2];
     98     int (*mbmode_cost)[MB_MODE_COUNT];
     99     int (*intra_uv_mode_cost)[MB_MODE_COUNT];
    100     int (*bmode_costs)[10][10];
    101     int *inter_bmode_costs;
    102     int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS]
    103     [MAX_ENTROPY_TOKENS];
    104 
    105     /* These define limits to motion vector components to prevent
    106      * them from extending outside the UMV borders.
    107      */
    108     int mv_col_min;
    109     int mv_col_max;
    110     int mv_row_min;
    111     int mv_row_max;
    112 
    113     int skip;
    114 
    115     unsigned int encode_breakout;
    116 
    117     signed char *gf_active_ptr;
    118 
    119     unsigned char *active_ptr;
    120     MV_CONTEXT *mvc;
    121 
    122     int optimize;
    123     int q_index;
    124 
    125 #if CONFIG_TEMPORAL_DENOISING
    126     MB_PREDICTION_MODE best_sse_inter_mode;
    127     int_mv best_sse_mv;
    128     MV_REFERENCE_FRAME best_reference_frame;
    129     MV_REFERENCE_FRAME best_zeromv_reference_frame;
    130     unsigned char need_to_clamp_best_mvs;
    131 #endif
    132 
    133     int skip_true_count;
    134     unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
    135     unsigned int MVcount [2] [MVvals];  /* (row,col) MV cts this frame */
    136     int ymode_count [VP8_YMODES];        /* intra MB type cts this frame */
    137     int uv_mode_count[VP8_UV_MODES];     /* intra MB type cts this frame */
    138     int64_t prediction_error;
    139     int64_t intra_error;
    140     int count_mb_ref_frame_usage[MAX_REF_FRAMES];
    141 
    142     int rd_thresh_mult[MAX_MODES];
    143     int rd_threshes[MAX_MODES];
    144     unsigned int mbs_tested_so_far;
    145     unsigned int mode_test_hit_counts[MAX_MODES];
    146     int zbin_mode_boost_enabled;
    147     int zbin_mode_boost;
    148     int last_zbin_mode_boost;
    149 
    150     int last_zbin_over_quant;
    151     int zbin_over_quant;
    152     int error_bins[MAX_ERROR_BINS];
    153 
    154     void (*short_fdct4x4)(short *input, short *output, int pitch);
    155     void (*short_fdct8x4)(short *input, short *output, int pitch);
    156     void (*short_walsh4x4)(short *input, short *output, int pitch);
    157     void (*quantize_b)(BLOCK *b, BLOCKD *d);
    158     void (*quantize_b_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1);
    159 
    160 } MACROBLOCK;
    161 
    162 
    163 #endif
    164