1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_ENCODER_BLOCK_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_ENCODER_BLOCK_H_
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/onyx.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/blockd.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/entropymv.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/entropy.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h"
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
22233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" {
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_MODES 20
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_ERROR_BINS 1024
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* motion search site */
29233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MV mv;
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int offset;
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan} search_site;
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan
35233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct block
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *src_diff;
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *coeff;
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant;
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_fast;
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *quant_shift;
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zbin;
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *zrun_zbin_boost;
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short *round;
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Zbin Over Quant value */
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan    short zbin_extra;
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char **base_src;
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int src;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int src_stride;
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan} BLOCK;
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan
57233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int count;
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan    struct
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan        B_PREDICTION_MODE mode;
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int_mv mv;
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan    } bmi[16];
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan} PARTITION_INFO;
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct macroblock
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, unsigned char, thismb[256]);
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char *thismb_ptr;
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    BLOCK block[25];
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG src;
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACROBLOCKD e_mbd;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PARTITION_INFO *partition_info; /* work pointer */
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PARTITION_INFO *pi;   /* Corresponds to upper left visible macroblock */
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan    PARTITION_INFO *pip;  /* Base of allocated array */
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int ref_frame_cost[MAX_REF_FRAMES];
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan    search_site *ss;
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int ss_count;
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int searches_per_step;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int errorperbit;
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int sadperbit16;
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int sadperbit4;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int rddiv;
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int rdmult;
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int * mb_activity_ptr;
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int * mb_norm_activity_ptr;
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan    signed int act_zbin_adj;
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan    signed int last_act_zbin_adj;
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int *mvcost[2];
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int *mvsadcost[2];
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int (*mbmode_cost)[MB_MODE_COUNT];
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int (*intra_uv_mode_cost)[MB_MODE_COUNT];
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int (*bmode_costs)[10][10];
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int *inter_bmode_costs;
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS]
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    [MAX_ENTROPY_TOKENS];
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* These define limits to motion vector components to prevent
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan     * them from extending outside the UMV borders.
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan     */
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mv_col_min;
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mv_col_max;
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mv_row_min;
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mv_row_max;
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int skip;
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int encode_breakout;
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    signed char *gf_active_ptr;
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char *active_ptr;
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MV_CONTEXT *mvc;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int optimize;
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int q_index;
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_TEMPORAL_DENOISING
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MB_PREDICTION_MODE best_sse_inter_mode;
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv best_sse_mv;
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MV_REFERENCE_FRAME best_reference_frame;
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MV_REFERENCE_FRAME best_zeromv_reference_frame;
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char need_to_clamp_best_mvs;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int skip_true_count;
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS];
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int MVcount [2] [MVvals];  /* (row,col) MV cts this frame */
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int ymode_count [VP8_YMODES];        /* intra MB type cts this frame */
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int uv_mode_count[VP8_UV_MODES];     /* intra MB type cts this frame */
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int64_t prediction_error;
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int64_t intra_error;
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int count_mb_ref_frame_usage[MAX_REF_FRAMES];
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int rd_thresh_mult[MAX_MODES];
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int rd_threshes[MAX_MODES];
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int mbs_tested_so_far;
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int mode_test_hit_counts[MAX_MODES];
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_mode_boost_enabled;
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_mode_boost;
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int last_zbin_mode_boost;
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int last_zbin_over_quant;
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int zbin_over_quant;
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int error_bins[MAX_ERROR_BINS];
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void (*short_fdct4x4)(short *input, short *output, int pitch);
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void (*short_fdct8x4)(short *input, short *output, int pitch);
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void (*short_walsh4x4)(short *input, short *output, int pitch);
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void (*quantize_b)(BLOCK *b, BLOCKD *d);
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    void (*quantize_b_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1);
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan} MACROBLOCK;
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // extern "C"
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VP8_ENCODER_BLOCK_H_
172