summaryrefslogtreecommitdiffstats
path: root/media/libvpx/vp8/encoder/block.h
blob: b15da015f56c1eeaf0b2774d6de6087854eb5518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#ifndef VP8_ENCODER_BLOCK_H_
#define VP8_ENCODER_BLOCK_H_

#include "vp8/common/onyx.h"
#include "vp8/common/blockd.h"
#include "vp8/common/entropymv.h"
#include "vp8/common/entropy.h"
#include "vpx_ports/mem.h"

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_MODES 20
#define MAX_ERROR_BINS 1024

/* motion search site */
typedef struct
{
    MV mv;
    int offset;
} search_site;

typedef struct block
{
    /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
    short *src_diff;
    short *coeff;

    /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
    short *quant;
    short *quant_fast;
    short *quant_shift;
    short *zbin;
    short *zrun_zbin_boost;
    short *round;

    /* Zbin Over Quant value */
    short zbin_extra;

    unsigned char **base_src;
    int src;
    int src_stride;
} BLOCK;

typedef struct
{
    int count;
    struct
    {
        B_PREDICTION_MODE mode;
        int_mv mv;
    } bmi[16];
} PARTITION_INFO;

typedef struct macroblock
{
    DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */
    DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */
    DECLARE_ALIGNED(16, unsigned char, thismb[256]);

    unsigned char *thismb_ptr;
    /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */
    BLOCK block[25];

    YV12_BUFFER_CONFIG src;

    MACROBLOCKD e_mbd;
    PARTITION_INFO *partition_info; /* work pointer */
    PARTITION_INFO *pi;   /* Corresponds to upper left visible macroblock */
    PARTITION_INFO *pip;  /* Base of allocated array */

    int ref_frame_cost[MAX_REF_FRAMES];

    search_site *ss;
    int ss_count;
    int searches_per_step;

    int errorperbit;
    int sadperbit16;
    int sadperbit4;
    int rddiv;
    int rdmult;
    unsigned int * mb_activity_ptr;
    int * mb_norm_activity_ptr;
    signed int act_zbin_adj;
    signed int last_act_zbin_adj;

    int *mvcost[2];
    /* MSVC generates code that thinks this is 16-byte aligned */
    DECLARE_ALIGNED(16, int*, mvsadcost[2]);
    int (*mbmode_cost)[MB_MODE_COUNT];
    int (*intra_uv_mode_cost)[MB_MODE_COUNT];
    int (*bmode_costs)[10][10];
    int *inter_bmode_costs;
    int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS]
    [MAX_ENTROPY_TOKENS];

    /* These define limits to motion vector components to prevent
     * them from extending outside the UMV borders.
     */
    int mv_col_min;
    int mv_col_max;
    int mv_row_min;
    int mv_row_max;

    int skip;

    unsigned int encode_breakout;

    signed char *gf_active_ptr;

    unsigned char *active_ptr;
    MV_CONTEXT *mvc;

    int optimize;
    int q_index;
    int is_skin;
    int denoise_zeromv;

#if CONFIG_TEMPORAL_DENOISING
    int increase_denoising;
    MB_PREDICTION_MODE best_sse_inter_mode;
    int_mv best_sse_mv;
    MV_REFERENCE_FRAME best_reference_frame;
    MV_REFERENCE_FRAME best_zeromv_reference_frame;
    unsigned char need_to_clamp_best_mvs;
#endif

    int skip_true_count;
    unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
    unsigned int MVcount [2] [MVvals];  /* (row,col) MV cts this frame */
    int ymode_count [VP8_YMODES];        /* intra MB type cts this frame */
    int uv_mode_count[VP8_UV_MODES];     /* intra MB type cts this frame */
    int64_t prediction_error;
    int64_t intra_error;
    int count_mb_ref_frame_usage[MAX_REF_FRAMES];

    int rd_thresh_mult[MAX_MODES];
    int rd_threshes[MAX_MODES];
    unsigned int mbs_tested_so_far;
    unsigned int mode_test_hit_counts[MAX_MODES];
    int zbin_mode_boost_enabled;
    int zbin_mode_boost;
    int last_zbin_mode_boost;

    int last_zbin_over_quant;
    int zbin_over_quant;
    int error_bins[MAX_ERROR_BINS];

    void (*short_fdct4x4)(short *input, short *output, int pitch);
    void (*short_fdct8x4)(short *input, short *output, int pitch);
    void (*short_walsh4x4)(short *input, short *output, int pitch);
    void (*quantize_b)(BLOCK *b, BLOCKD *d);

    unsigned int mbs_zero_last_dot_suppress;
    int zero_last_dot_suppress;
} MACROBLOCK;


#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // VP8_ENCODER_BLOCK_H_