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 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "loopfilter.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "onyxc_int.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_mem/vpx_mem.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void lf_init_lut(loop_filter_info_n *lfi) 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filt_lvl; 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (filt_lvl = 0; filt_lvl <= MAX_LOOP_FILTER; filt_lvl++) 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (filt_lvl >= 40) 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 2; 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 3; 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (filt_lvl >= 20) 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1; 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 2; 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else if (filt_lvl >= 15) 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1; 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 1; 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 0; 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 0; 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[DC_PRED] = 1; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[V_PRED] = 1; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[H_PRED] = 1; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[TM_PRED] = 1; 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[B_PRED] = 0; 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[ZEROMV] = 1; 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[NEARESTMV] = 2; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[NEARMV] = 2; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[NEWMV] = 2; 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->mode_lf_lut[SPLITMV] = 3; 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi, 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int sharpness_lvl) 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* For each possible value for the loop filter fill out limits */ 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i <= MAX_LOOP_FILTER; i++) 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filt_lvl = i; 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int block_inside_limit = 0; 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Set loop filter paramaeters that control sharpness. */ 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org block_inside_limit = filt_lvl >> (sharpness_lvl > 0); 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org block_inside_limit = block_inside_limit >> (sharpness_lvl > 4); 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (sharpness_lvl > 0) 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (block_inside_limit > (9 - sharpness_lvl)) 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org block_inside_limit = (9 - sharpness_lvl); 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (block_inside_limit < 1) 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org block_inside_limit = 1; 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(lfi->lim[i], block_inside_limit, SIMD_WIDTH); 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(lfi->blim[i], (2 * filt_lvl + block_inside_limit), 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org SIMD_WIDTH); 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(lfi->mblim[i], (2 * (filt_lvl + 2) + block_inside_limit), 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org SIMD_WIDTH); 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_init(VP8_COMMON *cm) 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info_n *lfi = &cm->lf_info; 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* init limits for given sharpness*/ 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level); 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cm->last_sharpness_level = cm->sharpness_level; 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* init LUT for lvl and hev thr picking */ 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lf_init_lut(lfi); 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* init hev threshold const vectors */ 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for(i = 0; i < 4 ; i++) 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(lfi->hev_thr[i], i, SIMD_WIDTH); 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_frame_init(VP8_COMMON *cm, 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *mbd, 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int default_filt_lvl) 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int seg, /* segment number */ 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref, /* index in ref_lf_deltas */ 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode; /* index in mode_lf_deltas */ 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info_n *lfi = &cm->lf_info; 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* update limits if sharpness has changed */ 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if(cm->last_sharpness_level != cm->sharpness_level) 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level); 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org cm->last_sharpness_level = cm->sharpness_level; 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for(seg = 0; seg < MAX_MB_SEGMENTS; seg++) 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int lvl_seg = default_filt_lvl; 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int lvl_ref, lvl_mode; 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Note the baseline filter values for each segment */ 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mbd->segmentation_enabled) 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Abs value */ 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA) 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lvl_seg = mbd->segment_feature_data[MB_LVL_ALT_LF][seg]; 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else /* Delta Value */ 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lvl_seg += mbd->segment_feature_data[MB_LVL_ALT_LF][seg]; 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lvl_seg = (lvl_seg > 0) ? ((lvl_seg > 63) ? 63: lvl_seg) : 0; 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!mbd->mode_ref_lf_delta_enabled) 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* we could get rid of this if we assume that deltas are set to 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * zero when not in use; encoder always uses deltas 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_memset(lfi->lvl[seg][0], lvl_seg, 4 * 4 ); 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org continue; 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* INTRA_FRAME */ 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ref = INTRA_FRAME; 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Apply delta for reference frame */ 162ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref]; 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Apply delta for Intra modes */ 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode = 0; /* B_PRED */ 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Only the split mode BPRED has a further special case */ 167ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode]; 168ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org /* clamp */ 169ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0; 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->lvl[seg][ref][mode] = lvl_mode; 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode = 1; /* all the rest of Intra modes */ 174ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org /* clamp */ 175ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_mode = (lvl_ref > 0) ? (lvl_ref > 63 ? 63 : lvl_ref) : 0; 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->lvl[seg][ref][mode] = lvl_mode; 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* LAST, GOLDEN, ALT */ 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for(ref = 1; ref < MAX_REF_FRAMES; ref++) 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Apply delta for reference frame */ 182ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref]; 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Apply delta for Inter modes */ 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mode = 1; mode < 4; mode++) 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode]; 188ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org /* clamp */ 189ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0; 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi->lvl[seg][ref][mode] = lvl_mode; 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_row_normal(VP8_COMMON *cm, MODE_INFO *mode_info_context, 199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int mb_row, int post_ystride, int post_uvstride, 200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *y_ptr, unsigned char *u_ptr, 201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *v_ptr) 202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int mb_col; 204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int filter_level; 205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org loop_filter_info_n *lfi_n = &cm->lf_info; 206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org loop_filter_info lfi; 207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org FRAME_TYPE frame_type = cm->frame_type; 208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 210ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context->mbmi.mode != SPLITMV && 213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context->mbmi.mb_skip_coeff); 214ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 215ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 216ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int seg = mode_info_context->mbmi.segment_id; 217ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 218ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 219ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 220ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (filter_level) 222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lfi.mblim = lfi_n->mblim[filter_level]; 225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lfi.blim = lfi_n->blim[filter_level]; 226ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lfi.lim = lfi_n->lim[filter_level]; 227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org lfi.hev_thr = lfi_n->hev_thr[hev_index]; 228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mb_col > 0) 230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_mbv 231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!skip_lf) 234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_bv 235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* don't apply across umv border */ 238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mb_row > 0) 239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_mbh 240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!skip_lf) 243ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_bh 244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 245ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org y_ptr += 16; 248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org u_ptr += 8; 249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org v_ptr += 8; 250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 251ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context++; /* step to next MB */ 252ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 253ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 254ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 255ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 256ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgvoid vp8_loop_filter_row_simple(VP8_COMMON *cm, MODE_INFO *mode_info_context, 257ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int mb_row, int post_ystride, int post_uvstride, 258ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *y_ptr, unsigned char *u_ptr, 259ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *v_ptr) 260ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org{ 261ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int mb_col; 262ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int filter_level; 263ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org loop_filter_info_n *lfi_n = &cm->lf_info; 264ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 265ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 266ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 267ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 268ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context->mbmi.mode != SPLITMV && 269ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context->mbmi.mb_skip_coeff); 270ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 271ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 272ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int seg = mode_info_context->mbmi.segment_id; 273ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 274ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 275ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 276ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 277ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (filter_level) 278ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org { 279ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mb_col > 0) 280ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_simple_mbv 281ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, post_ystride, lfi_n->mblim[filter_level]); 282ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 283ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!skip_lf) 284ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_simple_bv 285ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, post_ystride, lfi_n->blim[filter_level]); 286ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 287ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org /* don't apply across umv border */ 288ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (mb_row > 0) 289ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_simple_mbh 290ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, post_ystride, lfi_n->mblim[filter_level]); 291ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 292ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org if (!skip_lf) 293ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_loop_filter_simple_bh 294ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org (y_ptr, post_ystride, lfi_n->blim[filter_level]); 295ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 296ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 297ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org y_ptr += 16; 298ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org u_ptr += 8; 299ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org v_ptr += 8; 300ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 301ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org mode_info_context++; /* step to next MB */ 302ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org } 303ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 304ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} 3055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_loop_filter_frame(VP8_COMMON *cm, 3065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MACROBLOCKD *mbd, 3075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int frame_type) 308474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 309474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG *post = cm->frame_to_show; 310474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info_n *lfi_n = &cm->lf_info; 311474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info lfi; 312474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 313474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row; 314474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_col; 3155c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_rows = cm->mb_rows; 3165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int mb_cols = cm->mb_cols; 317474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 318474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filter_level; 319474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *y_ptr, *u_ptr, *v_ptr; 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Point at base of Mb MODE_INFO list */ 323474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MODE_INFO *mode_info_context = cm->mi; 3245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int post_y_stride = post->y_stride; 3255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int post_uv_stride = post->uv_stride; 326474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 327474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Initialize the loop filter for this frame. */ 328474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_frame_init(cm, mbd, cm->filter_level); 329474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 330474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Set up the buffer pointers */ 331474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr = post->y_buffer; 332474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org u_ptr = post->u_buffer; 333474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org v_ptr = post->v_buffer; 334474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 335474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vp8_filter each macro block */ 3365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (cm->filter_type == NORMAL_LOOPFILTER) 337474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 3385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_row = 0; mb_row < mb_rows; mb_row++) 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 3405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_col = 0; mb_col < mb_cols; mb_col++) 3415c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 3435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context->mbmi.mode != SPLITMV && 3445c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context->mbmi.mb_skip_coeff); 345474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3465c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 3475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int seg = mode_info_context->mbmi.segment_id; 3485c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 349474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3505c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 351474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (filter_level) 353474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 354474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 355474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.mblim = lfi_n->mblim[filter_level]; 356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.blim = lfi_n->blim[filter_level]; 357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.lim = lfi_n->lim[filter_level]; 358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.hev_thr = lfi_n->hev_thr[hev_index]; 359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 360474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 3615c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbv 3625c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 363474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 364474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 3655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bv 3665c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 367474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 368474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* don't apply across umv border */ 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_row > 0) 3705c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbh 3715c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 3745c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bh 3755c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 376474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 3775c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3785c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org y_ptr += 16; 3795c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org u_ptr += 8; 3805c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org v_ptr += 8; 3815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3825c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context++; /* step to next MB */ 3835c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 3845c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org y_ptr += post_y_stride * 16 - post->y_width; 3855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org u_ptr += post_uv_stride * 8 - post->uv_width; 3865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org v_ptr += post_uv_stride * 8 - post->uv_width; 3875c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3885c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context++; /* Skip border mb */ 3895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 3905c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 3915c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 3925c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org else /* SIMPLE_LOOPFILTER */ 3935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3945c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_row = 0; mb_row < mb_rows; mb_row++) 3955c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3965c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org for (mb_col = 0; mb_col < mb_cols; mb_col++) 3975c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org { 3985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 3995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context->mbmi.mode != SPLITMV && 4005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context->mbmi.mb_skip_coeff); 4015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 4035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int seg = mode_info_context->mbmi.segment_id; 4045c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 4055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 4065c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 4075c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org if (filter_level) 408474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 4095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const unsigned char * mblim = lfi_n->mblim[filter_level]; 4105c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org const unsigned char * blim = lfi_n->blim[filter_level]; 4115c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org 412474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 4135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbv 4145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, post_y_stride, mblim); 415474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 416474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 4175c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bv 4185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, post_y_stride, blim); 419474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 420474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* don't apply across umv border */ 421474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_row > 0) 4225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbh 4235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, post_y_stride, mblim); 424474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 425474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 4265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bh 4275c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org (y_ptr, post_y_stride, blim); 428474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 429474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4305c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org y_ptr += 16; 4315c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org u_ptr += 8; 4325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org v_ptr += 8; 433474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context++; /* step to next MB */ 4355c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 4365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org y_ptr += post_y_stride * 16 - post->y_width; 4375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org u_ptr += post_uv_stride * 8 - post->uv_width; 4385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org v_ptr += post_uv_stride * 8 - post->uv_width; 439474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4405c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org mode_info_context++; /* Skip border mb */ 441474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org } 443474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 444474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 445474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 446474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_frame_yonly 447474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 448474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *cm, 449474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *mbd, 450474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int default_filt_lvl 451474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 452474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 453474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG *post = cm->frame_to_show; 454474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 455474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *y_ptr; 456474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row; 457474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_col; 458474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 459474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info_n *lfi_n = &cm->lf_info; 460474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info lfi; 461474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 462474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filter_level; 463474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FRAME_TYPE frame_type = cm->frame_type; 464474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 465474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Point at base of Mb MODE_INFO list */ 466474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MODE_INFO *mode_info_context = cm->mi; 467474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 468474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if 0 469474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if(default_filt_lvl == 0) /* no filter applied */ 470474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return; 471474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 472474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 473474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Initialize the loop filter for this frame. */ 474474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl); 475474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 476474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* Set up the buffer pointers */ 477474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr = post->y_buffer; 478474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 479474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vp8_filter each macro block */ 480474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) 481474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 482474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 483474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 484474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 485474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context->mbmi.mode != SPLITMV && 486474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context->mbmi.mb_skip_coeff); 487474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 488474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 489474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int seg = mode_info_context->mbmi.segment_id; 490474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 491474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 492474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 493474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 494474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (filter_level) 495474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 496474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cm->filter_type == NORMAL_LOOPFILTER) 497474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 498474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 499474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.mblim = lfi_n->mblim[filter_level]; 500474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.blim = lfi_n->blim[filter_level]; 501474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.lim = lfi_n->lim[filter_level]; 502474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.hev_thr = lfi_n->hev_thr[hev_index]; 503474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 504474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 5055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbv 506474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 507474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 508474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 5095c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bv 510474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 511474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 512474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* don't apply across umv border */ 513474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_row > 0) 5145c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbh 515474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 516474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 517474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 5185c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bh 519474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 520474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 521474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 522474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 523474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 5245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbv 525474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 526474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 527474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 5285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bv 529474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 530474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 531474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* don't apply across umv border */ 532474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_row > 0) 5335c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbh 534474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 535474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 536474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 5375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bh 538474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 539474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 540474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 541474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 542474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr += 16; 543474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context ++; /* step to next MB */ 544474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 545474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 546474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 547474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr += post->y_stride * 16 - post->y_width; 548474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context ++; /* Skip border mb */ 549474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 550474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 551474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 552474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 553474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvoid vp8_loop_filter_partial_frame 554474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org( 555474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org VP8_COMMON *cm, 556474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org MACROBLOCKD *mbd, 557474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int default_filt_lvl 558474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org) 559474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 560474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org YV12_BUFFER_CONFIG *post = cm->frame_to_show; 561474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 562474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char *y_ptr; 563474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_row; 564474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int mb_col; 565167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int mb_cols = post->y_width >> 4; 566167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int mb_rows = post->y_height >> 4; 567474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 568d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org int linestocopy; 569474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 570474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info_n *lfi_n = &cm->lf_info; 571474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org loop_filter_info lfi; 572474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 573474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int filter_level; 574474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FRAME_TYPE frame_type = cm->frame_type; 575474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 576474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const MODE_INFO *mode_info_context; 577474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 578d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#if 0 579d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org if(default_filt_lvl == 0) /* no filter applied */ 580d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org return; 581d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org#endif 582d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 583d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org /* Initialize the loop filter for this frame. */ 584d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl); 585474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 586167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* number of MB rows to use in partial filtering */ 587167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org linestocopy = mb_rows / PARTIAL_FRAME_FRACTION; 588167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org linestocopy = linestocopy ? linestocopy << 4 : 16; /* 16 lines per MB */ 589474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 590167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org /* Set up the buffer pointers; partial image starts at ~middle of frame */ 591167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org y_ptr = post->y_buffer + ((post->y_height >> 5) * 16) * post->y_stride; 592167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mode_info_context = cm->mi + (post->y_height >> 5) * (mb_cols + 1); 593474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 594474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org /* vp8_filter each macro block */ 595474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mb_row = 0; mb_row<(linestocopy >> 4); mb_row++) 596474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 597474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (mb_col = 0; mb_col < mb_cols; mb_col++) 598474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 599474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 600474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context->mbmi.mode != SPLITMV && 601474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context->mbmi.mb_skip_coeff); 602474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 603d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org const int mode_index = 604d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 605d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org const int seg = mode_info_context->mbmi.segment_id; 606d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org const int ref_frame = mode_info_context->mbmi.ref_frame; 607d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 608d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 609474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 610474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (filter_level) 611474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 612474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (cm->filter_type == NORMAL_LOOPFILTER) 613474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 614474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 615474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.mblim = lfi_n->mblim[filter_level]; 616474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.blim = lfi_n->blim[filter_level]; 617474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.lim = lfi_n->lim[filter_level]; 618474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org lfi.hev_thr = lfi_n->hev_thr[hev_index]; 619474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 620474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 6215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbv 622474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 623474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 624474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 6255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bv 626474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 627474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_mbh 629474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 630474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 631474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 6325c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_bh 633474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, 0, 0, post->y_stride, 0, &lfi); 634474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 635474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 636474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 637474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (mb_col > 0) 6385c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbv 639474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 640474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 641474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 6425c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bv 643474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 644474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 6455c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_mbh 646474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 647474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 648474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (!skip_lf) 6495c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_loop_filter_simple_bh 650474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 651474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 652474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 653474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 654474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr += 16; 655474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context += 1; /* step to next MB */ 656474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 657474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 658474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org y_ptr += post->y_stride * 16 - post->y_width; 659474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mode_info_context += 1; /* Skip border mb */ 660474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 661474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 662