Commit 398ddafb authored by Dmitry Kovalev's avatar Dmitry Kovalev
Browse files

New way of updating last frame segmentation map.

Implementing more natural (and faster) way of updating last frame
segmentation map.

Change-Id: I9fefa8f78e77bd7948133b04173da45edc15a17e
parent 831d72ac
......@@ -75,28 +75,9 @@ static TX_SIZE read_tx_size(VP9D_COMP *pbi, TX_MODE tx_mode,
return TX_4X4;
}
static void set_segment_id(VP9_COMMON *cm, BLOCK_SIZE bsize,
int mi_row, int mi_col, int segment_id) {
const int mi_offset = mi_row * cm->mi_cols + mi_col;
const int bw = 1 << mi_width_log2(bsize);
const int bh = 1 << mi_height_log2(bsize);
const int xmis = MIN(cm->mi_cols - mi_col, bw);
const int ymis = MIN(cm->mi_rows - mi_row, bh);
int x, y;
assert(segment_id >= 0 && segment_id < MAX_SEGMENTS);
for (y = 0; y < ymis; y++)
for (x = 0; x < xmis; x++)
cm->last_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
}
static int read_intra_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
vp9_reader *r) {
MACROBLOCKD *const xd = &pbi->mb;
struct segmentation *const seg = &pbi->common.seg;
const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type;
int segment_id;
if (!seg->enabled)
return 0; // Default for disabled segmentation
......@@ -104,9 +85,7 @@ static int read_intra_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
if (!seg->update_map)
return 0;
segment_id = read_segment_id(r, seg);
set_segment_id(&pbi->common, bsize, mi_row, mi_col, segment_id);
return segment_id;
return read_segment_id(r, seg);
}
static int read_inter_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
......@@ -115,7 +94,7 @@ static int read_inter_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
MACROBLOCKD *const xd = &pbi->mb;
struct segmentation *const seg = &cm->seg;
const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type;
int pred_segment_id, segment_id;
int pred_segment_id;;
if (!seg->enabled)
return 0; // Default for disabled segmentation
......@@ -129,13 +108,10 @@ static int read_inter_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
const vp9_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd);
const int pred_flag = vp9_read(r, pred_prob);
vp9_set_pred_flag_seg_id(xd, pred_flag);
segment_id = pred_flag ? pred_segment_id
: read_segment_id(r, seg);
return pred_flag ? pred_segment_id : read_segment_id(r, seg);
} else {
segment_id = read_segment_id(r, seg);
return read_segment_id(r, seg);
}
set_segment_id(cm, bsize, mi_row, mi_col, segment_id);
return segment_id;
}
static uint8_t read_skip_coeff(VP9D_COMP *pbi, int segment_id, vp9_reader *r) {
......
......@@ -935,6 +935,15 @@ void vp9_init_dequantizer(VP9_COMMON *cm) {
}
}
static void update_segmentation_map(VP9_COMMON *cm) {
int i, j;
for (i = 0; i < cm->mi_rows; ++i)
for (j = 0; j < cm->mi_cols; ++j)
cm->last_frame_seg_map[i * cm->mi_cols + j] =
cm->mi_grid_visible[i * cm->mode_info_stride + j]->mbmi.segment_id;
}
int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
int i;
VP9_COMMON *const cm = &pbi->common;
......@@ -1014,5 +1023,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
if (cm->refresh_frame_context)
cm->frame_contexts[cm->frame_context_idx] = cm->fc;
update_segmentation_map(cm);
return 0;
}
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