summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2013-09-26 18:44:48 -0700
committerYaowu Xu <yaowu@google.com>2013-10-28 16:32:50 -0700
commit8f83c132fff95c62f93ba1b9171a56f88234d4dc (patch)
treeda1684014ed9b07dc0910c31fb281f50f8530413
parent4beb889f99a4fb58bd4ca340cfddf9819a7fe5b8 (diff)
downloadlibvpx-8f83c132fff95c62f93ba1b9171a56f88234d4dc.tar.gz
New way of updating last frame segmentation map.
Implementing more natural (and faster) way of updating last frame segmentation map. Change-Id: I9fefa8f78e77bd7948133b04173da45edc15a17e
-rw-r--r--vp9/decoder/vp9_decodemv.c32
-rw-r--r--vp9/decoder/vp9_decodframe.c11
2 files changed, 15 insertions, 28 deletions
diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c
index dc12876b1..cef5ada7f 100644
--- a/vp9/decoder/vp9_decodemv.c
+++ b/vp9/decoder/vp9_decodemv.c
@@ -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) {
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 34ed0c759..2331bb591 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -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;
}