Move FRAME_COUNTS to encoder side completely FRAME_COUNTS is only needed in the encoding process, so we move it out of the common folder then dec does not need to carry it. Change-Id: Iad41b707c52ee739da3651e3cdd601117cb48a5a
diff --git a/av1/common/blockd.h b/av1/common/blockd.h index b0d0a5e..4e0e2dc 100644 --- a/av1/common/blockd.h +++ b/av1/common/blockd.h
@@ -494,7 +494,6 @@ uint8_t bmode_blocks_wl; uint8_t bmode_blocks_hl; - FRAME_COUNTS *counts; TileInfo tile; int mi_stride;
diff --git a/av1/common/entropymode.h b/av1/common/entropymode.h index 7dac7f2..0bd2e20 100644 --- a/av1/common/entropymode.h +++ b/av1/common/entropymode.h
@@ -163,92 +163,6 @@ int initialized; } FRAME_CONTEXT; -typedef struct FRAME_COUNTS { -// Note: This structure should only contain 'unsigned int' fields, or -// aggregates built solely from 'unsigned int' fields/elements -#if CONFIG_ENTROPY_STATS - unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES]; - unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1]; - unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES]; - unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; - unsigned int cfl_sign[CFL_JOINT_SIGNS]; - unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE]; - unsigned int palette_y_mode[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2]; - unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS][2]; - unsigned int palette_y_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; - unsigned int palette_uv_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; - unsigned int palette_y_color_index[PALETTE_SIZES] - [PALETTE_COLOR_INDEX_CONTEXTS] - [PALETTE_COLORS]; - unsigned int palette_uv_color_index[PALETTE_SIZES] - [PALETTE_COLOR_INDEX_CONTEXTS] - [PALETTE_COLORS]; - unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES]; - unsigned int txb_skip[TOKEN_CDF_Q_CTXS][TX_SIZES][TXB_SKIP_CONTEXTS][2]; - unsigned int eob_extra[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] - [EOB_COEF_CONTEXTS][2]; - unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2]; - unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS] - [2]; - unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2]; - unsigned int eob_multi16[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][5]; - unsigned int eob_multi32[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][6]; - unsigned int eob_multi64[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][7]; - unsigned int eob_multi128[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8]; - unsigned int eob_multi256[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][9]; - unsigned int eob_multi512[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][10]; - unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][11]; - unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] - [LEVEL_CONTEXTS][BR_CDF_SIZE]; - unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] - [SIG_COEF_CONTEXTS][NUM_BASE_LEVELS + 2]; - unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] - [SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1]; - unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2]; - unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2]; - unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2]; - unsigned int drl_mode[DRL_MODE_CONTEXTS][2]; - unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES]; - unsigned int wedge_idx[BLOCK_SIZES_ALL][16]; - unsigned int interintra[BLOCK_SIZE_GROUPS][2]; - unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; - unsigned int wedge_interintra[BLOCK_SIZES_ALL][2]; - unsigned int compound_type[BLOCK_SIZES_ALL][COMPOUND_TYPES - 1]; - unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES]; - unsigned int obmc[BLOCK_SIZES_ALL][2]; - unsigned int intra_inter[INTRA_INTER_CONTEXTS][2]; - unsigned int comp_inter[COMP_INTER_CONTEXTS][2]; - unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2]; - unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2]; - unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2]; - unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2]; - unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2]; - unsigned int intrabc[2]; - - unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2]; - unsigned int intra_tx_size[MAX_TX_CATS][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1]; - unsigned int skip_mode[SKIP_MODE_CONTEXTS][2]; - unsigned int skip[SKIP_CONTEXTS][2]; - unsigned int compound_index[COMP_INDEX_CONTEXTS][2]; - unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2]; - unsigned int delta_q[DELTA_Q_PROBS][2]; - unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2]; - unsigned int delta_lf[DELTA_LF_PROBS][2]; - - unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES]; - unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES] - [TX_TYPES]; - unsigned int filter_intra_mode[FILTER_INTRA_MODES]; - unsigned int filter_intra[BLOCK_SIZES_ALL][2]; - unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES]; - unsigned int wiener_restore[2]; - unsigned int sgrproj_restore[2]; -#endif // CONFIG_ENTROPY_STATS - - unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS] - [SWITCHABLE_FILTERS]; -} FRAME_COUNTS; - static const int av1_ext_tx_ind[EXT_TX_SET_TYPES][TX_TYPES] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index 6a8cedc..4bd87f2 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -454,7 +454,6 @@ unsigned int frame_context_idx; /* Context to use/update */ int fb_of_context_type[REF_FRAMES]; int primary_ref_frame; - FRAME_COUNTS counts; unsigned int frame_offset;
diff --git a/av1/common/thread_common.c b/av1/common/thread_common.c index c309520..094a1aa 100644 --- a/av1/common/thread_common.c +++ b/av1/common/thread_common.c
@@ -362,16 +362,3 @@ loop_filter_rows_mt(frame, cm, xd, start_mi_row, end_mi_row, plane_start, plane_end, workers, num_workers, lf_sync); } - -// Accumulate frame counts. FRAME_COUNTS consist solely of 'unsigned int' -// members, so we treat it as an array, and sum over the whole length. -void av1_accumulate_frame_counts(FRAME_COUNTS *acc_counts, - FRAME_COUNTS *counts) { - unsigned int *const acc = (unsigned int *)acc_counts; - const unsigned int *const cnt = (unsigned int *)counts; - - const unsigned int n_counts = sizeof(FRAME_COUNTS) / sizeof(unsigned int); - unsigned int i; - - for (i = 0; i < n_counts; i++) acc[i] += cnt[i]; -}
diff --git a/av1/common/thread_common.h b/av1/common/thread_common.h index e5011c6..2fd5bd3 100644 --- a/av1/common/thread_common.h +++ b/av1/common/thread_common.h
@@ -20,7 +20,6 @@ #endif struct AV1Common; -struct FRAME_COUNTS; typedef struct AV1LfMTInfo { int mi_row; @@ -62,9 +61,6 @@ AVxWorker *workers, int num_workers, AV1LfSync *lf_sync); -void av1_accumulate_frame_counts(struct FRAME_COUNTS *acc_counts, - struct FRAME_COUNTS *counts); - #ifdef __cplusplus } // extern "C" #endif
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index 407ba58..fe748a9 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c
@@ -1068,7 +1068,7 @@ update_film_grain_parameters(cpi, oxcf); // Single thread case: use counts in common. - cpi->td.counts = &cm->counts; + cpi->td.counts = &cpi->counts; // change includes all joint functionality av1_change_config(cpi, oxcf); @@ -5039,7 +5039,7 @@ update_reference_frames(cpi); #if CONFIG_ENTROPY_STATS - av1_accumulate_frame_counts(&aggregate_fc, &cm->counts); + av1_accumulate_frame_counts(&aggregate_fc, &cpi->counts); #endif // CONFIG_ENTROPY_STATS if (cm->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) {
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index 031168a..6b3c54b 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -314,6 +314,92 @@ return cfg->best_allowed_q == 0 && cfg->worst_allowed_q == 0; } +typedef struct FRAME_COUNTS { +// Note: This structure should only contain 'unsigned int' fields, or +// aggregates built solely from 'unsigned int' fields/elements +#if CONFIG_ENTROPY_STATS + unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES]; + unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1]; + unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES]; + unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES]; + unsigned int cfl_sign[CFL_JOINT_SIGNS]; + unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE]; + unsigned int palette_y_mode[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2]; + unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS][2]; + unsigned int palette_y_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; + unsigned int palette_uv_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES]; + unsigned int palette_y_color_index[PALETTE_SIZES] + [PALETTE_COLOR_INDEX_CONTEXTS] + [PALETTE_COLORS]; + unsigned int palette_uv_color_index[PALETTE_SIZES] + [PALETTE_COLOR_INDEX_CONTEXTS] + [PALETTE_COLORS]; + unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES]; + unsigned int txb_skip[TOKEN_CDF_Q_CTXS][TX_SIZES][TXB_SKIP_CONTEXTS][2]; + unsigned int eob_extra[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] + [EOB_COEF_CONTEXTS][2]; + unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2]; + unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS] + [2]; + unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2]; + unsigned int eob_multi16[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][5]; + unsigned int eob_multi32[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][6]; + unsigned int eob_multi64[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][7]; + unsigned int eob_multi128[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8]; + unsigned int eob_multi256[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][9]; + unsigned int eob_multi512[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][10]; + unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][11]; + unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] + [LEVEL_CONTEXTS][BR_CDF_SIZE]; + unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] + [SIG_COEF_CONTEXTS][NUM_BASE_LEVELS + 2]; + unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES] + [SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1]; + unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2]; + unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2]; + unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2]; + unsigned int drl_mode[DRL_MODE_CONTEXTS][2]; + unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES]; + unsigned int wedge_idx[BLOCK_SIZES_ALL][16]; + unsigned int interintra[BLOCK_SIZE_GROUPS][2]; + unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES]; + unsigned int wedge_interintra[BLOCK_SIZES_ALL][2]; + unsigned int compound_type[BLOCK_SIZES_ALL][COMPOUND_TYPES - 1]; + unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES]; + unsigned int obmc[BLOCK_SIZES_ALL][2]; + unsigned int intra_inter[INTRA_INTER_CONTEXTS][2]; + unsigned int comp_inter[COMP_INTER_CONTEXTS][2]; + unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2]; + unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2]; + unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2]; + unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2]; + unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2]; + unsigned int intrabc[2]; + + unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2]; + unsigned int intra_tx_size[MAX_TX_CATS][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1]; + unsigned int skip_mode[SKIP_MODE_CONTEXTS][2]; + unsigned int skip[SKIP_CONTEXTS][2]; + unsigned int compound_index[COMP_INDEX_CONTEXTS][2]; + unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2]; + unsigned int delta_q[DELTA_Q_PROBS][2]; + unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2]; + unsigned int delta_lf[DELTA_LF_PROBS][2]; + + unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES]; + unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES] + [TX_TYPES]; + unsigned int filter_intra_mode[FILTER_INTRA_MODES]; + unsigned int filter_intra[BLOCK_SIZES_ALL][2]; + unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES]; + unsigned int wiener_restore[2]; + unsigned int sgrproj_restore[2]; +#endif // CONFIG_ENTROPY_STATS + + unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS] + [SWITCHABLE_FILTERS]; +} FRAME_COUNTS; + // TODO(jingning) All spatially adaptive variables should go to TileDataEnc. typedef struct TileDataEnc { TileInfo tile_info; @@ -385,6 +471,7 @@ typedef struct AV1_COMP { QUANTS quants; ThreadData td; + FRAME_COUNTS counts; MB_MODE_INFO_EXT *mbmi_ext_base; CB_COEFF_BUFFER *coeff_buffer_base; Dequants dequants;
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c index 9575f15..404af2e 100644 --- a/av1/encoder/ethread.c +++ b/av1/encoder/ethread.c
@@ -142,9 +142,8 @@ thread_data->td->mb.wsrc_buf = thread_data->td->wsrc_buf; thread_data->td->mb.mask_buf = thread_data->td->mask_buf; } - if (thread_data->td->counts != &cpi->common.counts) { - memcpy(thread_data->td->counts, &cpi->common.counts, - sizeof(cpi->common.counts)); + if (thread_data->td->counts != &cpi->counts) { + memcpy(thread_data->td->counts, &cpi->counts, sizeof(cpi->counts)); } if (i < num_workers - 1) @@ -177,9 +176,21 @@ cpi->intrabc_used |= thread_data->td->intrabc_used_this_tile; // Accumulate counters. if (i < cpi->num_workers - 1) { - av1_accumulate_frame_counts(&cm->counts, thread_data->td->counts); + av1_accumulate_frame_counts(&cpi->counts, thread_data->td->counts); accumulate_rd_opt(&cpi->td, thread_data->td); cpi->td.mb.txb_split_count += thread_data->td->mb.txb_split_count; } } } + +// Accumulate frame counts. FRAME_COUNTS consist solely of 'unsigned int' +// members, so we treat it as an array, and sum over the whole length. +void av1_accumulate_frame_counts(FRAME_COUNTS *acc_counts, + const FRAME_COUNTS *counts) { + unsigned int *const acc = (unsigned int *)acc_counts; + const unsigned int *const cnt = (const unsigned int *)counts; + + const unsigned int n_counts = sizeof(FRAME_COUNTS) / sizeof(unsigned int); + + for (unsigned int i = 0; i < n_counts; i++) acc[i] += cnt[i]; +}
diff --git a/av1/encoder/ethread.h b/av1/encoder/ethread.h index 6c30a3e..b6b1fed 100644 --- a/av1/encoder/ethread.h +++ b/av1/encoder/ethread.h
@@ -27,6 +27,9 @@ void av1_encode_tiles_mt(struct AV1_COMP *cpi); +void av1_accumulate_frame_counts(struct FRAME_COUNTS *acc_counts, + const struct FRAME_COUNTS *counts); + #ifdef __cplusplus } // extern "C" #endif
diff --git a/av1/encoder/tokenize.h b/av1/encoder/tokenize.h index 5d277f6..de1cbe9 100644 --- a/av1/encoder/tokenize.h +++ b/av1/encoder/tokenize.h
@@ -28,6 +28,7 @@ struct AV1_COMP; struct ThreadData; +struct FRAME_COUNTS; struct tokenize_b_args { const struct AV1_COMP *cpi; @@ -57,7 +58,7 @@ void av1_tokenize_color_map(const MACROBLOCK *const x, int plane, TOKENEXTRA **t, BLOCK_SIZE bsize, TX_SIZE tx_size, COLOR_MAP_TYPE type, int allow_update_cdf, - FRAME_COUNTS *counts); + struct FRAME_COUNTS *counts); static INLINE int av1_get_tx_eob(const struct segmentation *seg, int segment_id, TX_SIZE tx_size) {
diff --git a/tools/aom_entropy_optimizer.c b/tools/aom_entropy_optimizer.c index 09d94eb..f438ea5 100644 --- a/tools/aom_entropy_optimizer.c +++ b/tools/aom_entropy_optimizer.c
@@ -26,7 +26,7 @@ #include <assert.h> #include <stdio.h> #include "./aom_config.h" -#include "av1/common/entropymode.h" +#include "av1/encoder/encoder.h" #define SPACES_PER_TAB 2 #define CDF_MAX_SIZE 16