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;
+ }
+ }
}
}
}