11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "loopfilter.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "onyxc_int.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 171b362b15af34006e6a11974088a46d42b903418eJohann 181b362b15af34006e6a11974088a46d42b903418eJohann 191b362b15af34006e6a11974088a46d42b903418eJohannstatic void lf_init_lut(loop_filter_info_n *lfi) 201b362b15af34006e6a11974088a46d42b903418eJohann{ 211b362b15af34006e6a11974088a46d42b903418eJohann int filt_lvl; 221b362b15af34006e6a11974088a46d42b903418eJohann 231b362b15af34006e6a11974088a46d42b903418eJohann for (filt_lvl = 0; filt_lvl <= MAX_LOOP_FILTER; filt_lvl++) 241b362b15af34006e6a11974088a46d42b903418eJohann { 251b362b15af34006e6a11974088a46d42b903418eJohann if (filt_lvl >= 40) 261b362b15af34006e6a11974088a46d42b903418eJohann { 271b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 2; 281b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 3; 291b362b15af34006e6a11974088a46d42b903418eJohann } 301b362b15af34006e6a11974088a46d42b903418eJohann else if (filt_lvl >= 20) 311b362b15af34006e6a11974088a46d42b903418eJohann { 321b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1; 331b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 2; 341b362b15af34006e6a11974088a46d42b903418eJohann } 351b362b15af34006e6a11974088a46d42b903418eJohann else if (filt_lvl >= 15) 361b362b15af34006e6a11974088a46d42b903418eJohann { 371b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 1; 381b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 1; 391b362b15af34006e6a11974088a46d42b903418eJohann } 401b362b15af34006e6a11974088a46d42b903418eJohann else 411b362b15af34006e6a11974088a46d42b903418eJohann { 421b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[KEY_FRAME][filt_lvl] = 0; 431b362b15af34006e6a11974088a46d42b903418eJohann lfi->hev_thr_lut[INTER_FRAME][filt_lvl] = 0; 441b362b15af34006e6a11974088a46d42b903418eJohann } 451b362b15af34006e6a11974088a46d42b903418eJohann } 461b362b15af34006e6a11974088a46d42b903418eJohann 471b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[DC_PRED] = 1; 481b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[V_PRED] = 1; 491b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[H_PRED] = 1; 501b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[TM_PRED] = 1; 511b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[B_PRED] = 0; 521b362b15af34006e6a11974088a46d42b903418eJohann 531b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[ZEROMV] = 1; 541b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[NEARESTMV] = 2; 551b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[NEARMV] = 2; 561b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[NEWMV] = 2; 571b362b15af34006e6a11974088a46d42b903418eJohann lfi->mode_lf_lut[SPLITMV] = 3; 581b362b15af34006e6a11974088a46d42b903418eJohann 591b362b15af34006e6a11974088a46d42b903418eJohann} 601b362b15af34006e6a11974088a46d42b903418eJohann 611b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_update_sharpness(loop_filter_info_n *lfi, 621b362b15af34006e6a11974088a46d42b903418eJohann int sharpness_lvl) 631b362b15af34006e6a11974088a46d42b903418eJohann{ 641b362b15af34006e6a11974088a46d42b903418eJohann int i; 651b362b15af34006e6a11974088a46d42b903418eJohann 661b362b15af34006e6a11974088a46d42b903418eJohann /* For each possible value for the loop filter fill out limits */ 671b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i <= MAX_LOOP_FILTER; i++) 681b362b15af34006e6a11974088a46d42b903418eJohann { 691b362b15af34006e6a11974088a46d42b903418eJohann int filt_lvl = i; 701b362b15af34006e6a11974088a46d42b903418eJohann int block_inside_limit = 0; 711b362b15af34006e6a11974088a46d42b903418eJohann 721b362b15af34006e6a11974088a46d42b903418eJohann /* Set loop filter paramaeters that control sharpness. */ 731b362b15af34006e6a11974088a46d42b903418eJohann block_inside_limit = filt_lvl >> (sharpness_lvl > 0); 741b362b15af34006e6a11974088a46d42b903418eJohann block_inside_limit = block_inside_limit >> (sharpness_lvl > 4); 751b362b15af34006e6a11974088a46d42b903418eJohann 761b362b15af34006e6a11974088a46d42b903418eJohann if (sharpness_lvl > 0) 771b362b15af34006e6a11974088a46d42b903418eJohann { 781b362b15af34006e6a11974088a46d42b903418eJohann if (block_inside_limit > (9 - sharpness_lvl)) 791b362b15af34006e6a11974088a46d42b903418eJohann block_inside_limit = (9 - sharpness_lvl); 801b362b15af34006e6a11974088a46d42b903418eJohann } 811b362b15af34006e6a11974088a46d42b903418eJohann 821b362b15af34006e6a11974088a46d42b903418eJohann if (block_inside_limit < 1) 831b362b15af34006e6a11974088a46d42b903418eJohann block_inside_limit = 1; 841b362b15af34006e6a11974088a46d42b903418eJohann 851b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(lfi->lim[i], block_inside_limit, SIMD_WIDTH); 861b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(lfi->blim[i], (2 * filt_lvl + block_inside_limit), 871b362b15af34006e6a11974088a46d42b903418eJohann SIMD_WIDTH); 881b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(lfi->mblim[i], (2 * (filt_lvl + 2) + block_inside_limit), 891b362b15af34006e6a11974088a46d42b903418eJohann SIMD_WIDTH); 901b362b15af34006e6a11974088a46d42b903418eJohann } 911b362b15af34006e6a11974088a46d42b903418eJohann} 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_init(VP8_COMMON *cm) 941b362b15af34006e6a11974088a46d42b903418eJohann{ 951b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi = &cm->lf_info; 961b362b15af34006e6a11974088a46d42b903418eJohann int i; 971b362b15af34006e6a11974088a46d42b903418eJohann 981b362b15af34006e6a11974088a46d42b903418eJohann /* init limits for given sharpness*/ 991b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level); 1001b362b15af34006e6a11974088a46d42b903418eJohann cm->last_sharpness_level = cm->sharpness_level; 1011b362b15af34006e6a11974088a46d42b903418eJohann 1021b362b15af34006e6a11974088a46d42b903418eJohann /* init LUT for lvl and hev thr picking */ 1031b362b15af34006e6a11974088a46d42b903418eJohann lf_init_lut(lfi); 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann /* init hev threshold const vectors */ 1061b362b15af34006e6a11974088a46d42b903418eJohann for(i = 0; i < 4 ; i++) 1071b362b15af34006e6a11974088a46d42b903418eJohann { 1081b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(lfi->hev_thr[i], i, SIMD_WIDTH); 1091b362b15af34006e6a11974088a46d42b903418eJohann } 1101b362b15af34006e6a11974088a46d42b903418eJohann} 1111b362b15af34006e6a11974088a46d42b903418eJohann 1121b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_frame_init(VP8_COMMON *cm, 1131b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *mbd, 1141b362b15af34006e6a11974088a46d42b903418eJohann int default_filt_lvl) 1151b362b15af34006e6a11974088a46d42b903418eJohann{ 1161b362b15af34006e6a11974088a46d42b903418eJohann int seg, /* segment number */ 1171b362b15af34006e6a11974088a46d42b903418eJohann ref, /* index in ref_lf_deltas */ 1181b362b15af34006e6a11974088a46d42b903418eJohann mode; /* index in mode_lf_deltas */ 1191b362b15af34006e6a11974088a46d42b903418eJohann 1201b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi = &cm->lf_info; 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann /* update limits if sharpness has changed */ 1231b362b15af34006e6a11974088a46d42b903418eJohann if(cm->last_sharpness_level != cm->sharpness_level) 1241b362b15af34006e6a11974088a46d42b903418eJohann { 1251b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_update_sharpness(lfi, cm->sharpness_level); 1261b362b15af34006e6a11974088a46d42b903418eJohann cm->last_sharpness_level = cm->sharpness_level; 1271b362b15af34006e6a11974088a46d42b903418eJohann } 1281b362b15af34006e6a11974088a46d42b903418eJohann 1291b362b15af34006e6a11974088a46d42b903418eJohann for(seg = 0; seg < MAX_MB_SEGMENTS; seg++) 1301b362b15af34006e6a11974088a46d42b903418eJohann { 1311b362b15af34006e6a11974088a46d42b903418eJohann int lvl_seg = default_filt_lvl; 1321b362b15af34006e6a11974088a46d42b903418eJohann int lvl_ref, lvl_mode; 1331b362b15af34006e6a11974088a46d42b903418eJohann 1341b362b15af34006e6a11974088a46d42b903418eJohann /* Note the baseline filter values for each segment */ 1351b362b15af34006e6a11974088a46d42b903418eJohann if (mbd->segmentation_enabled) 1361b362b15af34006e6a11974088a46d42b903418eJohann { 1371b362b15af34006e6a11974088a46d42b903418eJohann /* Abs value */ 1381b362b15af34006e6a11974088a46d42b903418eJohann if (mbd->mb_segement_abs_delta == SEGMENT_ABSDATA) 1391b362b15af34006e6a11974088a46d42b903418eJohann { 1401b362b15af34006e6a11974088a46d42b903418eJohann lvl_seg = mbd->segment_feature_data[MB_LVL_ALT_LF][seg]; 1411b362b15af34006e6a11974088a46d42b903418eJohann } 1421b362b15af34006e6a11974088a46d42b903418eJohann else /* Delta Value */ 1431b362b15af34006e6a11974088a46d42b903418eJohann { 1441b362b15af34006e6a11974088a46d42b903418eJohann lvl_seg += mbd->segment_feature_data[MB_LVL_ALT_LF][seg]; 1451b362b15af34006e6a11974088a46d42b903418eJohann lvl_seg = (lvl_seg > 0) ? ((lvl_seg > 63) ? 63: lvl_seg) : 0; 1461b362b15af34006e6a11974088a46d42b903418eJohann } 1471b362b15af34006e6a11974088a46d42b903418eJohann } 1481b362b15af34006e6a11974088a46d42b903418eJohann 1491b362b15af34006e6a11974088a46d42b903418eJohann if (!mbd->mode_ref_lf_delta_enabled) 1501b362b15af34006e6a11974088a46d42b903418eJohann { 1511b362b15af34006e6a11974088a46d42b903418eJohann /* we could get rid of this if we assume that deltas are set to 1521b362b15af34006e6a11974088a46d42b903418eJohann * zero when not in use; encoder always uses deltas 1531b362b15af34006e6a11974088a46d42b903418eJohann */ 1541b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(lfi->lvl[seg][0], lvl_seg, 4 * 4 ); 1551b362b15af34006e6a11974088a46d42b903418eJohann continue; 1561b362b15af34006e6a11974088a46d42b903418eJohann } 1571b362b15af34006e6a11974088a46d42b903418eJohann 1581b362b15af34006e6a11974088a46d42b903418eJohann /* INTRA_FRAME */ 1591b362b15af34006e6a11974088a46d42b903418eJohann ref = INTRA_FRAME; 1601b362b15af34006e6a11974088a46d42b903418eJohann 1611b362b15af34006e6a11974088a46d42b903418eJohann /* Apply delta for reference frame */ 162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref]; 1631b362b15af34006e6a11974088a46d42b903418eJohann 1641b362b15af34006e6a11974088a46d42b903418eJohann /* Apply delta for Intra modes */ 1651b362b15af34006e6a11974088a46d42b903418eJohann mode = 0; /* B_PRED */ 1661b362b15af34006e6a11974088a46d42b903418eJohann /* Only the split mode BPRED has a further special case */ 167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode]; 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* clamp */ 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0; 1701b362b15af34006e6a11974088a46d42b903418eJohann 1711b362b15af34006e6a11974088a46d42b903418eJohann lfi->lvl[seg][ref][mode] = lvl_mode; 1721b362b15af34006e6a11974088a46d42b903418eJohann 1731b362b15af34006e6a11974088a46d42b903418eJohann mode = 1; /* all the rest of Intra modes */ 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* clamp */ 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_mode = (lvl_ref > 0) ? (lvl_ref > 63 ? 63 : lvl_ref) : 0; 1761b362b15af34006e6a11974088a46d42b903418eJohann lfi->lvl[seg][ref][mode] = lvl_mode; 1771b362b15af34006e6a11974088a46d42b903418eJohann 1781b362b15af34006e6a11974088a46d42b903418eJohann /* LAST, GOLDEN, ALT */ 1791b362b15af34006e6a11974088a46d42b903418eJohann for(ref = 1; ref < MAX_REF_FRAMES; ref++) 1801b362b15af34006e6a11974088a46d42b903418eJohann { 1811b362b15af34006e6a11974088a46d42b903418eJohann /* Apply delta for reference frame */ 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_ref = lvl_seg + mbd->ref_lf_deltas[ref]; 1831b362b15af34006e6a11974088a46d42b903418eJohann 1841b362b15af34006e6a11974088a46d42b903418eJohann /* Apply delta for Inter modes */ 1851b362b15af34006e6a11974088a46d42b903418eJohann for (mode = 1; mode < 4; mode++) 1861b362b15af34006e6a11974088a46d42b903418eJohann { 1871b362b15af34006e6a11974088a46d42b903418eJohann lvl_mode = lvl_ref + mbd->mode_lf_deltas[mode]; 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* clamp */ 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lvl_mode = (lvl_mode > 0) ? (lvl_mode > 63 ? 63 : lvl_mode) : 0; 1901b362b15af34006e6a11974088a46d42b903418eJohann 1911b362b15af34006e6a11974088a46d42b903418eJohann lfi->lvl[seg][ref][mode] = lvl_mode; 1921b362b15af34006e6a11974088a46d42b903418eJohann } 1931b362b15af34006e6a11974088a46d42b903418eJohann } 1941b362b15af34006e6a11974088a46d42b903418eJohann } 1951b362b15af34006e6a11974088a46d42b903418eJohann} 1961b362b15af34006e6a11974088a46d42b903418eJohann 1971b362b15af34006e6a11974088a46d42b903418eJohann 1981b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_row_normal(VP8_COMMON *cm, MODE_INFO *mode_info_context, 1991b362b15af34006e6a11974088a46d42b903418eJohann int mb_row, int post_ystride, int post_uvstride, 2001b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_ptr, unsigned char *u_ptr, 2011b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *v_ptr) 2021b362b15af34006e6a11974088a46d42b903418eJohann{ 2031b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 2041b362b15af34006e6a11974088a46d42b903418eJohann int filter_level; 2051b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi_n = &cm->lf_info; 2061b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info lfi; 2071b362b15af34006e6a11974088a46d42b903418eJohann FRAME_TYPE frame_type = cm->frame_type; 2081b362b15af34006e6a11974088a46d42b903418eJohann 2091b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 2101b362b15af34006e6a11974088a46d42b903418eJohann { 2111b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 2121b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 2131b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 2141b362b15af34006e6a11974088a46d42b903418eJohann 2151b362b15af34006e6a11974088a46d42b903418eJohann const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 2161b362b15af34006e6a11974088a46d42b903418eJohann const int seg = mode_info_context->mbmi.segment_id; 2171b362b15af34006e6a11974088a46d42b903418eJohann const int ref_frame = mode_info_context->mbmi.ref_frame; 2181b362b15af34006e6a11974088a46d42b903418eJohann 2191b362b15af34006e6a11974088a46d42b903418eJohann filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 2201b362b15af34006e6a11974088a46d42b903418eJohann 2211b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 2221b362b15af34006e6a11974088a46d42b903418eJohann { 2231b362b15af34006e6a11974088a46d42b903418eJohann const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 2241b362b15af34006e6a11974088a46d42b903418eJohann lfi.mblim = lfi_n->mblim[filter_level]; 2251b362b15af34006e6a11974088a46d42b903418eJohann lfi.blim = lfi_n->blim[filter_level]; 2261b362b15af34006e6a11974088a46d42b903418eJohann lfi.lim = lfi_n->lim[filter_level]; 2271b362b15af34006e6a11974088a46d42b903418eJohann lfi.hev_thr = lfi_n->hev_thr[hev_index]; 2281b362b15af34006e6a11974088a46d42b903418eJohann 2291b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 2301b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbv 2311b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 2321b362b15af34006e6a11974088a46d42b903418eJohann 2331b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 2341b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bv 2351b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 2361b362b15af34006e6a11974088a46d42b903418eJohann 2371b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 2381b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 2391b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbh 2401b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 2411b362b15af34006e6a11974088a46d42b903418eJohann 2421b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 2431b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bh 2441b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_ystride, post_uvstride, &lfi); 2451b362b15af34006e6a11974088a46d42b903418eJohann } 2461b362b15af34006e6a11974088a46d42b903418eJohann 2471b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 2481b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += 8; 2491b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += 8; 2501b362b15af34006e6a11974088a46d42b903418eJohann 2511b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* step to next MB */ 2521b362b15af34006e6a11974088a46d42b903418eJohann } 2531b362b15af34006e6a11974088a46d42b903418eJohann 2541b362b15af34006e6a11974088a46d42b903418eJohann} 2551b362b15af34006e6a11974088a46d42b903418eJohann 2561b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_row_simple(VP8_COMMON *cm, MODE_INFO *mode_info_context, 2571b362b15af34006e6a11974088a46d42b903418eJohann int mb_row, int post_ystride, int post_uvstride, 2581b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_ptr, unsigned char *u_ptr, 2591b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *v_ptr) 2601b362b15af34006e6a11974088a46d42b903418eJohann{ 2611b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 2621b362b15af34006e6a11974088a46d42b903418eJohann int filter_level; 2631b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi_n = &cm->lf_info; 2641b362b15af34006e6a11974088a46d42b903418eJohann 2651b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 2661b362b15af34006e6a11974088a46d42b903418eJohann { 2671b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 2681b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 2691b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 2701b362b15af34006e6a11974088a46d42b903418eJohann 2711b362b15af34006e6a11974088a46d42b903418eJohann const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 2721b362b15af34006e6a11974088a46d42b903418eJohann const int seg = mode_info_context->mbmi.segment_id; 2731b362b15af34006e6a11974088a46d42b903418eJohann const int ref_frame = mode_info_context->mbmi.ref_frame; 2741b362b15af34006e6a11974088a46d42b903418eJohann 2751b362b15af34006e6a11974088a46d42b903418eJohann filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 2761b362b15af34006e6a11974088a46d42b903418eJohann 2771b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 2781b362b15af34006e6a11974088a46d42b903418eJohann { 2791b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 2801b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbv 2811b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_ystride, lfi_n->mblim[filter_level]); 2821b362b15af34006e6a11974088a46d42b903418eJohann 2831b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 2841b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bv 2851b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_ystride, lfi_n->blim[filter_level]); 2861b362b15af34006e6a11974088a46d42b903418eJohann 2871b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 2881b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 2891b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbh 2901b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_ystride, lfi_n->mblim[filter_level]); 2911b362b15af34006e6a11974088a46d42b903418eJohann 2921b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 2931b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bh 2941b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_ystride, lfi_n->blim[filter_level]); 2951b362b15af34006e6a11974088a46d42b903418eJohann } 2961b362b15af34006e6a11974088a46d42b903418eJohann 2971b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 2981b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += 8; 2991b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += 8; 3001b362b15af34006e6a11974088a46d42b903418eJohann 3011b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* step to next MB */ 3021b362b15af34006e6a11974088a46d42b903418eJohann } 3031b362b15af34006e6a11974088a46d42b903418eJohann 3041b362b15af34006e6a11974088a46d42b903418eJohann} 3051b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_frame(VP8_COMMON *cm, 3061b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *mbd, 3071b362b15af34006e6a11974088a46d42b903418eJohann int frame_type) 3081b362b15af34006e6a11974088a46d42b903418eJohann{ 3091b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *post = cm->frame_to_show; 3101b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi_n = &cm->lf_info; 3111b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info lfi; 3121b362b15af34006e6a11974088a46d42b903418eJohann 3131b362b15af34006e6a11974088a46d42b903418eJohann int mb_row; 3141b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 3151b362b15af34006e6a11974088a46d42b903418eJohann int mb_rows = cm->mb_rows; 3161b362b15af34006e6a11974088a46d42b903418eJohann int mb_cols = cm->mb_cols; 3171b362b15af34006e6a11974088a46d42b903418eJohann 3181b362b15af34006e6a11974088a46d42b903418eJohann int filter_level; 3191b362b15af34006e6a11974088a46d42b903418eJohann 3201b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_ptr, *u_ptr, *v_ptr; 3211b362b15af34006e6a11974088a46d42b903418eJohann 3221b362b15af34006e6a11974088a46d42b903418eJohann /* Point at base of Mb MODE_INFO list */ 3231b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *mode_info_context = cm->mi; 3241b362b15af34006e6a11974088a46d42b903418eJohann int post_y_stride = post->y_stride; 3251b362b15af34006e6a11974088a46d42b903418eJohann int post_uv_stride = post->uv_stride; 3261b362b15af34006e6a11974088a46d42b903418eJohann 3271b362b15af34006e6a11974088a46d42b903418eJohann /* Initialize the loop filter for this frame. */ 3281b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_frame_init(cm, mbd, cm->filter_level); 3291b362b15af34006e6a11974088a46d42b903418eJohann 3301b362b15af34006e6a11974088a46d42b903418eJohann /* Set up the buffer pointers */ 3311b362b15af34006e6a11974088a46d42b903418eJohann y_ptr = post->y_buffer; 3321b362b15af34006e6a11974088a46d42b903418eJohann u_ptr = post->u_buffer; 3331b362b15af34006e6a11974088a46d42b903418eJohann v_ptr = post->v_buffer; 3341b362b15af34006e6a11974088a46d42b903418eJohann 3351b362b15af34006e6a11974088a46d42b903418eJohann /* vp8_filter each macro block */ 3361b362b15af34006e6a11974088a46d42b903418eJohann if (cm->filter_type == NORMAL_LOOPFILTER) 3371b362b15af34006e6a11974088a46d42b903418eJohann { 3381b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row < mb_rows; mb_row++) 3391b362b15af34006e6a11974088a46d42b903418eJohann { 3401b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < mb_cols; mb_col++) 3411b362b15af34006e6a11974088a46d42b903418eJohann { 3421b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 3431b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 3441b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 3451b362b15af34006e6a11974088a46d42b903418eJohann 3461b362b15af34006e6a11974088a46d42b903418eJohann const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 3471b362b15af34006e6a11974088a46d42b903418eJohann const int seg = mode_info_context->mbmi.segment_id; 3481b362b15af34006e6a11974088a46d42b903418eJohann const int ref_frame = mode_info_context->mbmi.ref_frame; 3491b362b15af34006e6a11974088a46d42b903418eJohann 3501b362b15af34006e6a11974088a46d42b903418eJohann filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 3511b362b15af34006e6a11974088a46d42b903418eJohann 3521b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 3531b362b15af34006e6a11974088a46d42b903418eJohann { 3541b362b15af34006e6a11974088a46d42b903418eJohann const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 3551b362b15af34006e6a11974088a46d42b903418eJohann lfi.mblim = lfi_n->mblim[filter_level]; 3561b362b15af34006e6a11974088a46d42b903418eJohann lfi.blim = lfi_n->blim[filter_level]; 3571b362b15af34006e6a11974088a46d42b903418eJohann lfi.lim = lfi_n->lim[filter_level]; 3581b362b15af34006e6a11974088a46d42b903418eJohann lfi.hev_thr = lfi_n->hev_thr[hev_index]; 3591b362b15af34006e6a11974088a46d42b903418eJohann 3601b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 3611b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbv 3621b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 3631b362b15af34006e6a11974088a46d42b903418eJohann 3641b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 3651b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bv 3661b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 3671b362b15af34006e6a11974088a46d42b903418eJohann 3681b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 3691b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 3701b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbh 3711b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 3721b362b15af34006e6a11974088a46d42b903418eJohann 3731b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 3741b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bh 3751b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, u_ptr, v_ptr, post_y_stride, post_uv_stride, &lfi); 3761b362b15af34006e6a11974088a46d42b903418eJohann } 3771b362b15af34006e6a11974088a46d42b903418eJohann 3781b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 3791b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += 8; 3801b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += 8; 3811b362b15af34006e6a11974088a46d42b903418eJohann 3821b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* step to next MB */ 3831b362b15af34006e6a11974088a46d42b903418eJohann } 3841b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += post_y_stride * 16 - post->y_width; 3851b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += post_uv_stride * 8 - post->uv_width; 3861b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += post_uv_stride * 8 - post->uv_width; 3871b362b15af34006e6a11974088a46d42b903418eJohann 3881b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* Skip border mb */ 3891b362b15af34006e6a11974088a46d42b903418eJohann 3901b362b15af34006e6a11974088a46d42b903418eJohann } 3911b362b15af34006e6a11974088a46d42b903418eJohann } 3921b362b15af34006e6a11974088a46d42b903418eJohann else /* SIMPLE_LOOPFILTER */ 3931b362b15af34006e6a11974088a46d42b903418eJohann { 3941b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row < mb_rows; mb_row++) 3951b362b15af34006e6a11974088a46d42b903418eJohann { 3961b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < mb_cols; mb_col++) 3971b362b15af34006e6a11974088a46d42b903418eJohann { 3981b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 3991b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 4001b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 4011b362b15af34006e6a11974088a46d42b903418eJohann 4021b362b15af34006e6a11974088a46d42b903418eJohann const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 4031b362b15af34006e6a11974088a46d42b903418eJohann const int seg = mode_info_context->mbmi.segment_id; 4041b362b15af34006e6a11974088a46d42b903418eJohann const int ref_frame = mode_info_context->mbmi.ref_frame; 4051b362b15af34006e6a11974088a46d42b903418eJohann 4061b362b15af34006e6a11974088a46d42b903418eJohann filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 4071b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 4081b362b15af34006e6a11974088a46d42b903418eJohann { 4091b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char * mblim = lfi_n->mblim[filter_level]; 4101b362b15af34006e6a11974088a46d42b903418eJohann const unsigned char * blim = lfi_n->blim[filter_level]; 4111b362b15af34006e6a11974088a46d42b903418eJohann 4121b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 4131b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbv 4141b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_y_stride, mblim); 4151b362b15af34006e6a11974088a46d42b903418eJohann 4161b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 4171b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bv 4181b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_y_stride, blim); 4191b362b15af34006e6a11974088a46d42b903418eJohann 4201b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 4211b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 4221b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbh 4231b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_y_stride, mblim); 4241b362b15af34006e6a11974088a46d42b903418eJohann 4251b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 4261b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bh 4271b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post_y_stride, blim); 4281b362b15af34006e6a11974088a46d42b903418eJohann } 4291b362b15af34006e6a11974088a46d42b903418eJohann 4301b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 4311b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += 8; 4321b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += 8; 4331b362b15af34006e6a11974088a46d42b903418eJohann 4341b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* step to next MB */ 4351b362b15af34006e6a11974088a46d42b903418eJohann } 4361b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += post_y_stride * 16 - post->y_width; 4371b362b15af34006e6a11974088a46d42b903418eJohann u_ptr += post_uv_stride * 8 - post->uv_width; 4381b362b15af34006e6a11974088a46d42b903418eJohann v_ptr += post_uv_stride * 8 - post->uv_width; 4391b362b15af34006e6a11974088a46d42b903418eJohann 4401b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context++; /* Skip border mb */ 4411b362b15af34006e6a11974088a46d42b903418eJohann 4421b362b15af34006e6a11974088a46d42b903418eJohann } 4431b362b15af34006e6a11974088a46d42b903418eJohann } 4441b362b15af34006e6a11974088a46d42b903418eJohann} 4451b362b15af34006e6a11974088a46d42b903418eJohann 4461b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_frame_yonly 4471b362b15af34006e6a11974088a46d42b903418eJohann( 4481b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *cm, 4491b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *mbd, 4501b362b15af34006e6a11974088a46d42b903418eJohann int default_filt_lvl 4511b362b15af34006e6a11974088a46d42b903418eJohann) 4521b362b15af34006e6a11974088a46d42b903418eJohann{ 4531b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *post = cm->frame_to_show; 4541b362b15af34006e6a11974088a46d42b903418eJohann 4551b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_ptr; 4561b362b15af34006e6a11974088a46d42b903418eJohann int mb_row; 4571b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 4581b362b15af34006e6a11974088a46d42b903418eJohann 4591b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi_n = &cm->lf_info; 4601b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info lfi; 4611b362b15af34006e6a11974088a46d42b903418eJohann 4621b362b15af34006e6a11974088a46d42b903418eJohann int filter_level; 4631b362b15af34006e6a11974088a46d42b903418eJohann FRAME_TYPE frame_type = cm->frame_type; 4641b362b15af34006e6a11974088a46d42b903418eJohann 4651b362b15af34006e6a11974088a46d42b903418eJohann /* Point at base of Mb MODE_INFO list */ 4661b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *mode_info_context = cm->mi; 4671b362b15af34006e6a11974088a46d42b903418eJohann 4681b362b15af34006e6a11974088a46d42b903418eJohann#if 0 4691b362b15af34006e6a11974088a46d42b903418eJohann if(default_filt_lvl == 0) /* no filter applied */ 4701b362b15af34006e6a11974088a46d42b903418eJohann return; 4711b362b15af34006e6a11974088a46d42b903418eJohann#endif 4721b362b15af34006e6a11974088a46d42b903418eJohann 4731b362b15af34006e6a11974088a46d42b903418eJohann /* Initialize the loop filter for this frame. */ 4741b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl); 4751b362b15af34006e6a11974088a46d42b903418eJohann 4761b362b15af34006e6a11974088a46d42b903418eJohann /* Set up the buffer pointers */ 4771b362b15af34006e6a11974088a46d42b903418eJohann y_ptr = post->y_buffer; 4781b362b15af34006e6a11974088a46d42b903418eJohann 4791b362b15af34006e6a11974088a46d42b903418eJohann /* vp8_filter each macro block */ 4801b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) 4811b362b15af34006e6a11974088a46d42b903418eJohann { 4821b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) 4831b362b15af34006e6a11974088a46d42b903418eJohann { 4841b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 4851b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 4861b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 4871b362b15af34006e6a11974088a46d42b903418eJohann 4881b362b15af34006e6a11974088a46d42b903418eJohann const int mode_index = lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 4891b362b15af34006e6a11974088a46d42b903418eJohann const int seg = mode_info_context->mbmi.segment_id; 4901b362b15af34006e6a11974088a46d42b903418eJohann const int ref_frame = mode_info_context->mbmi.ref_frame; 4911b362b15af34006e6a11974088a46d42b903418eJohann 4921b362b15af34006e6a11974088a46d42b903418eJohann filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 4931b362b15af34006e6a11974088a46d42b903418eJohann 4941b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 4951b362b15af34006e6a11974088a46d42b903418eJohann { 4961b362b15af34006e6a11974088a46d42b903418eJohann if (cm->filter_type == NORMAL_LOOPFILTER) 4971b362b15af34006e6a11974088a46d42b903418eJohann { 4981b362b15af34006e6a11974088a46d42b903418eJohann const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 4991b362b15af34006e6a11974088a46d42b903418eJohann lfi.mblim = lfi_n->mblim[filter_level]; 5001b362b15af34006e6a11974088a46d42b903418eJohann lfi.blim = lfi_n->blim[filter_level]; 5011b362b15af34006e6a11974088a46d42b903418eJohann lfi.lim = lfi_n->lim[filter_level]; 5021b362b15af34006e6a11974088a46d42b903418eJohann lfi.hev_thr = lfi_n->hev_thr[hev_index]; 5031b362b15af34006e6a11974088a46d42b903418eJohann 5041b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 5051b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbv 5061b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 5071b362b15af34006e6a11974088a46d42b903418eJohann 5081b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 5091b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bv 5101b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 5111b362b15af34006e6a11974088a46d42b903418eJohann 5121b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 5131b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 5141b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbh 5151b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 5161b362b15af34006e6a11974088a46d42b903418eJohann 5171b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 5181b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bh 5191b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 5201b362b15af34006e6a11974088a46d42b903418eJohann } 5211b362b15af34006e6a11974088a46d42b903418eJohann else 5221b362b15af34006e6a11974088a46d42b903418eJohann { 5231b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 5241b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbv 5251b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 5261b362b15af34006e6a11974088a46d42b903418eJohann 5271b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 5281b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bv 5291b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 5301b362b15af34006e6a11974088a46d42b903418eJohann 5311b362b15af34006e6a11974088a46d42b903418eJohann /* don't apply across umv border */ 5321b362b15af34006e6a11974088a46d42b903418eJohann if (mb_row > 0) 5331b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbh 5341b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 5351b362b15af34006e6a11974088a46d42b903418eJohann 5361b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 5371b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bh 5381b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 5391b362b15af34006e6a11974088a46d42b903418eJohann } 5401b362b15af34006e6a11974088a46d42b903418eJohann } 5411b362b15af34006e6a11974088a46d42b903418eJohann 5421b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 5431b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context ++; /* step to next MB */ 5441b362b15af34006e6a11974088a46d42b903418eJohann 5451b362b15af34006e6a11974088a46d42b903418eJohann } 5461b362b15af34006e6a11974088a46d42b903418eJohann 5471b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += post->y_stride * 16 - post->y_width; 5481b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context ++; /* Skip border mb */ 5491b362b15af34006e6a11974088a46d42b903418eJohann } 5501b362b15af34006e6a11974088a46d42b903418eJohann 5511b362b15af34006e6a11974088a46d42b903418eJohann} 5521b362b15af34006e6a11974088a46d42b903418eJohann 5531b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_loop_filter_partial_frame 5541b362b15af34006e6a11974088a46d42b903418eJohann( 5551b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *cm, 5561b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *mbd, 5571b362b15af34006e6a11974088a46d42b903418eJohann int default_filt_lvl 5581b362b15af34006e6a11974088a46d42b903418eJohann) 5591b362b15af34006e6a11974088a46d42b903418eJohann{ 5601b362b15af34006e6a11974088a46d42b903418eJohann YV12_BUFFER_CONFIG *post = cm->frame_to_show; 5611b362b15af34006e6a11974088a46d42b903418eJohann 5621b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *y_ptr; 5631b362b15af34006e6a11974088a46d42b903418eJohann int mb_row; 5641b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 5651b362b15af34006e6a11974088a46d42b903418eJohann int mb_cols = post->y_width >> 4; 5661b362b15af34006e6a11974088a46d42b903418eJohann int mb_rows = post->y_height >> 4; 5671b362b15af34006e6a11974088a46d42b903418eJohann 568ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int linestocopy; 5691b362b15af34006e6a11974088a46d42b903418eJohann 5701b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info_n *lfi_n = &cm->lf_info; 5711b362b15af34006e6a11974088a46d42b903418eJohann loop_filter_info lfi; 5721b362b15af34006e6a11974088a46d42b903418eJohann 5731b362b15af34006e6a11974088a46d42b903418eJohann int filter_level; 5741b362b15af34006e6a11974088a46d42b903418eJohann FRAME_TYPE frame_type = cm->frame_type; 5751b362b15af34006e6a11974088a46d42b903418eJohann 5761b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *mode_info_context; 5771b362b15af34006e6a11974088a46d42b903418eJohann 578ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if 0 579ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if(default_filt_lvl == 0) /* no filter applied */ 580ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return; 581ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 582ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 583ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Initialize the loop filter for this frame. */ 584ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_loop_filter_frame_init( cm, mbd, default_filt_lvl); 5851b362b15af34006e6a11974088a46d42b903418eJohann 5861b362b15af34006e6a11974088a46d42b903418eJohann /* number of MB rows to use in partial filtering */ 5871b362b15af34006e6a11974088a46d42b903418eJohann linestocopy = mb_rows / PARTIAL_FRAME_FRACTION; 5881b362b15af34006e6a11974088a46d42b903418eJohann linestocopy = linestocopy ? linestocopy << 4 : 16; /* 16 lines per MB */ 5891b362b15af34006e6a11974088a46d42b903418eJohann 5901b362b15af34006e6a11974088a46d42b903418eJohann /* Set up the buffer pointers; partial image starts at ~middle of frame */ 5911b362b15af34006e6a11974088a46d42b903418eJohann y_ptr = post->y_buffer + ((post->y_height >> 5) * 16) * post->y_stride; 5921b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context = cm->mi + (post->y_height >> 5) * (mb_cols + 1); 5931b362b15af34006e6a11974088a46d42b903418eJohann 5941b362b15af34006e6a11974088a46d42b903418eJohann /* vp8_filter each macro block */ 5951b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row<(linestocopy >> 4); mb_row++) 5961b362b15af34006e6a11974088a46d42b903418eJohann { 5971b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < mb_cols; mb_col++) 5981b362b15af34006e6a11974088a46d42b903418eJohann { 5991b362b15af34006e6a11974088a46d42b903418eJohann int skip_lf = (mode_info_context->mbmi.mode != B_PRED && 6001b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mode != SPLITMV && 6011b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context->mbmi.mb_skip_coeff); 6021b362b15af34006e6a11974088a46d42b903418eJohann 603ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int mode_index = 604ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang lfi_n->mode_lf_lut[mode_info_context->mbmi.mode]; 605ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int seg = mode_info_context->mbmi.segment_id; 606ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int ref_frame = mode_info_context->mbmi.ref_frame; 607ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 608ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang filter_level = lfi_n->lvl[seg][ref_frame][mode_index]; 6091b362b15af34006e6a11974088a46d42b903418eJohann 6101b362b15af34006e6a11974088a46d42b903418eJohann if (filter_level) 6111b362b15af34006e6a11974088a46d42b903418eJohann { 6121b362b15af34006e6a11974088a46d42b903418eJohann if (cm->filter_type == NORMAL_LOOPFILTER) 6131b362b15af34006e6a11974088a46d42b903418eJohann { 6141b362b15af34006e6a11974088a46d42b903418eJohann const int hev_index = lfi_n->hev_thr_lut[frame_type][filter_level]; 6151b362b15af34006e6a11974088a46d42b903418eJohann lfi.mblim = lfi_n->mblim[filter_level]; 6161b362b15af34006e6a11974088a46d42b903418eJohann lfi.blim = lfi_n->blim[filter_level]; 6171b362b15af34006e6a11974088a46d42b903418eJohann lfi.lim = lfi_n->lim[filter_level]; 6181b362b15af34006e6a11974088a46d42b903418eJohann lfi.hev_thr = lfi_n->hev_thr[hev_index]; 6191b362b15af34006e6a11974088a46d42b903418eJohann 6201b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 6211b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbv 6221b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 6231b362b15af34006e6a11974088a46d42b903418eJohann 6241b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 6251b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bv 6261b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 6271b362b15af34006e6a11974088a46d42b903418eJohann 6281b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_mbh 6291b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 6301b362b15af34006e6a11974088a46d42b903418eJohann 6311b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 6321b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_bh 6331b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, 0, 0, post->y_stride, 0, &lfi); 6341b362b15af34006e6a11974088a46d42b903418eJohann } 6351b362b15af34006e6a11974088a46d42b903418eJohann else 6361b362b15af34006e6a11974088a46d42b903418eJohann { 6371b362b15af34006e6a11974088a46d42b903418eJohann if (mb_col > 0) 6381b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbv 6391b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 6401b362b15af34006e6a11974088a46d42b903418eJohann 6411b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 6421b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bv 6431b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 6441b362b15af34006e6a11974088a46d42b903418eJohann 6451b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_mbh 6461b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->mblim[filter_level]); 6471b362b15af34006e6a11974088a46d42b903418eJohann 6481b362b15af34006e6a11974088a46d42b903418eJohann if (!skip_lf) 6491b362b15af34006e6a11974088a46d42b903418eJohann vp8_loop_filter_simple_bh 6501b362b15af34006e6a11974088a46d42b903418eJohann (y_ptr, post->y_stride, lfi_n->blim[filter_level]); 6511b362b15af34006e6a11974088a46d42b903418eJohann } 6521b362b15af34006e6a11974088a46d42b903418eJohann } 6531b362b15af34006e6a11974088a46d42b903418eJohann 6541b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += 16; 6551b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context += 1; /* step to next MB */ 6561b362b15af34006e6a11974088a46d42b903418eJohann } 6571b362b15af34006e6a11974088a46d42b903418eJohann 6581b362b15af34006e6a11974088a46d42b903418eJohann y_ptr += post->y_stride * 16 - post->y_width; 6591b362b15af34006e6a11974088a46d42b903418eJohann mode_info_context += 1; /* Skip border mb */ 6601b362b15af34006e6a11974088a46d42b903418eJohann } 6611b362b15af34006e6a11974088a46d42b903418eJohann} 662