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
Showing with 15 additions and 28 deletions
...@@ -75,28 +75,9 @@ static TX_SIZE read_tx_size(VP9D_COMP *pbi, TX_MODE tx_mode, ...@@ -75,28 +75,9 @@ static TX_SIZE read_tx_size(VP9D_COMP *pbi, TX_MODE tx_mode,
return TX_4X4; 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, static int read_intra_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
vp9_reader *r) { vp9_reader *r) {
MACROBLOCKD *const xd = &pbi->mb;
struct segmentation *const seg = &pbi->common.seg; struct segmentation *const seg = &pbi->common.seg;
const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type;
int segment_id;
if (!seg->enabled) if (!seg->enabled)
return 0; // Default for disabled segmentation 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, ...@@ -104,9 +85,7 @@ static int read_intra_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
if (!seg->update_map) if (!seg->update_map)
return 0; return 0;
segment_id = read_segment_id(r, seg); return read_segment_id(r, seg);
set_segment_id(&pbi->common, bsize, mi_row, mi_col, segment_id);
return segment_id;
} }
static int read_inter_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col, 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, ...@@ -115,7 +94,7 @@ static int read_inter_segment_id(VP9D_COMP *pbi, int mi_row, int mi_col,
MACROBLOCKD *const xd = &pbi->mb; MACROBLOCKD *const xd = &pbi->mb;
struct segmentation *const seg = &cm->seg; struct segmentation *const seg = &cm->seg;
const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type; const BLOCK_SIZE bsize = xd->this_mi->mbmi.sb_type;
int pred_segment_id, segment_id; int pred_segment_id;;
if (!seg->enabled) if (!seg->enabled)
return 0; // Default for disabled segmentation 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, ...@@ -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 vp9_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd);
const int pred_flag = vp9_read(r, pred_prob); const int pred_flag = vp9_read(r, pred_prob);
vp9_set_pred_flag_seg_id(xd, pred_flag); vp9_set_pred_flag_seg_id(xd, pred_flag);
segment_id = pred_flag ? pred_segment_id return pred_flag ? pred_segment_id : read_segment_id(r, seg);
: read_segment_id(r, seg);
} else { } 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) { 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) { ...@@ -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 vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
int i; int i;
VP9_COMMON *const cm = &pbi->common; VP9_COMMON *const cm = &pbi->common;
...@@ -1014,5 +1023,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) { ...@@ -1014,5 +1023,7 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
if (cm->refresh_frame_context) if (cm->refresh_frame_context)
cm->frame_contexts[cm->frame_context_idx] = cm->fc; cm->frame_contexts[cm->frame_context_idx] = cm->fc;
update_segmentation_map(cm);
return 0; return 0;
} }
Supports Markdown
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