diff options
Diffstat (limited to 'media/libaom/src/av1/encoder/firstpass.h')
-rw-r--r-- | media/libaom/src/av1/encoder/firstpass.h | 192 |
1 files changed, 90 insertions, 102 deletions
diff --git a/media/libaom/src/av1/encoder/firstpass.h b/media/libaom/src/av1/encoder/firstpass.h index 4b7325ae2..99d444539 100644 --- a/media/libaom/src/av1/encoder/firstpass.h +++ b/media/libaom/src/av1/encoder/firstpass.h @@ -12,8 +12,8 @@ #ifndef AOM_AV1_ENCODER_FIRSTPASS_H_ #define AOM_AV1_ENCODER_FIRSTPASS_H_ +#include "av1/common/av1_common_int.h" #include "av1/common/enums.h" -#include "av1/common/onyxc_int.h" #include "av1/encoder/lookahead.h" #include "av1/encoder/ratectrl.h" @@ -21,35 +21,7 @@ extern "C" { #endif -#if CONFIG_FP_MB_STATS - -#define FPMB_DCINTRA_MASK 0x01 - -#define FPMB_MOTION_ZERO_MASK 0x02 -#define FPMB_MOTION_LEFT_MASK 0x04 -#define FPMB_MOTION_RIGHT_MASK 0x08 -#define FPMB_MOTION_UP_MASK 0x10 -#define FPMB_MOTION_DOWN_MASK 0x20 - -#define FPMB_ERROR_SMALL_MASK 0x40 -#define FPMB_ERROR_LARGE_MASK 0x80 -#define FPMB_ERROR_SMALL_TH 2000 -#define FPMB_ERROR_LARGE_TH 48000 - -typedef struct { - uint8_t *mb_stats_start; - uint8_t *mb_stats_end; -} FIRSTPASS_MB_STATS; -#endif - -// Length of the bi-predictive frame group (BFG) -// NOTE: Currently each BFG contains one backward ref (BWF) frame plus a certain -// number of bi-predictive frames. -#define BFG_INTERVAL 2 -// The maximum number of extra ALTREF's except ALTREF_FRAME -#define MAX_EXT_ARFS (REF_FRAMES - BWDREF_FRAME - 1) - -#define MIN_EXT_ARF_INTERVAL 4 +#define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x)-0.000001 : (x) + 0.000001) #define MIN_ZERO_MOTION 0.95 #define MAX_SR_CODED_ERROR 40 @@ -59,83 +31,121 @@ typedef struct { #define VLOW_MOTION_THRESHOLD 950 typedef struct { + // Frame number in display order, if stats are for a single frame. + // No real meaning for a collection of frames. double frame; + // Weight assigned to this frame (or total weight for the collection of + // frames) currently based on intra factor and brightness factor. This is used + // to distribute bits betweeen easier and harder frames. double weight; + // Intra prediction error. double intra_error; + // Average wavelet energy computed using Discrete Wavelet Transform (DWT). double frame_avg_wavelet_energy; + // Best of intra pred error and inter pred error using last frame as ref. double coded_error; + // Best of intra pred error and inter pred error using golden frame as ref. double sr_coded_error; + // Best of intra pred error and inter pred error using altref frame as ref. + double tr_coded_error; + // Percentage of blocks with inter pred error < intra pred error. double pcnt_inter; + // Percentage of blocks using (inter prediction and) non-zero motion vectors. double pcnt_motion; + // Percentage of blocks where golden frame was better than last or intra: + // inter pred error using golden frame < inter pred error using last frame and + // inter pred error using golden frame < intra pred error double pcnt_second_ref; + // Percentage of blocks where altref frame was better than intra, last, golden + double pcnt_third_ref; + // Percentage of blocks where intra and inter prediction errors were very + // close. Note that this is a 'weighted count', that is, the so blocks may be + // weighted by how close the two errors were. double pcnt_neutral; + // Percentage of blocks that have almost no intra error residual + // (i.e. are in effect completely flat and untextured in the intra + // domain). In natural videos this is uncommon, but it is much more + // common in animations, graphics and screen content, so may be used + // as a signal to detect these types of content. double intra_skip_pct; - double inactive_zone_rows; // Image mask rows top and bottom. - double inactive_zone_cols; // Image mask columns at left and right edges. + // Image mask rows top and bottom. + double inactive_zone_rows; + // Image mask columns at left and right edges. + double inactive_zone_cols; + // Average of row motion vectors. double MVr; + // Mean of absolute value of row motion vectors. double mvr_abs; + // Mean of column motion vectors. double MVc; + // Mean of absolute value of column motion vectors. double mvc_abs; + // Variance of row motion vectors. double MVrv; + // Variance of column motion vectors. double MVcv; + // Value in range [-1,1] indicating fraction of row and column motion vectors + // that point inwards (negative MV value) or outwards (positive MV value). + // For example, value of 1 indicates, all row/column MVs are inwards. double mv_in_out_count; + // Count of unique non-zero motion vectors. double new_mv_count; + // Duration of the frame / collection of frames. double duration; + // 1.0 if stats are for a single frame, OR + // Number of frames in this collection for which the stats are accumulated. double count; // standard deviation for (0, 0) motion prediction error double raw_error_stdev; } FIRSTPASS_STATS; -typedef enum { - KF_UPDATE = 0, - LF_UPDATE = 1, - GF_UPDATE = 2, - ARF_UPDATE = 3, - OVERLAY_UPDATE = 4, - BRF_UPDATE = 5, // Backward Reference Frame - LAST_BIPRED_UPDATE = 6, // Last Bi-predictive Frame - BIPRED_UPDATE = 7, // Bi-predictive Frame, but not the last one - INTNL_OVERLAY_UPDATE = 8, // Internal Overlay Frame - INTNL_ARF_UPDATE = 9, // Internal Altref Frame (candidate for ALTREF2) - FRAME_UPDATE_TYPES = 10 -} FRAME_UPDATE_TYPE; - #define FC_ANIMATION_THRESH 0.15 -typedef enum { +enum { FC_NORMAL = 0, FC_GRAPHICS_ANIMATION = 1, FRAME_CONTENT_TYPES = 2 -} FRAME_CONTENT_TYPE; +} UENUM1BYTE(FRAME_CONTENT_TYPE); typedef struct { unsigned char index; - RATE_FACTOR_LEVEL rf_level[(MAX_LAG_BUFFERS * 2) + 1]; - FRAME_UPDATE_TYPE update_type[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char arf_src_offset[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char arf_update_idx[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char arf_ref_idx[(MAX_LAG_BUFFERS * 2) + 1]; -#if USE_SYMM_MULTI_LAYER - unsigned char arf_pos_in_gf[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char pyramid_level[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char pyramid_height; - unsigned char pyramid_lvl_nodes[MAX_PYRAMID_LVL]; -#endif - unsigned char brf_src_offset[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char bidir_pred_enabled[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char ref_fb_idx_map[(MAX_LAG_BUFFERS * 2) + 1][REF_FRAMES]; - unsigned char refresh_idx[(MAX_LAG_BUFFERS * 2) + 1]; - unsigned char refresh_flag[(MAX_LAG_BUFFERS * 2) + 1]; - int bit_allocation[(MAX_LAG_BUFFERS * 2) + 1]; + FRAME_UPDATE_TYPE update_type[MAX_STATIC_GF_GROUP_LENGTH]; + unsigned char arf_src_offset[MAX_STATIC_GF_GROUP_LENGTH]; + // The number of frames displayed so far within the GOP at a given coding + // frame. + unsigned char cur_frame_idx[MAX_STATIC_GF_GROUP_LENGTH]; + unsigned char frame_disp_idx[MAX_STATIC_GF_GROUP_LENGTH]; + int ref_frame_disp_idx[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES]; + int ref_frame_gop_idx[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES]; + + // TODO(jingning): Unify the data structure used here after the new control + // mechanism is in place. + int layer_depth[MAX_STATIC_GF_GROUP_LENGTH]; + int arf_boost[MAX_STATIC_GF_GROUP_LENGTH]; + int max_layer_depth; + int max_layer_depth_allowed; + // This is currently only populated for AOM_Q mode + unsigned char q_val[MAX_STATIC_GF_GROUP_LENGTH]; + int bit_allocation[MAX_STATIC_GF_GROUP_LENGTH]; + int size; } GF_GROUP; typedef struct { + FIRSTPASS_STATS *stats_in_start; + FIRSTPASS_STATS *stats_in_end; + FIRSTPASS_STATS *stats_in_buf_end; + FIRSTPASS_STATS *total_stats; + FIRSTPASS_STATS *total_left_stats; +} STATS_BUFFER_CTX; + +typedef struct { unsigned int section_intra_rating; - FIRSTPASS_STATS total_stats; - FIRSTPASS_STATS this_frame_stats; + // Circular queue of first pass stats stored for most recent frames. + // cpi->output_pkt_list[i].data.twopass_stats.buf points to actual data stored + // here. + FIRSTPASS_STATS *frame_stats_arr[MAX_LAP_BUFFERS + 1]; + int frame_stats_next_idx; // Index to next unused element in frame_stats_arr. const FIRSTPASS_STATS *stats_in; - const FIRSTPASS_STATS *stats_in_start; - const FIRSTPASS_STATS *stats_in_end; - FIRSTPASS_STATS total_left_stats; + STATS_BUFFER_CTX *stats_buf_ctx; int first_pass_done; int64_t bits_left; double modified_error_min; @@ -144,11 +154,6 @@ typedef struct { double mb_av_energy; double frame_avg_haar_energy; -#if CONFIG_FP_MB_STATS - uint8_t *frame_mb_stats_buf; - uint8_t *this_frame_mb_stats; - FIRSTPASS_MB_STATS firstpass_mb_stats; -#endif // An indication of the content type of the current frame FRAME_CONTENT_TYPE fr_content_type; @@ -158,48 +163,31 @@ typedef struct { // Error score of frames still to be coded in kf group int64_t kf_group_error_left; - // The fraction for a kf groups total bits allocated to the inter frames - double kfgroup_inter_fraction; + // Over time correction for bits per macro block estimation + double bpm_factor; + + // Record of target and actual bits spent in current ARF group + int rolling_arf_group_target_bits; + int rolling_arf_group_actual_bits; int sr_update_lag; int kf_zeromotion_pct; int last_kfgroup_zeromotion_pct; - int gf_zeromotion_pct; - int active_worst_quality; - int baseline_active_worst_quality; int extend_minq; int extend_maxq; int extend_minq_fast; - - GF_GROUP gf_group; } TWO_PASS; struct AV1_COMP; +struct EncodeFrameParams; +struct AV1EncoderConfig; -void av1_init_first_pass(struct AV1_COMP *cpi); void av1_rc_get_first_pass_params(struct AV1_COMP *cpi); -void av1_first_pass(struct AV1_COMP *cpi, const struct lookahead_entry *source); +void av1_first_pass(struct AV1_COMP *cpi, const int64_t ts_duration); void av1_end_first_pass(struct AV1_COMP *cpi); -void av1_init_second_pass(struct AV1_COMP *cpi); -void av1_rc_get_second_pass_params(struct AV1_COMP *cpi); -void av1_configure_buffer_updates_firstpass(struct AV1_COMP *cpi, - FRAME_UPDATE_TYPE update_type); - -// Post encode update of the rate control parameters for 2-pass -void av1_twopass_postencode_update(struct AV1_COMP *cpi); - -static INLINE int get_number_of_extra_arfs(int interval, int arf_pending) { - if (arf_pending && MAX_EXT_ARFS > 0) - return interval >= MIN_EXT_ARF_INTERVAL * (MAX_EXT_ARFS + 1) - ? MAX_EXT_ARFS - : interval >= MIN_EXT_ARF_INTERVAL * MAX_EXT_ARFS - ? MAX_EXT_ARFS - 1 - : 0; - else - return 0; -} +void av1_twopass_zero_stats(FIRSTPASS_STATS *section); #ifdef __cplusplus } // extern "C" |