summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuman Sunkara <sunkaras@google.com>2010-09-14 15:13:40 -0400
committerSuman Sunkara <sunkaras@google.com>2010-09-14 16:05:42 -0400
commit00cec8f9e9a921ad69f20e84f79235a23515b4dd (patch)
tree99bd356d825442c0dce2c17cc523df92b4f5aa8b
parentbe7e4e854c82bd9e8b5db0586873ea19156cfeef (diff)
downloadlibvpx-00cec8f9e9a921ad69f20e84f79235a23515b4dd.tar
libvpx-00cec8f9e9a921ad69f20e84f79235a23515b4dd.tar.gz
libvpx-00cec8f9e9a921ad69f20e84f79235a23515b4dd.tar.bz2
libvpx-00cec8f9e9a921ad69f20e84f79235a23515b4dd.zip
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
-rw-r--r--vp8/decoder/decodemv.c32
-rw-r--r--vp8/decoder/demode.c30
-rw-r--r--vp8/encoder/bitstream.c71
-rw-r--r--vp8/encoder/encodeframe.c26
4 files changed, 136 insertions, 23 deletions
diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c
index de85e8f6d..dfa468084 100644
--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -187,7 +187,8 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi)
#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 @@ void vp8_decode_mode_mvs(VP8D_COMP *pbi)
{
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;
+ }
+ }
+ }
}
}
}
diff --git a/vp8/decoder/demode.c b/vp8/decoder/demode.c
index 0d2e95b8b..5b837ad9b 100644
--- a/vp8/decoder/demode.c
+++ b/vp8/decoder/demode.c
@@ -94,7 +94,8 @@ void vp8_kfread_modes(VP8D_COMP *pbi)
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 @@ void vp8_kfread_modes(VP8D_COMP *pbi)
{
if((left_id != i) && (above_id != i))
{
- if (vp8_read(bc, xd->mb_segment_tree_probs[2+i]) == 0)
+ if(left_id != above_id)
+ {
+ 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
{
- m->mbmi.segment_id = i;
+ 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;
+ }
+ }
}
}
}
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index e336753b4..f0b345b06 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -986,19 +986,41 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
{
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 @@ static void write_kfmodes(VP8_COMP *cpi)
{
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 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
}
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);
diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c
index adc85096b..4af2fdd69 100644
--- a/vp8/encoder/encodeframe.c
+++ b/vp8/encoder/encodeframe.c
@@ -411,14 +411,34 @@ void encode_mb_row(VP8_COMP *cpi,
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;
+ }
+ }
}
}
}