Merge "Removing get_segment_id function and using existing vp9_get_pred_mb_segid." into experimental

This commit is contained in:
Dmitry Kovalev 2013-04-20 11:05:50 -07:00 committed by Gerrit Code Review
commit c7a38f77ef
5 changed files with 64 additions and 97 deletions

View File

@ -9,6 +9,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include <limits.h>
#include "vp9/common/vp9_common.h" #include "vp9/common/vp9_common.h"
#include "vp9/common/vp9_pred_common.h" #include "vp9/common/vp9_pred_common.h"
#include "vp9/common/vp9_seg_common.h" #include "vp9/common/vp9_seg_common.h"
@ -225,30 +227,26 @@ void vp9_set_pred_flag(MACROBLOCKD *const xd,
// peredict various bitstream signals. // peredict various bitstream signals.
// Macroblock segment id prediction function // Macroblock segment id prediction function
unsigned char vp9_get_pred_mb_segid(const VP9_COMMON *const cm, int vp9_get_pred_mb_segid(VP9_COMMON *cm, BLOCK_SIZE_TYPE sb_type,
const MACROBLOCKD *const xd, int MbIndex) { int mb_row, int mb_col) {
// Currently the prediction for the macroblock segment ID is const int mb_index = mb_row * cm->mb_cols + mb_col;
// the value stored for this macroblock in the previous frame. if (sb_type) {
if (!xd->mode_info_context->mbmi.sb_type) { const int bw = 1 << mb_width_log2(sb_type);
return cm->last_frame_seg_map[MbIndex]; const int bh = 1 << mb_height_log2(sb_type);
} else { const int ymbs = MIN(cm->mb_rows - mb_row, bh);
BLOCK_SIZE_TYPE bsize = xd->mode_info_context->mbmi.sb_type; const int xmbs = MIN(cm->mb_cols - mb_col, bw);
const int bh = 1 << mb_height_log2(bsize); int segment_id = INT_MAX;
const int bw = 1 << mb_width_log2(bsize);
const int mb_col = MbIndex % cm->mb_cols;
const int mb_row = MbIndex / cm->mb_cols;
const int x_mbs = MIN(bw, cm->mb_cols - mb_col);
const int y_mbs = MIN(bh, cm->mb_rows - mb_row);
int x, y; int x, y;
unsigned seg_id = -1;
for (y = mb_row; y < mb_row + y_mbs; y++) { for (y = 0; y < ymbs; y++) {
for (x = mb_col; x < mb_col + x_mbs; x++) { for (x = 0; x < xmbs; x++) {
seg_id = MIN(seg_id, cm->last_frame_seg_map[cm->mb_cols * y + x]); const int index = mb_index + (y * cm->mb_cols + x);
segment_id = MIN(segment_id, cm->last_frame_seg_map[index]);
} }
} }
return segment_id;
return seg_id; } else {
return cm->last_frame_seg_map[mb_index];
} }
} }

View File

@ -43,9 +43,8 @@ void vp9_set_pred_flag(MACROBLOCKD *const xd,
unsigned char pred_flag); unsigned char pred_flag);
unsigned char vp9_get_pred_mb_segid(const VP9_COMMON *const cm, int vp9_get_pred_mb_segid(VP9_COMMON *cm, BLOCK_SIZE_TYPE sb_type,
const MACROBLOCKD *const xd, int mb_row, int mb_col);
int MbIndex);
MV_REFERENCE_FRAME vp9_get_pred_ref(const VP9_COMMON *const cm, MV_REFERENCE_FRAME vp9_get_pred_ref(const VP9_COMMON *const cm,
const MACROBLOCKD *const xd); const MACROBLOCKD *const xd);

View File

