kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 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_VAR_BASED_PART_H_ |
| 13 | #define AOM_AV1_ENCODER_VAR_BASED_PART_H_ |
| 14 | |
| 15 | #include <stdio.h> |
| 16 | |
| 17 | #include "config/aom_config.h" |
| 18 | #include "config/aom_dsp_rtcd.h" |
| 19 | #include "config/av1_rtcd.h" |
| 20 | |
| 21 | #include "av1/encoder/encoder.h" |
| 22 | |
Narayan Kalaburgi | 238db83 | 2022-12-20 11:43:45 +0530 | [diff] [blame] | 23 | // Calculate block index x and y from split level and index |
| 24 | #define GET_BLK_IDX_X(idx, level) (((idx) & (0x01)) << (level)) |
| 25 | #define GET_BLK_IDX_Y(idx, level) (((idx) >> (0x01)) << (level)) |
| 26 | |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 27 | #ifdef __cplusplus |
| 28 | extern "C" { |
| 29 | #endif |
| 30 | |
Fyodor Kyslov | 766f43c | 2020-09-02 14:04:54 -0700 | [diff] [blame] | 31 | #define QINDEX_LARGE_BLOCK_THR \ |
| 32 | 100 // Use increased thresholds for midres for speed 9 when qindex is above |
| 33 | // this threshold |
Michael Horowitz | 85a9314 | 2019-10-16 15:07:28 -0500 | [diff] [blame] | 34 | |
Ranjit Kumar Tulabandu | cd4a307 | 2022-09-02 15:53:57 +0530 | [diff] [blame] | 35 | #define CALC_CHROMA_THRESH_FOR_ZEROMV_SKIP(thresh_exit_part) \ |
| 36 | ((3 * (thresh_exit_part)) >> 2) |
Marco Paniconi | 08f71f2 | 2020-07-14 10:41:47 -0700 | [diff] [blame] | 37 | /*!\brief Set the thresholds for variance based partition. |
| 38 | * |
| 39 | * Set the variance split thresholds for following the block sizes: |
| 40 | * 0 - threshold_128x128, 1 - threshold_64x64, 2 - threshold_32x32, |
| 41 | * 3 - vbp_threshold_16x16. 4 - vbp_threshold_8x8 (to split to 4x4 partition) is |
| 42 | * currently only used on key frame. The thresholds are based om Q, resolution, |
| 43 | * noise level, and content state. |
| 44 | * |
| 45 | * \ingroup variance_partition |
| 46 | * \callgraph |
| 47 | * \callergraph |
| 48 | * |
Marco Paniconi | 988b34a | 2020-11-09 12:41:13 -0800 | [diff] [blame] | 49 | * \param[in] cpi Top level encoder structure |
| 50 | * \param[in] q q index |
| 51 | * \param[in] content_lowsumdiff Low sumdiff flag for superblock |
Marco Paniconi | 08f71f2 | 2020-07-14 10:41:47 -0700 | [diff] [blame] | 52 | * |
Wan-Teh Chang | 0defff8 | 2022-08-23 14:17:01 -0700 | [diff] [blame] | 53 | * \remark Returns the set of thresholds in \c cpi->vbp_info.thresholds. |
Marco Paniconi | 08f71f2 | 2020-07-14 10:41:47 -0700 | [diff] [blame] | 54 | */ |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 55 | void av1_set_variance_partition_thresholds(AV1_COMP *cpi, int q, |
Marco Paniconi | 988b34a | 2020-11-09 12:41:13 -0800 | [diff] [blame] | 56 | int content_lowsumdiff); |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 57 | |
Marco Paniconi | 08f71f2 | 2020-07-14 10:41:47 -0700 | [diff] [blame] | 58 | /*!\brief Variance based partition selection. |
| 59 | * |
| 60 | * Select the partitioning based on the variance of the residual signal, |
| 61 | * residual generated as the difference between the source and prediction. |
| 62 | * The prediction is the reconstructed LAST or reconstructed GOLDEN, whichever |
| 63 | * has lower y sad. For LAST, option exists (speed feature) to use motion |
| 64 | * compensation based on superblock motion via int_pro_motion_estimation. For |
| 65 | * key frames reference is fixed 128 level, so variance is the source variance. |
| 66 | * The variance is computed for downsampled inputs (8x8 or 4x4 downsampled), |
| 67 | * and selection is done top-down via as set of partition thresholds. defined |
| 68 | * for each block level, and set based on Q, resolution, noise level, and |
| 69 | * content state. |
| 70 | * |
| 71 | * \ingroup variance_partition |
| 72 | * \callgraph |
| 73 | * \callergraph |
| 74 | * |
| 75 | * \param[in] cpi Top level encoder structure |
| 76 | * \param[in] tile Pointer to TileInfo |
| 77 | * \param[in] td Pointer to ThreadData |
| 78 | * \param[in] x Pointer to MACROBLOCK |
| 79 | * \param[in] mi_row Row coordinate of the superblock in a step |
| 80 | size of MI_SIZE |
| 81 | * \param[in] mi_col Column coordinate of the super block in a step |
| 82 | size of MI_SIZE |
| 83 | * |
| 84 | * \return Returns the partition in \c xd->mi[0]->sb_type. Also sets the low |
| 85 | * temporal variance flag and the color sensitivity flag (both used in |
| 86 | * nonrd_pickmode). |
| 87 | */ |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 88 | int av1_choose_var_based_partitioning(AV1_COMP *cpi, const TileInfo *const tile, |
Fyodor Kyslov | 166648a | 2020-03-18 16:15:27 -0700 | [diff] [blame] | 89 | ThreadData *td, MACROBLOCK *x, int mi_row, |
| 90 | int mi_col); |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 91 | |
Yunqing Wang | 61a7598 | 2021-10-13 12:01:11 -0700 | [diff] [blame] | 92 | // Read out the block's temporal variance for 64x64 SB case. |
| 93 | int av1_get_force_skip_low_temp_var_small_sb(const uint8_t *variance_low, |
| 94 | int mi_row, int mi_col, |
| 95 | BLOCK_SIZE bsize); |
| 96 | // Read out the block's temporal variance for 128x128 SB case. |
| 97 | int av1_get_force_skip_low_temp_var(const uint8_t *variance_low, int mi_row, |
| 98 | int mi_col, BLOCK_SIZE bsize); |
| 99 | |
kyslov | 7b9d0d6 | 2018-12-21 11:12:26 -0800 | [diff] [blame] | 100 | #ifdef __cplusplus |
| 101 | } // extern "C" |
| 102 | #endif |
| 103 | |
| 104 | #endif // AOM_AV1_ENCODER_VAR_BASED_PART_H_ |