summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2015-09-04 23:53:24 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-09-04 23:53:24 +0000
commit536a90970b7b7d0bf4a029ae1a61774088dc795a (patch)
tree7582409dce4221c0a75de372e0668b84491afec1
parent9511b948ef5ee7f318f15f3744497640bdbcc69e (diff)
parentd88cee37124a598e78e7eb17686a89a5533b9520 (diff)
downloadlibvpx-536a90970b7b7d0bf4a029ae1a61774088dc795a.tar
libvpx-536a90970b7b7d0bf4a029ae1a61774088dc795a.tar.gz
libvpx-536a90970b7b7d0bf4a029ae1a61774088dc795a.tar.bz2
libvpx-536a90970b7b7d0bf4a029ae1a61774088dc795a.zip
Merge "Make update_map/temporal_update fields implicit for keyframes."
-rw-r--r--vp10/decoder/decodeframe.c17
-rw-r--r--vp10/decoder/decodemv.c30
-rw-r--r--vp10/encoder/bitstream.c12
3 files changed, 36 insertions, 23 deletions
diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c
index 518dec017..e3c97c68c 100644
--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -1012,8 +1012,9 @@ static void read_coef_probs(FRAME_CONTEXT *fc, TX_MODE tx_mode,
read_coef_probs_common(fc->coef_probs[tx_size], r);
}
-static void setup_segmentation(struct segmentation *seg,
+static void setup_segmentation(VP10_COMMON *const cm,
struct vpx_read_bit_buffer *rb) {
+ struct segmentation *const seg = &cm->seg;
int i, j;
seg->update_map = 0;
@@ -1024,13 +1025,21 @@ static void setup_segmentation(struct segmentation *seg,
return;
// Segmentation map update
- seg->update_map = vpx_rb_read_bit(rb);
+ if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
+ seg->update_map = 1;
+ } else {
+ seg->update_map = vpx_rb_read_bit(rb);
+ }
if (seg->update_map) {
for (i = 0; i < SEG_TREE_PROBS; i++)
seg->tree_probs[i] = vpx_rb_read_bit(rb) ? vpx_rb_read_literal(rb, 8)
: MAX_PROB;
- seg->temporal_update = vpx_rb_read_bit(rb);
+ if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
+ seg->temporal_update = 0;
+ } else {
+ seg->temporal_update = vpx_rb_read_bit(rb);
+ }
if (seg->temporal_update) {
for (i = 0; i < PREDICTION_PROBS; i++)
seg->pred_probs[i] = vpx_rb_read_bit(rb) ? vpx_rb_read_literal(rb, 8)
@@ -1953,7 +1962,7 @@ static size_t read_uncompressed_header(VP10Decoder *pbi,
setup_loopfilter(&cm->lf, rb);
setup_quantization(cm, &pbi->mb, rb);
- setup_segmentation(&cm->seg, rb);
+ setup_segmentation(cm, rb);
setup_segmentation_dequant(cm);
setup_tile_info(cm, rb);
diff --git a/vp10/decoder/decodemv.c b/vp10/decoder/decodemv.c
index 681e02f39..b190f734c 100644
--- a/vp10/decoder/decodemv.c
+++ b/vp10/decoder/decodemv.c
@@ -116,18 +116,6 @@ static void set_segment_id(VP10_COMMON *cm, int mi_offset,
cm->current_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
}
-static void copy_segment_id(const VP10_COMMON *cm,
- const uint8_t *last_segment_ids,
- uint8_t *current_segment_ids,
- int mi_offset, int x_mis, int y_mis) {
- int x, y;
-
- for (y = 0; y < y_mis; y++)
- for (x = 0; x < x_mis; x++)
- current_segment_ids[mi_offset + y * cm->mi_cols + x] = last_segment_ids ?
- last_segment_ids[mi_offset + y * cm->mi_cols + x] : 0;
-}
-
static int read_intra_segment_id(VP10_COMMON *const cm, int mi_offset,
int x_mis, int y_mis,
vpx_reader *r) {
@@ -137,17 +125,25 @@ static int read_intra_segment_id(VP10_COMMON *const cm, int mi_offset,
if (!seg->enabled)
return 0; // Default for disabled segmentation
- if (!seg->update_map) {
- copy_segment_id(cm, cm->last_frame_seg_map, cm->current_frame_seg_map,
- mi_offset, x_mis, y_mis);
- return 0;
- }
+ assert(seg->update_map && !seg->temporal_update);
segment_id = read_segment_id(r, seg);
set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
return segment_id;
}
+static void copy_segment_id(const VP10_COMMON *cm,
+ const uint8_t *last_segment_ids,
+ uint8_t *current_segment_ids,
+ int mi_offset, int x_mis, int y_mis) {
+ int x, y;
+
+ for (y = 0; y < y_mis; y++)
+ for (x = 0; x < x_mis; x++)
+ current_segment_ids[mi_offset + y * cm->mi_cols + x] = last_segment_ids ?
+ last_segment_ids[mi_offset + y * cm->mi_cols + x] : 0;
+}
+
static int read_inter_segment_id(VP10_COMMON *const cm, MACROBLOCKD *const xd,
int mi_row, int mi_col, vpx_reader *r) {
struct segmentation *const seg = &cm->seg;
diff --git a/vp10/encoder/bitstream.c b/vp10/encoder/bitstream.c
index 356bc16f7..2b60ac5d7 100644
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -762,7 +762,11 @@ static void encode_segmentation(VP10_COMMON *cm, MACROBLOCKD *xd,
return;
// Segmentation map
- vpx_wb_write_bit(wb, seg->update_map);
+ if (!frame_is_intra_only(cm) && !cm->error_resilient_mode) {
+ vpx_wb_write_bit(wb, seg->update_map);
+ } else {
+ assert(seg->update_map == 1);
+ }
if (seg->update_map) {
// Select the coding strategy (temporal or spatial)
vp10_choose_segmap_coding_method(cm, xd);
@@ -776,7 +780,11 @@ static void encode_segmentation(VP10_COMMON *cm, MACROBLOCKD *xd,
}
// Write out the chosen coding method.
- vpx_wb_write_bit(wb, seg->temporal_update);
+ if (!frame_is_intra_only(cm) && !cm->error_resilient_mode) {
+ vpx_wb_write_bit(wb, seg->temporal_update);
+ } else {
+ assert(seg->temporal_update == 0);
+ }
if (seg->temporal_update) {
for (i = 0; i < PREDICTION_PROBS; i++) {
const int prob = seg->pred_probs[i];