tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

firstpass.h (19268B)


      1 /*
      2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
      3 *
      4 * This source code is subject to the terms of the BSD 2 Clause License and
      5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6 * was not distributed with this source code in the LICENSE file, you can
      7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8 * Media Patent License 1.0 was not distributed with this source code in the
      9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10 */
     11 
     12 #ifndef AOM_AV1_ENCODER_FIRSTPASS_H_
     13 #define AOM_AV1_ENCODER_FIRSTPASS_H_
     14 
     15 #include <stdbool.h>
     16 
     17 #include "av1/common/av1_common_int.h"
     18 #include "av1/common/enums.h"
     19 #include "av1/encoder/lookahead.h"
     20 #include "av1/encoder/ratectrl.h"
     21 
     22 #ifdef __cplusplus
     23 extern "C" {
     24 #endif
     25 
     26 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001)
     27 
     28 #define MIN_ZERO_MOTION 0.95
     29 #define MAX_SR_CODED_ERROR 40
     30 #define MAX_RAW_ERR_VAR 2000
     31 #define MIN_MV_IN_OUT 0.4
     32 
     33 #define VLOW_MOTION_THRESHOLD 950
     34 struct ThreadData;
     35 
     36 /*!
     37 * \brief The stucture of acummulated frame stats in the first pass.
     38 *
     39 * Errors (coded_error, intra_error, etc.) and counters (new_mv_count) are
     40 * normalized to each MB. MV related stats (MVc, MVr, etc.) are normalized to
     41 * the frame width and height. See function normalize_firstpass_stats.
     42 */
     43 typedef struct FIRSTPASS_STATS {
     44  /*!
     45   * Frame number in display order, if stats are for a single frame.
     46   * No real meaning for a collection of frames.
     47   */
     48  double frame;
     49  /*!
     50   * Weight assigned to this frame (or total weight for the collection of
     51   * frames) currently based on intra factor and brightness factor. This is used
     52   * to distribute bits betweeen easier and harder frames.
     53   */
     54  double weight;
     55  /*!
     56   * Intra prediction error.
     57   */
     58  double intra_error;
     59  /*!
     60   * Average wavelet energy computed using Discrete Wavelet Transform (DWT).
     61   */
     62  double frame_avg_wavelet_energy;
     63  /*!
     64   * Best of intra pred error and inter pred error using last frame as ref.
     65   */
     66  double coded_error;
     67  /*!
     68   * Best of intra pred error and inter pred error using golden frame as ref.
     69   */
     70  double sr_coded_error;
     71  /*!
     72   * Percentage of blocks with inter pred error < intra pred error.
     73   */
     74  double pcnt_inter;
     75  /*!
     76   * Percentage of blocks using (inter prediction and) non-zero motion vectors.
     77   */
     78  double pcnt_motion;
     79  /*!
     80   * Percentage of blocks where golden frame was better than last or intra:
     81   * inter pred error using golden frame < inter pred error using last frame and
     82   * inter pred error using golden frame < intra pred error
     83   */
     84  double pcnt_second_ref;
     85  /*!
     86   * Percentage of blocks where intra and inter prediction errors were very
     87   * close. Note that this is a 'weighted count', that is, the so blocks may be
     88   * weighted by how close the two errors were.
     89   */
     90  double pcnt_neutral;
     91  /*!
     92   * Percentage of blocks that have almost no intra error residual
     93   * (i.e. are in effect completely flat and untextured in the intra
     94   * domain). In natural videos this is uncommon, but it is much more
     95   * common in animations, graphics and screen content, so may be used
     96   * as a signal to detect these types of content.
     97   */
     98  double intra_skip_pct;
     99  /*!
    100   * Image mask rows top and bottom.
    101   */
    102  double inactive_zone_rows;
    103  /*!
    104   * Image mask columns at left and right edges.
    105   */
    106  double inactive_zone_cols;
    107  /*!
    108   * Average of row motion vectors.
    109   */
    110  double MVr;
    111  /*!
    112   * Mean of absolute value of row motion vectors.
    113   */
    114  double mvr_abs;
    115  /*!
    116   * Mean of column motion vectors.
    117   */
    118  double MVc;
    119  /*!
    120   * Mean of absolute value of column motion vectors.
    121   */
    122  double mvc_abs;
    123  /*!
    124   * Variance of row motion vectors.
    125   */
    126  double MVrv;
    127  /*!
    128   * Variance of column motion vectors.
    129   */
    130  double MVcv;
    131  /*!
    132   * Value in range [-1,1] indicating fraction of row and column motion vectors
    133   * that point inwards (negative MV value) or outwards (positive MV value).
    134   * For example, value of 1 indicates, all row/column MVs are inwards.
    135   */
    136  double mv_in_out_count;
    137  /*!
    138   * Count of unique non-zero motion vectors.
    139   */
    140  double new_mv_count;
    141  /*!
    142   * Duration of the frame / collection of frames.
    143   */
    144  double duration;
    145  /*!
    146   * 1.0 if stats are for a single frame, OR
    147   * Number of frames in this collection for which the stats are accumulated.
    148   */
    149  double count;
    150  /*!
    151   * standard deviation for (0, 0) motion prediction error
    152   */
    153  double raw_error_stdev;
    154  /*!
    155   * Whether the frame contains a flash
    156   */
    157  int64_t is_flash;
    158  /*!
    159   * Estimated noise variance
    160   */
    161  double noise_var;
    162  /*!
    163   * Correlation coefficient with the previous frame
    164   */
    165  double cor_coeff;
    166  /*!
    167   * log of intra_error
    168   */
    169  double log_intra_error;
    170  /*!
    171   * log of coded_error
    172   */
    173  double log_coded_error;
    174 } FIRSTPASS_STATS;
    175 
    176 // We want to keep one past stats for key frame detection
    177 // in test_candidate_kf()
    178 #define FIRSTPASS_INFO_STATS_PAST_MIN 1
    179 
    180 // The size of static buffer used in FIRSTPASS_INFO.
    181 #define FIRSTPASS_INFO_STATIC_BUF_SIZE \
    182  (MAX_LAP_BUFFERS + FIRSTPASS_INFO_STATS_PAST_MIN)
    183 
    184 /*!
    185 * \brief  Data structure used for managing first pass stats
    186 */
    187 typedef struct {
    188  /*!
    189   * A static buffer that will be used when no ext_stats_buf is assigned. The
    190   * ext_stats_buf is assigned through av1_firstpass_info_init() when the user
    191   * already has a pre-existing firstpass stats that is stored in an external
    192   * buffer. The ext_stats_buf is usually used in two pass mode. When using one
    193   * pass mode, we generate "firstpass" stats and encode the video in the same
    194   * pass. In this scenario, the stats will be pushed and popped from
    195   * static_stats_buf.
    196   */
    197  FIRSTPASS_STATS static_stats_buf[FIRSTPASS_INFO_STATIC_BUF_SIZE];
    198  /*!
    199   * A pointer to first pass stats.
    200   * Note that this buffer will be used as ring buffer.
    201   */
    202  FIRSTPASS_STATS *stats_buf;
    203  /*!
    204   * size of stats_buf
    205   */
    206  int stats_buf_size;
    207  /*!
    208   * start index of the available frame stats
    209   * Note that start_index doesn't always point to
    210   * current frame's stats because we need to
    211   * keep past stats as well. To access current
    212   * frame's stats, please use cur_index.
    213   */
    214  int start_index;
    215 
    216  /*!
    217   * count available stats stored in stats_buf
    218   * the following condition should stay true
    219   * stats_count = future_stats_count + past_stats_count
    220   */
    221  int stats_count;
    222 
    223  /*!
    224   *  index of the current frame's stats
    225   */
    226  int cur_index;
    227 
    228  /*!
    229   * count available future stats including current stats
    230   */
    231  int future_stats_count;
    232 
    233  /*!
    234   * count available past stats EXCLUDING current stats
    235   */
    236  int past_stats_count;
    237 
    238  /*!
    239   * Accumulation of the stats being pushed into firstpass_info
    240   */
    241  FIRSTPASS_STATS total_stats;
    242 } FIRSTPASS_INFO;
    243 
    244 /*!\brief Init firstpass_info
    245 *
    246 * If using ext_stats_buf, the buffer needs to stay available during encoding
    247 * process.
    248 *
    249 * \ingroup rate_control
    250 * \param[out]   firstpass_info      struct of firstpass_info.
    251 * \param[in]    ext_stats_buf       external stats buffer. Pass in NULL if
    252 *                                   choose to use internal static_stats_buf.
    253 * \param[in]    ext_stats_buf_size  external stats buffer size. Pass in 0 if
    254 * choose to use internal static_stats_buf. \return status
    255 */
    256 aom_codec_err_t av1_firstpass_info_init(FIRSTPASS_INFO *firstpass_info,
    257                                        FIRSTPASS_STATS *ext_stats_buf,
    258                                        int ext_stats_buf_size);
    259 
    260 /*!\brief Move cur_index by 1
    261 *
    262 * \ingroup rate_control
    263 * \param[out]   firstpass_info      struct of firstpass_info.
    264 * \return status
    265 */
    266 aom_codec_err_t av1_firstpass_info_move_cur_index(
    267    FIRSTPASS_INFO *firstpass_info);
    268 
    269 /*!\brief Pop a stats from firstpass_info
    270 *
    271 * \ingroup rate_control
    272 * \param[out]   firstpass_info      struct of firstpass_info.
    273 * \return status
    274 */
    275 aom_codec_err_t av1_firstpass_info_pop(FIRSTPASS_INFO *firstpass_info);
    276 
    277 /*!\brief Move cur_index by 1 and pop a stats from firstpass_info
    278 *
    279 * \ingroup rate_control
    280 * \param[out]   firstpass_info      struct of firstpass_info.
    281 * \return status
    282 */
    283 aom_codec_err_t av1_firstpass_info_move_cur_index_and_pop(
    284    FIRSTPASS_INFO *firstpass_info);
    285 
    286 /*!\brief Push a stats into firstpass_info
    287 *
    288 * Note that the input stats will be copied into firstpass_info.
    289 * \ingroup rate_control
    290 * \param[out]  firstpass_info      struct of firstpass_info.
    291 * \param[in]   input_stats         input stats
    292 * \return status
    293 */
    294 aom_codec_err_t av1_firstpass_info_push(FIRSTPASS_INFO *firstpass_info,
    295                                        const FIRSTPASS_STATS *input_stats);
    296 
    297 /*!\brief Peek at a stats from firstpass_info
    298 *
    299 * The target index is as follows.
    300 * (cur_index + offset_from_cur) % firstpass_info->stats_buf_size
    301 *
    302 * \ingroup rate_control
    303 * \param[in]  firstpass_info      struct of firstpass_info.
    304 * \param[in]  offset_from_cur  index offset from cur_index.
    305 * \return pointer to the stats. The pointer will be NULL if
    306 *         stats_index_offset is invalid.
    307 */
    308 const FIRSTPASS_STATS *av1_firstpass_info_peek(
    309    const FIRSTPASS_INFO *firstpass_info, int offset_from_cur);
    310 
    311 /*!\brief Count the future stats from the target in firstpass_info
    312 * Note that the target stats will be counted as well.
    313 * The target index is as follows.
    314 * (cur_index + offset_from_cur) % firstpass_info->stats_buf_size
    315 *
    316 * \ingroup rate_control
    317 * \param[in]  firstpass_info    struct of firstpass_info.
    318 * \param[in]  offset_from_cur  target stats's inffset
    319 *                               from cur_index.
    320 * \return Number of stats in the future after the target stats
    321 *         including itself.
    322 */
    323 int av1_firstpass_info_future_count(const FIRSTPASS_INFO *firstpass_info,
    324                                    int offset_from_cur);
    325 
    326 /*!\cond */
    327 #define FC_ANIMATION_THRESH 0.15
    328 enum {
    329  FC_NORMAL = 0,
    330  FC_GRAPHICS_ANIMATION = 1,
    331  FRAME_CONTENT_TYPES = 2
    332 } UENUM1BYTE(FRAME_CONTENT_TYPE);
    333 /*!\endcond */
    334 
    335 /*!
    336 * \brief  Data related to the current GF/ARF group and the
    337 * individual frames within the group
    338 */
    339 typedef struct GF_GROUP {
    340  /*!\cond */
    341  // Frame update type, e.g. ARF/GF/LF/Overlay
    342  FRAME_UPDATE_TYPE update_type[MAX_STATIC_GF_GROUP_LENGTH];
    343  unsigned char arf_src_offset[MAX_STATIC_GF_GROUP_LENGTH];
    344  // The number of frames displayed so far within the GOP at a given coding
    345  // frame.
    346  unsigned char cur_frame_idx[MAX_STATIC_GF_GROUP_LENGTH];
    347  int layer_depth[MAX_STATIC_GF_GROUP_LENGTH];
    348  int arf_boost[MAX_STATIC_GF_GROUP_LENGTH];
    349  int max_layer_depth;
    350  int max_layer_depth_allowed;
    351  // This is currently only populated for AOM_Q mode
    352  int q_val[MAX_STATIC_GF_GROUP_LENGTH];
    353  int rdmult_val[MAX_STATIC_GF_GROUP_LENGTH];
    354  int bit_allocation[MAX_STATIC_GF_GROUP_LENGTH];
    355  // The frame coding type - inter/intra frame
    356  FRAME_TYPE frame_type[MAX_STATIC_GF_GROUP_LENGTH];
    357  // The reference frame buffer control - update or reset
    358  REFBUF_STATE refbuf_state[MAX_STATIC_GF_GROUP_LENGTH];
    359  int arf_index;  // the index in the gf group of ARF, if no arf, then -1
    360  int size;       // The total length of a GOP
    361 
    362  // The offset into lookahead_ctx for choosing
    363  // source of frame parallel encodes.
    364  int src_offset[MAX_STATIC_GF_GROUP_LENGTH];
    365  // Stores the display order hint of each frame in the current GF_GROUP.
    366  int display_idx[MAX_STATIC_GF_GROUP_LENGTH];
    367 
    368  // The reference frame list maps the reference frame indexes to its
    369  // buffer index in the decoded buffer. A value of -1 means the
    370  // corresponding reference frame index doesn't point towards any
    371  // previously decoded frame.
    372  int8_t ref_frame_list[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES];
    373  // Update frame index
    374  int update_ref_idx[MAX_STATIC_GF_GROUP_LENGTH];
    375  // The map_idx of primary reference
    376  int primary_ref_idx[MAX_STATIC_GF_GROUP_LENGTH];
    377 
    378  // Indicates the level of parallelism in frame parallel encodes.
    379  // 0 : frame is independently encoded (not part of parallel encodes).
    380  // 1 : frame is the first in encode order in a given parallel encode set.
    381  // 2 : frame occurs later in encode order in a given parallel encode set.
    382  int frame_parallel_level[MAX_STATIC_GF_GROUP_LENGTH];
    383  // Indicates whether a frame should act as non-reference frame.
    384  bool is_frame_non_ref[MAX_STATIC_GF_GROUP_LENGTH];
    385  // Indicates whether a frame is dropped.
    386  bool is_frame_dropped[MAX_STATIC_GF_GROUP_LENGTH];
    387 
    388  // Stores the display order hint of the frames not to be
    389  // refreshed by the current frame.
    390  int skip_frame_refresh[MAX_STATIC_GF_GROUP_LENGTH][REF_FRAMES];
    391  // Stores the display order hint of the frame to be excluded during reference
    392  // assignment.
    393  int skip_frame_as_ref[MAX_STATIC_GF_GROUP_LENGTH];
    394  // Indicates whether a switch frame is due.
    395  bool is_sframe_due;
    396  /*!\endcond */
    397 } GF_GROUP;
    398 /*!\cond */
    399 
    400 typedef struct {
    401  // Track if the last frame in a GOP has higher quality.
    402  int arf_gf_boost_lst;
    403 } GF_STATE;
    404 
    405 typedef struct {
    406  FIRSTPASS_STATS *stats_in_start;
    407  FIRSTPASS_STATS *stats_in_end;
    408  FIRSTPASS_STATS *stats_in_buf_end;
    409  FIRSTPASS_STATS *total_stats;
    410  FIRSTPASS_STATS *total_left_stats;
    411 } STATS_BUFFER_CTX;
    412 
    413 /*!\endcond */
    414 
    415 /*!
    416 * \brief Two pass status and control data.
    417 */
    418 typedef struct {
    419  /*!\cond */
    420  unsigned int section_intra_rating;
    421  // Circular queue of first pass stats stored for most recent frames.
    422  // cpi->output_pkt_list[i].data.twopass_stats.buf points to actual data stored
    423  // here.
    424  FIRSTPASS_STATS *frame_stats_arr[MAX_LAP_BUFFERS + 1];
    425  int frame_stats_next_idx;  // Index to next unused element in frame_stats_arr.
    426  STATS_BUFFER_CTX *stats_buf_ctx;
    427  FIRSTPASS_INFO firstpass_info;  // This is the first pass data structure
    428                                  // intended to replace stats_in
    429  int first_pass_done;
    430  int64_t bits_left;
    431  double modified_error_min;
    432  double modified_error_max;
    433  double modified_error_left;
    434 
    435  // Projected total bits available for a key frame group of frames
    436  int64_t kf_group_bits;
    437 
    438  // Error score of frames still to be coded in kf group
    439  double kf_group_error_left;
    440 
    441  // Over time correction for bits per macro block estimation
    442  double bpm_factor;
    443 
    444  // Record of target and actual bits spent in current ARF group
    445  int rolling_arf_group_target_bits;
    446  int rolling_arf_group_actual_bits;
    447 
    448  int sr_update_lag;
    449 
    450  int kf_zeromotion_pct;
    451  int last_kfgroup_zeromotion_pct;
    452  int extend_minq;
    453  int extend_maxq;
    454  /*!\endcond */
    455 } TWO_PASS;
    456 
    457 /*!
    458 * \brief Frame level Two pass status and control data.
    459 */
    460 typedef struct {
    461  /*!\cond */
    462  const FIRSTPASS_STATS *stats_in;
    463  // Pointer to the stats of the current frame.
    464  const FIRSTPASS_STATS *this_frame;
    465  double mb_av_energy;
    466  // An indication of the content type of the current frame
    467  FRAME_CONTENT_TYPE fr_content_type;
    468  double frame_avg_haar_energy;
    469  /*!\endcond */
    470 } TWO_PASS_FRAME;
    471 
    472 /*!\cond */
    473 
    474 // This structure contains several key parameters to be accumulated for this
    475 // frame.
    476 typedef struct {
    477  // Intra prediction error.
    478  int64_t intra_error;
    479  // Average wavelet energy computed using Discrete Wavelet Transform (DWT).
    480  int64_t frame_avg_wavelet_energy;
    481  // Best of intra pred error and inter pred error using last frame as ref.
    482  int64_t coded_error;
    483  // Best of intra pred error and inter pred error using golden frame as ref.
    484  int64_t sr_coded_error;
    485  // Count of motion vector.
    486  int mv_count;
    487  // Count of blocks that pick inter prediction (inter pred error is smaller
    488  // than intra pred error).
    489  int inter_count;
    490  // Count of blocks that pick second ref (golden frame).
    491  int second_ref_count;
    492  // Count of blocks where the inter and intra are very close and very low.
    493  double neutral_count;
    494  // Count of blocks where intra error is very small.
    495  int intra_skip_count;
    496  // Start row.
    497  int image_data_start_row;
    498  // Count of unique non-zero motion vectors.
    499  int new_mv_count;
    500  // Sum of inward motion vectors.
    501  int sum_in_vectors;
    502  // Sum of motion vector row.
    503  int sum_mvr;
    504  // Sum of motion vector column.
    505  int sum_mvc;
    506  // Sum of absolute value of motion vector row.
    507  int sum_mvr_abs;
    508  // Sum of absolute value of motion vector column.
    509  int sum_mvc_abs;
    510  // Sum of the square of motion vector row.
    511  int64_t sum_mvrs;
    512  // Sum of the square of motion vector column.
    513  int64_t sum_mvcs;
    514  // A factor calculated using intra pred error.
    515  double intra_factor;
    516  // A factor that measures brightness.
    517  double brightness_factor;
    518 } FRAME_STATS;
    519 
    520 // This structure contains first pass data.
    521 typedef struct {
    522  // Buffer holding frame stats for all MACROBLOCKs.
    523  // mb_stats[i] stores the FRAME_STATS of the ith
    524  // MB in raster scan order.
    525  FRAME_STATS *mb_stats;
    526  // Buffer to store the prediction error of the (0,0) motion
    527  // vector using the last source frame as the reference.
    528  // raw_motion_err_list[i] stores the raw_motion_err of
    529  // the ith MB in raster scan order.
    530  int *raw_motion_err_list;
    531 } FirstPassData;
    532 
    533 struct AV1_COMP;
    534 struct EncodeFrameParams;
    535 struct AV1EncoderConfig;
    536 struct TileDataEnc;
    537 
    538 static inline int is_fp_wavelet_energy_invalid(
    539    const FIRSTPASS_STATS *fp_stats) {
    540  assert(fp_stats != NULL);
    541  return (fp_stats->frame_avg_wavelet_energy < 0);
    542 }
    543 
    544 static inline BLOCK_SIZE get_fp_block_size(int is_screen_content_type) {
    545  return (is_screen_content_type ? BLOCK_8X8 : BLOCK_16X16);
    546 }
    547 
    548 int av1_get_unit_rows_in_tile(const TileInfo *tile,
    549                              const BLOCK_SIZE fp_block_size);
    550 int av1_get_unit_cols_in_tile(const TileInfo *tile,
    551                              const BLOCK_SIZE fp_block_size);
    552 
    553 void av1_first_pass_row(struct AV1_COMP *cpi, struct ThreadData *td,
    554                        struct TileDataEnc *tile_data, const int mb_row,
    555                        const BLOCK_SIZE fp_block_size);
    556 void av1_end_first_pass(struct AV1_COMP *cpi);
    557 
    558 void av1_free_firstpass_data(FirstPassData *firstpass_data);
    559 
    560 void av1_twopass_zero_stats(FIRSTPASS_STATS *section);
    561 void av1_accumulate_stats(FIRSTPASS_STATS *section,
    562                          const FIRSTPASS_STATS *frame);
    563 /*!\endcond */
    564 
    565 /*!\brief AV1 first pass encoding.
    566 *
    567 * \ingroup rate_control
    568 * This function is the first encoding pass for the two pass encoding mode.
    569 * It encodes the whole video and collect essential information.
    570 * Two pass encoding is an encoding mode in the reference software (libaom)
    571 * of AV1 for high performance encoding. The first pass is a fast encoding
    572 * process to collect essential information to help the second pass make
    573 * encoding decisions and improve coding quality. The collected stats is used
    574 * in rate control, for example, to determine frame cut, the position of
    575 * alternative reference frame (ARF), etc.
    576 *
    577 * \param[in]    cpi            Top-level encoder structure
    578 * \param[in]    ts_duration    Duration of the frame / collection of frames
    579 *
    580 * \remark Nothing is returned. Instead, the "TWO_PASS" structure inside "cpi"
    581 * is modified to store information computed in this function.
    582 */
    583 void av1_first_pass(struct AV1_COMP *cpi, const int64_t ts_duration);
    584 
    585 void av1_noop_first_pass_frame(struct AV1_COMP *cpi, const int64_t ts_duration);
    586 #ifdef __cplusplus
    587 }  // extern "C"
    588 #endif
    589 
    590 #endif  // AOM_AV1_ENCODER_FIRSTPASS_H_