1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h"
131cedac70da0675180660d8d3478648400afde47djohannkoenig@chromium.org#include "vp8_rtcd.h"
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemb.h"
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemv.h"
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/common.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyx_int.h"
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/extend.h"
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/entropymode.h"
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/quant_common.h"
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "segmentation.h"
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/setupintrarecon.h"
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodeintra.h"
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconinter.h"
25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "rdopt.h"
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "pickinter.h"
27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/findnearmv.h"
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <stdio.h>
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h>
30167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vp8/common/invtrans.h"
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/vpx_timer.h"
325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "bitstream.h"
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#include "encodeframe.h"
365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
37d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgextern void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t) ;
38167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgextern void vp8_calc_ref_frame_costs(int *ref_frame_cost,
39167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     int prob_intra,
40167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     int prob_last,
41167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                     int prob_garf
42167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                    );
43167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgextern void vp8_convert_rfct_to_prob(VP8_COMP *const cpi);
44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex);
45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_auto_select_speed(VP8_COMP *cpi);
46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8cx_init_mbrthread_data(VP8_COMP *cpi,
47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      MACROBLOCK *x,
48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      MB_ROW_COMP *mbr_ei,
49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                      int count);
50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x );
51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int inter_y_modes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int inter_uv_modes[4] = {0, 0, 0, 0};
55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int inter_b_modes[15]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int y_modes[5]   = {0, 0, 0, 0, 0};
57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int uv_modes[4]  = {0, 0, 0, 0};
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgunsigned int b_modes[14]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* activity_avg must be positive, or flat regions could get a zero weight
63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  (infinite lambda), which confounds analysis.
64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * This also avoids the need for divide by zero checks in
65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  vp8_activity_masking().
66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define VP8_ACTIVITY_AVG_MIN (64)
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* This is used as a reference when computing the source variance for the
70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  purposes of activity masking.
71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Eventually this should be replaced by custom no-reference routines,
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  which will be faster.
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const unsigned char VP8_VAR_OFFS[16]=
75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org};
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
80ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Original activity measure from Tim T's code. */
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned int tt_activity_measure( VP8_COMP *cpi, MACROBLOCK *x )
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int act;
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int sse;
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* TODO: This could also be done over smaller areas (8x8), but that would
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     *  require extensive changes elsewhere, as lambda is assumed to be fixed
87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     *  over an entire MB in most of the code.
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     * Another option is to compute four 8x8 variances, and pick a single
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     *  lambda using a non-linear combination (e.g., the smallest, or second
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     *  smallest, etc.).
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org     */
925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    act =  vp8_variance16x16(x->src.y_buffer,
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    x->src.y_stride, VP8_VAR_OFFS, 0, &sse);
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    act = act<<4;
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* If the region is flat, lower the activity some more. */
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (act < 8<<12)
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        act = act < 5<<12 ? act : 5<<12;
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return act;
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Stub for alternative experimental activity measures. */
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned int alt_activity_measure( VP8_COMP *cpi,
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                          MACROBLOCK *x, int use_dc_pred )
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return vp8_encode_intra(cpi,x, use_dc_pred);
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Measure the activity of the current macroblock
112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * What we measure here is TBD so abstracted to this function
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define ALT_ACT_MEASURE 1
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic unsigned int mb_activity_measure( VP8_COMP *cpi, MACROBLOCK *x,
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                  int mb_row, int mb_col)
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int mb_activity;
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if  ( ALT_ACT_MEASURE )
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Or use and alternative. */
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mb_activity = alt_activity_measure( cpi, x, use_dc_pred );
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Original activity measure from Tim T's code. */
130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mb_activity = tt_activity_measure( cpi, x );
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( mb_activity < VP8_ACTIVITY_AVG_MIN )
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        mb_activity = VP8_ACTIVITY_AVG_MIN;
135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return mb_activity;
137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Calculate an "average" mb activity value for the frame */
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define ACT_MEDIAN 0
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void calc_av_activity( VP8_COMP *cpi, int64_t activity_sum )
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ACT_MEDIAN
144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Find median: Simple n^2 algorithm for experimentation */
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int median;
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int i,j;
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int * sortlist;
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int tmp;
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Create a list to sort to */
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        CHECK_MEM_ERROR(sortlist,
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        vpx_calloc(sizeof(unsigned int),
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->common.MBs));
155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Copy map to sort list */
157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_memcpy( sortlist, cpi->mb_activity_map,
158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    sizeof(unsigned int) * cpi->common.MBs );
159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Ripple each value down to its correct position */
162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for ( i = 1; i < cpi->common.MBs; i ++ )
163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for ( j = i; j > 0; j -- )
165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if ( sortlist[j] < sortlist[j-1] )
167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                    /* Swap values */
169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    tmp = sortlist[j-1];
170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    sortlist[j-1] = sortlist[j];
171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    sortlist[j] = tmp;
172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    break;
175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Even number MBs so estimate median as mean of two either side. */
179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        median = ( 1 + sortlist[cpi->common.MBs >> 1] +
180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   sortlist[(cpi->common.MBs >> 1) + 1] ) >> 1;
181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->activity_avg = median;
183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_free(sortlist);
185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Simple mean for now */
188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->activity_avg = (unsigned int)(activity_sum/cpi->common.MBs);
189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->activity_avg < VP8_ACTIVITY_AVG_MIN)
192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->activity_avg = VP8_ACTIVITY_AVG_MIN;
193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code: return fixed value normalized for several clips */
195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if  ( ALT_ACT_MEASURE )
196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->activity_avg = 100000;
197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define USE_ACT_INDEX   0
200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define OUTPUT_NORM_ACT_STATS   0
201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if USE_ACT_INDEX
203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Calculate and activity index for each mb */
204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void calc_activity_index( VP8_COMP *cpi, MACROBLOCK *x )
205474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
206474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *const cm = & cpi->common;
207474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mb_row, mb_col;
208474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
209474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t act;
210474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t a;
211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t b;
212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if OUTPUT_NORM_ACT_STATS
214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    FILE *f = fopen("norm_act.stt", "a");
215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fprintf(f, "\n%12d\n", cpi->activity_avg );
216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Reset pointers to start of activity map */
219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mb_activity_ptr = cpi->mb_activity_map;
220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Calculate normalized mb activity number. */
222474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
223474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* for each macroblock col in image */
225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Read activity from the map */
228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            act = *(x->mb_activity_ptr);
229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Calculate a normalized activity number */
231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            a = act + 4*cpi->activity_avg;
232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            b = 4*act + cpi->activity_avg;
233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( b >= a )
235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                *(x->activity_ptr) = (int)((b + (a>>1))/a) - 1;
236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                *(x->activity_ptr) = 1 - (int)((a + (b>>1))/b);
238474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
239474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if OUTPUT_NORM_ACT_STATS
240474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            fprintf(f, " %6d", *(x->mb_activity_ptr));
241474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Increment activity map pointers */
243474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->mb_activity_ptr++;
244474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if OUTPUT_NORM_ACT_STATS
247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        fprintf(f, "\n");
248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
249474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if OUTPUT_NORM_ACT_STATS
253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    fclose(f);
254474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
255474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Loop through all MBs. Note activity of each, average activity and
260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * calculate a normalized activity for each
261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
262474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void build_activity_map( VP8_COMP *cpi )
263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCK *const x = & cpi->mb;
265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCKD *xd = &x->e_mbd;
266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *const cm = & cpi->common;
267474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
268474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ALT_ACT_MEASURE
269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recon_yoffset;
271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recon_y_stride = new_yv12->y_stride;
272474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mb_row, mb_col;
275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int mb_activity;
276474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t activity_sum = 0;
277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* for each macroblock row in image */
279474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
281474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ALT_ACT_MEASURE
282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* reset above block coeffs */
283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->up_available = (mb_row != 0);
284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon_yoffset = (mb_row * recon_y_stride * 16);
285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* for each macroblock col in image */
287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ALT_ACT_MEASURE
290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
291474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            xd->left_available = (mb_col != 0);
292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            recon_yoffset += 16;
293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Copy current mb to a buffer */
2955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* measure activity */
298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            mb_activity = mb_activity_measure( cpi, x, mb_row, mb_col );
299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Keep frame sum */
301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            activity_sum += mb_activity;
302474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Store MB level activity details. */
304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            *x->mb_activity_ptr = mb_activity;
305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
306ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Increment activity map pointer */
307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->mb_activity_ptr++;
308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
309ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* adjust to the next column of source macroblocks */
310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->src.y_buffer += 16;
311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
314ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* adjust to the next row of mbs */
315474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
316474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ALT_ACT_MEASURE
318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* extend the recon for intra prediction */
319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16,
320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                          xd->dst.u_buffer + 8, xd->dst.v_buffer + 8);
321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
325ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Calculate an "average" MB activity */
326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    calc_av_activity(cpi, activity_sum);
327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if USE_ACT_INDEX
329ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Calculate an activity index number of each mb */
330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    calc_activity_index( cpi, x );
331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
335ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Macroblock activity masking */
336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x)
337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if USE_ACT_INDEX
339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->rdmult += *(x->mb_activity_ptr) * (x->rdmult >> 2);
340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
341474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->errorperbit += (x->errorperbit==0);
342474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t a;
344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t b;
345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t act = *(x->mb_activity_ptr);
346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
347ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Apply the masking to the RD multiplier. */
348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    a = act + (2*cpi->activity_avg);
349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    b = (2*act) + cpi->activity_avg;
350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->rdmult = (unsigned int)(((int64_t)x->rdmult*b + (a>>1))/a);
352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->errorperbit = x->rdmult * 100 /(110 * x->rddiv);
353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->errorperbit += (x->errorperbit==0);
354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
356ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Activity based Zbin adjustment */
357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    adjust_act_zbin(cpi, x);
358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic
361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid encode_mb_row(VP8_COMP *cpi,
362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   VP8_COMMON *cm,
363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   int mb_row,
364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   MACROBLOCK  *x,
365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   MACROBLOCKD *xd,
366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   TOKENEXTRA **tp,
367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   int *segment_counts,
368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                   int *totalrate)
369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recon_yoffset, recon_uvoffset;
371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mb_col;
372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ref_fb_idx = cm->lst_fb_idx;
373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int dst_fb_idx = cm->new_fb_idx;
374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int map_index = (mb_row * cpi->common.mb_cols);
377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
3795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const int num_part = (1 << cm->multi_token_partition);
3805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    TOKENEXTRA * tp_start = cpi->tok;
3815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_writer *w;
3825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
3835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const int nsync = cpi->mt_sync_range;
3865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const int rightmost_col = cm->mb_cols + nsync;
387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    volatile const int *last_row_current_mb_col;
3885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    volatile int *current_mb_col = &cpi->mt_current_mb_col[mb_row];
389474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
390474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ((cpi->b_multi_threaded != 0) && (mb_row != 0))
391474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        last_row_current_mb_col = &cpi->mt_current_mb_col[mb_row - 1];
392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
393474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        last_row_current_mb_col = &rightmost_col;
394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
395474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
3965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
3975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if(num_part > 1)
3985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        w= &cpi->bc[1 + (mb_row % num_part)];
3995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    else
4005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        w = &cpi->bc[1];
4015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
4025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
403ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* reset above block coeffs */
404474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->above_context = cm->above_context;
405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->up_available = (mb_row != 0);
407474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    recon_yoffset = (mb_row * recon_y_stride * 16);
408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    recon_uvoffset = (mb_row * recon_uv_stride * 8);
409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->tplist[mb_row].start = *tp;
411ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* printf("Main mb_row = %d\n", mb_row); */
412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
413ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Distance of Mb to the top & bottom edges, specified in 1/8th pel
414ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * units as they are always compared to values that are in 1/8th pel
415ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mb_to_top_edge = -((mb_row * 16) << 3);
417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
418474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
419ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set up limit values for vertical motion vector components
420ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * to prevent them extending beyond the UMV borders
421ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
422474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
423474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        + (VP8BORDERINPIXELS - 16);
425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
426ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Set the mb activity pointer to the start of the row. */
427474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mb_activity_ptr = &cpi->mb_activity_map[map_index];
428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
429ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* for each macroblock col in image */
430474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
431474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
4325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
4335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if  (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING)
4345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        *tp = cpi->tok;
4355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
436ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Distance of Mb to the left & right edges, specified in
437ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * 1/8th pel units as they are always compared to values
438ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * that are in 1/8th pel units
439ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
440474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->mb_to_left_edge = -((mb_col * 16) << 3);
441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
442474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
443ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Set up limit values for horizontal motion vector components
444ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         * to prevent them extending beyond the UMV borders
445ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            + (VP8BORDERINPIXELS - 16);
449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->left_available = (mb_col != 0);
454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->rddiv = cpi->RDDIV;
456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->rdmult = cpi->RDMULT;
457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
458ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Copy current mb to a buffer */
4595c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
4625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        if (cpi->b_multi_threaded != 0)
463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
464ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            *current_mb_col = mb_col - 1; /* set previous MB done */
4655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((mb_col & (nsync - 1)) == 0)
467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
4685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                while (mb_col > (*last_row_current_mb_col - nsync))
469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    x86_pause_hint();
471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    thread_sleep(0);
472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_activity_masking(cpi, x);
479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
480ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Is segmentation enabled */
481ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* MB level adjustment to quantizer */
482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (xd->segmentation_enabled)
483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
484ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Code to set segment id in xd->mbmi.segment_id for current MB
485ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * (with range checking)
486ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (cpi->segmentation_map[map_index+mb_col] <= 3)
488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[map_index+mb_col];
489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            else
490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mode_info_context->mbmi.segment_id = 0;
491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
492167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            vp8cx_mb_init_quantizer(cpi, x, 1);
493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
495ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Set to Segment 0 by default */
496ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            xd->mode_info_context->mbmi.segment_id = 0;
497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->active_ptr = cpi->active_map + map_index + mb_col;
499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cm->frame_type == KEY_FRAME)
501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
5025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            *totalrate += vp8cx_encode_intra_macroblock(cpi, x, tp);
503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            y_modes[xd->mbmi.mode] ++;
505474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
509167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            *totalrate += vp8cx_encode_inter_macroblock(cpi, x, tp, recon_yoffset, recon_uvoffset, mb_row, mb_col);
510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            inter_y_modes[xd->mbmi.mode] ++;
513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
514474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (xd->mbmi.mode == SPLITMV)
515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                int b;
517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
518474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                for (b = 0; b < xd->mbmi.partition_count; b++)
519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    inter_b_modes[x->partition->bmi[b].mode] ++;
521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
524474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
52541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            // Keep track of how many (consecutive) times a block is coded
52641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            // as ZEROMV_LASTREF, for base layer frames.
52741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            // Reset to 0 if its coded as anything else.
52841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            if (cpi->current_layer == 0) {
52941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              if (xd->mode_info_context->mbmi.mode == ZEROMV &&
53041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  xd->mode_info_context->mbmi.ref_frame == LAST_FRAME) {
53141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                // Increment, check for wrap-around.
53241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                if (cpi->consec_zero_last[map_index+mb_col] < 255)
53341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                  cpi->consec_zero_last[map_index+mb_col] += 1;
53441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              } else {
53541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org                cpi->consec_zero_last[map_index+mb_col] = 0;
53641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org              }
53741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            }
538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
539ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Special case code for cyclic refresh
540ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * If cyclic update enabled then copy xd->mbmi.segment_id; (which
541ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * may have been updated based on mode during
542ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * vp8cx_encode_inter_macroblock()) back into the global
543ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             * segmentation map
544ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org             */
545167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            if ((cpi->current_layer == 0) &&
546d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                (cpi->cyclic_refresh_mode_enabled &&
547d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                 xd->segmentation_enabled))
548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->segmentation_map[map_index+mb_col] = xd->mode_info_context->mbmi.segment_id;
550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
551ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* If the block has been refreshed mark it as clean (the
552ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * magnitude of the -ve influences how long it will be before
553ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * we consider another refresh):
554ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * Else if it was coded (last frame 0,0) and has not already
555ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * been refreshed then mark it as a candidate for cleanup
556ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 * next time (marked 0) else mark it as dirty (1).
557ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                 */
558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (xd->mode_info_context->mbmi.segment_id)
559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->cyclic_refresh_map[map_index+mb_col] = -1;
560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    if (cpi->cyclic_refresh_map[map_index+mb_col] == 1)
563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        cpi->cyclic_refresh_map[map_index+mb_col] = 0;
564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
565474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
566474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    cpi->cyclic_refresh_map[map_index+mb_col] = 1;
567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
568474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->tplist[mb_row].stop = *tp;
572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
5735c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
5745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        /* pack tokens for this MB */
5755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
5765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            int tok_count = *tp - tp_start;
5775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            pack_tokens(w, tp_start, tok_count);
5785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
5795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
580ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Increment pointer into gf usage flags structure. */
581474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->gf_active_ptr++;
582474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
583ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Increment the activity mask pointers. */
584474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->mb_activity_ptr++;
585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
586ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* adjust to the next column of macroblocks */
587474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->src.y_buffer += 16;
588474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->src.u_buffer += 8;
589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->src.v_buffer += 8;
590474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
591474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon_yoffset += 16;
592474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        recon_uvoffset += 8;
593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
594ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Keep track of segment usage */
595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        segment_counts[xd->mode_info_context->mbmi.segment_id] ++;
596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
597ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* skip to next mb */
598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->mode_info_context++;
599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->partition_info++;
600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->above_context++;
601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
603ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* extend the recon for intra prediction */
6045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_extend_mb_row( &cm->yv12_fb[dst_fb_idx],
6055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                        xd->dst.y_buffer + 16,
6065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                        xd->dst.u_buffer + 8,
6075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                        xd->dst.v_buffer + 8);
6085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
6095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_MULTITHREAD
6105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    if (cpi->b_multi_threaded != 0)
6115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        *current_mb_col = rightmost_col;
6125c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
614ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* this is to account for the border */
615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_context++;
616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->partition_info++;
617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
6195c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgstatic void init_encode_frame_mb_context(VP8_COMP *cpi)
620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
621474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCK *const x = & cpi->mb;
622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *const cm = & cpi->common;
623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCKD *const xd = & x->e_mbd;
624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
625ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* GF active flags data structure */
626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->gf_active_ptr = (signed char *)cpi->gf_active_flags;
627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
628ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Activity map pointer */
629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mb_activity_ptr = cpi->mb_activity_map;
630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->act_zbin_adj = 0;
632474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->partition_info = x->pi;
634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_context = cm->mi;
636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_stride = cm->mode_info_stride;
637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
638474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->frame_type = cm->frame_type;
639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
640ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* reset intra mode contexts */
641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
642474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_init_mbmode_probs(cm);
643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
644ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Copy data over into macro block data structures. */
645474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->src = * cpi->Source;
646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->pre = cm->yv12_fb[cm->lst_fb_idx];
647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->dst = cm->yv12_fb[cm->new_fb_idx];
648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
649ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* set up frame for intra coded blocks */
650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]);
651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_build_block_offsets(x);
653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_context->mbmi.mode = DC_PRED;
655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_context->mbmi.uv_mode = DC_PRED;
656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->left_context = &cm->left_context;
658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->mvc = cm->fc.mvc;
660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(cm->above_context, 0,
662474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org               sizeof(ENTROPY_CONTEXT_PLANES) * cm->mb_cols);
663474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
664ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Special case treatment when GF and ARF are not sensible options
665ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * for reference
666ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
667ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (cpi->ref_frame_flags == VP8_LAST_FRAME)
6685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_calc_ref_frame_costs(x->ref_frame_cost,
669167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_intra_coded,255,128);
670167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    else if ((cpi->oxcf.number_of_layers > 1) &&
671ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org               (cpi->ref_frame_flags == VP8_GOLD_FRAME))
6725c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_calc_ref_frame_costs(x->ref_frame_cost,
673167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_intra_coded,1,255);
674167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    else if ((cpi->oxcf.number_of_layers > 1) &&
675ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                (cpi->ref_frame_flags == VP8_ALTR_FRAME))
6765c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_calc_ref_frame_costs(x->ref_frame_cost,
677167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_intra_coded,1,1);
678474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
6795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_calc_ref_frame_costs(x->ref_frame_cost,
680167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_intra_coded,
681167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_last_coded,
682167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                                 cpi->prob_gf_coded);
683167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
684167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    xd->fullpixel_mask = 0xffffffff;
685167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if(cm->full_pixel)
686167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        xd->fullpixel_mask = 0xfffffff8;
687d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
688d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_zero(x->coef_counts);
689d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_zero(x->ymode_count);
690d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_zero(x->uv_mode_count)
691d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    x->prediction_error = 0;
692d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    x->intra_error = 0;
693d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_zero(x->count_mb_ref_frame_usage);
694d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org}
695d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
696d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgstatic void sum_coef_counts(MACROBLOCK *x, MACROBLOCK *x_thread)
697d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org{
698d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    int i = 0;
699d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    do
700d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    {
701d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        int j = 0;
702d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        do
703d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        {
704d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            int k = 0;
705d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            do
706d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            {
707d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                /* at every context */
708d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
709d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                /* calc probs and branch cts for this frame only */
710d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                int t = 0;      /* token/prob index */
711d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
712d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                do
713d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                {
714d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    x->coef_counts [i][j][k][t] +=
715d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        x_thread->coef_counts [i][j][k][t];
716d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                }
717d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                while (++t < ENTROPY_NODES);
718d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            }
719d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            while (++k < PREV_COEF_CONTEXTS);
720d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        }
721d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        while (++j < COEF_BANDS);
722d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    }
723d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    while (++i < BLOCK_TYPES);
724474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
725474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
726474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_encode_frame(VP8_COMP *cpi)
727474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
728474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mb_row;
729474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCK *const x = & cpi->mb;
730474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMMON *const cm = & cpi->common;
731474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCKD *const xd = & x->e_mbd;
732474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    TOKENEXTRA *tp = cpi->tok;
733474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int segment_counts[MAX_MB_SEGMENTS];
734474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int totalrate;
7355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
736ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    BOOL_CODER * bc = &cpi->bc[1]; /* bc[0] is for control partition */
7375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    const int num_part = (1 << cm->multi_token_partition);
7385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
739474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
740474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vpx_memset(segment_counts, 0, sizeof(segment_counts));
741474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    totalrate = 0;
742474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
743474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->compressor_speed == 2)
744474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
745474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->oxcf.cpu_used < 0)
746474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            cpi->Speed = -(cpi->oxcf.cpu_used);
747474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
748474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_auto_select_speed(cpi);
749474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
750474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
751ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Functions setup for all frame types so we can use MC in AltRef */
752ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if(!cm->use_bilinear_mc_filter)
753474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
7545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict        = vp8_sixtap_predict4x4;
7555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict8x4     = vp8_sixtap_predict8x4;
7565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict8x8     = vp8_sixtap_predict8x8;
7575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict16x16   = vp8_sixtap_predict16x16;
758474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
759474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
760474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
7615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict        = vp8_bilinear_predict4x4;
7625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict8x4     = vp8_bilinear_predict8x4;
7635c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict8x8     = vp8_bilinear_predict8x8;
7645c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->subpixel_predict16x16   = vp8_bilinear_predict16x16;
765474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
766474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
767d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    cpi->mb.skip_true_count = 0;
7685c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    cpi->tok_count = 0;
769474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
770474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
771ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental code */
772474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frame_distortion = 0;
773474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->last_mb_distortion = 0;
774474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
775474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
776474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    xd->mode_info_context = cm->mi;
777474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
778d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_zero(cpi->mb.MVcount);
779474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
780474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8cx_frame_init_quantizer(cpi);
781474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
782d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_initialize_rd_consts(cpi, x,
783474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                             vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
784474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
785474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8cx_initialize_me_consts(cpi, cm->base_qindex);
786474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
787474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
788474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
789ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Initialize encode frame context. */
790474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        init_encode_frame_mb_context(cpi);
791474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
792ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Build a frame level activity map */
793474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        build_activity_map(cpi);
794474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
795474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
796ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* re-init encode frame context. */
797474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    init_encode_frame_mb_context(cpi);
798474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
7995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
8005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    {
8015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        int i;
8025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        for(i = 0; i < num_part; i++)
8035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
8045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_start_encode(&bc[i], cpi->partition_d[i + 1],
8055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                    cpi->partition_d_end[i + 1]);
8065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            bc[i].error = &cm->error;
8075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
8085c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    }
8095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
8105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
8115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
812474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
813474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        struct vpx_usec_timer  emr_timer;
814474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_start(&emr_timer);
815474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
816474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
817474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->b_multi_threaded)
818474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
819474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            int i;
820474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
821d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            vp8cx_init_mbrthread_data(cpi, x, cpi->mb_row_ei,
822d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                                      cpi->encoding_thread_count);
823474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
824474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < cm->mb_rows; i++)
825474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                cpi->mt_current_mb_col[i] = -1;
826474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
827474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < cpi->encoding_thread_count; i++)
828474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
829474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                sem_post(&cpi->h_event_start_encoding[i]);
830474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
831474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
832474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (mb_row = 0; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1))
833474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
834474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_zero(cm->left_context)
835474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
8365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
8375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                tp = cpi->tok;
8385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#else
839474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
8405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
841474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
842474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
843474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
844ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* adjust to the next row of mbs */
845474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
846474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.u_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
847474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.v_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
848474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
849474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
850474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->partition_info  += xd->mode_info_stride * cpi->encoding_thread_count;
851474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->gf_active_ptr   += cm->mb_cols * cpi->encoding_thread_count;
852474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
8535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                if(mb_row == cm->mb_rows - 1)
8545c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                {
8555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                    sem_post(&cpi->h_event_end_encoding); /* signal frame encoding end */
8565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                }
857474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
858474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
859474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            sem_wait(&cpi->h_event_end_encoding); /* wait for other threads to finish */
860474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
861474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
862474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
863ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                cpi->tok_count += (unsigned int)
864ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                  (cpi->tplist[mb_row].stop - cpi->tplist[mb_row].start);
865474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
866474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
867474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (xd->segmentation_enabled)
868474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
8691929f88e772d51271e69324816701e01c9e7c579johannkoenig@chromium.org                int j;
870474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
871474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (xd->segmentation_enabled)
872474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
873474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    for (i = 0; i < cpi->encoding_thread_count; i++)
874474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    {
875474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                        for (j = 0; j < 4; j++)
876474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                            segment_counts[j] += cpi->mb_row_ei[i].segment_counts[j];
877474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    }
878474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
879474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
880474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
881474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < cpi->encoding_thread_count; i++)
882474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
883d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                int mode_count;
884d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                int c_idx;
885474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                totalrate += cpi->mb_row_ei[i].totalrate;
886d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
887d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.skip_true_count += cpi->mb_row_ei[i].mb.skip_true_count;
888d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
889d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                for(mode_count = 0; mode_count < VP8_YMODES; mode_count++)
890d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.ymode_count[mode_count] +=
891d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.ymode_count[mode_count];
892d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
893d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                for(mode_count = 0; mode_count < VP8_UV_MODES; mode_count++)
894d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.uv_mode_count[mode_count] +=
895d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.uv_mode_count[mode_count];
896d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
897d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                for(c_idx = 0; c_idx < MVvals; c_idx++)
898d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                {
899d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.MVcount[0][c_idx] +=
900d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.MVcount[0][c_idx];
901d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.MVcount[1][c_idx] +=
902d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.MVcount[1][c_idx];
903d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                }
904d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
905d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.prediction_error +=
906d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb_row_ei[i].mb.prediction_error;
907d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.intra_error += cpi->mb_row_ei[i].mb.intra_error;
908d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
909d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                for(c_idx = 0; c_idx < MAX_REF_FRAMES; c_idx++)
910d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.count_mb_ref_frame_usage[c_idx] +=
911d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.count_mb_ref_frame_usage[c_idx];
912d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
913d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                for(c_idx = 0; c_idx < MAX_ERROR_BINS; c_idx++)
914d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    cpi->mb.error_bins[c_idx] +=
915d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        cpi->mb_row_ei[i].mb.error_bins[c_idx];
916d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
917d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                /* add up counts for each thread */
918d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                sum_coef_counts(x, &cpi->mb_row_ei[i].mb);
919474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
920474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
921474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
922474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
923474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
924474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
925d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org
926ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* for each macroblock row in image */
927474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
928474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
929474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                vp8_zero(cm->left_context)
930474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
9315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
9325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                tp = cpi->tok;
9335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
9345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
935474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
936474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
937ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org                /* adjust to the next row of mbs */
938474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
939474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
940474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
941474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
942474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
943ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            cpi->tok_count = (unsigned int)(tp - cpi->tok);
9445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        }
945474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
9465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
9475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        {
9485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            int i;
9495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            for(i = 0; i < num_part; i++)
9505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            {
9515c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                vp8_stop_encode(&bc[i]);
9525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org                cpi->partition_sz[i+1] = bc[i].pos;
9535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            }
954474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
9555c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
956474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
957474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_usec_timer_mark(&emr_timer);
958474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer);
959474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
960474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
961474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
9625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    // Work out the segment probabilities if segmentation is enabled
963ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    // and needs to be updated
964ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (xd->segmentation_enabled && xd->update_mb_segmentation_map)
965474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
966474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int tot_count;
967474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int i;
968474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
969ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Set to defaults */
970474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vpx_memset(xd->mb_segment_tree_probs, 255 , sizeof(xd->mb_segment_tree_probs));
971474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
972474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        tot_count = segment_counts[0] + segment_counts[1] + segment_counts[2] + segment_counts[3];
973474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
974474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (tot_count)
975474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
976474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            xd->mb_segment_tree_probs[0] = ((segment_counts[0] + segment_counts[1]) * 255) / tot_count;
977474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
978474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            tot_count = segment_counts[0] + segment_counts[1];
979474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
980474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (tot_count > 0)
981474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
982474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mb_segment_tree_probs[1] = (segment_counts[0] * 255) / tot_count;
983474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
984474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
985474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            tot_count = segment_counts[2] + segment_counts[3];
986474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
987474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if (tot_count > 0)
988474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mb_segment_tree_probs[2] = (segment_counts[2] * 255) / tot_count;
989474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
990ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Zero probabilities not allowed */
991474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            for (i = 0; i < MB_FEATURE_TREE_PROBS; i ++)
992474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
993474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (xd->mb_segment_tree_probs[i] == 0)
994474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    xd->mb_segment_tree_probs[i] = 1;
995474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
996474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
997474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
998474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
999ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* projected_frame_size in units of BYTES */
1000ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    cpi->projected_frame_size = totalrate >> 8;
1001474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1002ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Make a note of the percentage MBs coded Intra. */
1003474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cm->frame_type == KEY_FRAME)
1004474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1005474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        cpi->this_frame_percent_intra = 100;
1006474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1007474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1008474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1009474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int tot_modes;
1010474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1011d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        tot_modes = cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME]
1012d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    + cpi->mb.count_mb_ref_frame_usage[LAST_FRAME]
1013d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    + cpi->mb.count_mb_ref_frame_usage[GOLDEN_FRAME]
1014d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    + cpi->mb.count_mb_ref_frame_usage[ALTREF_FRAME];
1015474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1016474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (tot_modes)
1017d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            cpi->this_frame_percent_intra =
1018d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                cpi->mb.count_mb_ref_frame_usage[INTRA_FRAME] * 100 / tot_modes;
1019474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1020474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1021474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
10225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if ! CONFIG_REALTIME_ONLY
1023ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Adjust the projected reference frame usage probability numbers to
1024ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * reflect what we have just seen. This may be useful when we make
1025ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * multiple iterations of the recode loop rather than continuing to use
1026ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     * values from the previous frame.
1027ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org     */
1028167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if ((cm->frame_type != KEY_FRAME) && ((cpi->oxcf.number_of_layers > 1) ||
1029167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        (!cm->refresh_alt_ref_frame && !cm->refresh_golden_frame)))
1030474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1031167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org      vp8_convert_rfct_to_prob(cpi);
1032474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1033474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1034474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1035474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_setup_block_ptrs(MACROBLOCK *x)
1036474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1037474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int r, c;
1038474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int i;
1039474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1040474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (r = 0; r < 4; r++)
1041474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1042474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (c = 0; c < 4; c++)
1043474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1044474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->block[r*4+c].src_diff = x->src_diff + r * 4 * 16 + c * 4;
1045474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1046474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1047474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1048474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (r = 0; r < 2; r++)
1049474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1050474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (c = 0; c < 2; c++)
1051474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1052474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->block[16 + r*2+c].src_diff = x->src_diff + 256 + r * 4 * 8 + c * 4;
1053474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1054474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1055474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1056474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1057474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (r = 0; r < 2; r++)
1058474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1059474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (c = 0; c < 2; c++)
1060474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1061474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            x->block[20 + r*2+c].src_diff = x->src_diff + 320 + r * 4 * 8 + c * 4;
1062474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1063474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1064474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1065474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->block[24].src_diff = x->src_diff + 384;
1066474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1067474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1068474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (i = 0; i < 25; i++)
1069474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1070474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->block[i].coeff = x->coeff + i * 16;
1071474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1072474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1073474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1074474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_build_block_offsets(MACROBLOCK *x)
1075474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1076474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int block = 0;
1077474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int br, bc;
1078474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1079474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_build_block_doffsets(&x->e_mbd);
1080474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1081ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* y blocks */
1082474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->thismb_ptr = &x->thismb[0];
1083474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (br = 0; br < 4; br++)
1084474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1085474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (bc = 0; bc < 4; bc++)
1086474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1087474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            BLOCK *this_block = &x->block[block];
1088474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->base_src = &x->thismb_ptr;
1089474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src_stride = 16;
1090474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src = 4 * br * 16 + 4 * bc;
1091474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ++block;
1092474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1093474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1094474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1095ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* u blocks */
1096474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (br = 0; br < 2; br++)
1097474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1098474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (bc = 0; bc < 2; bc++)
1099474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            BLOCK *this_block = &x->block[block];
1101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->base_src = &x->src.u_buffer;
1102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src_stride = x->src.uv_stride;
1103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src = 4 * br * this_block->src_stride + 4 * bc;
1104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ++block;
1105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* v blocks */
1109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    for (br = 0; br < 2; br++)
1110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        for (bc = 0; bc < 2; bc++)
1112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            BLOCK *this_block = &x->block[block];
1114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->base_src = &x->src.v_buffer;
1115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src_stride = x->src.uv_stride;
1116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            this_block->src = 4 * br * this_block->src_stride + 4 * bc;
1117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ++block;
1118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x)
1123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const MACROBLOCKD *xd = & x->e_mbd;
1125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const MB_PREDICTION_MODE m = xd->mode_info_context->mbmi.mode;
1126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const MB_PREDICTION_MODE uvm = xd->mode_info_context->mbmi.uv_mode;
1127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef MODE_STATS
1129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    const int is_key = cpi->common.frame_type == KEY_FRAME;
1130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    ++ (is_key ? uv_modes : inter_uv_modes)[uvm];
1132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (m == B_PRED)
1134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        unsigned int *const bct = is_key ? b_modes : inter_b_modes;
1136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int b = 0;
1138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        do
1140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ++ bct[xd->block[b].bmi.mode];
1142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        while (++b < 16);
1144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1148d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    ++x->ymode_count[m];
1149d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    ++x->uv_mode_count[uvm];
1150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/* Experimental stub function to create a per MB zbin adjustment based on
1154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org * some previously calculated measure of MB activity.
1155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
1156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void adjust_act_zbin( VP8_COMP *cpi, MACROBLOCK *x )
1157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if USE_ACT_INDEX
1159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->act_zbin_adj = *(x->mb_activity_ptr);
1160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
1161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t a;
1162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t b;
1163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t act = *(x->mb_activity_ptr);
1164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Apply the masking to the RD multiplier. */
1166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    a = act + 4*cpi->activity_avg;
1167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    b = 4*act + cpi->activity_avg;
1168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if ( act > cpi->activity_avg )
1170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->act_zbin_adj = (int)(((int64_t)b + (a>>1))/a) - 1;
1171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->act_zbin_adj = 1 - (int)(((int64_t)a + (b>>1))/b);
1173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1176d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgint vp8cx_encode_intra_macroblock(VP8_COMP *cpi, MACROBLOCK *x,
1177d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                                  TOKENEXTRA **t)
1178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1179167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    MACROBLOCKD *xd = &x->e_mbd;
1180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int rate;
1181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.RD && cpi->compressor_speed != 2)
1183d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        vp8_rd_pick_intra_mode(x, &rate);
1184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1185d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        vp8_pick_intra_mode(x, &rate);
1186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
1188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1189474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        adjust_act_zbin( cpi, x );
1190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_update_zbin_extra(cpi, x);
1191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED)
11945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_encode_intra4x4mby(x);
1195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
11965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_encode_intra16x16mby(x);
1197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_encode_intra16x16mbuv(x);
1199167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sum_intra_stats(cpi, x);
12015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1202d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    vp8_tokenize_mb(cpi, x, t);
1203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1204167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    if (xd->mode_info_context->mbmi.mode != B_PRED)
12055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_inverse_transform_mby(xd);
1206167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
12075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    vp8_dequant_idct_add_uv_block
1208167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                    (xd->qcoeff+16*16, xd->dequant_uv,
1209167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                     xd->dst.u_buffer, xd->dst.v_buffer,
1210167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                     xd->dst.uv_stride, xd->eobs+16);
1211474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return rate;
1212474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1213474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef SPEEDSTATS
1214474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern int cnt_pm;
1215474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1216474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1217474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgextern void vp8_fix_contexts(MACROBLOCKD *x);
1218474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1219474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8cx_encode_inter_macroblock
1220474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org(
1221474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
1222167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int recon_yoffset, int recon_uvoffset,
1223167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    int mb_row, int mb_col
1224474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org)
1225474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
1226474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCKD *const xd = &x->e_mbd;
1227474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int intra_error = 0;
1228474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int rate;
1229474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int distortion;
1230474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1231474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    x->skip = 0;
1232474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1233474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xd->segmentation_enabled)
1234474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context->mbmi.segment_id];
1235474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1236474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        x->encode_breakout = cpi->oxcf.encode_breakout;
1237474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#if CONFIG_TEMPORAL_DENOISING
1239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Reset the best sse mode/mv for each macroblock. */
12405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    x->best_reference_frame = INTRA_FRAME;
12415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    x->best_zeromv_reference_frame = INTRA_FRAME;
12425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    x->best_sse_inter_mode = 0;
12435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    x->best_sse_mv.as_int = 0;
12445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org    x->need_to_clamp_best_mvs = 0;
12455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org#endif
12465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1247474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (cpi->sf.RD)
1248474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1249d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        int zbin_mode_boost_enabled = x->zbin_mode_boost_enabled;
1250474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* Are we using the fast quantizer for the mode selection? */
1252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(cpi->sf.use_fastquant_for_pick)
1253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1254d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->quantize_b      = vp8_fast_quantize_b;
1255d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->quantize_b_pair = vp8_fast_quantize_b_pair;
1256474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            /* the fast quantizer does not use zbin_extra, so
1258474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org             * do not recalculate */
1259d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->zbin_mode_boost_enabled = 0;
1260474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1261474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate,
126288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                               &distortion, &intra_error, mb_row, mb_col);
1263474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1264474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* switch back to the regular quantizer for the encode */
1265474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->sf.improved_quant)
1266474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1267d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->quantize_b      = vp8_regular_quantize_b;
1268d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->quantize_b_pair = vp8_regular_quantize_b_pair;
1269474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1270474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1271474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        /* restore cpi->zbin_mode_boost_enabled */
1272d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        x->zbin_mode_boost_enabled = zbin_mode_boost_enabled;
1273474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1274474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1275474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1276167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
1277474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate,
1278167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                            &distortion, &intra_error, mb_row, mb_col);
1279167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
1280474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1281d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    x->prediction_error += distortion;
1282d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    x->intra_error += intra_error;
1283474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1284474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
1285474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* Adjust the zbin based on this MB rate. */
1287474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        adjust_act_zbin( cpi, x );
1288474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1289474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0
1291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* Experimental RD code */
1292474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->frame_distortion += distortion;
1293474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    cpi->last_mb_distortion = distortion;
1294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
1295474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* MB level adjutment to quantizer setup */
1297474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xd->segmentation_enabled)
1298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        /* If cyclic update enabled */
1300167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->current_layer == 0 && cpi->cyclic_refresh_mode_enabled)
1301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org            /* Clear segment_id back to 0 if not coded (last frame 0,0) */
1303474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ((xd->mode_info_context->mbmi.segment_id == 1) &&
1304474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                ((xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) || (xd->mode_info_context->mbmi.mode != ZEROMV)))
1305474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1306474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                xd->mode_info_context->mbmi.segment_id = 0;
1307474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                /* segment_id changed, so update */
1309167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                vp8cx_mb_init_quantizer(cpi, x, 1);
1310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
131510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org        /* Experimental code.
131610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org         * Special case for gf and arf zeromv modes, for 1 temporal layer.
131710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org         * Increase zbin size to supress noise.
1318ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org         */
1319d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        x->zbin_mode_boost = 0;
1320d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        if (x->zbin_mode_boost_enabled)
1321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            if ( xd->mode_info_context->mbmi.ref_frame != INTRA_FRAME )
1323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            {
1324474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                if (xd->mode_info_context->mbmi.mode == ZEROMV)
1325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                {
132610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                    if (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME &&
132710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                        cpi->oxcf.number_of_layers == 1)
1328d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                    else
1330d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                        x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
1331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                }
1332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else if (xd->mode_info_context->mbmi.mode == SPLITMV)
1333d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    x->zbin_mode_boost = 0;
1334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                else
1335d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org                    x->zbin_mode_boost = MV_ZBIN_BOOST;
1336474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            }
1337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1338167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1339167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        /* The fast quantizer doesn't use zbin_extra, only do so with
1340167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org         * the regular quantizer. */
1341167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (cpi->sf.improved_quant)
1342167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org            vp8_update_zbin_extra(cpi, x);
1343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1344474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1345d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org    x->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++;
1346474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1347474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
1348474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
13495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_encode_intra16x16mbuv(x);
1350474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (xd->mode_info_context->mbmi.mode == B_PRED)
1352474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
13535c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_encode_intra4x4mby(x);
1354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
13575c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_encode_intra16x16mby(x);
1358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        sum_intra_stats(cpi, x);
1361474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
1364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        int ref_fb_idx;
1365474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1366474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)
1367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ref_fb_idx = cpi->common.lst_fb_idx;
1368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME)
1369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ref_fb_idx = cpi->common.gld_fb_idx;
1370474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            ref_fb_idx = cpi->common.alt_fb_idx;
1372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoffset;
1374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
1375474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
1376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1377474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (!x->skip)
1378474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
13795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_encode_inter16x16(x);
1380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1381474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_build_inter16x16_predictors_mb(xd, xd->dst.y_buffer,
1383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                           xd->dst.u_buffer, xd->dst.v_buffer,
1384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                                           xd->dst.y_stride, xd->dst.uv_stride);
1385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1386474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1387474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    if (!x->skip)
1389167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    {
1390d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org        vp8_tokenize_mb(cpi, x, t);
1391167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
1392167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org        if (xd->mode_info_context->mbmi.mode != B_PRED)
13935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org            vp8_inverse_transform_mby(xd);
1394167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
13955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        vp8_dequant_idct_add_uv_block
1396167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                        (xd->qcoeff+16*16, xd->dequant_uv,
1397167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         xd->dst.u_buffer, xd->dst.v_buffer,
1398167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org                         xd->dst.uv_stride, xd->eobs+16);
1399167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org    }
1400474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    else
1401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    {
14025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        /* always set mb_skip_coeff as it is needed by the loopfilter */
14035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org        xd->mode_info_context->mbmi.mb_skip_coeff = 1;
14045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org
1405474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if (cpi->common.mb_no_coeff_skip)
1406474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1407d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            x->skip_true_count ++;
1408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vp8_fix_contexts(xd);
1409474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1410474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        else
1411474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        {
1412d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org            vp8_stuff_mb(cpi, x, t);
1413474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        }
1414474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
1415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
1416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    return rate;
1417474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
1418