spatial_segmentation: improve edge case handling

Change-Id: If47ac212044a977b12c8df1322759d173dd29ed5
diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h
index 7c3b042..e381610 100644
--- a/av1/common/pred_common.h
+++ b/av1/common/pred_common.h
@@ -21,8 +21,10 @@
 #endif
 
 #if CONFIG_SPATIAL_SEGMENTATION
-/* Picks CDFs based on number of matching segment IDs */
+/* Picks CDFs based on number of matching/out-of-bounds segment IDs */
 static INLINE int pick_spatial_seg_cdf(int prev_ul, int prev_u, int prev_l) {
+  if (prev_ul < 0 || prev_u < 0 || prev_l < 0) /* Edge case */
+    return 0;
   if ((prev_ul == prev_u) && (prev_ul == prev_l))
     return 2;
   else if ((prev_ul == prev_u) || (prev_ul == prev_l) || (prev_u == prev_l))
@@ -31,8 +33,12 @@
     return 0;
 }
 
+/* If 2 or more are identical returns that as predictor, otherwise prev_l */
 static INLINE int pick_spatial_seg_pred(int prev_ul, int prev_u, int prev_l) {
-  /* If 2 or more are identical returns that as predictor, otherwise prev_l */
+  if (prev_u == -1) /* Edge case */
+    return prev_l == -1 ? 0 : prev_l;
+  if (prev_l == -1) /* Edge case */
+    return prev_u;
   return (prev_ul == prev_u) ? prev_u : prev_l;
 }
 
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index e1a69e1..4b6694e 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -350,9 +350,9 @@
                            int mi_row, int mi_col, aom_reader *r, int skip) {
   FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
   struct segmentation_probs *const segp = &ec_ctx->seg;
-  int prev_ul = 0; /* Top left segment_id */
-  int prev_l = 0;  /* Current left segment_id */
-  int prev_u = 0;  /* Current top segment_id */
+  int prev_ul = -1; /* Top left segment_id */
+  int prev_l = -1;  /* Current left segment_id */
+  int prev_u = -1;  /* Current top segment_id */
 
   if ((xd->up_available) && (xd->left_available))
     prev_ul = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 8aa8bb0..25eac0a 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -593,9 +593,9 @@
                              int mi_col, int skip) {
   AV1_COMMON *const cm = &cpi->common;
   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
-  int prev_ul = 0; /* Top left segment_id */
-  int prev_l = 0;  /* Current left segment_id */
-  int prev_u = 0;  /* Current top segment_id */
+  int prev_ul = -1; /* Top left segment_id */
+  int prev_l = -1;  /* Current left segment_id */
+  int prev_u = -1;  /* Current top segment_id */
 
   if (!seg->enabled || !seg->update_map) return;