summaryrefslogtreecommitdiff
path: root/media/libaom/src/av1/encoder/firstpass.h
diff options
context:
space:
mode:
Diffstat (limited to 'media/libaom/src/av1/encoder/firstpass.h')
-rw-r--r--media/libaom/src/av1/encoder/firstpass.h192
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 4b7325ae21..99d4445395 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"