Change q_segmentation to spatial_segmentation Adds spatial prediction to standard segmentation instead of a separate segmentation feature. When using temporal prediction skipped blocks are flagged as mispredicted. Change-Id: I0c32281286d3fbce66d339c9247bcc6516f37a63
diff --git a/av1/common/alloccommon.c b/av1/common/alloccommon.c index 00ff268..b60fc83 100644 --- a/av1/common/alloccommon.c +++ b/av1/common/alloccommon.c
@@ -53,11 +53,6 @@ int i; int seg_map_size = rows * cols; -#if CONFIG_Q_SEGMENTATION - cm->q_seg_map = (uint8_t *)aom_calloc(seg_map_size, 1); - if (!cm->q_seg_map) return 1; -#endif - for (i = 0; i < NUM_PING_PONG_BUFFERS; ++i) { cm->seg_map_array[i] = (uint8_t *)aom_calloc(seg_map_size, 1); if (cm->seg_map_array[i] == NULL) return 1; @@ -78,11 +73,6 @@ static void free_seg_map(AV1_COMMON *cm) { int i; -#if CONFIG_Q_SEGMENTATION - aom_free(cm->q_seg_map); - cm->q_seg_map = NULL; -#endif - for (i = 0; i < NUM_PING_PONG_BUFFERS; ++i) { aom_free(cm->seg_map_array[i]); cm->seg_map_array[i] = NULL;
diff --git a/av1/common/blockd.h b/av1/common/blockd.h index 54bf921..1c41637 100644 --- a/av1/common/blockd.h +++ b/av1/common/blockd.h
@@ -278,9 +278,6 @@ int8_t skip_mode; #endif // CONFIG_EXT_SKIP int8_t segment_id; -#if CONFIG_Q_SEGMENTATION - int8_t q_segment_id; -#endif int8_t seg_id_predicted; // valid only when temporal_update is enabled // Only for INTRA blocks
diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 2756071..ae45300 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c
@@ -1751,9 +1751,11 @@ AVERAGE_TILE_CDFS(lpf_delta_cdf); AVERAGE_TILE_CDFS(lpf_sign_cdf); #endif // CONFIG_LPF_SB -#if CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION int j; - for (j = 0; j < Q_SEGMENT_CDF_COUNT; j++) AVERAGE_TILE_CDFS(seg.q_seg_cdf[j]); + for (j = 0; j < SPATIAL_PREDICTION_PROBS; j++) { + AVERAGE_TILE_CDFS(seg.spatial_pred_seg_cdf[j]); + } #endif } @@ -1807,10 +1809,6 @@ AVERAGE_TILE_CDFS(lpf_delta_cdf); AVERAGE_TILE_CDFS(lpf_sign_cdf); #endif // CONFIG_LPF_SB -#if CONFIG_Q_SEGMENTATION - int j; - for (j = 0; j < Q_SEGMENT_CDF_COUNT; j++) AVERAGE_TILE_CDFS(seg.q_seg_cdf[j]); -#endif #if CONFIG_JNT_COMP AVERAGE_TILE_CDFS(compound_index_cdf); #endif // CONFIG_JNT_COMP
diff --git a/av1/common/entropymode.c b/av1/common/entropymode.c index 0ddf6b6..c75a148 100644 --- a/av1/common/entropymode.c +++ b/av1/common/entropymode.c
@@ -1603,9 +1603,10 @@ AOM_CDF8(4096, 8192, 12288, 16384, 20480, 24576, 28672) }; -#if CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION static const aom_cdf_prob - default_q_seg_tree_cdf[Q_SEGMENT_CDF_COUNT][CDF_SIZE(MAX_SEGMENTS)] = { + default_spatial_pred_seg_tree_cdf[SPATIAL_PREDICTION_PROBS][CDF_SIZE( + MAX_SEGMENTS)] = { { AOM_CDF8(5622, 7893, 16093, 18233, 27809, 28373, 32533), }, @@ -3085,9 +3086,10 @@ av1_copy(fc->skip_cdfs, default_skip_cdfs); av1_copy(fc->intra_inter_cdf, default_intra_inter_cdf); av1_copy(fc->seg.tree_cdf, default_seg_tree_cdf); -#if CONFIG_Q_SEGMENTATION - for (int i = 0; i < Q_SEGMENT_CDF_COUNT; i++) - av1_copy(fc->seg.q_seg_cdf[i], default_q_seg_tree_cdf[i]); +#if CONFIG_SPATIAL_SEGMENTATION + for (int i = 0; i < SPATIAL_PREDICTION_PROBS; i++) + av1_copy(fc->seg.spatial_pred_seg_cdf[i], + default_spatial_pred_seg_tree_cdf[i]); #endif av1_copy(fc->tx_size_cdf, default_tx_size_cdf); av1_copy(fc->delta_q_cdf, default_delta_q_cdf);
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index 0ddfc42..7d8fa3f 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -398,10 +398,11 @@ #endif uint8_t *last_frame_seg_map; uint8_t *current_frame_seg_map; -#if CONFIG_Q_SEGMENTATION - uint8_t *q_seg_map; -#endif int seg_map_alloc_size; +#if CONFIG_SPATIAL_SEGMENTATION + int last_active_segid; + int preskip_segid; +#endif InterpFilter interp_filter;
diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h index bf3f091..6ce442f 100644 --- a/av1/common/pred_common.h +++ b/av1/common/pred_common.h
@@ -20,9 +20,9 @@ extern "C" { #endif -#if CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION /* Picks CDFs based on number of matching segment IDs */ -static INLINE int pick_q_seg_cdf(int prev_ul, int prev_u, int prev_l) { +static INLINE int pick_spatial_seg_cdf(int prev_ul, int prev_u, int prev_l) { if ((prev_ul == prev_u) && (prev_ul == prev_l)) return 2; else if ((prev_ul == prev_u) || (prev_ul == prev_l) || (prev_u == prev_l)) @@ -31,14 +31,15 @@ return 0; } -static INLINE int pick_q_seg_pred(int prev_ul, int prev_u, int prev_l) { +static INLINE int pick_spatial_seg_pred(int prev_ul, int prev_u, int prev_l) { /* If 2 or more are identical returns that as predictor, otherwise prev_l */ return (prev_ul == prev_u) ? prev_u : prev_l; } -static INLINE void set_q_segment_id(const AV1_COMMON *const cm, - uint8_t *segment_ids, BLOCK_SIZE bsize, - int mi_row, int mi_col, int segment_id) { +static INLINE void set_spatial_segment_id(const AV1_COMMON *const cm, + uint8_t *segment_ids, + BLOCK_SIZE bsize, int mi_row, + int mi_col, int segment_id) { const int mi_offset = mi_row * cm->mi_cols + mi_col; const int bw = mi_size_wide[bsize]; const int bh = mi_size_high[bsize];
diff --git a/av1/common/quant_common.c b/av1/common/quant_common.c index 44a31ff..286a8a4 100644 --- a/av1/common/quant_common.c +++ b/av1/common/quant_common.c
@@ -430,25 +430,14 @@ #endif // !CONFIG_DAALA_TX int av1_get_qindex(const struct segmentation *seg, int segment_id, -#if CONFIG_Q_SEGMENTATION - int q_segment_id, int base_qindex) -#else - int base_qindex) -#endif -{ + int base_qindex) { if (segfeature_active(seg, segment_id, SEG_LVL_ALT_Q)) { const int data = get_segdata(seg, segment_id, SEG_LVL_ALT_Q); const int seg_qindex = base_qindex + data; return clamp(seg_qindex, 0, MAXQ); - } -#if CONFIG_Q_SEGMENTATION - else if (q_segment_id < seg->q_lvls) { - const int seg_qindex = base_qindex + seg->q_delta[q_segment_id]; - return clamp(seg_qindex, 0, MAXQ); - } -#endif - else + } else { return base_qindex; + } } #if CONFIG_AOM_QM
diff --git a/av1/common/quant_common.h b/av1/common/quant_common.h index a8d1114..7a7db57 100644 --- a/av1/common/quant_common.h +++ b/av1/common/quant_common.h
@@ -44,11 +44,7 @@ int16_t av1_qindex_from_ac_Q3(int ac_Q3, aom_bit_depth_t bit_depth); int av1_get_qindex(const struct segmentation *seg, int segment_id, -#if CONFIG_Q_SEGMENTATION - int q_segment_id, int base_qindex); -#else int base_qindex); -#endif #if CONFIG_AOM_QM // Reduce the large number of quantizers to a smaller number of levels for which // different matrices may be defined
diff --git a/av1/common/seg_common.h b/av1/common/seg_common.h index 03276cb..a68fe6e 100644 --- a/av1/common/seg_common.h +++ b/av1/common/seg_common.h
@@ -22,8 +22,8 @@ #define SEG_TREE_PROBS (MAX_SEGMENTS - 1) #define PREDICTION_PROBS 3 -#if CONFIG_Q_SEGMENTATION -#define Q_SEGMENT_CDF_COUNT 3 +#if CONFIG_SPATIAL_SEGMENTATION +#define SPATIAL_PREDICTION_PROBS 3 #endif #if CONFIG_LOOPFILTER_LEVEL @@ -60,10 +60,6 @@ struct segmentation { uint8_t enabled; -#if CONFIG_Q_SEGMENTATION - uint8_t q_lvls; - int16_t q_delta[MAX_SEGMENTS]; -#endif uint8_t update_map; uint8_t update_data; uint8_t temporal_update; @@ -76,8 +72,9 @@ aom_prob tree_probs[SEG_TREE_PROBS]; aom_cdf_prob tree_cdf[CDF_SIZE(MAX_SEGMENTS)]; aom_cdf_prob pred_cdf[PREDICTION_PROBS][CDF_SIZE(2)]; -#if CONFIG_Q_SEGMENTATION - aom_cdf_prob q_seg_cdf[Q_SEGMENT_CDF_COUNT][CDF_SIZE(MAX_SEGMENTS)]; +#if CONFIG_SPATIAL_SEGMENTATION + aom_cdf_prob spatial_pred_seg_cdf[SPATIAL_PREDICTION_PROBS] + [CDF_SIZE(MAX_SEGMENTS)]; #endif };
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 08db2ad..785b99c 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -406,11 +406,7 @@ for (int i = 0; i < MAX_SEGMENTS; i++) { #if CONFIG_EXT_DELTA_Q const int current_qindex = -#if CONFIG_Q_SEGMENTATION - av1_get_qindex(&cm->seg, i, i, xd->current_qindex); -#else av1_get_qindex(&cm->seg, i, xd->current_qindex); -#endif #else const int current_qindex = xd->current_qindex; #endif // CONFIG_EXT_DELTA_Q @@ -959,6 +955,10 @@ } } +#if CONFIG_SPATIAL_SEGMENTATION + cm->preskip_segid = 0; +#endif + // Segmentation data update seg->update_data = aom_rb_read_bit(rb); if (seg->update_data) { @@ -969,6 +969,10 @@ int data = 0; const int feature_enabled = aom_rb_read_bit(rb); if (feature_enabled) { +#if CONFIG_SPATIAL_SEGMENTATION + cm->preskip_segid |= j >= SEG_LVL_REF_FRAME; + cm->last_active_segid = i; +#endif av1_enable_segfeature(seg, i, j); data = decode_unsigned_max(rb, av1_seg_feature_data_max(j)); if (av1_is_segfeature_signed(j)) @@ -980,33 +984,6 @@ } } -#if CONFIG_Q_SEGMENTATION -static void setup_q_segmentation(AV1_COMMON *const cm, - struct aom_read_bit_buffer *rb) { - struct segmentation *const seg = &cm->seg; - - for (int i = 0; i < MAX_SEGMENTS; i++) { - if (segfeature_active(seg, i, SEG_LVL_ALT_Q)) { - seg->q_lvls = 0; - return; - } - } - - if (!aom_rb_read_bit(rb)) { - seg->q_lvls = 0; - return; - } - - seg->q_lvls = decode_unsigned_max(rb, MAX_SEGMENTS); - - for (int i = 0; i < seg->q_lvls; i++) { - int val = decode_unsigned_max(rb, MAXQ); - val *= 1 - 2 * aom_rb_read_bit(rb); - seg->q_delta[i] = val; - } -} -#endif - #if CONFIG_LOOP_RESTORATION static void decode_restoration_mode(AV1_COMMON *cm, struct aom_read_bit_buffer *rb) { @@ -1279,11 +1256,7 @@ // remaining are don't cares. const int max_segments = cm->seg.enabled ? MAX_SEGMENTS : 1; for (int i = 0; i < max_segments; ++i) { -#if CONFIG_Q_SEGMENTATION - const int qindex = av1_get_qindex(&cm->seg, i, i, cm->base_qindex); -#else const int qindex = av1_get_qindex(&cm->seg, i, cm->base_qindex); -#endif cm->y_dequant_QTX[i][0] = av1_dc_quant_QTX(qindex, cm->y_dc_delta_q, cm->bit_depth); cm->y_dequant_QTX[i][1] = av1_ac_quant_QTX(qindex, 0, cm->bit_depth); @@ -3119,9 +3092,6 @@ #endif // CONFIG_Q_ADAPT_PROBS setup_segmentation(cm, rb); -#if CONFIG_Q_SEGMENTATION - setup_q_segmentation(cm, rb); -#endif { int delta_q_allowed = 1; @@ -3132,9 +3102,6 @@ if (segfeature_active(seg, i, SEG_LVL_ALT_Q)) { segment_quantizer_active = 1; } -#if CONFIG_Q_SEGMENTATION - if (seg->q_lvls) segment_quantizer_active = 1; -#endif } delta_q_allowed = !segment_quantizer_active; #endif @@ -3175,11 +3142,7 @@ for (int i = 0; i < MAX_SEGMENTS; ++i) { const int qindex = cm->seg.enabled -#if CONFIG_Q_SEGMENTATION - ? av1_get_qindex(&cm->seg, i, i, cm->base_qindex) -#else ? av1_get_qindex(&cm->seg, i, cm->base_qindex) -#endif : cm->base_qindex; xd->lossless[i] = qindex == 0 && cm->y_dc_delta_q == 0 && cm->u_dc_delta_q == 0 && cm->u_ac_delta_q == 0 &&
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 4a7729b..4d7da60 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -344,11 +344,7 @@ return NEAREST_NEARESTMV + mode; } -static int read_segment_id(aom_reader *r, struct segmentation_probs *segp) { - return aom_read_symbol(r, segp->tree_cdf, MAX_SEGMENTS, ACCT_STR); -} - -#if CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION static int neg_deinterleave(int diff, int ref, int max) { if (!ref) return diff; if (ref >= (max - 1)) return max - diff - 1; @@ -371,52 +367,49 @@ } } -static int read_q_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd, - int mi_row, int mi_col, aom_reader *r) { - struct segmentation *const seg = &cm->seg; +static int read_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd, + int mi_row, int mi_col, aom_reader *r, int skip) { FRAME_CONTEXT *ec_ctx = xd->tile_ctx; struct segmentation_probs *const segp = &ec_ctx->seg; - MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; int prev_ul = 0; /* Top left segment_id */ int prev_l = 0; /* Current left segment_id */ int prev_u = 0; /* Current top segment_id */ - if (!seg->q_lvls) return 0; - MODE_INFO *const mi = cm->mi + mi_row * cm->mi_stride + mi_col; int tinfo = mi->mbmi.boundary_info; int above = (!(tinfo & TILE_ABOVE_BOUNDARY)) && ((mi_row - 1) >= 0); int left = (!(tinfo & TILE_LEFT_BOUNDARY)) && ((mi_col - 1) >= 0); if (above && left) - prev_ul = - get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row - 1, mi_col - 1); + prev_ul = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 1, mi_col - 1); if (above) - prev_u = get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row - 1, mi_col); + prev_u = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 1, mi_col - 0); if (left) - prev_l = get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row, mi_col - 1); + prev_l = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 0, mi_col - 1); - int cdf_num = pick_q_seg_cdf(prev_ul, prev_u, prev_l); - int pred = pick_q_seg_pred(prev_ul, prev_u, prev_l); + int cdf_num = pick_spatial_seg_cdf(prev_ul, prev_u, prev_l); + int pred = pick_spatial_seg_pred(prev_ul, prev_u, prev_l); - if (mbmi->skip) { - set_q_segment_id(cm, cm->q_seg_map, mbmi->sb_type, mi_row, mi_col, pred); - return 0; - } + if (skip) return pred; - aom_cdf_prob *pred_cdf = segp->q_seg_cdf[cdf_num]; + aom_cdf_prob *pred_cdf = segp->spatial_pred_seg_cdf[cdf_num]; int coded_id = aom_read_symbol(r, pred_cdf, 8, ACCT_STR); - int segment_id = neg_deinterleave(coded_id, pred, seg->q_lvls); + int segment_id = neg_deinterleave(coded_id, pred, cm->last_active_segid + 1); - assert(segment_id >= 0 && segment_id < seg->q_lvls); - set_q_segment_id(cm, cm->q_seg_map, mbmi->sb_type, mi_row, mi_col, - segment_id); + assert(segment_id >= 0 && segment_id <= cm->last_active_segid); return segment_id; } +#else +static int read_segment_id(aom_reader *r, struct segmentation_probs *segp) { + return aom_read_symbol(r, segp->tree_cdf, MAX_SEGMENTS, ACCT_STR); +} #endif static void read_tx_size_vartx(AV1_COMMON *cm, MACROBLOCKD *xd, @@ -558,19 +551,36 @@ } static int read_intra_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd, - int mi_offset, int x_mis, int y_mis, + MB_MODE_INFO *const mbmi, int mi_row, + int mi_col, int bsize, int preskip, aom_reader *r) { struct segmentation *const seg = &cm->seg; + const int mi_offset = mi_row * cm->mi_cols + mi_col; + const int bw = mi_size_wide[bsize]; + const int bh = mi_size_high[bsize]; + const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw); + const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh); FRAME_COUNTS *counts = xd->counts; - FRAME_CONTEXT *ec_ctx = xd->tile_ctx; - struct segmentation_probs *const segp = &ec_ctx->seg; int segment_id; if (!seg->enabled) return 0; // Default for disabled segmentation assert(seg->update_map && !seg->temporal_update); - segment_id = read_segment_id(r, segp); +#if CONFIG_SPATIAL_SEGMENTATION + if (preskip) { + if (!cm->preskip_segid) return 0; + } else { + if (cm->preskip_segid) return mbmi->segment_id; + } + segment_id = + read_segment_id(cm, xd, mi_row, mi_col, r, preskip ? 0 : mbmi->skip); +#else + FRAME_CONTEXT *ec_ctx = xd->tile_ctx; + (void)preskip; + (void)mbmi; + segment_id = read_segment_id(r, &ec_ctx->seg); +#endif if (counts) ++counts->seg.tree_total[segment_id]; set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id); return segment_id; @@ -588,7 +598,8 @@ } static int read_inter_segment_id(AV1_COMMON *const cm, MACROBLOCKD *const xd, - int mi_row, int mi_col, aom_reader *r) { + int mi_row, int mi_col, int preskip, + aom_reader *r) { struct segmentation *const seg = &cm->seg; FRAME_COUNTS *counts = xd->counts; FRAME_CONTEXT *ec_ctx = xd->tile_ctx; @@ -617,6 +628,25 @@ return predicted_segment_id; } +#if CONFIG_SPATIAL_SEGMENTATION + if (preskip) { + if (!cm->preskip_segid) return 0; + } else { + if (cm->preskip_segid) return mbmi->segment_id; + if (mbmi->skip) { + if (seg->temporal_update) { + const int ctx = av1_get_pred_context_seg_id(xd); + mbmi->seg_id_predicted = 0; + if (counts) ++counts->seg.pred[ctx][mbmi->seg_id_predicted]; + } + segment_id = read_segment_id(cm, xd, mi_row, mi_col, r, 0); + if (counts) ++counts->seg.tree_total[segment_id]; + set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id); + return segment_id; + } + } +#endif + (void)preskip; if (seg->temporal_update) { const int ctx = av1_get_pred_context_seg_id(xd); aom_cdf_prob *pred_cdf = segp->pred_cdf[ctx]; @@ -625,11 +655,19 @@ if (mbmi->seg_id_predicted) { segment_id = predicted_segment_id; } else { +#if CONFIG_SPATIAL_SEGMENTATION + segment_id = read_segment_id(cm, xd, mi_row, mi_col, r, 0); +#else segment_id = read_segment_id(r, segp); +#endif if (counts) ++counts->seg.tree_mispred[segment_id]; } } else { +#if CONFIG_SPATIAL_SEGMENTATION + segment_id = read_segment_id(cm, xd, mi_row, mi_col, r, 0); +#else segment_id = read_segment_id(r, segp); +#endif if (counts) ++counts->seg.tree_total[segment_id]; } set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id); @@ -1077,20 +1115,16 @@ const MODE_INFO *left_mi = xd->left_mi; const BLOCK_SIZE bsize = mbmi->sb_type; int i; - const int mi_offset = mi_row * cm->mi_cols + mi_col; - const int bw = mi_size_wide[bsize]; - const int bh = mi_size_high[bsize]; - // TODO(slavarnway): move x_mis, y_mis into xd ????? - const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw); - const int y_mis = AOMMIN(cm->mi_rows - mi_row, bh); FRAME_CONTEXT *ec_ctx = xd->tile_ctx; - mbmi->segment_id = read_intra_segment_id(cm, xd, mi_offset, x_mis, y_mis, r); + mbmi->segment_id = + read_intra_segment_id(cm, xd, mbmi, mi_row, mi_col, bsize, 1, r); mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); -#if CONFIG_Q_SEGMENTATION - mbmi->q_segment_id = read_q_segment_id(cm, xd, mi_row, mi_col, r); +#if CONFIG_SPATIAL_SEGMENTATION + mbmi->segment_id = + read_intra_segment_id(cm, xd, mbmi, mi_row, mi_col, bsize, 0, r); #endif read_cdef(cm, r, mbmi, mi_col, mi_row); @@ -2334,7 +2368,7 @@ mbmi->mv[0].as_int = 0; mbmi->mv[1].as_int = 0; - mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, r); + mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, 1, r); #if CONFIG_EXT_SKIP mbmi->skip_mode = read_skip_mode(cm, xd, mbmi->segment_id, r); @@ -2351,9 +2385,9 @@ #endif // CONFIG_EXT_SKIP mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); -#if CONFIG_Q_SEGMENTATION - mbmi->q_segment_id = read_q_segment_id(cm, xd, mi_row, mi_col, r); -#endif // CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION + mbmi->segment_id = read_inter_segment_id(cm, xd, mi_row, mi_col, 0, r); +#endif read_cdef(cm, r, mbmi, mi_col, mi_row);
diff --git a/av1/encoder/aq_cyclicrefresh.c b/av1/encoder/aq_cyclicrefresh.c index 22247a2..12bdc80 100644 --- a/av1/encoder/aq_cyclicrefresh.c +++ b/av1/encoder/aq_cyclicrefresh.c
@@ -410,11 +410,7 @@ int mi_col = sb_col_index * cm->mib_size; int qindex_thresh = cpi->oxcf.content == AOM_CONTENT_SCREEN -#if CONFIG_Q_SEGMENTATION - ? av1_get_qindex(&cm->seg, CR_SEGMENT_ID_BOOST2, 0, cm->base_qindex) -#else ? av1_get_qindex(&cm->seg, CR_SEGMENT_ID_BOOST2, cm->base_qindex) -#endif : 0; assert(mi_row >= 0 && mi_row < cm->mi_rows); assert(mi_col >= 0 && mi_col < cm->mi_cols);
diff --git a/av1/encoder/av1_quantize.c b/av1/encoder/av1_quantize.c index 18b226c..d0ec6ec 100644 --- a/av1/encoder/av1_quantize.c +++ b/av1/encoder/av1_quantize.c
@@ -1642,11 +1642,7 @@ } void av1_init_plane_quantizers(const AV1_COMP *cpi, MACROBLOCK *x, -#if CONFIG_Q_SEGMENTATION - int segment_id, int q_segment_id) { -#else int segment_id) { -#endif const AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &x->e_mbd; const QUANTS *const quants = &cpi->quants; @@ -1663,12 +1659,7 @@ cm->delta_q_present_flag ? cm->base_qindex + xd->delta_qindex : cm->base_qindex)); #endif -#if CONFIG_Q_SEGMENTATION - const int qindex = - av1_get_qindex(&cm->seg, segment_id, q_segment_id, current_q_index); -#else const int qindex = av1_get_qindex(&cm->seg, segment_id, current_q_index); -#endif const int rdmult = av1_compute_rd_mult(cpi, qindex + cm->y_dc_delta_q); #if CONFIG_AOM_QM int minqm = cm->min_qmlevel; @@ -1766,12 +1757,7 @@ void av1_frame_init_quantizer(AV1_COMP *cpi) { MACROBLOCK *const x = &cpi->td.mb; MACROBLOCKD *const xd = &x->e_mbd; -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id, - xd->mi[0]->mbmi.q_segment_id); -#else av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id); -#endif } void av1_set_quantizer(AV1_COMMON *cm, int q) {
diff --git a/av1/encoder/av1_quantize.h b/av1/encoder/av1_quantize.h index 94156b5..f08022f 100644 --- a/av1/encoder/av1_quantize.h +++ b/av1/encoder/av1_quantize.h
@@ -107,11 +107,7 @@ void av1_frame_init_quantizer(struct AV1_COMP *cpi); void av1_init_plane_quantizers(const struct AV1_COMP *cpi, MACROBLOCK *x, -#if CONFIG_Q_SEGMENTATION - int segment_id, int q_segment_id); -#else int segment_id); -#endif void av1_build_quantizer(aom_bit_depth_t bit_depth, int y_dc_delta_q, int u_dc_delta_q, int u_ac_delta_q, int v_dc_delta_q,
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index d914fc3..1b75dc9 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -615,7 +615,7 @@ } #endif // CONFIG_LV_MAP -#if CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION static int neg_interleave(int x, int ref, int max) { const int diff = x - ref; if (!ref) return x; @@ -639,16 +639,16 @@ } } -static void write_q_segment_id(const AV1_COMMON *cm, int skip, - const MB_MODE_INFO *const mbmi, aom_writer *w, - const struct segmentation *seg, - struct segmentation_probs *segp, - BLOCK_SIZE bsize, int mi_row, int mi_col) { +static void write_segment_id(AV1_COMP *cpi, const MB_MODE_INFO *const mbmi, + aom_writer *w, const struct segmentation *seg, + struct segmentation_probs *segp, int mi_row, + int mi_col, int skip) { + AV1_COMMON *const cm = &cpi->common; int prev_ul = 0; /* Top left segment_id */ int prev_l = 0; /* Current left segment_id */ int prev_u = 0; /* Current top segment_id */ - if (!seg->q_lvls) return; + if (!seg->enabled || !seg->update_map) return; MODE_INFO *const mi = cm->mi + mi_row * cm->mi_stride + mi_col; int tinfo = mi->mbmi.boundary_info; @@ -656,39 +656,47 @@ int left = (!(tinfo & TILE_LEFT_BOUNDARY)) && ((mi_col - 1) >= 0); if (above && left) - prev_ul = - get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row - 1, mi_col - 1); + prev_ul = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 1, mi_col - 1); if (above) - prev_u = get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row - 1, mi_col); + prev_u = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 1, mi_col - 0); if (left) - prev_l = get_segment_id(cm, cm->q_seg_map, BLOCK_4X4, mi_row, mi_col - 1); + prev_l = get_segment_id(cm, cm->current_frame_seg_map, BLOCK_4X4, + mi_row - 0, mi_col - 1); - int cdf_num = pick_q_seg_cdf(prev_ul, prev_u, prev_l); - int pred = pick_q_seg_pred(prev_ul, prev_u, prev_l); + int cdf_num = pick_spatial_seg_cdf(prev_ul, prev_u, prev_l); + int pred = pick_spatial_seg_pred(prev_ul, prev_u, prev_l); if (skip) { - set_q_segment_id(cm, cm->q_seg_map, mbmi->sb_type, mi_row, mi_col, pred); + set_spatial_segment_id(cm, cm->current_frame_seg_map, mbmi->sb_type, mi_row, + mi_col, pred); + set_spatial_segment_id(cm, cpi->segmentation_map, mbmi->sb_type, mi_row, + mi_col, pred); + /* mbmi is read only but we need to update segment_id */ + ((MB_MODE_INFO *)mbmi)->segment_id = pred; return; } - int coded_id = neg_interleave(mbmi->q_segment_id, pred, seg->q_lvls); + int coded_id = + neg_interleave(mbmi->segment_id, pred, cm->last_active_segid + 1); - aom_cdf_prob *pred_cdf = segp->q_seg_cdf[cdf_num]; + aom_cdf_prob *pred_cdf = segp->spatial_pred_seg_cdf[cdf_num]; aom_write_symbol(w, coded_id, pred_cdf, 8); - set_q_segment_id(cm, cm->q_seg_map, bsize, mi_row, mi_col, - mbmi->q_segment_id); + set_spatial_segment_id(cm, cm->current_frame_seg_map, mbmi->sb_type, mi_row, + mi_col, mbmi->segment_id); } -#endif - +#else static void write_segment_id(aom_writer *w, const struct segmentation *seg, struct segmentation_probs *segp, int segment_id) { if (seg->enabled && seg->update_map) { aom_write_symbol(w, segment_id, segp->tree_cdf, MAX_SEGMENTS); } } +#endif #define WRITE_REF_BIT(bname, pname) \ aom_write_symbol(w, bname, av1_get_pred_cdf_##pname(cm, xd), 2) @@ -1229,6 +1237,77 @@ #endif } +static void write_inter_segment_id(AV1_COMP *cpi, aom_writer *w, + const struct segmentation *const seg, + struct segmentation_probs *const segp, + int mi_row, int mi_col, int skip, + int preskip) { + MACROBLOCKD *const xd = &cpi->td.mb.e_mbd; + const MODE_INFO *mi = xd->mi[0]; + const MB_MODE_INFO *const mbmi = &mi->mbmi; +#if CONFIG_SPATIAL_SEGMENTATION + AV1_COMMON *const cm = &cpi->common; +#else + (void)mi_row; + (void)mi_col; + (void)skip; + (void)preskip; +#endif + + if (seg->update_map) { +#if CONFIG_SPATIAL_SEGMENTATION + if (preskip) { + if (!cm->preskip_segid) return; + } else { + if (cm->preskip_segid) return; + if (skip) { + int prev_segid = mbmi->segment_id; + write_segment_id(cpi, mbmi, w, seg, segp, mi_row, mi_col, 0); + + if (seg->temporal_update) { + const int pred_flag = mbmi->seg_id_predicted; + const int pred_context = av1_get_pred_context_seg_id(xd); + unsigned(*temporal_predictor_count)[2] = cm->counts.seg.pred; + unsigned *t_unpred_seg_counts = cm->counts.seg.tree_mispred; + + temporal_predictor_count[pred_context][pred_flag]--; + if (!pred_flag) t_unpred_seg_counts[prev_segid]--; + + ((MB_MODE_INFO *)mbmi)->seg_id_predicted = 0; + temporal_predictor_count[pred_context][0]--; + t_unpred_seg_counts[mbmi->segment_id]--; + } + return; + } + } +#endif + if (seg->temporal_update) { + const int pred_flag = mbmi->seg_id_predicted; + aom_cdf_prob *pred_cdf = av1_get_pred_cdf_seg_id(segp, xd); + aom_write_symbol(w, pred_flag, pred_cdf, 2); + if (!pred_flag) { +#if CONFIG_SPATIAL_SEGMENTATION + write_segment_id(cpi, mbmi, w, seg, segp, mi_row, mi_col, 0); +#else + write_segment_id(w, seg, segp, mbmi->segment_id); +#endif + } +#if CONFIG_SPATIAL_SEGMENTATION + if (pred_flag) { + set_spatial_segment_id(cm, cm->current_frame_seg_map, mbmi->sb_type, + mi_row, mi_col, mbmi->segment_id); + } +#endif + } else { +#if CONFIG_SPATIAL_SEGMENTATION + write_segment_id(cpi, mbmi, w, seg, segp, mi_row, mi_col, 0); +#else + write_segment_id(w, seg, segp, mbmi->segment_id); +#endif + } + } +} + static void pack_inter_mode_mvs(AV1_COMP *cpi, const int mi_row, const int mi_col, aom_writer *w) { AV1_COMMON *const cm = &cpi->common; @@ -1251,16 +1330,7 @@ (void)mi_row; (void)mi_col; - if (seg->update_map) { - if (seg->temporal_update) { - const int pred_flag = mbmi->seg_id_predicted; - aom_cdf_prob *pred_cdf = av1_get_pred_cdf_seg_id(segp, xd); - aom_write_symbol(w, pred_flag, pred_cdf, 2); - if (!pred_flag) write_segment_id(w, seg, segp, segment_id); - } else { - write_segment_id(w, seg, segp, segment_id); - } - } + write_inter_segment_id(cpi, w, seg, segp, mi_row, mi_col, 0, 1); #if CONFIG_EXT_SKIP write_skip_mode(cm, xd, segment_id, mi, w); @@ -1275,9 +1345,9 @@ } #endif // CONFIG_EXT_SKIP -#if CONFIG_Q_SEGMENTATION - write_q_segment_id(cm, skip, mbmi, w, seg, segp, bsize, mi_row, mi_col); -#endif // CONFIG_Q_SEGMENTATION +#if CONFIG_SPATIAL_SEGMENTATION + write_inter_segment_id(cpi, w, seg, segp, mi_row, mi_col, skip, 0); +#endif write_cdef(cm, w, skip, mi_col, mi_row); @@ -1570,12 +1640,13 @@ } #endif // CONFIG_INTRABC -static void write_mb_modes_kf(AV1_COMMON *cm, MACROBLOCKD *xd, +static void write_mb_modes_kf(AV1_COMP *cpi, MACROBLOCKD *xd, #if CONFIG_INTRABC const MB_MODE_INFO_EXT *mbmi_ext, #endif // CONFIG_INTRABC const int mi_row, const int mi_col, aom_writer *w) { + AV1_COMMON *const cm = &cpi->common; FRAME_CONTEXT *ec_ctx = xd->tile_ctx; const struct segmentation *const seg = &cm->seg; struct segmentation_probs *const segp = &ec_ctx->seg; @@ -1587,12 +1658,18 @@ (void)mi_row; (void)mi_col; +#if CONFIG_SPATIAL_SEGMENTATION + if (cm->preskip_segid && seg->update_map) + write_segment_id(cpi, mbmi, w, seg, segp, mi_row, mi_col, 0); +#else if (seg->update_map) write_segment_id(w, seg, segp, mbmi->segment_id); +#endif const int skip = write_skip(cm, xd, mbmi->segment_id, mi, w); -#if CONFIG_Q_SEGMENTATION - write_q_segment_id(cm, skip, mbmi, w, seg, segp, bsize, mi_row, mi_col); +#if CONFIG_SPATIAL_SEGMENTATION + if (!cm->preskip_segid && seg->update_map) + write_segment_id(cpi, mbmi, w, seg, segp, mi_row, mi_col, skip); #endif write_cdef(cm, w, skip, mi_col, mi_row); @@ -1837,7 +1914,7 @@ ((mi_row & MAX_MIB_MASK) << TX_UNIT_HIGH_LOG2); } #endif // CONFIG_INTRABC - write_mb_modes_kf(cm, xd, + write_mb_modes_kf(cpi, xd, #if CONFIG_INTRABC cpi->td.mb.mbmi_ext, #endif // CONFIG_INTRABC @@ -2709,6 +2786,10 @@ } } +#if CONFIG_SPATIAL_SEGMENTATION + cm->preskip_segid = 0; +#endif + // Segmentation data aom_wb_write_bit(wb, seg->update_data); if (seg->update_data) { @@ -2719,6 +2800,10 @@ if (active) { const int data = get_segdata(seg, i, j); const int data_max = av1_seg_feature_data_max(j); +#if CONFIG_SPATIAL_SEGMENTATION + cm->preskip_segid |= j >= SEG_LVL_REF_FRAME; + cm->last_active_segid = i; +#endif if (av1_is_segfeature_signed(j)) { encode_unsigned_max(wb, abs(data), data_max); @@ -2732,32 +2817,6 @@ } } -#if CONFIG_Q_SEGMENTATION -static void encode_q_segmentation(AV1_COMMON *cm, - struct aom_write_bit_buffer *wb) { - int i; - struct segmentation *seg = &cm->seg; - - for (i = 0; i < MAX_SEGMENTS; i++) { - if (segfeature_active(seg, i, SEG_LVL_ALT_Q)) { - seg->q_lvls = 0; - return; - } - } - - aom_wb_write_bit(wb, !!seg->q_lvls); - if (!seg->q_lvls) return; - - encode_unsigned_max(wb, seg->q_lvls, MAX_SEGMENTS); - - for (i = 0; i < seg->q_lvls; i++) { - const int val = seg->q_delta[i]; - encode_unsigned_max(wb, abs(val), MAXQ); - aom_wb_write_bit(wb, val < 0); - } -} -#endif - static void write_tx_mode(AV1_COMMON *cm, TX_MODE *mode, struct aom_write_bit_buffer *wb) { if (cm->all_lossless) { @@ -3931,9 +3990,6 @@ encode_loopfilter(cm, wb); encode_quantization(cm, wb); encode_segmentation(cm, xd, wb); -#if CONFIG_Q_SEGMENTATION - encode_q_segmentation(cm, wb); -#endif { int delta_q_allowed = 1; #if !CONFIG_EXT_DELTA_Q @@ -3945,9 +4001,6 @@ segment_quantizer_active = 1; } } -#if CONFIG_Q_SEGMENTATION - segment_quantizer_active |= !!seg->q_lvls; -#endif delta_q_allowed = !segment_quantizer_active; #endif @@ -4283,9 +4336,6 @@ encode_loopfilter(cm, wb); encode_quantization(cm, wb); encode_segmentation(cm, xd, wb); -#if CONFIG_Q_SEGMENTATION - encode_q_segmentation(cm, wb); -#endif { int delta_q_allowed = 1; #if !CONFIG_EXT_DELTA_Q @@ -4297,9 +4347,6 @@ segment_quantizer_active = 1; } } -#if CONFIG_Q_SEGMENTATION - segment_quantizer_active |= !!seg->q_lvls; -#endif delta_q_allowed = !segment_quantizer_active; #endif
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 918eea1..e930bf4 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -348,29 +348,15 @@ #endif mbmi->segment_id = 0; -#if CONFIG_Q_SEGMENTATION - mbmi->q_segment_id = 0; -#endif -// Setup segment ID. -#if CONFIG_Q_SEGMENTATION - if (seg->enabled || seg->q_lvls) { -#else + // Setup segment ID. if (seg->enabled) { -#endif if (seg->enabled && !cpi->vaq_refresh) { const uint8_t *const map = seg->update_map ? cpi->segmentation_map : cm->last_frame_seg_map; mbmi->segment_id = get_segment_id(cm, map, bsize, mi_row, mi_col); } -#if CONFIG_Q_SEGMENTATION - if (seg->q_lvls) - mbmi->q_segment_id = - get_segment_id(cm, cpi->q_seg_encoding_map, bsize, mi_row, mi_col); - av1_init_plane_quantizers(cpi, x, mbmi->segment_id, mbmi->q_segment_id); -#else av1_init_plane_quantizers(cpi, x, mbmi->segment_id); -#endif } } @@ -557,21 +543,11 @@ #if !CONFIG_EXT_DELTA_Q if (cpi->oxcf.aq_mode > NO_AQ && cpi->oxcf.aq_mode < DELTA_AQ) -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id, - xd->mi[0]->mbmi.q_segment_id); -#else av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id); -#endif #else if (cpi->oxcf.aq_mode) -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id, - xd->mi[0]->mbmi.q_segment_id); -#else av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id); #endif -#endif x->skip = ctx->skip; @@ -788,25 +764,12 @@ } static int set_segment_rdmult(const AV1_COMP *const cpi, MACROBLOCK *const x, -#if CONFIG_Q_SEGMENTATION - int8_t segment_id, int8_t q_segment_id) { -#else int8_t segment_id) { -#endif int segment_qindex; const AV1_COMMON *const cm = &cpi->common; -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, segment_id, q_segment_id); -#else av1_init_plane_quantizers(cpi, x, segment_id); -#endif aom_clear_system_state(); -#if CONFIG_Q_SEGMENTATION - segment_qindex = - av1_get_qindex(&cm->seg, segment_id, q_segment_id, cm->base_qindex); -#else segment_qindex = av1_get_qindex(&cm->seg, segment_id, cm->base_qindex); -#endif return av1_compute_rd_mult(cpi, segment_qindex + cm->y_dc_delta_q); } @@ -917,24 +880,12 @@ const int energy = bsize <= BLOCK_16X16 ? x->mb_energy : av1_block_energy(cpi, x, bsize); mbmi->segment_id = av1_vaq_segment_id(energy); -// Re-initialise quantiser -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, mbmi->segment_id, mbmi->q_segment_id); -#else + // Re-initialise quantiser av1_init_plane_quantizers(cpi, x, mbmi->segment_id); -#endif } -#if CONFIG_Q_SEGMENTATION - x->rdmult = - set_segment_rdmult(cpi, x, mbmi->segment_id, mbmi->q_segment_id); - } else if (aq_mode == COMPLEXITY_AQ) { - x->rdmult = - set_segment_rdmult(cpi, x, mbmi->segment_id, mbmi->q_segment_id); -#else x->rdmult = set_segment_rdmult(cpi, x, mbmi->segment_id); } else if (aq_mode == COMPLEXITY_AQ) { x->rdmult = set_segment_rdmult(cpi, x, mbmi->segment_id); -#endif } else if (aq_mode == CYCLIC_REFRESH_AQ) { // If segment is boosted, use rdmult for that segment. if (cyclic_refresh_segment_id_boosted(mbmi->segment_id)) @@ -2269,66 +2220,24 @@ #if CONFIG_FP_MB_STATS const int qindex_skip_threshold_lookup[BLOCK_SIZES] = { - 0, - 10, - 10, - 30, - 40, - 40, - 60, - 80, - 80, - 90, - 100, - 100, - 120, + 0, 10, 10, 30, 40, 40, 60, 80, 80, 90, 100, 100, 120, #if CONFIG_EXT_PARTITION // TODO(debargha): What are the correct numbers here? - 130, - 130, - 150 + 130, 130, 150 #endif // CONFIG_EXT_PARTITION }; const int qindex_split_threshold_lookup[BLOCK_SIZES] = { - 0, - 3, - 3, - 7, - 15, - 15, - 30, - 40, - 40, - 60, - 80, - 80, - 120, + 0, 3, 3, 7, 15, 15, 30, 40, 40, 60, 80, 80, 120, #if CONFIG_EXT_PARTITION // TODO(debargha): What are the correct numbers here? - 160, - 160, - 240 + 160, 160, 240 #endif // CONFIG_EXT_PARTITION }; const int complexity_16x16_blocks_threshold[BLOCK_SIZES] = { - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 4, - 4, - 6, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 6, #if CONFIG_EXT_PARTITION // TODO(debargha): What are the correct numbers here? - 8, - 8, - 10 + 8, 8, 10 #endif // CONFIG_EXT_PARTITION }; @@ -3439,16 +3348,8 @@ xd->mi[0]->mbmi.current_q_index = current_qindex; #if !CONFIG_EXT_DELTA_Q xd->mi[0]->mbmi.segment_id = 0; -#if CONFIG_Q_SEGMENTATION - xd->mi[0]->mbmi.q_segment_id = 0; -#endif #endif // CONFIG_EXT_DELTA_Q -#if CONFIG_Q_SEGMENTATION - av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id, - xd->mi[0]->mbmi.q_segment_id); -#else av1_init_plane_quantizers(cpi, x, xd->mi[0]->mbmi.segment_id); -#endif #if CONFIG_EXT_DELTA_Q if (cpi->oxcf.deltaq_mode == DELTA_Q_LF) { int j, k; @@ -4181,11 +4082,7 @@ for (i = 0; i < MAX_SEGMENTS; ++i) { const int qindex = cm->seg.enabled -#if CONFIG_Q_SEGMENTATION - ? av1_get_qindex(&cm->seg, i, i, cm->base_qindex) -#else ? av1_get_qindex(&cm->seg, i, cm->base_qindex) -#endif : cm->base_qindex; xd->lossless[i] = qindex == 0 && cm->y_dc_delta_q == 0 && cm->u_dc_delta_q == 0 && cm->u_ac_delta_q == 0 &&
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index 623a5f77..d1edaf9 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -491,9 +491,6 @@ #endif // CONFIG_FARME_MARKER uint8_t *segmentation_map; -#if CONFIG_Q_SEGMENTATION - uint8_t *q_seg_encoding_map; // Must be allocated and set by AQs -#endif CYCLIC_REFRESH *cyclic_refresh; ActiveMap active_map;
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c index 3bd3b42..483a1e5 100644 --- a/av1/encoder/rd.c +++ b/av1/encoder/rd.c
@@ -415,14 +415,9 @@ for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) { const int qindex = -#if CONFIG_Q_SEGMENTATION - clamp( - av1_get_qindex(&cm->seg, segment_id, segment_id, cm->base_qindex) + -#else clamp(av1_get_qindex(&cm->seg, segment_id, cm->base_qindex) + -#endif - cm->y_dc_delta_q, - 0, MAXQ); + cm->y_dc_delta_q, + 0, MAXQ); const int q = compute_rd_thresh_factor(qindex, cm->bit_depth); for (bsize = 0; bsize < BLOCK_SIZES_ALL; ++bsize) {
diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake index a75122e..7646029 100644 --- a/build/cmake/aom_config_defaults.cmake +++ b/build/cmake/aom_config_defaults.cmake
@@ -174,7 +174,6 @@ set(CONFIG_PALETTE_THROUGHPUT 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_PARALLEL_DEBLOCKING 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_Q_ADAPT_PROBS 1 CACHE NUMBER "AV1 experiment flag.") -set(CONFIG_Q_SEGMENTATION 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_RD_DEBUG 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_RECT_TX_EXT 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_RECT_TX_EXT_INTRA 0 CACHE NUMBER "AV1 experiment flag.") @@ -185,6 +184,7 @@ set(CONFIG_SHORT_FILTER 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_SIMPLE_BWD_ADAPT 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_SIMPLIFY_TX_MODE 0 CACHE NUMBER "AV1 experiment flag.") +set(CONFIG_SPATIAL_SEGMENTATION 0 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_STRIPED_LOOP_RESTORATION 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_TEMPMV_SIGNALING 1 CACHE NUMBER "AV1 experiment flag.") set(CONFIG_TMV 1 CACHE NUMBER "AV1 experiment flag.")
diff --git a/configure b/configure index 71599a6..03ba93c 100755 --- a/configure +++ b/configure
@@ -330,7 +330,7 @@ eob_first eighth_pel_mv_only mono_video - q_segmentation + spatial_segmentation segment_pred_last obu_no_ivf "