summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_bitstream.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/encoder/vp9_bitstream.c')
-rw-r--r--vp9/encoder/vp9_bitstream.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index 27d505bce..e7de5c59b 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -577,6 +577,28 @@ static void write_mb_segid(vp9_writer *bc,
}
}
+static void write_mb_segid_except(VP9_COMMON *cm,
+ vp9_writer *bc,
+ const MB_MODE_INFO *mi,
+ const MACROBLOCKD *xd,
+ int mb_row, int mb_col) {
+ // Encode the MB segment id.
+ int seg_id = mi->segment_id;
+ int pred_seg_id = vp9_get_pred_mb_segid(cm, xd,
+ mb_row * cm->mb_cols + mb_col);
+ const vp9_prob *p = xd->mb_segment_tree_probs;
+ const vp9_prob p1 = xd->mb_segment_mispred_tree_probs[pred_seg_id];
+
+ if (xd->segmentation_enabled && xd->update_mb_segmentation_map) {
+ vp9_write(bc, seg_id >= 2, p1);
+ if (pred_seg_id >= 2 && seg_id < 2) {
+ vp9_write(bc, seg_id == 1, p[1]);
+ } else if (pred_seg_id < 2 && seg_id >= 2) {
+ vp9_write(bc, seg_id == 3, p[2]);
+ }
+ }
+}
+
// This function encodes the reference frame
static void encode_ref_frame(vp9_writer *const bc,
VP9_COMMON *const cm,
@@ -720,7 +742,7 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
// If the mb segment id wasn't predicted code explicitly
if (!prediction_flag)
- write_mb_segid(bc, mi, &cpi->mb.e_mbd);
+ write_mb_segid_except(pc, bc, mi, &cpi->mb.e_mbd, mb_row, mb_col);
} else {
// Normal unpredicted coding
write_mb_segid(bc, mi, &cpi->mb.e_mbd);