Index: source/libvpx/vp9/common/vp9_loopfilter.c |
=================================================================== |
--- source/libvpx/vp9/common/vp9_loopfilter.c (revision 232232) |
+++ source/libvpx/vp9/common/vp9_loopfilter.c (working copy) |
@@ -8,7 +8,7 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
-#include "vpx_config.h" |
+#include "./vpx_config.h" |
#include "vp9/common/vp9_loopfilter.h" |
#include "vp9/common/vp9_onyxc_int.h" |
#include "vp9/common/vp9_reconinter.h" |
@@ -16,12 +16,6 @@ |
#include "vp9/common/vp9_seg_common.h" |
-struct loop_filter_info { |
- const uint8_t *mblim; |
- const uint8_t *lim; |
- const uint8_t *hev_thr; |
-}; |
- |
// This structure holds bit masks for all 8x8 blocks in a 64x64 region. |
// Each 1 bit represents a position in which we want to apply the loop filter. |
// Left_ entries refer to whether we apply a filter on the border to the |
@@ -259,8 +253,8 @@ |
if (block_inside_limit < 1) |
block_inside_limit = 1; |
- vpx_memset(lfi->lim[lvl], block_inside_limit, SIMD_WIDTH); |
- vpx_memset(lfi->mblim[lvl], (2 * (lvl + 2) + block_inside_limit), |
+ vpx_memset(lfi->lfthr[lvl].lim, block_inside_limit, SIMD_WIDTH); |
+ vpx_memset(lfi->lfthr[lvl].mblim, (2 * (lvl + 2) + block_inside_limit), |
SIMD_WIDTH); |
} |
} |
@@ -268,7 +262,7 @@ |
void vp9_loop_filter_init(VP9_COMMON *cm) { |
loop_filter_info_n *lfi = &cm->lf_info; |
struct loopfilter *lf = &cm->lf; |
- int i; |
+ int lvl; |
// init limits for given sharpness |
update_sharpness(lfi, lf->sharpness_level); |
@@ -278,8 +272,8 @@ |
lf_init_lut(lfi); |
// init hev threshold const vectors |
- for (i = 0; i < 4; i++) |
- vpx_memset(lfi->hev_thr[i], i, SIMD_WIDTH); |
+ for (lvl = 0; lvl <= MAX_LOOP_FILTER; lvl++) |
+ vpx_memset(lfi->lfthr[lvl].hev_thr, (lvl >> 4), SIMD_WIDTH); |
} |
void vp9_loop_filter_frame_init(VP9_COMMON *cm, int default_filt_lvl) { |
@@ -316,13 +310,13 @@ |
continue; |
} |
- intra_lvl = lvl_seg + (lf->ref_deltas[INTRA_FRAME] << n_shift); |
+ intra_lvl = lvl_seg + lf->ref_deltas[INTRA_FRAME] * (1 << n_shift); |
lfi->lvl[seg_id][INTRA_FRAME][0] = clamp(intra_lvl, 0, MAX_LOOP_FILTER); |
for (ref = LAST_FRAME; ref < MAX_REF_FRAMES; ++ref) |
for (mode = 0; mode < MAX_MODE_LF_DELTAS; ++mode) { |
- const int inter_lvl = lvl_seg + (lf->ref_deltas[ref] << n_shift) |
- + (lf->mode_deltas[mode] << n_shift); |
+ const int inter_lvl = lvl_seg + lf->ref_deltas[ref] * (1 << n_shift) |
+ + lf->mode_deltas[mode] * (1 << n_shift); |
lfi->lvl[seg_id][ref][mode] = clamp(inter_lvl, 0, MAX_LOOP_FILTER); |
} |
} |
@@ -330,16 +324,14 @@ |
static int build_lfi(const loop_filter_info_n *lfi_n, |
const MB_MODE_INFO *mbmi, |
- struct loop_filter_info *lfi) { |
+ const loop_filter_thresh **lfi) { |
const int seg = mbmi->segment_id; |
const int ref = mbmi->ref_frame[0]; |
const int mode = lfi_n->mode_lf_lut[mbmi->mode]; |
const int filter_level = lfi_n->lvl[seg][ref][mode]; |
if (filter_level > 0) { |
- lfi->mblim = lfi_n->mblim[filter_level]; |
- lfi->lim = lfi_n->lim[filter_level]; |
- lfi->hev_thr = lfi_n->hev_thr[filter_level >> 4]; |
+ *lfi = &lfi_n->lfthr[filter_level]; |
return 1; |
} else { |
return 0; |
@@ -351,11 +343,13 @@ |
unsigned int mask_8x8, |
unsigned int mask_4x4, |
unsigned int mask_4x4_int, |
- const struct loop_filter_info *lfi) { |
+ const loop_filter_thresh **p_lfi) { |
unsigned int mask; |
for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; |
mask; mask >>= 1) { |
+ const loop_filter_thresh *lfi = *p_lfi; |
+ |
if (mask & 1) { |
if (mask_16x16 & 1) { |
vp9_mb_lpf_vertical_edge_w(s, pitch, lfi->mblim, lfi->lim, |
@@ -379,7 +373,7 @@ |
vp9_loop_filter_vertical_edge(s + 4, pitch, lfi->mblim, lfi->lim, |
lfi->hev_thr, 1); |
s += 8; |
- lfi++; |
+ p_lfi++; |
mask_16x16 >>= 1; |
mask_8x8 >>= 1; |
mask_4x4 >>= 1; |
@@ -393,12 +387,14 @@ |
unsigned int mask_4x4, |
unsigned int mask_4x4_int, |
int only_4x4_1, |
- const struct loop_filter_info *lfi) { |
+ const loop_filter_thresh **p_lfi) { |
unsigned int mask; |
int count; |
for (mask = mask_16x16 | mask_8x8 | mask_4x4 | mask_4x4_int; |
mask; mask >>= count) { |
+ const loop_filter_thresh *lfi = *p_lfi; |
+ |
count = 1; |
if (mask & 1) { |
if (!only_4x4_1) { |
@@ -432,7 +428,7 @@ |
lfi->lim, lfi->hev_thr, 1); |
} |
s += 8 * count; |
- lfi += count; |
+ p_lfi += count; |
mask_16x16 >>= count; |
mask_8x8 >>= count; |
mask_4x4 >>= count; |
@@ -805,7 +801,7 @@ |
unsigned int mask_8x8[MI_BLOCK_SIZE] = {0}; |
unsigned int mask_4x4[MI_BLOCK_SIZE] = {0}; |
unsigned int mask_4x4_int[MI_BLOCK_SIZE] = {0}; |
- struct loop_filter_info lfi[MI_BLOCK_SIZE][MI_BLOCK_SIZE]; |
+ const loop_filter_thresh *lfi[MI_BLOCK_SIZE][MI_BLOCK_SIZE]; |
int r, c; |
for (r = 0; r < MI_BLOCK_SIZE && mi_row + r < cm->mi_rows; r += row_step) { |
@@ -834,7 +830,7 @@ |
const int skip_border_4x4_r = ss_y && mi_row + r == cm->mi_rows - 1; |
// Filter level can vary per MI |
- if (!build_lfi(&cm->lf_info, &mi[0].mbmi, lfi[r] + (c >> ss_x))) |
+ if (!build_lfi(&cm->lf_info, &mi[0].mbmi, &lfi[r][c >> ss_x])) |
continue; |
// Build masks based on the transform size of each block |
@@ -925,7 +921,7 @@ |
struct buf_2d *const dst = &plane->dst; |
uint8_t* const dst0 = dst->buf; |
unsigned int mask_4x4_int[MI_BLOCK_SIZE] = {0}; |
- struct loop_filter_info lfi[MI_BLOCK_SIZE][MI_BLOCK_SIZE]; |
+ const loop_filter_thresh *lfi[MI_BLOCK_SIZE][MI_BLOCK_SIZE]; |
int r, c; |
int row_shift = 3 - ss_x; |
int row_mask = 0xff >> (ss_x << 2); |
@@ -938,8 +934,8 @@ |
// Determine the vertical edges that need filtering |
for (c = 0; c < MI_BLOCK_SIZE && mi_col + c < cm->mi_cols; c += col_step) { |
const MODE_INFO *mi = mi_8x8[c]; |
- if (!build_lfi(&cm->lf_info, &mi[0].mbmi, lfi[r] + (c >> ss_x))) |
- continue; |
+ |
+ build_lfi(&cm->lf_info, &mi[0].mbmi, &lfi[r][c >> ss_x]); |
} |
if (!plane->plane_type) { |
mask_4x4_int[r] = MASK_ROW(lfm->int_4x4_y); |