diff options
author | Suman Sunkara <sunkaras@google.com> | 2010-09-14 15:13:40 -0400 |
---|---|---|
committer | Suman Sunkara <sunkaras@google.com> | 2010-09-14 16:05:42 -0400 |
commit | 00cec8f9e9a921ad69f20e84f79235a23515b4dd (patch) | |
tree | 99bd356d825442c0dce2c17cc523df92b4f5aa8b | |
parent | be7e4e854c82bd9e8b5db0586873ea19156cfeef (diff) | |
download | libvpx-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.c | 32 | ||||
-rw-r--r-- | vp8/decoder/demode.c | 30 | ||||
-rw-r--r-- | vp8/encoder/bitstream.c | 71 | ||||
-rw-r--r-- | vp8/encoder/encodeframe.c | 26 |
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; + } + } } } } |