@ -84,8 +84,8 @@ static int read_mb_segid(vp9_reader *r, MACROBLOCKD *xd) {
static int read_mb_segid_except(vp9_reader *r, static int read_mb_segid_except(vp9_reader *r,
VP9_COMMON *cm, MACROBLOCKD *xd, VP9_COMMON *cm, MACROBLOCKD *xd,
int mb_row, int mb_col) { int mb_row, int mb_col) {
const int mb_index = mb_row * cm->mb_cols + mb_col; const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
const int pred_seg_id = vp9_get_pred_mb_segid(cm, xd, mb_index); const int pred_seg_id = vp9_get_pred_mb_segid(cm, sb_type, mb_row, mb_col);
const vp9_prob *const p = xd->mb_segment_tree_probs; const vp9_prob *const p = xd->mb_segment_tree_probs;
const vp9_prob prob = xd->mb_segment_mispred_tree_probs[pred_seg_id]; const vp9_prob prob = xd->mb_segment_mispred_tree_probs[pred_seg_id];
@ -116,30 +116,6 @@ static void set_segment_id(VP9_COMMON *cm, MB_MODE_INFO *mbmi,
} }
} }
static int get_segment_id(VP9_COMMON *cm, MB_MODE_INFO *mbmi,
int mb_row, int mb_col) {
const int mb_index = mb_row * cm->mb_cols + mb_col;
const BLOCK_SIZE_TYPE sb_type = mbmi->sb_type;
if (sb_type) {
const int bw = 1 << mb_width_log2(sb_type);
const int bh = 1 << mb_height_log2(sb_type);
const int ymbs = MIN(cm->mb_rows - mb_row, bh);
const int xmbs = MIN(cm->mb_cols - mb_col, bw);
int segment_id = INT_MAX;
int x, y;
for (y = 0; y < ymbs; y++) {
for (x = 0; x < xmbs; x++) {
const int index = mb_index + (y * cm->mb_cols + x);
segment_id = MIN(segment_id, cm->last_frame_seg_map[index]);
}
}
return segment_id;
} else {
return cm->last_frame_seg_map[mb_index];
}
}
extern const int vp9_i8x8_block[4]; extern const int vp9_i8x8_block[4];
static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m, static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
int mb_row, int mb_col, int mb_row, int mb_col,
@ -149,19 +125,19 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
const int mis = cm->mode_info_stride; const int mis = cm->mode_info_stride;
m->mbmi.ref_frame = INTRA_FRAME; m->mbmi.ref_frame = INTRA_FRAME;
// Read the Macroblock segmentation map if it is being updated explicitly // Read segmentation map if it is being updated explicitly this frame
// this frame (reset to 0 by default).
m->mbmi.segment_id = 0; m->mbmi.segment_id = 0;
if (xd->segmentation_enabled && xd->update_mb_segmentation_map) { if (xd->segmentation_enabled && xd->update_mb_segmentation_map) {
m->mbmi.segment_id = read_mb_segid(r, xd); m->mbmi.segment_id = read_mb_segid(r, xd);
set_segment_id(cm, &m->mbmi, mb_row, mb_col, m->mbmi.segment_id); set_segment_id(cm, &m->mbmi, mb_row, mb_col, m->mbmi.segment_id);
} }
m->mbmi.mb_skip_coeff = vp9_segfeature_active(&pbi->mb, m->mbmi.segment_id, m->mbmi.mb_skip_coeff = vp9_segfeature_active(xd, m->mbmi.segment_id,
SEG_LVL_SKIP); SEG_LVL_SKIP);
if (!m->mbmi.mb_skip_coeff) if (!m->mbmi.mb_skip_coeff)
m->mbmi.mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP)); m->mbmi.mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP));
// luma mode
m->mbmi.mode = m->mbmi.sb_type ? m->mbmi.mode = m->mbmi.sb_type ?
read_kf_sb_ymode(r, cm->sb_kf_ymode_prob[cm->kf_ymode_probs_index]): read_kf_sb_ymode(r, cm->sb_kf_ymode_prob[cm->kf_ymode_probs_index]):
read_kf_mb_ymode(r, cm->kf_ymode_prob[cm->kf_ymode_probs_index]); read_kf_mb_ymode(r, cm->kf_ymode_prob[cm->kf_ymode_probs_index]);
@ -169,19 +145,19 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
m->mbmi.ref_frame = INTRA_FRAME; m->mbmi.ref_frame = INTRA_FRAME;
if (m->mbmi.mode == I4X4_PRED) { if (m->mbmi.mode == I4X4_PRED) {
int i = 0; int i;
do { for (i = 0; i < 16; ++i) {
const B_PREDICTION_MODE a = above_block_mode(m, i, mis); const B_PREDICTION_MODE a = above_block_mode(m, i, mis);
const B_PREDICTION_MODE l = xd->left_available || (i & 3) ? const B_PREDICTION_MODE l = xd->left_available || (i & 3) ?
left_block_mode(m, i) : B_DC_PRED; left_block_mode(m, i) : B_DC_PRED;
m->bmi[i].as_mode.first = read_kf_bmode(r, cm->kf_bmode_prob[a][l]); m->bmi[i].as_mode.first = read_kf_bmode(r, cm->kf_bmode_prob[a][l]);
} while (++i < 16); }
} }
if (m->mbmi.mode == I8X8_PRED) { if (m->mbmi.mode == I8X8_PRED) {
int i; int i;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; ++i) {
const int ib = vp9_i8x8_block[i]; const int ib = vp9_i8x8_block[i];
const int mode8x8 = read_i8x8_mode(r, cm->fc.i8x8_mode_prob); const int mode8x8 = read_i8x8_mode(r, cm->fc.i8x8_mode_prob);
@ -190,7 +166,10 @@ static void kfread_modes(VP9D_COMP *pbi, MODE_INFO *m,
m->bmi[ib + 4].as_mode.first = mode8x8; m->bmi[ib + 4].as_mode.first = mode8x8;
m->bmi[ib + 5].as_mode.first = mode8x8; m->bmi[ib + 5].as_mode.first = mode8x8;
} }
} else { }
// chroma mode
if (m->mbmi.mode != I8X8_PRED) {
m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]); m->mbmi.uv_mode = read_uv_mode(r, cm->kf_uv_mode_prob[m->mbmi.mode]);
} }
@ -527,12 +506,10 @@ static void mb_mode_mv_init(VP9D_COMP *pbi, vp9_reader *r) {
for (i = 0; i < VP9_I32X32_MODES - 1; ++i) for (i = 0; i < VP9_I32X32_MODES - 1; ++i)
cm->fc.sb_ymode_prob[i] = vp9_read_prob(r); cm->fc.sb_ymode_prob[i] = vp9_read_prob(r);
for (j = 0; j < PARTITION_PLANES; j++) { for (j = 0; j < PARTITION_PLANES; j++)
if (vp9_read_bit(r)) { if (vp9_read_bit(r))
for (i = 0; i < PARTITION_TYPES - 1; i++) for (i = 0; i < PARTITION_TYPES - 1; i++)
cm->fc.partition_prob[j][i] = vp9_read_prob(r); cm->fc.partition_prob[j][i] = vp9_read_prob(r);
}
}
read_nmvprobs(r, nmvc, xd->allow_high_precision_mv); read_nmvprobs(r, nmvc, xd->allow_high_precision_mv);
} }
@ -541,47 +518,40 @@ static void mb_mode_mv_init(VP9D_COMP *pbi, vp9_reader *r) {
// This function either reads the segment id for the current macroblock from // This function either reads the segment id for the current macroblock from
// the bitstream or if the value is temporally predicted asserts the predicted // the bitstream or if the value is temporally predicted asserts the predicted
// value // value
static void read_mb_segment_id(VP9D_COMP *pbi, static int read_mb_segment_id(VP9D_COMP *pbi, int mb_row, int mb_col,
int mb_row, int mb_col, vp9_reader *r) {
vp9_reader *r) {
VP9_COMMON *const cm = &pbi->common; VP9_COMMON *const cm = &pbi->common;
MACROBLOCKD *const xd = &pbi->mb; MACROBLOCKD *const xd = &pbi->mb;
MODE_INFO *const mi = xd->mode_info_context; MODE_INFO *const mi = xd->mode_info_context;
MB_MODE_INFO *const mbmi = &mi->mbmi; MB_MODE_INFO *const mbmi = &mi->mbmi;
const int mb_index = mb_row * cm->mb_cols + mb_col;
if (xd->segmentation_enabled) { if (!xd->segmentation_enabled)
if (xd->update_mb_segmentation_map) { return 0; // Default for disabled segmentation
// Is temporal coding of the segment id for this mb enabled.
if (cm->temporal_update) {
// Get the context based probability for reading the
// prediction status flag
vp9_prob pred_prob = vp9_get_pred_prob(cm, xd, PRED_SEG_ID);
// Read the prediction status flag if (xd->update_mb_segmentation_map) {
unsigned char seg_pred_flag = vp9_read(r, pred_prob); int segment_id;
// Store the prediction flag. if (cm->temporal_update) {
vp9_set_pred_flag(xd, PRED_SEG_ID, seg_pred_flag); // Temporal coding of the segment id for this mb is enabled.
// Get the context based probability for reading the
// prediction status flag
const vp9_prob pred_prob = vp9_get_pred_prob(cm, xd, PRED_SEG_ID);
const int pred_flag = vp9_read(r, pred_prob);
vp9_set_pred_flag(xd, PRED_SEG_ID, pred_flag);
// If the value is flagged as correctly predicted // If the value is flagged as correctly predicted
// then use the predicted value, otherwise decode it explicitly // then use the predicted value, otherwise decode it explicitly
mbmi->segment_id = seg_pred_flag ? segment_id = pred_flag ? vp9_get_pred_mb_segid(cm, mbmi->sb_type,
vp9_get_pred_mb_segid(cm, xd, mb_index) : mb_row, mb_col)
read_mb_segid_except(r, cm, xd, mb_row, mb_col); : read_mb_segid_except(r, cm, xd, mb_row, mb_col);
} else {
// Normal unpredicted coding mode
mbmi->segment_id = read_mb_segid(r, xd);
}
set_segment_id(cm, mbmi, mb_row, mb_col, mbmi->segment_id);
} else { } else {
mbmi->segment_id = get_segment_id(cm, mbmi, mb_row, mb_col); segment_id = read_mb_segid(r, xd); // Normal unpredicted coding mode
} }
set_segment_id(cm, mbmi, mb_row, mb_col, segment_id); // Side effect
return segment_id;
} else { } else {
// The encoder explicitly sets the segment_id to 0 return vp9_get_pred_mb_segid(cm, mbmi->sb_type, mb_row, mb_col);
// when segmentation is disabled
mbmi->segment_id = 0;
} }
} }
@ -656,7 +626,7 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
mb_to_right_edge = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN; mb_to_right_edge = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN;
// Read the macroblock segment id. // Read the macroblock segment id.
read_mb_segment_id(pbi, mb_row, mb_col, r); mbmi->segment_id = read_mb_segment_id(pbi, mb_row, mb_col, r);
mbmi->mb_skip_coeff = vp9_segfeature_active(xd, mbmi->segment_id, mbmi->mb_skip_coeff = vp9_segfeature_active(xd, mbmi->segment_id,
SEG_LVL_SKIP); SEG_LVL_SKIP);

