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