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