shithub: libvpx

Download patch

ref: 00cec8f9e9a921ad69f20e84f79235a23515b4dd
parent: be7e4e854c82bd9e8b5db0586873ea19156cfeef
author: Suman Sunkara <sunkaras@google.com>
date: Tue Sep 14 11:13:40 EDT 2010

Changed code to remove extra read/write loops when not necessary

Modified code so that:
-When above and left contexts are same and not equal to current segment id, it needs to read a maximum of 2 segment_tree_probabilities.
- When above and left contexts are different and not equal to current segment id, it needs to read only a single segment_tree_probability.

Change-Id: Idc2cf2c4afcc6179b8162ac5a32c948ff5a9a2ba

--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -187,7 +187,8 @@
 #if CONFIG_SEGMENTATION
                 xd->up_available = (mb_row != 0);
                 xd->left_available = (mb_col != 0);
-
+                int count = 0;
+                int j;
                 if(xd->left_available)
                     left_id = (mi-1)->mbmi.segment_id;
                 else
@@ -204,8 +205,33 @@
                     {
                         if((left_id != i) && (above_id != i))
                         {
-                            if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
-                              mbmi->segment_id = i;
+                            if(left_id != above_id)
+                            {
+                                if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+                                    mbmi->segment_id = i;
+                                else
+                                    mbmi->segment_id = 6-left_id-above_id-i;
+                                break;
+                            }
+                            else
+                            {
+                                if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+                                {
+                                    mbmi->segment_id = i;
+                                    break;
+                                }
+                                else
+                                {
+                                    count++;
+                                    if(count == 1)
+                                        j = i;
+                                    if(count == 2)
+                                    {
+                                        mbmi->segment_id = 6-left_id-j-i;
+                                        break;
+                                    }
+                                }
+                            }
                         }
                     }
                 }
--- a/vp8/decoder/demode.c
+++ b/vp8/decoder/demode.c
@@ -94,7 +94,8 @@
                 MACROBLOCKD *xd = &pbi->mb;
                 xd->up_available = (mb_row != 0);
                 xd->left_available = (mb_col != 0);
-
+                int count = 0;
+                int j;
                 if(xd->left_available)
                     left_id = (m-1)->mbmi.segment_id;
                 else
@@ -111,9 +112,32 @@
                     {
                         if((left_id != i) && (above_id != i))
                         {
-                            if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+                            if(left_id != above_id)
                             {
-                                m->mbmi.segment_id = i;
+                                if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+                                    m->mbmi.segment_id = i;
+                                else
+                                    m->mbmi.segment_id = 6-left_id-above_id-i;
+                                break;
+                            }
+                            else
+                            {
+                                if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+                                {
+                                    m->mbmi.segment_id = i;
+                                    break;
+                                }
+                                else
+                                {
+                                    count++;
+                                    if(count == 1)
+                                        j = i;
+                                    if(count == 2)
+                                    {
+                                        m->mbmi.segment_id = 6-left_id-j-i;
+                                        break;
+                                    }
+                                }
                             }
                         }
                     }
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -986,19 +986,41 @@
                 {
                     vp8_write(w, 1, xd->mb_segment_tree_probs[0]);
                     segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[0]);
+                    int count = 0;
                     for(i = 0; i < MAX_MB_SEGMENTS; i++)
                     {
                         if((left_id != i) && (above_id != i))
                         {
-                            if(m->mbmi.segment_id == i)
+                            if(left_id != above_id)
                             {
-                                vp8_write(w, 0, xd->mb_segment_tree_probs[2+i]);
-                                segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                if(m->mbmi.segment_id == i)
+                                {
+                                    vp8_write(w, 0, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                }
+                                else
+                                {
+                                    vp8_write(w, 1, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                }
+                                break;
                             }
                             else
                             {
-                                vp8_write(w, 1, xd->mb_segment_tree_probs[2+i]);
-                                segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                if(m->mbmi.segment_id == i)
+                                {
+                                    vp8_write(w, 0, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                    break;
+                                }
+                                else
+                                {
+                                    count++;
+                                    vp8_write(w, 1, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                    if(count == 2)
+                                        break;
+                                }
                             }
                         }
                     }
@@ -1205,22 +1227,43 @@
                 {
                     vp8_write(bc, 1, xd->mb_segment_tree_probs[0]);
                     segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[0]);
-
+                    int count = 0;
                     for(i = 0; i < MAX_MB_SEGMENTS; i++)
                     {
                         if((left_id != i) && (above_id != i))
                         {
-                            if(m->mbmi.segment_id == i)
+                            if(left_id != above_id)
                             {
-                                vp8_write(bc, 0, xd->mb_segment_tree_probs[2+i]);
-                                segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                if(m->mbmi.segment_id == i)
+                                {
+                                    vp8_write(bc, 0, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                }
+                                else
+                                {
+                                    vp8_write(bc, 1, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                }
+                                break;
                             }
                             else
                             {
-                                vp8_write(bc, 1, xd->mb_segment_tree_probs[2+i]);
-                                segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                if(m->mbmi.segment_id == i)
+                                {
+                                    vp8_write(bc, 0, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_zero(xd->mb_segment_tree_probs[2+i]);
+                                    break;
+                                }
+                                else
+                                {
+                                    count++;
+                                    vp8_write(bc, 1, xd->mb_segment_tree_probs[2+i]);
+                                    segment_cost += vp8_cost_one(xd->mb_segment_tree_probs[2+i]);
+                                    if(count == 2)
+                                        break;
+                                }
                             }
-                            
+
                         }
                     }
                 }
@@ -1544,10 +1587,10 @@
     }
     else
         vp8_start_encode(bc, cx_data);
-//#if CONFIG_SEGMENTATION
+#if CONFIG_SEGMENTATION
      //xd->segmentation_enabled =1;
      xd->update_mb_segmentation_map = 1;
-//#endif
+#endif
     // Signal whether or not Segmentation is enabled
     vp8_write_bit(bc, (xd->segmentation_enabled) ? 1 : 0);
 
--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -411,14 +411,34 @@
     else
     {
         segment_counts[9]++;
+        int count =0;
         for(i = 0; i < MAX_MB_SEGMENTS; i++)
         {
             if((left_id != i) && (above_id != i))
             {
-                if(xd->mbmi.segment_id == i)
-                    segment_counts[i]++;
+                if(above_id != left_id)
+                {
+                    if(xd->mbmi.segment_id == i)
+                        segment_counts[i]++;
+                    else
+                        segment_counts[MAX_MB_SEGMENTS + i]++;
+                    break;
+                }
                 else
-                    segment_counts[MAX_MB_SEGMENTS + i]++;
+                {
+                    if(xd->mbmi.segment_id == i)
+                    {
+                        segment_counts[i]++;
+                        break;
+                    }
+                    else
+                    {
+                        count++;
+                        segment_counts[MAX_MB_SEGMENTS + i]++;
+                        if(count == 2)
+                            break;
+                    }
+                }
             }
         }
     }