Use cached xd->qindex and xd->lossless values. setup_segmentation_dequant() is only called after read_uncompressed_header() has set up the xd->qindex and xd->lossless arrays, so setup_segmentation_dequant() can just use the cached values. read_uncompressed_header() can just call av1_get_qindex() without checking cm->seg.enabled, because av1_get_qindex() checks cm->seg.enabled internally. av1_read_tx_type() can just use xd->qindex[i] directly, because xd->qindex[i] is equal to cm->base_qindex if cm->seg.enabled is false. Change-Id: I714f25dff278cc686b5bc36bfbbc041b20f4a4ea
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 128a657..e098041 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -2250,14 +2250,15 @@ } // Build y/uv dequant values based on segmentation. -static void setup_segmentation_dequant(AV1_COMMON *const cm) { +static void setup_segmentation_dequant(AV1_COMMON *const cm, + MACROBLOCKD *const xd) { const int bit_depth = cm->seq_params.bit_depth; const int using_qm = cm->using_qmatrix; // When segmentation is disabled, only the first value is used. The // remaining are don't cares. const int max_segments = cm->seg.enabled ? MAX_SEGMENTS : 1; for (int i = 0; i < max_segments; ++i) { - const int qindex = av1_get_qindex(&cm->seg, i, cm->base_qindex); + const int qindex = xd->qindex[i]; cm->y_dequant_QTX[i][0] = av1_dc_quant_QTX(qindex, cm->y_dc_delta_q, bit_depth); cm->y_dequant_QTX[i][1] = av1_ac_quant_QTX(qindex, 0, bit_depth); @@ -2269,9 +2270,7 @@ av1_dc_quant_QTX(qindex, cm->v_dc_delta_q, bit_depth); cm->v_dequant_QTX[i][1] = av1_ac_quant_QTX(qindex, cm->v_ac_delta_q, bit_depth); - const int lossless = qindex == 0 && cm->y_dc_delta_q == 0 && - cm->u_dc_delta_q == 0 && cm->u_ac_delta_q == 0 && - cm->v_dc_delta_q == 0 && cm->v_ac_delta_q == 0; + const int lossless = xd->lossless[i]; // NB: depends on base index so there is only 1 set per frame // No quant weighting when lossless or signalled not using QM int qmlevel = (lossless || using_qm == 0) ? NUM_QM_LEVELS - 1 : cm->qm_y; @@ -5324,9 +5323,7 @@ xd->cur_frame_force_integer_mv = cm->cur_frame_force_integer_mv; for (int i = 0; i < MAX_SEGMENTS; ++i) { - const int qindex = cm->seg.enabled - ? av1_get_qindex(&cm->seg, i, cm->base_qindex) - : cm->base_qindex; + const int qindex = av1_get_qindex(&cm->seg, i, 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 && cm->v_dc_delta_q == 0 && cm->v_ac_delta_q == 0; @@ -5334,7 +5331,7 @@ } cm->coded_lossless = is_coded_lossless(cm, xd); cm->all_lossless = cm->coded_lossless && !av1_superres_scaled(cm); - setup_segmentation_dequant(cm); + setup_segmentation_dequant(cm, xd); if (cm->coded_lossless) { cm->lf.filter_level[0] = 0; cm->lf.filter_level[1] = 0;
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 551e4d5..1cf1ac3 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -612,9 +612,8 @@ return; // No need to read transform type for lossless mode(qindex==0). - const int qindex = - cm->seg.enabled ? xd->qindex[mbmi->segment_id] : cm->base_qindex; - if (qindex <= 0) return; + const int qindex = xd->qindex[mbmi->segment_id]; + if (qindex == 0) return; const int inter_block = is_inter_block(mbmi); if (get_ext_tx_types(tx_size, inter_block, cm->reduced_tx_set_used) > 1) {