From 398ddafb629b7f49cf255bf09d3e38b4abd0bb95 Mon Sep 17 00:00:00 2001 From: Dmitry Kovalev Date: Thu, 26 Sep 2013 18:44:48 -0700 Subject: New way of updating last frame segmentation map. Implementing more natural (and faster) way of updating last frame segmentation map. Change-Id: I9fefa8f78e77bd7948133b04173da45edc15a17e --- vp9/decoder/vp9_decodemv.c | 32 ++++---------------------------- vp9/decoder/vp9_decodframe.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 28 deletions(-) (limited to 'vp9') 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; } -- cgit v1.2.3