View File

@ -554,9 +554,9 @@ static void write_mb_segid_except(VP9_COMMON *cm,
const MACROBLOCKD *xd, const MACROBLOCKD *xd,
int mb_row, int mb_col) { int mb_row, int mb_col) {
// Encode the MB segment id. // Encode the MB segment id.
int seg_id = mi->segment_id; const int seg_id = mi->segment_id;
int pred_seg_id = vp9_get_pred_mb_segid(cm, xd, const BLOCK_SIZE_TYPE sb_type = xd->mode_info_context->mbmi.sb_type;
mb_row * cm->mb_cols + mb_col); const int pred_seg_id = vp9_get_pred_mb_segid(cm, sb_type, mb_row, mb_col);
const vp9_prob *p = xd->mb_segment_tree_probs; const vp9_prob *p = xd->mb_segment_tree_probs;
const vp9_prob p1 = xd->mb_segment_mispred_tree_probs[pred_seg_id]; const vp9_prob p1 = xd->mb_segment_mispred_tree_probs[pred_seg_id];

View File

@ -171,7 +171,6 @@ static void count_segs(VP9_COMP *cpi,
int bw, int bh, int mb_row, int mb_col) { int bw, int bh, int mb_row, int mb_col) {
VP9_COMMON *const cm = &cpi->common; VP9_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &cpi->mb.e_mbd; MACROBLOCKD *const xd = &cpi->mb.e_mbd;
const int segmap_index = mb_row * cm->mb_cols + mb_col;
const int segment_id = mi->mbmi.segment_id; const int segment_id = mi->mbmi.segment_id;
xd->mode_info_context = mi; xd->mode_info_context = mi;
@ -184,7 +183,8 @@ static void count_segs(VP9_COMP *cpi,
// Temporal prediction not allowed on key frames // Temporal prediction not allowed on key frames
if (cm->frame_type != KEY_FRAME) { if (cm->frame_type != KEY_FRAME) {
// Test to see if the segment id matches the predicted value. // Test to see if the segment id matches the predicted value.
const int pred_seg_id = vp9_get_pred_mb_segid(cm, xd, segmap_index); const int pred_seg_id = vp9_get_pred_mb_segid(cm, mi->mbmi.sb_type,
mb_row, mb_col);
const int seg_predicted = (segment_id == pred_seg_id); const int seg_predicted = (segment_id == pred_seg_id);
// Get the segment id prediction context // Get the segment id prediction context