Commit 6727943c authored by Jingning Han's avatar Jingning Han

Refactor loop filter mask

This commit refactors the loop filter selection process to support
variable transform block sizes based filter mask. It disables the
multi-thread loop filter implementation to simplify the experiments.
The speed impact on speed 0 encoding is negligible.

Change-Id: Ia470b6da9ad833fe6eb72d2cbeda9296b21910ec
parent 47c7fd98
......@@ -1183,9 +1183,9 @@ static void highbd_filter_selectively_vert(uint16_t *s, int pitch,
#endif // CONFIG_VP9_HIGHBITDEPTH
void vp10_filter_block_plane_non420(VP10_COMMON *cm,
struct macroblockd_plane *plane,
MODE_INFO **mi_8x8,
int mi_row, int mi_col) {
struct macroblockd_plane *plane,
MODE_INFO **mi_8x8,
int mi_row, int mi_col) {
const int ss_x = plane->subsampling_x;
const int ss_y = plane->subsampling_y;
const int row_step = 1 << ss_y;
......@@ -1209,16 +1209,21 @@ void vp10_filter_block_plane_non420(VP10_COMMON *cm,
// 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];
const BLOCK_SIZE sb_type = mi[0].mbmi.sb_type;
const int skip_this = mi[0].mbmi.skip && is_inter_block(&mi[0].mbmi);
const MB_MODE_INFO *mbmi = &mi[0].mbmi;
const BLOCK_SIZE sb_type = mbmi->sb_type;
const int skip_this = mbmi->skip && is_inter_block(mbmi);
const int blk_row = r & (num_8x8_blocks_high_lookup[sb_type] - 1);
const int blk_col = c & (num_8x8_blocks_wide_lookup[sb_type] - 1);
// left edge of current unit is block/partition edge -> no skip
const int block_edge_left = (num_4x4_blocks_wide_lookup[sb_type] > 1) ?
!(c & (num_8x8_blocks_wide_lookup[sb_type] - 1)) : 1;
!blk_col : 1;
const int skip_this_c = skip_this && !block_edge_left;
// top edge of current unit is block/partition edge -> no skip
const int block_edge_above = (num_4x4_blocks_high_lookup[sb_type] > 1) ?
!(r & (num_8x8_blocks_high_lookup[sb_type] - 1)) : 1;
!blk_row : 1;
const int skip_this_r = skip_this && !block_edge_above;
const TX_SIZE tx_size = (plane->plane_type == PLANE_TYPE_UV)
? get_uv_tx_size(&mi[0].mbmi, plane)
: mi[0].mbmi.tx_size;
......@@ -1227,7 +1232,7 @@ void vp10_filter_block_plane_non420(VP10_COMMON *cm,
// Filter level can vary per MI
if (!(lfl[(r << 3) + (c >> ss_x)] =
get_filter_level(&cm->lf_info, &mi[0].mbmi)))
get_filter_level(&cm->lf_info, mbmi)))
continue;
// Build masks based on the transform size of each block
......@@ -1568,13 +1573,14 @@ void vp10_filter_block_plane_ss11(VP10_COMMON *const cm,
}
void vp10_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
VP10_COMMON *cm,
struct macroblockd_plane planes[MAX_MB_PLANE],
int start, int stop, int y_only) {
VP10_COMMON *cm,
struct macroblockd_plane planes[MAX_MB_PLANE],
int start, int stop, int y_only) {
const int num_planes = y_only ? 1 : MAX_MB_PLANE;
int mi_row, mi_col;
#if !CONFIG_VAR_TX
enum lf_path path;
LOOP_FILTER_MASK lfm;
int mi_row, mi_col;
if (y_only)
path = LF_PATH_444;
......@@ -1584,6 +1590,7 @@ void vp10_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
path = LF_PATH_444;
else
path = LF_PATH_SLOW;
#endif
for (mi_row = start; mi_row < stop; mi_row += MI_BLOCK_SIZE) {
MODE_INFO **mi = cm->mi_grid_visible + mi_row * cm->mi_stride;
......@@ -1593,10 +1600,14 @@ void vp10_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
vp10_setup_dst_planes(planes, frame_buffer, mi_row, mi_col);
#if CONFIG_VAR_TX
for (plane = 0; plane < num_planes; ++plane)
vp10_filter_block_plane_non420(cm, &planes[plane], mi + mi_col,
mi_row, mi_col);
#else
// TODO(JBB): Make setup_mask work for non 420.
vp10_setup_mask(cm, mi_row, mi_col, mi + mi_col, cm->mi_stride,
&lfm);
vp10_filter_block_plane_ss00(cm, &planes[0], mi_row, &lfm);
for (plane = 1; plane < num_planes; ++plane) {
switch (path) {
......@@ -1612,6 +1623,7 @@ void vp10_loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer,
break;
}
}
#endif
}
}
}
......
......@@ -1683,6 +1683,7 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi,
vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME,
"Failed to decode tile data");
}
#if !CONFIG_VAR_TX
// Loopfilter one row.
if (cm->lf.filter_level && !cm->skip_loop_filter) {
const int lf_start = mi_row - MI_BLOCK_SIZE;
......@@ -1709,10 +1710,15 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi,
if (cm->frame_parallel_decode)
vp10_frameworker_broadcast(pbi->cur_buf,
mi_row << MI_BLOCK_SIZE_LOG2);
#endif
}
}
// Loopfilter remaining rows in the frame.
#if CONFIG_VAR_TX
vp10_loop_filter_frame(get_frame_new_buffer(cm), cm, &pbi->mb,
cm->lf.filter_level, 0, 0);
#else
if (cm->lf.filter_level && !cm->skip_loop_filter) {
LFWorkerData *const lf_data = (LFWorkerData*)pbi->lf_worker.data1;
winterface->sync(&pbi->lf_worker);
......@@ -1720,6 +1726,7 @@ static const uint8_t *decode_tiles(VP10Decoder *pbi,
lf_data->stop = cm->mi_rows;
winterface->execute(&pbi->lf_worker);
}
#endif
// Get last tile data.
tile_data = pbi->tile_data + tile_cols * tile_rows - 1;
......
......@@ -2680,6 +2680,9 @@ static void loopfilter_frame(VP10_COMP *cpi, VP10_COMMON *cm) {
}
if (lf->filter_level > 0) {
#if CONFIG_VAR_TX
vp10_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
#else
if (cpi->num_workers > 1)
vp10_loop_filter_frame_mt(cm->frame_to_show, cm, xd->plane,
lf->filter_level, 0, 0,
......@@ -2687,6 +2690,7 @@ static void loopfilter_frame(VP10_COMP *cpi, VP10_COMMON *cm) {
&cpi->lf_row_sync);
else
vp10_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
#endif
}
vpx_extend_frame_inner_borders(cm->frame_to_show);
......
......@@ -41,6 +41,10 @@ static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd,
VP10_COMMON *const cm = &cpi->common;
int64_t filt_err;
#if CONFIG_VAR_TX
vp10_loop_filter_frame(cm->frame_to_show, cm, &cpi->td.mb.e_mbd, filt_level,
1, partial_frame);
#else
if (cpi->num_workers > 1)
vp10_loop_filter_frame_mt(cm->frame_to_show, cm, cpi->td.mb.e_mbd.plane,
filt_level, 1, partial_frame,
......@@ -48,6 +52,7 @@ static int64_t try_filter_frame(const YV12_BUFFER_CONFIG *sd,
else
vp10_loop_filter_frame(cm->frame_to_show, cm, &cpi->td.mb.e_mbd, filt_level,
1, partial_frame);
#endif
#if CONFIG_VP9_HIGHBITDEPTH
if (cm->use_highbitdepth) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment