Abstract twopass to AV1_PRIMARY Moved twopass from cpi to ppi(AV1_PRIMARY). Change-Id: I3493d19c72020c32acb94ec852bf8262882056e4
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c index acc9372..ea2c31e 100644 --- a/av1/av1_cx_iface.c +++ b/av1/av1_cx_iface.c
@@ -2011,9 +2011,8 @@ static aom_codec_err_t create_context_and_bufferpool( AV1_PRIMARY *ppi, AV1_COMP **p_cpi, BufferPool **p_buffer_pool, - AV1EncoderConfig *oxcf, FIRSTPASS_STATS *frame_stats_buf, - COMPRESSOR_STAGE stage, int num_lap_buffers, int lap_lag_in_frames, - STATS_BUFFER_CTX *stats_buf_context) { + AV1EncoderConfig *oxcf, COMPRESSOR_STAGE stage, int num_lap_buffers, + int lap_lag_in_frames) { aom_codec_err_t res = AOM_CODEC_OK; *p_buffer_pool = (BufferPool *)aom_calloc(1, sizeof(BufferPool)); @@ -2024,9 +2023,8 @@ return AOM_CODEC_MEM_ERROR; } #endif - *p_cpi = av1_create_compressor(ppi, oxcf, *p_buffer_pool, frame_stats_buf, - stage, num_lap_buffers, lap_lag_in_frames, - stats_buf_context); + *p_cpi = av1_create_compressor(ppi, oxcf, *p_buffer_pool, stage, + num_lap_buffers, lap_lag_in_frames); if (*p_cpi == NULL) res = AOM_CODEC_MEM_ERROR; return res; @@ -2085,20 +2083,27 @@ res = create_stats_buffer(&priv->frame_stats_buffer, &priv->stats_buf_context, *num_lap_buffers); if (res != AOM_CODEC_OK) return AOM_CODEC_MEM_ERROR; + + assert(MAX_LAP_BUFFERS >= MAX_LAG_BUFFERS); + int size = get_stats_buf_size(*num_lap_buffers, MAX_LAG_BUFFERS); + for (int i = 0; i < size; i++) + priv->ppi->twopass.frame_stats_arr[i] = &priv->frame_stats_buffer[i]; + + priv->ppi->twopass.stats_buf_ctx = &priv->stats_buf_context; + priv->ppi->twopass.stats_in = + priv->ppi->twopass.stats_buf_ctx->stats_in_start; #endif - res = create_context_and_bufferpool( - priv->ppi, &priv->ppi->cpi, &priv->buffer_pool, &priv->oxcf, - priv->frame_stats_buffer, ENCODE_STAGE, *num_lap_buffers, -1, - &priv->stats_buf_context); + res = create_context_and_bufferpool(priv->ppi, &priv->ppi->cpi, + &priv->buffer_pool, &priv->oxcf, + ENCODE_STAGE, *num_lap_buffers, -1); // Create another compressor if look ahead is enabled if (res == AOM_CODEC_OK && *num_lap_buffers) { res = create_context_and_bufferpool( priv->ppi, &priv->ppi->cpi_lap, &priv->buffer_pool_lap, &priv->oxcf, - priv->frame_stats_buffer, LAP_STAGE, *num_lap_buffers, - clamp(lap_lag_in_frames, 0, MAX_LAG_BUFFERS), - &priv->stats_buf_context); + LAP_STAGE, *num_lap_buffers, + clamp(lap_lag_in_frames, 0, MAX_LAG_BUFFERS)); } } }
diff --git a/av1/encoder/aq_complexity.c b/av1/encoder/aq_complexity.c index 3ea5f63..6f166d6 100644 --- a/av1/encoder/aq_complexity.c +++ b/av1/encoder/aq_complexity.c
@@ -160,7 +160,7 @@ aom_clear_system_state(); low_var_thresh = (is_stat_consumption_stage_twopass(cpi)) - ? AOMMAX(exp(cpi->twopass.mb_av_energy), MIN_DEFAULT_LV_THRESH) + ? AOMMAX(exp(cpi->ppi->twopass.mb_av_energy), MIN_DEFAULT_LV_THRESH) : DEFAULT_LV_THRESH; av1_setup_src_planes(mb, cpi->source, mi_row, mi_col, num_planes, bs);
diff --git a/av1/encoder/aq_variance.c b/av1/encoder/aq_variance.c index 92d7ad1..3391315 100644 --- a/av1/encoder/aq_variance.c +++ b/av1/encoder/aq_variance.c
@@ -52,7 +52,7 @@ int resolution_change = cm->prev_frame && (cm->width != cm->prev_frame->width || cm->height != cm->prev_frame->height); - int avg_energy = (int)(cpi->twopass.mb_av_energy - 2); + int avg_energy = (int)(cpi->ppi->twopass.mb_av_energy - 2); double avg_ratio; if (avg_energy > 7) avg_energy = 7; if (avg_energy < 0) avg_energy = 0; @@ -178,7 +178,7 @@ double energy, energy_midpoint; aom_clear_system_state(); energy_midpoint = (is_stat_consumption_stage_twopass(cpi)) - ? cpi->twopass.frame_avg_haar_energy + ? cpi->ppi->twopass.frame_avg_haar_energy : DEFAULT_E_MIDPOINT; energy = av1_log_block_wavelet_energy(x, bs) - energy_midpoint; return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX);
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c index e4dda12..9e09c63 100644 --- a/av1/encoder/encode_strategy.c +++ b/av1/encoder/encode_strategy.c
@@ -1122,9 +1122,9 @@ if (!av1_lookahead_peek(cpi->ppi->lookahead, 0, cpi->compressor_stage)) { #if !CONFIG_REALTIME_ONLY - if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) { + if (flush && oxcf->pass == 1 && !cpi->ppi->twopass.first_pass_done) { av1_end_first_pass(cpi); /* get last stats packet */ - cpi->twopass.first_pass_done = 1; + cpi->ppi->twopass.first_pass_done = 1; } #endif return -1; @@ -1191,9 +1191,9 @@ if (source == NULL) { // If no source was found, we can't encode a frame. #if !CONFIG_REALTIME_ONLY - if (flush && oxcf->pass == 1 && !cpi->twopass.first_pass_done) { + if (flush && oxcf->pass == 1 && !cpi->ppi->twopass.first_pass_done) { av1_end_first_pass(cpi); /* get last stats packet */ - cpi->twopass.first_pass_done = 1; + cpi->ppi->twopass.first_pass_done = 1; } #endif return -1;
diff --git a/av1/encoder/encodeframe_utils.c b/av1/encoder/encodeframe_utils.c index 2d0e14c..57f1c79 100644 --- a/av1/encoder/encodeframe_utils.c +++ b/av1/encoder/encodeframe_utils.c
@@ -761,7 +761,7 @@ if (is_stat_consumption_stage_twopass(cpi)) { const AV1_COMMON *const cm = &cpi->common; const FIRSTPASS_STATS *const this_frame_stats = read_one_frame_stats( - &cpi->twopass, cm->current_frame.display_order_hint); + &cpi->ppi->twopass, cm->current_frame.display_order_hint); if (this_frame_stats == NULL) return AOM_CODEC_ERROR; // The inactive region is specified in MBs not mi units. @@ -791,7 +791,7 @@ if (is_stat_consumption_stage_twopass(cpi)) { const AV1_COMMON *const cm = &cpi->common; const FIRSTPASS_STATS *const this_frame_stats = read_one_frame_stats( - &cpi->twopass, cm->current_frame.display_order_hint); + &cpi->ppi->twopass, cm->current_frame.display_order_hint); if (this_frame_stats == NULL) return AOM_CODEC_ERROR; // The inactive region is specified in MBs not mi units.
diff --git a/av1/encoder/encodeframe_utils.h b/av1/encoder/encodeframe_utils.h index cd024f2..3d2c9b8 100644 --- a/av1/encoder/encodeframe_utils.h +++ b/av1/encoder/encodeframe_utils.h
@@ -410,7 +410,7 @@ #if !CONFIG_REALTIME_ONLY else if (is_stat_consumption_stage_twopass(cpi)) { const FIRSTPASS_STATS *const this_frame_stats = - read_one_frame_stats(&cpi->twopass, cur_frame_display_index); + read_one_frame_stats(&cpi->ppi->twopass, cur_frame_display_index); aom_clear_system_state(); const double coded_error_per_mb = this_frame_stats->coded_error / cpi->frame_info.num_mbs;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index fc96127..1e98940 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c
@@ -857,11 +857,8 @@ } AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, AV1EncoderConfig *oxcf, - BufferPool *const pool, - FIRSTPASS_STATS *frame_stats_buf, - COMPRESSOR_STAGE stage, int num_lap_buffers, - int lap_lag_in_frames, - STATS_BUFFER_CTX *stats_buf_context) { + BufferPool *const pool, COMPRESSOR_STAGE stage, + int num_lap_buffers, int lap_lag_in_frames) { AV1_COMP *volatile const cpi = aom_memalign(32, sizeof(AV1_COMP)); AV1_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL; @@ -994,14 +991,6 @@ yuv_denoised_file = fopen("denoised.yuv", "wb"); #endif - assert(MAX_LAP_BUFFERS >= MAX_LAG_BUFFERS); - int size = get_stats_buf_size(num_lap_buffers, MAX_LAG_BUFFERS); - for (int i = 0; i < size; i++) - cpi->twopass.frame_stats_arr[i] = &frame_stats_buf[i]; - - cpi->twopass.stats_buf_ctx = stats_buf_context; - cpi->twopass.stats_in = cpi->twopass.stats_buf_ctx->stats_in_start; - #if !CONFIG_REALTIME_ONLY if (is_stat_consumption_stage(cpi)) { const size_t packet_sz = sizeof(FIRSTPASS_STATS); @@ -1010,10 +999,12 @@ if (!cpi->ppi->lap_enabled) { /*Re-initialize to stats buffer, populated by application in the case of * two pass*/ - cpi->twopass.stats_buf_ctx->stats_in_start = oxcf->twopass_stats_in.buf; - cpi->twopass.stats_in = cpi->twopass.stats_buf_ctx->stats_in_start; - cpi->twopass.stats_buf_ctx->stats_in_end = - &cpi->twopass.stats_buf_ctx->stats_in_start[packets - 1]; + cpi->ppi->twopass.stats_buf_ctx->stats_in_start = + oxcf->twopass_stats_in.buf; + cpi->ppi->twopass.stats_in = + cpi->ppi->twopass.stats_buf_ctx->stats_in_start; + cpi->ppi->twopass.stats_buf_ctx->stats_in_end = + &cpi->ppi->twopass.stats_buf_ctx->stats_in_start[packets - 1]; av1_init_second_pass(cpi); } else {
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h index c0aa406..d88b05a 100644 --- a/av1/encoder/encoder.h +++ b/av1/encoder/encoder.h
@@ -2121,6 +2121,11 @@ * Number of frames left to be encoded, is 0 if limit is not set. */ int frames_left; + + /*! + * Information related to two pass encoding. + */ + TWO_PASS twopass; } AV1_PRIMARY; /*! @@ -2381,11 +2386,6 @@ aom_variance_fn_ptr_t fn_ptr[BLOCK_SIZES_ALL]; /*! - * Information related to two pass encoding. - */ - TWO_PASS twopass; - - /*! * The frame processing order within a GOP. */ unsigned char gf_frame_index; @@ -2795,11 +2795,9 @@ struct AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, AV1EncoderConfig *oxcf, BufferPool *const pool, - FIRSTPASS_STATS *frame_stats_buf, COMPRESSOR_STAGE stage, int num_lap_buffers, - int lap_lag_in_frames, - STATS_BUFFER_CTX *stats_buf_context); + int lap_lag_in_frames); struct AV1_PRIMARY *av1_create_primary_compressor( struct aom_codec_pkt_list *pkt_list_head, int num_lap_buffers,
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c index d9bf77d..ea1b89d 100644 --- a/av1/encoder/firstpass.c +++ b/av1/encoder/firstpass.c
@@ -177,8 +177,8 @@ } void av1_end_first_pass(AV1_COMP *cpi) { - if (cpi->twopass.stats_buf_ctx->total_stats && !cpi->ppi->lap_enabled) - output_stats(cpi->twopass.stats_buf_ctx->total_stats, + if (cpi->ppi->twopass.stats_buf_ctx->total_stats && !cpi->ppi->lap_enabled) + output_stats(cpi->ppi->twopass.stats_buf_ctx->total_stats, cpi->ppi->output_pkt_list); } @@ -780,7 +780,7 @@ const int frame_number, const int64_t ts_duration, const BLOCK_SIZE fp_block_size) { - TWO_PASS *twopass = &cpi->twopass; + TWO_PASS *twopass = &cpi->ppi->twopass; AV1_COMMON *const cm = &cpi->common; const CommonModeInfoParams *const mi_params = &cm->mi_params; FIRSTPASS_STATS *this_frame_stats = twopass->stats_buf_ctx->stats_in_end; @@ -851,8 +851,8 @@ *this_frame_stats = fps; if (!cpi->ppi->lap_enabled) output_stats(this_frame_stats, cpi->ppi->output_pkt_list); - if (cpi->twopass.stats_buf_ctx->total_stats != NULL) { - av1_accumulate_stats(cpi->twopass.stats_buf_ctx->total_stats, &fps); + if (cpi->ppi->twopass.stats_buf_ctx->total_stats != NULL) { + av1_accumulate_stats(cpi->ppi->twopass.stats_buf_ctx->total_stats, &fps); } /*In the case of two pass, first pass uses it as a circular buffer, * when LAP is enabled it is used as a linear buffer*/ @@ -1268,7 +1268,7 @@ (stats.image_data_start_row * unit_cols * 2)); } - TWO_PASS *twopass = &cpi->twopass; + TWO_PASS *twopass = &cpi->ppi->twopass; const int num_mbs_16X16 = (cpi->oxcf.resize_cfg.resize_mode != RESIZE_NONE) ? cpi->initial_mbs : mi_params->MBs;
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c index d4fa1fe..757232d 100644 --- a/av1/encoder/gop_structure.c +++ b/av1/encoder/gop_structure.c
@@ -190,7 +190,7 @@ void av1_gop_setup_structure(AV1_COMP *cpi) { RATE_CONTROL *const rc = &cpi->rc; GF_GROUP *const gf_group = &cpi->ppi->gf_group; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FRAME_INFO *const frame_info = &cpi->frame_info; const int key_frame = rc->frames_since_key == 0; const FRAME_UPDATE_TYPE first_frame_update_type =
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c index a2d17c1..2beb048 100644 --- a/av1/encoder/pass2_strategy.c +++ b/av1/encoder/pass2_strategy.c
@@ -182,7 +182,7 @@ // Based on history adjust expectations of bits per macroblock. static void twopass_update_bpm_factor(AV1_COMP *cpi, int rate_err_tol) { - TWO_PASS *twopass = &cpi->twopass; + TWO_PASS *twopass = &cpi->ppi->twopass; const RATE_CONTROL *const rc = &cpi->rc; int err_estimate = rc->rate_error_estimate; @@ -201,7 +201,7 @@ } else { rate_err_factor = 1.0 - ((double)(rc->vbr_bits_off_target) / - AOMMAX(rc->total_actual_bits, cpi->twopass.bits_left)); + AOMMAX(rc->total_actual_bits, cpi->ppi->twopass.bits_left)); } rate_err_factor = AOMMAX(min_fac, AOMMIN(max_fac, rate_err_factor)); @@ -303,8 +303,8 @@ // content at the given rate. int q = find_qindex_by_rate_with_correction( target_norm_bits_per_mb, cpi->common.seq_params.bit_depth, - av_err_per_mb, cpi->twopass.bpm_factor, rate_err_tol, rc->best_quality, - rc->worst_quality); + av_err_per_mb, cpi->ppi->twopass.bpm_factor, rate_err_tol, + rc->best_quality, rc->worst_quality); // Restriction on active max q for constrained quality mode. if (rc_cfg->mode == AOM_CQ) q = AOMMAX(q, rc_cfg->cq_level); @@ -767,7 +767,7 @@ static int64_t calculate_total_gf_group_bits(AV1_COMP *cpi, double gf_group_err) { const RATE_CONTROL *const rc = &cpi->rc; - const TWO_PASS *const twopass = &cpi->twopass; + const TWO_PASS *const twopass = &cpi->ppi->twopass; const int max_bits = frame_max_bits(rc, &cpi->oxcf); int64_t total_group_bits; @@ -968,7 +968,7 @@ int active_min_gf_interval, GF_GROUP_STATS *gf_stats) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; InitialDimensions *const initial_dimensions = &cpi->initial_dimensions; // Motion breakout threshold for loop below depends on image size. const double mv_ratio_accumulator_thresh = @@ -1923,7 +1923,7 @@ static void calculate_gf_length(AV1_COMP *cpi, int max_gop_length, int max_intervals) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FIRSTPASS_STATS next_frame; const FIRSTPASS_STATS *const start_pos = twopass->stats_in; FRAME_INFO *frame_info = &cpi->frame_info; @@ -2245,7 +2245,7 @@ int use_alt_ref, int is_final_pass) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; // Set the interval until the next gf. // If forward keyframes are enabled, ensure the final gf group obeys the // MIN_FWD_KF_INTERVAL. @@ -2328,7 +2328,7 @@ AV1_COMMON *const cm = &cpi->common; RATE_CONTROL *const rc = &cpi->rc; const AV1EncoderConfig *const oxcf = &cpi->oxcf; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FIRSTPASS_STATS next_frame; const FIRSTPASS_STATS *const start_pos = twopass->stats_in; GF_GROUP *gf_group = &cpi->ppi->gf_group; @@ -2881,7 +2881,7 @@ static int define_kf_interval(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame, double *kf_group_err, int num_frames_to_detect_scenecut) { - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; RATE_CONTROL *const rc = &cpi->rc; const AV1EncoderConfig *const oxcf = &cpi->oxcf; const KeyFrameCfg *const kf_cfg = &oxcf->kf_cfg; @@ -3017,7 +3017,7 @@ static int64_t get_kf_group_bits(AV1_COMP *cpi, double kf_group_err, double kf_group_avg_error) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; int64_t kf_group_bits; if (cpi->ppi->lap_enabled) { kf_group_bits = (int64_t)rc->frames_to_key * rc->avg_frame_bandwidth; @@ -3043,7 +3043,7 @@ static int calc_avg_stats(AV1_COMP *cpi, FIRSTPASS_STATS *avg_frame_stat) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FIRSTPASS_STATS cur_frame; av1_zero(cur_frame); int num_frames = 0; @@ -3092,7 +3092,7 @@ double *zero_motion_accumulator, double *sr_accumulator, int use_avg_stat) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FRAME_INFO *const frame_info = &cpi->frame_info; FIRSTPASS_STATS frame_stat; av1_zero(frame_stat); @@ -3155,7 +3155,7 @@ */ static void find_next_key_frame(AV1_COMP *cpi, FIRSTPASS_STATS *this_frame) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; GF_GROUP *const gf_group = &cpi->ppi->gf_group; FRAME_INFO *const frame_info = &cpi->frame_info; AV1_COMMON *const cm = &cpi->common; @@ -3387,7 +3387,7 @@ // first pass, and so do its previous and forward frames, then this frame // can be skipped for partition check, and the partition size is assigned // according to the variance - const TWO_PASS *const twopass = &cpi->twopass; + const TWO_PASS *const twopass = &cpi->ppi->twopass; return (!frame_is_intra_only(&cpi->common) && twopass->stats_in - 2 > twopass->stats_buf_ctx->stats_in_start && @@ -3410,7 +3410,7 @@ AV1_COMMON *const cm = &cpi->common; CurrentFrame *const current_frame = &cm->current_frame; RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; int section_target_bandwidth; const int frames_left = (int)(twopass->stats_buf_ctx->total_stats->count - current_frame->frame_number); @@ -3426,18 +3426,19 @@ AV1_COMMON *const cm = &cpi->common; CurrentFrame *const current_frame = &cm->current_frame; RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; if (cpi->oxcf.rc_cfg.mode != AOM_Q && current_frame->frame_number == 0 && - cpi->gf_frame_index == 0 && cpi->twopass.stats_buf_ctx->total_stats && - cpi->twopass.stats_buf_ctx->total_left_stats) { + cpi->gf_frame_index == 0 && + cpi->ppi->twopass.stats_buf_ctx->total_stats && + cpi->ppi->twopass.stats_buf_ctx->total_left_stats) { if (cpi->ppi->lap_enabled) { /* * Accumulate total_stats using available limited number of stats, * and assign it to total_left_stats. */ - *cpi->twopass.stats_buf_ctx->total_left_stats = - *cpi->twopass.stats_buf_ctx->total_stats; + *cpi->ppi->twopass.stats_buf_ctx->total_left_stats = + *cpi->ppi->twopass.stats_buf_ctx->total_stats; } // Special case code for first frame. const int section_target_bandwidth = get_section_target_bandwidth(cpi); @@ -3509,7 +3510,7 @@ const EncodeFrameInput *const frame_input, unsigned int frame_flags) { RATE_CONTROL *const rc = &cpi->rc; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; GF_GROUP *const gf_group = &cpi->ppi->gf_group; const AV1EncoderConfig *const oxcf = &cpi->oxcf; @@ -3768,7 +3769,7 @@ void av1_init_second_pass(AV1_COMP *cpi) { const AV1EncoderConfig *const oxcf = &cpi->oxcf; - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; FRAME_INFO *const frame_info = &cpi->frame_info; double frame_rate; FIRSTPASS_STATS *stats; @@ -3831,7 +3832,7 @@ } void av1_init_single_pass_lap(AV1_COMP *cpi) { - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; if (!twopass->stats_buf_ctx->stats_in_end) return; @@ -3865,7 +3866,7 @@ #define MINQ_ADJ_LIMIT_CQ 20 #define HIGH_UNDERSHOOT_RATIO 2 void av1_twopass_postencode_update(AV1_COMP *cpi) { - TWO_PASS *const twopass = &cpi->twopass; + TWO_PASS *const twopass = &cpi->ppi->twopass; RATE_CONTROL *const rc = &cpi->rc; const RateControlCfg *const rc_cfg = &cpi->oxcf.rc_cfg;
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c index 9b3924f..4391ae9 100644 --- a/av1/encoder/picklpf.c +++ b/av1/encoder/picklpf.c
@@ -39,8 +39,8 @@ int av1_get_max_filter_level(const AV1_COMP *cpi) { if (is_stat_consumption_stage_twopass(cpi)) { - return cpi->twopass.section_intra_rating > 8 ? MAX_LOOP_FILTER * 3 / 4 - : MAX_LOOP_FILTER; + return cpi->ppi->twopass.section_intra_rating > 8 ? MAX_LOOP_FILTER * 3 / 4 + : MAX_LOOP_FILTER; } else { return MAX_LOOP_FILTER; } @@ -153,8 +153,8 @@ int64_t bias = (best_err >> (15 - (filt_mid / 8))) * filter_step; if ((is_stat_consumption_stage_twopass(cpi)) && - (cpi->twopass.section_intra_rating < 20)) - bias = (bias * cpi->twopass.section_intra_rating) / 20; + (cpi->ppi->twopass.section_intra_rating < 20)) + bias = (bias * cpi->ppi->twopass.section_intra_rating) / 20; // yx, bias less for large block size if (cm->features.tx_mode != ONLY_4X4) bias >>= 1;
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c index e69e402..27499b2 100644 --- a/av1/encoder/ratectrl.c +++ b/av1/encoder/ratectrl.c
@@ -1328,7 +1328,7 @@ int qindex; if (is_stat_consumption_stage_twopass(cpi) && - cpi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { + cpi->ppi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { qindex = AOMMIN(rc->last_kf_qindex, rc->last_boosted_qindex); active_best_quality = qindex; last_boosted_q = av1_convert_qindex_to_q(qindex, bit_depth); @@ -1356,7 +1356,7 @@ } if (is_stat_consumption_stage_twopass(cpi) && - cpi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH) { + cpi->ppi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH) { active_best_quality /= 3; } @@ -1367,7 +1367,8 @@ // Make a further adjustment based on the kf zero motion measure. if (is_stat_consumption_stage_twopass(cpi)) - q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct); + q_adj_factor += + 0.05 - (0.001 * (double)cpi->ppi->twopass.kf_zeromotion_pct); // Convert the adjustment factor to a qindex delta // on active_best_quality. @@ -1410,12 +1411,13 @@ (refresh_frame_flags->golden_frame || is_intrl_arf_boost || refresh_frame_flags->alt_ref_frame))) { active_best_quality -= - (cpi->twopass.extend_minq + cpi->twopass.extend_minq_fast); - active_worst_quality += (cpi->twopass.extend_maxq / 2); + (cpi->ppi->twopass.extend_minq + cpi->ppi->twopass.extend_minq_fast); + active_worst_quality += (cpi->ppi->twopass.extend_maxq / 2); } else { active_best_quality -= - (cpi->twopass.extend_minq + cpi->twopass.extend_minq_fast) / 2; - active_worst_quality += cpi->twopass.extend_maxq; + (cpi->ppi->twopass.extend_minq + cpi->ppi->twopass.extend_minq_fast) / + 2; + active_worst_quality += cpi->ppi->twopass.extend_maxq; } } @@ -1423,7 +1425,7 @@ #ifndef STRICT_RC // Static forced key frames Q restrictions dealt with elsewhere. if (!(frame_is_intra_only(cm)) || !rc->this_key_frame_forced || - (cpi->twopass.last_kfgroup_zeromotion_pct < STATIC_MOTION_THRESH)) { + (cpi->ppi->twopass.last_kfgroup_zeromotion_pct < STATIC_MOTION_THRESH)) { const int qdelta = av1_frame_type_qdelta(cpi, active_worst_quality); active_worst_quality = AOMMAX(active_worst_quality + qdelta, active_best_quality); @@ -1472,13 +1474,13 @@ if (cpi->oxcf.rc_cfg.mode == AOM_Q || (frame_is_intra_only(cm) && !rc->this_key_frame_forced && - cpi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH && + cpi->ppi->twopass.kf_zeromotion_pct >= STATIC_KF_GROUP_THRESH && rc->frames_to_key > 1)) { q = active_best_quality; // Special case code to try and match quality with forced key frames. } else if (frame_is_intra_only(cm) && rc->this_key_frame_forced) { // If static since last kf use better of last boosted and last kf q. - if (cpi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { + if (cpi->ppi->twopass.last_kfgroup_zeromotion_pct >= STATIC_MOTION_THRESH) { q = AOMMIN(rc->last_kf_qindex, rc->last_boosted_qindex); } else { q = AOMMIN(rc->last_boosted_qindex, @@ -2007,8 +2009,8 @@ RATE_CONTROL *const rc = &cpi->rc; int64_t vbr_bits_off_target = rc->vbr_bits_off_target; const int stats_count = - cpi->twopass.stats_buf_ctx->total_stats != NULL - ? (int)cpi->twopass.stats_buf_ctx->total_stats->count + cpi->ppi->twopass.stats_buf_ctx->total_stats != NULL + ? (int)cpi->ppi->twopass.stats_buf_ctx->total_stats->count : 0; const int frame_window = AOMMIN( 16, (int)(stats_count - (int)cpi->common.current_frame.frame_number));
diff --git a/av1/encoder/rc_utils.h b/av1/encoder/rc_utils.h index 98cec2e..284f55e 100644 --- a/av1/encoder/rc_utils.h +++ b/av1/encoder/rc_utils.h
@@ -48,11 +48,11 @@ av1_get_max_bitrate_for_level(target_level, tier, profile); const int64_t max_bitrate = (int64_t)(level_bitrate_limit * 0.70); rc_cfg->target_bandwidth = AOMMIN(rc_cfg->target_bandwidth, max_bitrate); - // Also need to update cpi->twopass.bits_left. - TWO_PASS *const twopass = &cpi->twopass; + // Also need to update cpi->ppi->twopass.bits_left. + TWO_PASS *const twopass = &cpi->ppi->twopass; FIRSTPASS_STATS *stats = twopass->stats_buf_ctx->total_stats; if (stats != NULL) - cpi->twopass.bits_left = + cpi->ppi->twopass.bits_left = (int64_t)(stats->duration * rc_cfg->target_bandwidth / 10000000.0); // Adjust max over-shoot percentage.
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index bf784b3..099b7c3 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -301,7 +301,7 @@ sf->rt_sf.use_nonrd_pick_mode = 0; sf->rt_sf.use_real_time_ref_set = 0; - if (cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION || + if (cpi->ppi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION || cpi->use_screen_content_tools) { sf->mv_sf.exhaustive_searches_thresh = (1 << 20); } else { @@ -709,7 +709,7 @@ sf->rt_sf.use_nonrd_pick_mode = 0; sf->rt_sf.use_real_time_ref_set = 0; - if (cpi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION || + if (cpi->ppi->twopass.fr_content_type == FC_GRAPHICS_ANIMATION || cpi->use_screen_content_tools) { sf->mv_sf.exhaustive_searches_thresh = (1 << 20); } else {
diff --git a/doc/dev_guide/av1_encoder.dox b/doc/dev_guide/av1_encoder.dox index 00c73a5..5d3435c 100644 --- a/doc/dev_guide/av1_encoder.dox +++ b/doc/dev_guide/av1_encoder.dox
@@ -106,12 +106,12 @@ - \ref AV1_PRIMARY - \ref AV1_PRIMARY.gf_group (\ref GF_GROUP) - \ref AV1_PRIMARY.lap_enabled + - \ref AV1_PRIMARY.twopass (\ref TWO_PASS) - \ref AV1_COMP - \ref AV1_COMP.oxcf (\ref AV1EncoderConfig) - \ref AV1_COMP.alt_ref_buffer (\ref yv12_buffer_config) - \ref AV1_COMP.rc (\ref RATE_CONTROL) - - \ref AV1_COMP.twopass (\ref TWO_PASS) - \ref AV1_COMP.speed - \ref AV1_COMP.sf (\ref SPEED_FEATURES) @@ -484,10 +484,12 @@ The following are the main data structures referenced in this section (see also \ref architecture_enc_data_structures): + - \ref AV1_PRIMARY ppi (the primary compressor instance data structure) + - \ref AV1_PRIMARY.twopass (\ref TWO_PASS) + - \ref AV1_COMP cpi (the main compressor instance data structure) - \ref AV1_COMP.oxcf (\ref AV1EncoderConfig) - \ref AV1_COMP.rc (\ref RATE_CONTROL) - - \ref AV1_COMP.twopass (\ref TWO_PASS) - \ref AV1_COMP.sf (\ref SPEED_FEATURES) - \ref AV1EncoderConfig (Encoder configuration parameters)