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