diff --git a/av1/common/entropy.c b/av1/common/entropy.c index 14ab53ca004b0b397f18e819c0fac95150312907..b88ff3a4c2677ac816f586f0d005b6a87468c40d 100644 --- a/av1/common/entropy.c +++ b/av1/common/entropy.c @@ -6141,14 +6141,7 @@ static void adapt_coef_probs(AV1_COMMON *cm, TX_SIZE tx_size, unsigned int update_factor) { const FRAME_CONTEXT *pre_fc = &cm->frame_contexts[cm->frame_context_idx]; av1_coeff_probs_model *const probs = cm->fc->coef_probs[tx_size]; -#if CONFIG_SUBFRAME_PROB_UPDATE - const av1_coeff_probs_model *const pre_probs = - cm->partial_prob_update - ? (const av1_coeff_probs_model *)cm->starting_coef_probs[tx_size] - : pre_fc->coef_probs[tx_size]; -#else const av1_coeff_probs_model *const pre_probs = pre_fc->coef_probs[tx_size]; -#endif // CONFIG_SUBFRAME_PROB_UPDATE const av1_coeff_count_model *const counts = (const av1_coeff_count_model *)cm->counts.coef[tx_size]; const unsigned int(*eob_counts)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] = @@ -6209,9 +6202,6 @@ void av1_adapt_coef_probs(AV1_COMMON *cm) { update_factor = COEF_MAX_UPDATE_FACTOR; count_sat = COEF_COUNT_SAT; } -#if CONFIG_SUBFRAME_PROB_UPDATE - if (cm->partial_prob_update == 1) update_factor = COEF_MAX_UPDATE_FACTOR; -#endif // CONFIG_SUBFRAME_PROB_UPDATE #if CONFIG_LV_MAP av1_adapt_txb_probs(cm, count_sat, update_factor); @@ -6222,18 +6212,6 @@ void av1_adapt_coef_probs(AV1_COMMON *cm) { #endif } -#if CONFIG_SUBFRAME_PROB_UPDATE -void av1_partial_adapt_probs(AV1_COMMON *cm, int mi_row, int mi_col) { - (void)mi_row; - (void)mi_col; - - if (cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) { - cm->partial_prob_update = 1; - av1_adapt_coef_probs(cm); - } -} -#endif // CONFIG_SUBFRAME_PROB_UPDATE - #if CONFIG_EC_ADAPT static void av1_average_cdf(aom_cdf_prob *cdf_ptr[], aom_cdf_prob *fc_cdf_ptr, int cdf_size, const int num_tiles) { diff --git a/av1/common/entropy.h b/av1/common/entropy.h index b02d41bff1f7dabb8d5fdd2146c18914c8d53e91..97f98b68f20092eb614ee54cf2d2c1f5ee001780 100644 --- a/av1/common/entropy.h +++ b/av1/common/entropy.h @@ -32,10 +32,6 @@ extern "C" { #define QCTX_BINS (1 << QCTX_BIN_BITS) #endif // CONFIG_Q_ADAPT_PROBS -#if CONFIG_SUBFRAME_PROB_UPDATE -#define COEF_PROBS_BUFS 16 -#endif // CONFIG_SUBFRAME_PROB_UPDATE - // Coefficient token alphabet #define ZERO_TOKEN 0 // 0 Extra Bits 0+0 #define ONE_TOKEN 1 // 1 Extra Bits 0+1 @@ -199,9 +195,6 @@ void av1_adapt_coef_probs(struct AV1Common *cm); #if CONFIG_EC_ADAPT void av1_adapt_coef_cdfs(struct AV1Common *cm, struct frame_contexts *pre_fc); #endif -#if CONFIG_SUBFRAME_PROB_UPDATE -void av1_partial_adapt_probs(struct AV1Common *cm, int mi_row, int mi_col); -#endif // CONFIG_SUBFRAME_PROB_UPDATE // This is the index in the scan order beyond which all coefficients for // 8x8 transform and above are in the top band. diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index 7980bde3941c2ab226bb2b999596d0a07d15f1a6..b60112e39c8538b2617f3fd0e4f59798ef25140a 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h @@ -334,18 +334,6 @@ typedef struct AV1Common { unsigned int frame_context_idx; /* Context to use/update */ FRAME_COUNTS counts; -#if CONFIG_SUBFRAME_PROB_UPDATE - // The initial probabilities for a frame, before any subframe backward update, - // and after forward update. - av1_coeff_probs_model starting_coef_probs[TX_SIZES][PLANE_TYPES]; - // Number of subframe backward updates already done - uint8_t coef_probs_update_idx; - // Signal if the backward update is subframe or end-of-frame - uint8_t partial_prob_update; - // Frame level flag to turn on/off subframe backward update - uint8_t do_subframe_update; -#endif // CONFIG_SUBFRAME_PROB_UPDATE - unsigned int current_video_frame; BITSTREAM_PROFILE profile; diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 1c6501a4ca735b1628e8a2e9687ddb4146bcd4ee..ea2ff714db6d8f2c422cf0d4c404be62d85bc84c 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c @@ -3437,10 +3437,6 @@ static const uint8_t *decode_tiles(AV1Decoder *pbi, const uint8_t *data, #endif // CONFIG_EXT_TILE int tile_row, tile_col; -#if CONFIG_SUBFRAME_PROB_UPDATE - cm->do_subframe_update = n_tiles == 1; -#endif // CONFIG_SUBFRAME_PROB_UPDATE - if (cm->lf.filter_level && !cm->skip_loop_filter && pbi->lf_worker.data1 == NULL) { CHECK_MEM_ERROR(cm, pbi->lf_worker.data1, @@ -3592,19 +3588,6 @@ static const uint8_t *decode_tiles(AV1Decoder *pbi, const uint8_t *data, if (pbi->mb.corrupted) aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME, "Failed to decode tile data"); -#if CONFIG_SUBFRAME_PROB_UPDATE - if (cm->do_subframe_update && - cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) { - const int mi_rows_per_update = - MI_SIZE * AOMMAX(cm->mi_rows / MI_SIZE / COEF_PROBS_BUFS, 1); - if ((mi_row + MI_SIZE) % mi_rows_per_update == 0 && - mi_row + MI_SIZE < cm->mi_rows && - cm->coef_probs_update_idx < COEF_PROBS_BUFS - 1) { - av1_partial_adapt_probs(cm, mi_row, mi_col); - ++cm->coef_probs_update_idx; - } - } -#endif // CONFIG_SUBFRAME_PROB_UPDATE } } @@ -5059,11 +5042,6 @@ void av1_decode_frame(AV1Decoder *pbi, const uint8_t *data, av1_frameworker_unlock_stats(worker); } -#if CONFIG_SUBFRAME_PROB_UPDATE - av1_copy(cm->starting_coef_probs, cm->fc->coef_probs); - cm->coef_probs_update_idx = 0; -#endif // CONFIG_SUBFRAME_PROB_UPDATE - if (pbi->max_threads > 1 && !CONFIG_CB4X4 && #if CONFIG_EXT_TILE pbi->dec_tile_col < 0 && // Decoding all columns @@ -5111,10 +5089,6 @@ void av1_decode_frame(AV1Decoder *pbi, const uint8_t *data, sizeof(&pbi->tile_data[0].tctx.partition_cdf[0][0])); make_update_tile_list_dec(pbi, cm->tile_rows, cm->tile_cols, tile_ctxs); #endif - -#if CONFIG_SUBFRAME_PROB_UPDATE - cm->partial_prob_update = 0; -#endif // CONFIG_SUBFRAME_PROB_UPDATE av1_adapt_coef_probs(cm); av1_adapt_intra_frame_probs(cm); #if CONFIG_EC_ADAPT diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index d254157e729f1762c82124103dcceff11cd942bb..60b2f30408fe8f2333cdfc16121b91ff6a2f9146 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c @@ -4785,32 +4785,6 @@ static void encode_rd_sb_row(AV1_COMP *cpi, ThreadData *td, INT64_MAX, pc_root); } } -#if CONFIG_SUBFRAME_PROB_UPDATE - if (cm->do_subframe_update && - cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) { - const int mi_rows_per_update = - MI_SIZE * AOMMAX(cm->mi_rows / MI_SIZE / COEF_PROBS_BUFS, 1); - if ((mi_row + MI_SIZE) % mi_rows_per_update == 0 && - mi_row + MI_SIZE < cm->mi_rows && - cm->coef_probs_update_idx < COEF_PROBS_BUFS - 1) { - TX_SIZE t; - SUBFRAME_STATS *subframe_stats = &cpi->subframe_stats; - - for (t = 0; t < TX_SIZES; ++t) - av1_full_to_model_counts(cpi->td.counts->coef[t], - cpi->td.rd_counts.coef_counts[t]); - av1_partial_adapt_probs(cm, mi_row, mi_col); - ++cm->coef_probs_update_idx; - av1_copy(subframe_stats->coef_probs_buf[cm->coef_probs_update_idx], - cm->fc->coef_probs); - av1_copy(subframe_stats->coef_counts_buf[cm->coef_probs_update_idx], - cpi->td.rd_counts.coef_counts); - av1_copy(subframe_stats->eob_counts_buf[cm->coef_probs_update_idx], - cm->counts.eob_branch); - av1_fill_token_costs(x->token_costs, cm->fc->coef_probs); - } - } -#endif // CONFIG_SUBFRAME_PROB_UPDATE } static void init_encode_frame_mb_context(AV1_COMP *cpi) { diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index 2110d4793d5c40d8f6ac0d9b140052832941ea24..261d23bc6c45331f7050750091e7c21a9dbe6e6a 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c @@ -4097,18 +4097,9 @@ static void encode_without_recode_loop(AV1_COMP *cpi) { av1_set_quantizer(cm, q); av1_set_variance_partition_thresholds(cpi, q); - setup_frame(cpi); - -#if CONFIG_SUBFRAME_PROB_UPDATE - cm->do_subframe_update = cm->tile_cols == 1 && cm->tile_rows == 1; - av1_copy(cm->starting_coef_probs, cm->fc->coef_probs); - av1_copy(cpi->subframe_stats.enc_starting_coef_probs, cm->fc->coef_probs); - cm->coef_probs_update_idx = 0; - av1_copy(cpi->subframe_stats.coef_probs_buf[0], cm->fc->coef_probs); -#endif // CONFIG_SUBFRAME_PROB_UPDATE - suppress_active_map(cpi); + // Variance adaptive and in frame q adjustment experiments are mutually // exclusive. if (cpi->oxcf.aq_mode == VARIANCE_AQ) { @@ -4229,26 +4220,6 @@ static void encode_with_recode_loop(AV1_COMP *cpi, size_t *size, } #endif // CONFIG_Q_ADAPT_PROBS -#if CONFIG_SUBFRAME_PROB_UPDATE - cm->do_subframe_update = cm->tile_cols == 1 && cm->tile_rows == 1; - if (loop_count == 0 || frame_is_intra_only(cm) || - cm->error_resilient_mode) { - av1_copy(cm->starting_coef_probs, cm->fc->coef_probs); - av1_copy(cpi->subframe_stats.enc_starting_coef_probs, cm->fc->coef_probs); - } else { - if (cm->do_subframe_update) { - av1_copy(cm->fc->coef_probs, - cpi->subframe_stats.enc_starting_coef_probs); - av1_copy(cm->starting_coef_probs, - cpi->subframe_stats.enc_starting_coef_probs); - av1_zero(cpi->subframe_stats.coef_counts_buf); - av1_zero(cpi->subframe_stats.eob_counts_buf); - } - } - cm->coef_probs_update_idx = 0; - av1_copy(cpi->subframe_stats.coef_probs_buf[0], cm->fc->coef_probs); -#endif // CONFIG_SUBFRAME_PROB_UPDATE - // Variance adaptive and in frame q adjustment experiments are mutually // exclusive. if (cpi->oxcf.aq_mode == VARIANCE_AQ) { @@ -5039,9 +5010,6 @@ static void encode_frame_to_data_rate(AV1_COMP *cpi, size_t *size, av1_accumulate_frame_counts(&aggregate_fc, &cm->counts); #endif // CONFIG_ENTROPY_STATS if (cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) { -#if CONFIG_SUBFRAME_PROB_UPDATE - cm->partial_prob_update = 0; -#endif // CONFIG_SUBFRAME_PROB_UPDATE av1_adapt_coef_probs(cm); av1_adapt_intra_frame_probs(cm); #if CONFIG_EC_ADAPT diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index 68808a79c31201f72f5bc7a852a0f10b1cfd28ee..3e297c8f4bac18f2699c5252f5c81eeb164e0d99 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h @@ -350,16 +350,6 @@ typedef struct { YV12_BUFFER_CONFIG buf; } EncRefCntBuffer; -#if CONFIG_SUBFRAME_PROB_UPDATE -typedef struct SUBFRAME_STATS { - av1_coeff_probs_model coef_probs_buf[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES]; - av1_coeff_count coef_counts_buf[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES]; - unsigned int eob_counts_buf[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES][REF_TYPES] - [COEF_BANDS][COEFF_CONTEXTS]; - av1_coeff_probs_model enc_starting_coef_probs[TX_SIZES][PLANE_TYPES]; -} SUBFRAME_STATS; -#endif // CONFIG_SUBFRAME_PROB_UPDATE - typedef struct TileBufferEnc { uint8_t *data; size_t size; @@ -654,12 +644,6 @@ typedef struct AV1_COMP { AVxWorker *workers; struct EncWorkerData *tile_thr_data; AV1LfSync lf_row_sync; -#if CONFIG_SUBFRAME_PROB_UPDATE - SUBFRAME_STATS subframe_stats; - // TODO(yaowu): minimize the size of count buffers - SUBFRAME_STATS wholeframe_stats; - av1_coeff_stats branch_ct_buf[COEF_PROBS_BUFS][TX_SIZES][PLANE_TYPES]; -#endif // CONFIG_SUBFRAME_PROB_UPDATE #if CONFIG_ANS struct BufAnsCoder buf_ans; #endif diff --git a/av1/encoder/subexp.c b/av1/encoder/subexp.c index 8960d3341412dad7e2ae47ccc9efbd740fba5ddc..6a8ba12d8a556db1708e24e02d9b749ee05f2d19 100644 --- a/av1/encoder/subexp.c +++ b/av1/encoder/subexp.c @@ -179,83 +179,6 @@ int av1_prob_diff_update_savings_search_model(const unsigned int *ct, return bestsavings; } -#if CONFIG_SUBFRAME_PROB_UPDATE -static int get_cost(unsigned int ct[][2], aom_prob p, int n) { - int i, p0 = p; - unsigned int total_ct[2] = { 0, 0 }; - int cost = 0; - - for (i = 0; i <= n; ++i) { - cost += cost_branch256(ct[i], p); - total_ct[0] += ct[i][0]; - total_ct[1] += ct[i][1]; - if (i < n) - p = av1_merge_probs(p0, total_ct, COEF_COUNT_SAT, COEF_MAX_UPDATE_FACTOR); - } - return cost; -} - -int av1_prob_update_search_subframe(unsigned int ct[][2], aom_prob oldp, - aom_prob *bestp, aom_prob upd, int n) { - const int old_b = get_cost(ct, oldp, n); - int bestsavings = 0; - const int upd_cost = av1_cost_one(upd) - av1_cost_zero(upd); - aom_prob newp, bestnewp = oldp; - const int step = *bestp > oldp ? -1 : 1; - - for (newp = *bestp; newp != oldp; newp += step) { - const int new_b = get_cost(ct, newp, n); - const int update_b = prob_diff_update_cost(newp, oldp) + upd_cost; - const int savings = old_b - new_b - update_b; - if (savings > bestsavings) { - bestsavings = savings; - bestnewp = newp; - } - } - *bestp = bestnewp; - return bestsavings; -} - -int av1_prob_update_search_model_subframe( - unsigned int ct[ENTROPY_NODES][COEF_PROBS_BUFS][2], const aom_prob *oldp, - aom_prob *bestp, aom_prob upd, int stepsize, int n) { - int i, old_b, new_b, update_b, savings, bestsavings; - int newp; - const int step_sign = *bestp > oldp[PIVOT_NODE] ? -1 : 1; - const int step = stepsize * step_sign; - const int upd_cost = av1_cost_one(upd) - av1_cost_zero(upd); - aom_prob bestnewp, newplist[ENTROPY_NODES], oldplist[ENTROPY_NODES]; - av1_model_to_full_probs(oldp, oldplist); - memcpy(newplist, oldp, sizeof(aom_prob) * UNCONSTRAINED_NODES); - for (i = UNCONSTRAINED_NODES, old_b = 0; i < ENTROPY_NODES; ++i) - old_b += get_cost(ct[i], oldplist[i], n); - old_b += get_cost(ct[PIVOT_NODE], oldplist[PIVOT_NODE], n); - - bestsavings = 0; - bestnewp = oldp[PIVOT_NODE]; - - assert(stepsize > 0); - - for (newp = *bestp; (newp - oldp[PIVOT_NODE]) * step_sign < 0; newp += step) { - if (newp < 1 || newp > 255) continue; - newplist[PIVOT_NODE] = newp; - av1_model_to_full_probs(newplist, newplist); - for (i = UNCONSTRAINED_NODES, new_b = 0; i < ENTROPY_NODES; ++i) - new_b += get_cost(ct[i], newplist[i], n); - new_b += get_cost(ct[PIVOT_NODE], newplist[PIVOT_NODE], n); - update_b = prob_diff_update_cost(newp, oldp[PIVOT_NODE]) + upd_cost; - savings = old_b - new_b - update_b; - if (savings > bestsavings) { - bestsavings = savings; - bestnewp = newp; - } - } - - *bestp = bestnewp; - return bestsavings; -} -#endif // CONFIG_SUBFRAME_PROB_UPDATE - void av1_cond_prob_diff_update(aom_writer *w, aom_prob *oldp, const unsigned int ct[2], int probwt) { const aom_prob upd = DIFF_UPDATE_PROB; diff --git a/av1/encoder/subexp.h b/av1/encoder/subexp.h index 049265cb88126192c281535bcb81d60bc4648629..580edabdb65064e66bbb5a4dcaae8201c34c3c1e 100644 --- a/av1/encoder/subexp.h +++ b/av1/encoder/subexp.h @@ -35,13 +35,6 @@ int av1_prob_diff_update_savings_search_model(const unsigned int *ct, int av1_cond_prob_diff_update_savings(aom_prob *oldp, const unsigned int ct[2], int probwt); -#if CONFIG_SUBFRAME_PROB_UPDATE -int av1_prob_update_search_subframe(unsigned int ct[][2], aom_prob oldp, - aom_prob *bestp, aom_prob upd, int n); -int av1_prob_update_search_model_subframe( - unsigned int ct[ENTROPY_NODES][COEF_PROBS_BUFS][2], const aom_prob *oldp, - aom_prob *bestp, aom_prob upd, int stepsize, int n); -#endif // CONFIG_SUBFRAME_PROB_UPDATE #ifdef __cplusplus } // extern "C" #endif diff --git a/build/cmake/aom_config_defaults.cmake b/build/cmake/aom_config_defaults.cmake index 5c2bc5801f19fe14604459ec1a99d2693d4e3031..47202b276b6fba1cc2ca29ce2079bc0ca85c6e27 100644 --- a/build/cmake/aom_config_defaults.cmake +++ b/build/cmake/aom_config_defaults.cmake @@ -124,7 +124,6 @@ set(CONFIG_MOTION_VAR 0 CACHE BOOL "Internal flag.") set(CONFIG_NCOBMC 0 CACHE BOOL "Internal flag.") set(CONFIG_WARPED_MOTION 0 CACHE BOOL "Internal flag.") set(CONFIG_Q_ADAPT_PROBS 0 CACHE BOOL "Internal flag.") -set(CONFIG_SUBFRAME_PROB_UPDATE 0 CACHE BOOL "Internal flag.") set(CONFIG_BITSTREAM_DEBUG 0 CACHE BOOL "Internal flag.") set(CONFIG_ALT_INTRA 1 CACHE BOOL "Internal flag.") set(CONFIG_PALETTE 1 CACHE BOOL "Internal flag.") diff --git a/configure b/configure index 828dc625855e75f1218f25d94ddbd32ed5dc8799..446232b31124c7922c29f2c550275e69e7e57224 100755 --- a/configure +++ b/configure @@ -280,7 +280,6 @@ EXPERIMENT_LIST=" ncobmc warped_motion q_adapt_probs - subframe_prob_update bitstream_debug alt_intra palette