| Index: source/libvpx/vp9/common/vp9_loopfilter.c
|
| ===================================================================
|
| --- source/libvpx/vp9/common/vp9_loopfilter.c (revision 263011)
|
| +++ source/libvpx/vp9/common/vp9_loopfilter.c (working copy)
|
| @@ -228,6 +228,12 @@
|
| }
|
| }
|
|
|
| +static uint8_t get_filter_level(const loop_filter_info_n *lfi_n,
|
| + const MB_MODE_INFO *mbmi) {
|
| + return lfi_n->lvl[mbmi->segment_id][mbmi->ref_frame[0]]
|
| + [mode_lf_lut[mbmi->mode]];
|
| +}
|
| +
|
| void vp9_loop_filter_init(VP9_COMMON *cm) {
|
| loop_filter_info_n *lfi = &cm->lf_info;
|
| struct loopfilter *lf = &cm->lf;
|
| @@ -493,27 +499,25 @@
|
| const MODE_INFO *mi, const int shift_y,
|
| const int shift_uv,
|
| LOOP_FILTER_MASK *lfm) {
|
| - const BLOCK_SIZE block_size = mi->mbmi.sb_type;
|
| - const TX_SIZE tx_size_y = mi->mbmi.tx_size;
|
| - const TX_SIZE tx_size_uv = get_uv_tx_size(&mi->mbmi);
|
| - const int skip = mi->mbmi.skip;
|
| - const int seg = mi->mbmi.segment_id;
|
| - const int ref = mi->mbmi.ref_frame[0];
|
| - const int filter_level = lfi_n->lvl[seg][ref][mode_lf_lut[mi->mbmi.mode]];
|
| - uint64_t *left_y = &lfm->left_y[tx_size_y];
|
| - uint64_t *above_y = &lfm->above_y[tx_size_y];
|
| - uint64_t *int_4x4_y = &lfm->int_4x4_y;
|
| - uint16_t *left_uv = &lfm->left_uv[tx_size_uv];
|
| - uint16_t *above_uv = &lfm->above_uv[tx_size_uv];
|
| - uint16_t *int_4x4_uv = &lfm->int_4x4_uv;
|
| + const MB_MODE_INFO *mbmi = &mi->mbmi;
|
| + const BLOCK_SIZE block_size = mbmi->sb_type;
|
| + const TX_SIZE tx_size_y = mbmi->tx_size;
|
| + const TX_SIZE tx_size_uv = get_uv_tx_size(mbmi);
|
| + const int filter_level = get_filter_level(lfi_n, mbmi);
|
| + uint64_t *const left_y = &lfm->left_y[tx_size_y];
|
| + uint64_t *const above_y = &lfm->above_y[tx_size_y];
|
| + uint64_t *const int_4x4_y = &lfm->int_4x4_y;
|
| + uint16_t *const left_uv = &lfm->left_uv[tx_size_uv];
|
| + uint16_t *const above_uv = &lfm->above_uv[tx_size_uv];
|
| + uint16_t *const int_4x4_uv = &lfm->int_4x4_uv;
|
| int i;
|
| - int w = num_8x8_blocks_wide_lookup[block_size];
|
| - int h = num_8x8_blocks_high_lookup[block_size];
|
|
|
| // If filter level is 0 we don't loop filter.
|
| if (!filter_level) {
|
| return;
|
| } else {
|
| + const int w = num_8x8_blocks_wide_lookup[block_size];
|
| + const int h = num_8x8_blocks_high_lookup[block_size];
|
| int index = shift_y;
|
| for (i = 0; i < h; i++) {
|
| vpx_memset(&lfm->lfl_y[index], filter_level, w);
|
| @@ -540,7 +544,7 @@
|
|
|
| // If the block has no coefficients and is not intra we skip applying
|
| // the loop filter on block edges.
|
| - if (skip && ref > INTRA_FRAME)
|
| + if (mbmi->skip && is_inter_block(mbmi))
|
| return;
|
|
|
| // Here we are adding a mask for the transform size. The transform
|
| @@ -561,12 +565,11 @@
|
| // boundaries. These differ from the 4x4 boundaries on the outside edge of
|
| // an 8x8 in that the internal ones can be skipped and don't depend on
|
| // the prediction block size.
|
| - if (tx_size_y == TX_4X4) {
|
| + if (tx_size_y == TX_4X4)
|
| *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffff) << shift_y;
|
| - }
|
| - if (tx_size_uv == TX_4X4) {
|
| +
|
| + if (tx_size_uv == TX_4X4)
|
| *int_4x4_uv |= (size_mask_uv[block_size] & 0xffff) << shift_uv;
|
| - }
|
| }
|
|
|
| // This function does the same thing as the one above with the exception that
|
| @@ -575,22 +578,20 @@
|
| static void build_y_mask(const loop_filter_info_n *const lfi_n,
|
| const MODE_INFO *mi, const int shift_y,
|
| LOOP_FILTER_MASK *lfm) {
|
| - const BLOCK_SIZE block_size = mi->mbmi.sb_type;
|
| - const TX_SIZE tx_size_y = mi->mbmi.tx_size;
|
| - const int skip = mi->mbmi.skip;
|
| - const int seg = mi->mbmi.segment_id;
|
| - const int ref = mi->mbmi.ref_frame[0];
|
| - const int filter_level = lfi_n->lvl[seg][ref][mode_lf_lut[mi->mbmi.mode]];
|
| - uint64_t *left_y = &lfm->left_y[tx_size_y];
|
| - uint64_t *above_y = &lfm->above_y[tx_size_y];
|
| - uint64_t *int_4x4_y = &lfm->int_4x4_y;
|
| + const MB_MODE_INFO *mbmi = &mi->mbmi;
|
| + const BLOCK_SIZE block_size = mbmi->sb_type;
|
| + const TX_SIZE tx_size_y = mbmi->tx_size;
|
| + const int filter_level = get_filter_level(lfi_n, mbmi);
|
| + uint64_t *const left_y = &lfm->left_y[tx_size_y];
|
| + uint64_t *const above_y = &lfm->above_y[tx_size_y];
|
| + uint64_t *const int_4x4_y = &lfm->int_4x4_y;
|
| int i;
|
| - int w = num_8x8_blocks_wide_lookup[block_size];
|
| - int h = num_8x8_blocks_high_lookup[block_size];
|
|
|
| if (!filter_level) {
|
| return;
|
| } else {
|
| + const int w = num_8x8_blocks_wide_lookup[block_size];
|
| + const int h = num_8x8_blocks_high_lookup[block_size];
|
| int index = shift_y;
|
| for (i = 0; i < h; i++) {
|
| vpx_memset(&lfm->lfl_y[index], filter_level, w);
|
| @@ -601,7 +602,7 @@
|
| *above_y |= above_prediction_mask[block_size] << shift_y;
|
| *left_y |= left_prediction_mask[block_size] << shift_y;
|
|
|
| - if (skip && ref > INTRA_FRAME)
|
| + if (mbmi->skip && is_inter_block(mbmi))
|
| return;
|
|
|
| *above_y |= (size_mask[block_size] &
|
| @@ -610,9 +611,8 @@
|
| *left_y |= (size_mask[block_size] &
|
| left_64x64_txform_mask[tx_size_y]) << shift_y;
|
|
|
| - if (tx_size_y == TX_4X4) {
|
| + if (tx_size_y == TX_4X4)
|
| *int_4x4_y |= (size_mask[block_size] & 0xffffffffffffffff) << shift_y;
|
| - }
|
| }
|
|
|
| // This function sets up the bit masks for the entire 64x64 region represented
|
| @@ -868,13 +868,6 @@
|
| assert(!(lfm->int_4x4_uv & lfm->above_uv[TX_16X16]));
|
| }
|
|
|
| -static uint8_t build_lfi(const loop_filter_info_n *lfi_n,
|
| - const MB_MODE_INFO *mbmi) {
|
| - const int seg = mbmi->segment_id;
|
| - const int ref = mbmi->ref_frame[0];
|
| - return lfi_n->lvl[seg][ref][mode_lf_lut[mbmi->mode]];
|
| -}
|
| -
|
| static void filter_selectively_vert(uint8_t *s, int pitch,
|
| unsigned int mask_16x16,
|
| unsigned int mask_8x8,
|
| @@ -916,7 +909,7 @@
|
| const int ss_y = plane->subsampling_y;
|
| const int row_step = 1 << ss_x;
|
| const int col_step = 1 << ss_y;
|
| - const int row_step_stride = cm->mode_info_stride * row_step;
|
| + const int row_step_stride = cm->mi_stride * row_step;
|
| struct buf_2d *const dst = &plane->dst;
|
| uint8_t* const dst0 = dst->buf;
|
| unsigned int mask_16x16[MI_BLOCK_SIZE] = {0};
|
| @@ -953,7 +946,7 @@
|
|
|
| // Filter level can vary per MI
|
| if (!(lfl[(r << 3) + (c >> ss_x)] =
|
| - build_lfi(&cm->lf_info, &mi[0].mbmi)))
|
| + get_filter_level(&cm->lf_info, &mi[0].mbmi)))
|
| continue;
|
|
|
| // Build masks based on the transform size of each block
|
| @@ -1208,17 +1201,17 @@
|
| xd->plane[1].subsampling_x == 1);
|
|
|
| for (mi_row = start; mi_row < stop; mi_row += MI_BLOCK_SIZE) {
|
| - MODE_INFO **mi_8x8 = cm->mi_grid_visible + mi_row * cm->mode_info_stride;
|
| + MODE_INFO **mi_8x8 = cm->mi_grid_visible + mi_row * cm->mi_stride;
|
|
|
| for (mi_col = 0; mi_col < cm->mi_cols; mi_col += MI_BLOCK_SIZE) {
|
| int plane;
|
|
|
| - setup_dst_planes(xd, frame_buffer, mi_row, mi_col);
|
| + vp9_setup_dst_planes(xd, frame_buffer, mi_row, mi_col);
|
|
|
| // TODO(JBB): Make setup_mask work for non 420.
|
| if (use_420)
|
| - vp9_setup_mask(cm, mi_row, mi_col, mi_8x8 + mi_col,
|
| - cm->mode_info_stride, &lfm);
|
| + vp9_setup_mask(cm, mi_row, mi_col, mi_8x8 + mi_col, cm->mi_stride,
|
| + &lfm);
|
|
|
| for (plane = 0; plane < num_planes; ++plane) {
|
| if (use_420)
|
|
|