Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 1 | /* |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 2 | * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 3 | * |
Yaowu Xu | 2ab7ff0 | 2016-09-02 12:04:54 -0700 | [diff] [blame] | 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. |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 10 | */ |
| 11 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 12 | #ifndef AV1_ENCODER_RD_H_ |
| 13 | #define AV1_ENCODER_RD_H_ |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 14 | |
| 15 | #include <limits.h> |
| 16 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 17 | #include "av1/common/blockd.h" |
| 18 | |
| 19 | #include "av1/encoder/block.h" |
| 20 | #include "av1/encoder/context_tree.h" |
| 21 | #include "av1/encoder/cost.h" |
| 22 | |
| 23 | #ifdef __cplusplus |
| 24 | extern "C" { |
| 25 | #endif |
| 26 | |
| 27 | #define RDDIV_BITS 7 |
| 28 | #define RD_EPB_SHIFT 6 |
| 29 | |
Urvang Joshi | 70006e4 | 2017-06-14 16:08:55 -0700 | [diff] [blame] | 30 | #define RDCOST(RM, R, D) \ |
| 31 | (ROUND_POWER_OF_TWO(((int64_t)R) * (RM), AV1_PROB_COST_SHIFT) + \ |
Yaowu Xu | bb61778 | 2018-01-18 09:49:29 -0800 | [diff] [blame] | 32 | (D * (1 << RDDIV_BITS))) |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 33 | |
Urvang Joshi | 70006e4 | 2017-06-14 16:08:55 -0700 | [diff] [blame] | 34 | #define RDCOST_DBL(RM, R, D) \ |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 35 | (((((double)(R)) * (RM)) / (double)(1 << AV1_PROB_COST_SHIFT)) + \ |
Urvang Joshi | 70006e4 | 2017-06-14 16:08:55 -0700 | [diff] [blame] | 36 | ((double)(D) * (1 << RDDIV_BITS))) |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 37 | |
| 38 | #define QIDX_SKIP_THRESH 115 |
| 39 | |
| 40 | #define MV_COST_WEIGHT 108 |
| 41 | #define MV_COST_WEIGHT_SUB 120 |
| 42 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 43 | #define RD_THRESH_MAX_FACT 64 |
| 44 | #define RD_THRESH_INC 1 |
| 45 | |
| 46 | // This enumerator type needs to be kept aligned with the mode order in |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 47 | // const MODE_DEFINITION av1_mode_order[MAX_MODES] used in the rd code. |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 48 | typedef enum { |
| 49 | THR_NEARESTMV, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 50 | THR_NEARESTL2, |
| 51 | THR_NEARESTL3, |
| 52 | THR_NEARESTB, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 53 | THR_NEARESTA2, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 54 | THR_NEARESTA, |
| 55 | THR_NEARESTG, |
| 56 | |
| 57 | THR_DC, |
| 58 | |
| 59 | THR_NEWMV, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 60 | THR_NEWL2, |
| 61 | THR_NEWL3, |
| 62 | THR_NEWB, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 63 | THR_NEWA2, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 64 | THR_NEWA, |
| 65 | THR_NEWG, |
| 66 | |
| 67 | THR_NEARMV, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 68 | THR_NEARL2, |
| 69 | THR_NEARL3, |
| 70 | THR_NEARB, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 71 | THR_NEARA2, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 72 | THR_NEARA, |
| 73 | THR_NEARG, |
| 74 | |
Sarah Parker | 2b9ec2e | 2017-10-30 17:34:08 -0700 | [diff] [blame] | 75 | THR_GLOBALMV, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 76 | THR_GLOBALL2, |
| 77 | THR_GLOBALL3, |
| 78 | THR_GLOBALB, |
| 79 | THR_GLOBALA2, |
| 80 | THR_GLOBALA, |
| 81 | THR_GLOBALG, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 82 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 83 | THR_COMP_NEAREST_NEARESTLA, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 84 | THR_COMP_NEAREST_NEARESTL2A, |
| 85 | THR_COMP_NEAREST_NEARESTL3A, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 86 | THR_COMP_NEAREST_NEARESTGA, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 87 | THR_COMP_NEAREST_NEARESTLB, |
| 88 | THR_COMP_NEAREST_NEARESTL2B, |
| 89 | THR_COMP_NEAREST_NEARESTL3B, |
| 90 | THR_COMP_NEAREST_NEARESTGB, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 91 | THR_COMP_NEAREST_NEARESTLA2, |
| 92 | THR_COMP_NEAREST_NEARESTL2A2, |
| 93 | THR_COMP_NEAREST_NEARESTL3A2, |
| 94 | THR_COMP_NEAREST_NEARESTGA2, |
Zoe Liu | c082bbc | 2017-05-17 13:31:37 -0700 | [diff] [blame] | 95 | #if CONFIG_EXT_COMP_REFS |
| 96 | THR_COMP_NEAREST_NEARESTLL2, |
Zoe Liu | fcf5fa2 | 2017-06-26 16:00:38 -0700 | [diff] [blame] | 97 | THR_COMP_NEAREST_NEARESTLL3, |
Zoe Liu | c082bbc | 2017-05-17 13:31:37 -0700 | [diff] [blame] | 98 | THR_COMP_NEAREST_NEARESTLG, |
| 99 | THR_COMP_NEAREST_NEARESTBA, |
| 100 | #endif // CONFIG_EXT_COMP_REFS |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 101 | |
Urvang Joshi | 96d1c0a | 2017-10-10 13:15:32 -0700 | [diff] [blame] | 102 | THR_PAETH, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 103 | |
Urvang Joshi | 6be4a54 | 2016-11-03 15:24:05 -0700 | [diff] [blame] | 104 | THR_SMOOTH, |
Urvang Joshi | e6ca8e8 | 2017-03-15 14:57:41 -0700 | [diff] [blame] | 105 | THR_SMOOTH_V, |
| 106 | THR_SMOOTH_H, |
Urvang Joshi | 6be4a54 | 2016-11-03 15:24:05 -0700 | [diff] [blame] | 107 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 108 | THR_COMP_NEAR_NEARLA, |
| 109 | THR_COMP_NEW_NEARESTLA, |
| 110 | THR_COMP_NEAREST_NEWLA, |
| 111 | THR_COMP_NEW_NEARLA, |
| 112 | THR_COMP_NEAR_NEWLA, |
| 113 | THR_COMP_NEW_NEWLA, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 114 | THR_COMP_GLOBAL_GLOBALLA, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 115 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 116 | THR_COMP_NEAR_NEARL2A, |
| 117 | THR_COMP_NEW_NEARESTL2A, |
| 118 | THR_COMP_NEAREST_NEWL2A, |
| 119 | THR_COMP_NEW_NEARL2A, |
| 120 | THR_COMP_NEAR_NEWL2A, |
| 121 | THR_COMP_NEW_NEWL2A, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 122 | THR_COMP_GLOBAL_GLOBALL2A, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 123 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 124 | THR_COMP_NEAR_NEARL3A, |
| 125 | THR_COMP_NEW_NEARESTL3A, |
| 126 | THR_COMP_NEAREST_NEWL3A, |
| 127 | THR_COMP_NEW_NEARL3A, |
| 128 | THR_COMP_NEAR_NEWL3A, |
| 129 | THR_COMP_NEW_NEWL3A, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 130 | THR_COMP_GLOBAL_GLOBALL3A, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 131 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 132 | THR_COMP_NEAR_NEARGA, |
| 133 | THR_COMP_NEW_NEARESTGA, |
| 134 | THR_COMP_NEAREST_NEWGA, |
| 135 | THR_COMP_NEW_NEARGA, |
| 136 | THR_COMP_NEAR_NEWGA, |
| 137 | THR_COMP_NEW_NEWGA, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 138 | THR_COMP_GLOBAL_GLOBALGA, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 139 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 140 | THR_COMP_NEAR_NEARLB, |
| 141 | THR_COMP_NEW_NEARESTLB, |
| 142 | THR_COMP_NEAREST_NEWLB, |
| 143 | THR_COMP_NEW_NEARLB, |
| 144 | THR_COMP_NEAR_NEWLB, |
| 145 | THR_COMP_NEW_NEWLB, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 146 | THR_COMP_GLOBAL_GLOBALLB, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 147 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 148 | THR_COMP_NEAR_NEARL2B, |
| 149 | THR_COMP_NEW_NEARESTL2B, |
| 150 | THR_COMP_NEAREST_NEWL2B, |
| 151 | THR_COMP_NEW_NEARL2B, |
| 152 | THR_COMP_NEAR_NEWL2B, |
| 153 | THR_COMP_NEW_NEWL2B, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 154 | THR_COMP_GLOBAL_GLOBALL2B, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 155 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 156 | THR_COMP_NEAR_NEARL3B, |
| 157 | THR_COMP_NEW_NEARESTL3B, |
| 158 | THR_COMP_NEAREST_NEWL3B, |
| 159 | THR_COMP_NEW_NEARL3B, |
| 160 | THR_COMP_NEAR_NEWL3B, |
| 161 | THR_COMP_NEW_NEWL3B, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 162 | THR_COMP_GLOBAL_GLOBALL3B, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 163 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 164 | THR_COMP_NEAR_NEARGB, |
| 165 | THR_COMP_NEW_NEARESTGB, |
| 166 | THR_COMP_NEAREST_NEWGB, |
| 167 | THR_COMP_NEW_NEARGB, |
| 168 | THR_COMP_NEAR_NEWGB, |
| 169 | THR_COMP_NEW_NEWGB, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 170 | THR_COMP_GLOBAL_GLOBALGB, |
Zoe Liu | c082bbc | 2017-05-17 13:31:37 -0700 | [diff] [blame] | 171 | |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 172 | THR_COMP_NEAR_NEARLA2, |
| 173 | THR_COMP_NEW_NEARESTLA2, |
| 174 | THR_COMP_NEAREST_NEWLA2, |
| 175 | THR_COMP_NEW_NEARLA2, |
| 176 | THR_COMP_NEAR_NEWLA2, |
| 177 | THR_COMP_NEW_NEWLA2, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 178 | THR_COMP_GLOBAL_GLOBALLA2, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 179 | |
| 180 | THR_COMP_NEAR_NEARL2A2, |
| 181 | THR_COMP_NEW_NEARESTL2A2, |
| 182 | THR_COMP_NEAREST_NEWL2A2, |
| 183 | THR_COMP_NEW_NEARL2A2, |
| 184 | THR_COMP_NEAR_NEWL2A2, |
| 185 | THR_COMP_NEW_NEWL2A2, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 186 | THR_COMP_GLOBAL_GLOBALL2A2, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 187 | |
| 188 | THR_COMP_NEAR_NEARL3A2, |
| 189 | THR_COMP_NEW_NEARESTL3A2, |
| 190 | THR_COMP_NEAREST_NEWL3A2, |
| 191 | THR_COMP_NEW_NEARL3A2, |
| 192 | THR_COMP_NEAR_NEWL3A2, |
| 193 | THR_COMP_NEW_NEWL3A2, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 194 | THR_COMP_GLOBAL_GLOBALL3A2, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 195 | |
| 196 | THR_COMP_NEAR_NEARGA2, |
| 197 | THR_COMP_NEW_NEARESTGA2, |
| 198 | THR_COMP_NEAREST_NEWGA2, |
| 199 | THR_COMP_NEW_NEARGA2, |
| 200 | THR_COMP_NEAR_NEWGA2, |
| 201 | THR_COMP_NEW_NEWGA2, |
Debargha Mukherjee | ae2f3cf | 2017-11-06 18:44:00 -0800 | [diff] [blame] | 202 | THR_COMP_GLOBAL_GLOBALGA2, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 203 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 204 | THR_H_PRED, |
| 205 | THR_V_PRED, |
| 206 | THR_D135_PRED, |
| 207 | THR_D207_PRED, |
| 208 | THR_D153_PRED, |
| 209 | THR_D63_PRED, |
| 210 | THR_D117_PRED, |
| 211 | THR_D45_PRED, |
| 212 | |
Debargha Mukherjee | c1077e9 | 2017-11-06 20:17:33 -0800 | [diff] [blame] | 213 | #if CONFIG_EXT_COMP_REFS |
| 214 | THR_COMP_NEAR_NEARLL2, |
| 215 | THR_COMP_NEW_NEARESTLL2, |
| 216 | THR_COMP_NEAREST_NEWLL2, |
| 217 | THR_COMP_NEW_NEARLL2, |
| 218 | THR_COMP_NEAR_NEWLL2, |
| 219 | THR_COMP_NEW_NEWLL2, |
| 220 | THR_COMP_GLOBAL_GLOBALLL2, |
| 221 | |
| 222 | THR_COMP_NEAR_NEARLL3, |
| 223 | THR_COMP_NEW_NEARESTLL3, |
| 224 | THR_COMP_NEAREST_NEWLL3, |
| 225 | THR_COMP_NEW_NEARLL3, |
| 226 | THR_COMP_NEAR_NEWLL3, |
| 227 | THR_COMP_NEW_NEWLL3, |
| 228 | THR_COMP_GLOBAL_GLOBALLL3, |
| 229 | |
| 230 | THR_COMP_NEAR_NEARLG, |
| 231 | THR_COMP_NEW_NEARESTLG, |
| 232 | THR_COMP_NEAREST_NEWLG, |
| 233 | THR_COMP_NEW_NEARLG, |
| 234 | THR_COMP_NEAR_NEWLG, |
| 235 | THR_COMP_NEW_NEWLG, |
| 236 | THR_COMP_GLOBAL_GLOBALLG, |
| 237 | |
| 238 | THR_COMP_NEAR_NEARBA, |
| 239 | THR_COMP_NEW_NEARESTBA, |
| 240 | THR_COMP_NEAREST_NEWBA, |
| 241 | THR_COMP_NEW_NEARBA, |
| 242 | THR_COMP_NEAR_NEWBA, |
| 243 | THR_COMP_NEW_NEWBA, |
| 244 | THR_COMP_GLOBAL_GLOBALBA, |
| 245 | #endif // CONFIG_EXT_COMP_REFS |
| 246 | |
Urvang Joshi | 6be4a54 | 2016-11-03 15:24:05 -0700 | [diff] [blame] | 247 | MAX_MODES |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 248 | } THR_MODES; |
| 249 | |
| 250 | typedef enum { |
| 251 | THR_LAST, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 252 | THR_LAST2, |
| 253 | THR_LAST3, |
| 254 | THR_BWDR, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 255 | THR_ALTR2, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 256 | THR_GOLD, |
| 257 | THR_ALTR, |
| 258 | |
| 259 | THR_COMP_LA, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 260 | THR_COMP_L2A, |
| 261 | THR_COMP_L3A, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 262 | THR_COMP_GA, |
| 263 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 264 | THR_COMP_LB, |
| 265 | THR_COMP_L2B, |
| 266 | THR_COMP_L3B, |
| 267 | THR_COMP_GB, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 268 | |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 269 | THR_COMP_LA2, |
| 270 | THR_COMP_L2A2, |
| 271 | THR_COMP_L3A2, |
| 272 | THR_COMP_GA2, |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 273 | |
| 274 | THR_INTRA, |
Zoe Liu | e9b15e2 | 2017-07-19 15:53:01 -0700 | [diff] [blame] | 275 | |
| 276 | MAX_REFS |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 277 | } THR_MODES_SUB8X8; |
| 278 | |
| 279 | typedef struct RD_OPT { |
| 280 | // Thresh_mult is used to set a threshold for the rd score. A higher value |
| 281 | // means that we will accept the best mode so far more often. This number |
| 282 | // is used in combination with the current block size, and thresh_freq_fact |
| 283 | // to pick a threshold. |
| 284 | int thresh_mult[MAX_MODES]; |
| 285 | int thresh_mult_sub8x8[MAX_REFS]; |
| 286 | |
Rupert Swarbrick | 93c39e9 | 2017-07-12 11:11:02 +0100 | [diff] [blame] | 287 | int threshes[MAX_SEGMENTS][BLOCK_SIZES_ALL][MAX_MODES]; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 288 | |
| 289 | int64_t prediction_type_threshes[TOTAL_REFS_PER_FRAME][REFERENCE_MODES]; |
| 290 | |
| 291 | int RDMULT; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 292 | } RD_OPT; |
| 293 | |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 294 | static INLINE void av1_init_rd_stats(RD_STATS *rd_stats) { |
| 295 | #if CONFIG_RD_DEBUG |
| 296 | int plane; |
| 297 | #endif |
| 298 | rd_stats->rate = 0; |
| 299 | rd_stats->dist = 0; |
| 300 | rd_stats->rdcost = 0; |
| 301 | rd_stats->sse = 0; |
| 302 | rd_stats->skip = 1; |
Jingning Han | 3bce754 | 2017-07-25 10:53:57 -0700 | [diff] [blame] | 303 | rd_stats->zero_rate = 0; |
Jingning Han | 1a7f0a8 | 2017-07-27 09:48:05 -0700 | [diff] [blame] | 304 | rd_stats->invalid_rate = 0; |
Jingning Han | 3bce754 | 2017-07-25 10:53:57 -0700 | [diff] [blame] | 305 | rd_stats->ref_rdcost = INT64_MAX; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 306 | #if CONFIG_RD_DEBUG |
Imdad Sardharwalla | af8e264 | 2018-01-19 11:46:34 +0000 | [diff] [blame] | 307 | // This may run into problems when monochrome video is |
| 308 | // encoded, as there will only be 1 plane |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 309 | for (plane = 0; plane < MAX_MB_PLANE; ++plane) { |
| 310 | rd_stats->txb_coeff_cost[plane] = 0; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 311 | { |
| 312 | int r, c; |
| 313 | for (r = 0; r < TXB_COEFF_COST_MAP_SIZE; ++r) |
| 314 | for (c = 0; c < TXB_COEFF_COST_MAP_SIZE; ++c) |
| 315 | rd_stats->txb_coeff_cost_map[plane][r][c] = 0; |
| 316 | } |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 317 | } |
| 318 | #endif |
| 319 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 320 | |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 321 | static INLINE void av1_invalid_rd_stats(RD_STATS *rd_stats) { |
| 322 | #if CONFIG_RD_DEBUG |
| 323 | int plane; |
| 324 | #endif |
| 325 | rd_stats->rate = INT_MAX; |
| 326 | rd_stats->dist = INT64_MAX; |
| 327 | rd_stats->rdcost = INT64_MAX; |
| 328 | rd_stats->sse = INT64_MAX; |
| 329 | rd_stats->skip = 0; |
Jingning Han | 3bce754 | 2017-07-25 10:53:57 -0700 | [diff] [blame] | 330 | rd_stats->zero_rate = 0; |
Jingning Han | 1a7f0a8 | 2017-07-27 09:48:05 -0700 | [diff] [blame] | 331 | rd_stats->invalid_rate = 1; |
Jingning Han | 3bce754 | 2017-07-25 10:53:57 -0700 | [diff] [blame] | 332 | rd_stats->ref_rdcost = INT64_MAX; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 333 | #if CONFIG_RD_DEBUG |
Imdad Sardharwalla | af8e264 | 2018-01-19 11:46:34 +0000 | [diff] [blame] | 334 | // This may run into problems when monochrome video is |
| 335 | // encoded, as there will only be 1 plane |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 336 | for (plane = 0; plane < MAX_MB_PLANE; ++plane) { |
| 337 | rd_stats->txb_coeff_cost[plane] = INT_MAX; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 338 | { |
| 339 | int r, c; |
| 340 | for (r = 0; r < TXB_COEFF_COST_MAP_SIZE; ++r) |
| 341 | for (c = 0; c < TXB_COEFF_COST_MAP_SIZE; ++c) |
| 342 | rd_stats->txb_coeff_cost_map[plane][r][c] = INT_MAX; |
| 343 | } |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 344 | } |
| 345 | #endif |
| 346 | } |
| 347 | |
| 348 | static INLINE void av1_merge_rd_stats(RD_STATS *rd_stats_dst, |
| 349 | const RD_STATS *rd_stats_src) { |
| 350 | #if CONFIG_RD_DEBUG |
| 351 | int plane; |
| 352 | #endif |
| 353 | rd_stats_dst->rate += rd_stats_src->rate; |
Debargha Mukherjee | de80e76 | 2017-11-30 13:58:56 -0800 | [diff] [blame] | 354 | if (!rd_stats_dst->zero_rate) |
| 355 | rd_stats_dst->zero_rate = rd_stats_src->zero_rate; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 356 | rd_stats_dst->dist += rd_stats_src->dist; |
| 357 | rd_stats_dst->sse += rd_stats_src->sse; |
| 358 | rd_stats_dst->skip &= rd_stats_src->skip; |
Jingning Han | 1a7f0a8 | 2017-07-27 09:48:05 -0700 | [diff] [blame] | 359 | rd_stats_dst->invalid_rate &= rd_stats_src->invalid_rate; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 360 | #if CONFIG_RD_DEBUG |
Imdad Sardharwalla | af8e264 | 2018-01-19 11:46:34 +0000 | [diff] [blame] | 361 | // This may run into problems when monochrome video is |
| 362 | // encoded, as there will only be 1 plane |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 363 | for (plane = 0; plane < MAX_MB_PLANE; ++plane) { |
| 364 | rd_stats_dst->txb_coeff_cost[plane] += rd_stats_src->txb_coeff_cost[plane]; |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 365 | { |
| 366 | // TODO(angiebird): optimize this part |
| 367 | int r, c; |
| 368 | int ref_txb_coeff_cost = 0; |
| 369 | for (r = 0; r < TXB_COEFF_COST_MAP_SIZE; ++r) |
| 370 | for (c = 0; c < TXB_COEFF_COST_MAP_SIZE; ++c) { |
| 371 | rd_stats_dst->txb_coeff_cost_map[plane][r][c] += |
| 372 | rd_stats_src->txb_coeff_cost_map[plane][r][c]; |
| 373 | ref_txb_coeff_cost += rd_stats_dst->txb_coeff_cost_map[plane][r][c]; |
| 374 | } |
| 375 | assert(ref_txb_coeff_cost == rd_stats_dst->txb_coeff_cost[plane]); |
| 376 | } |
Angie Chiang | 2a2a7dd | 2017-04-25 16:08:47 -0700 | [diff] [blame] | 377 | } |
| 378 | #endif |
| 379 | } |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 380 | |
Yaowu Xu | abe5215 | 2017-10-20 14:37:54 -0700 | [diff] [blame] | 381 | static INLINE int av1_get_coeff_token_cost(int token, int8_t eob_val, |
| 382 | int is_first, |
hui su | c0cf71d | 2017-07-20 16:38:50 -0700 | [diff] [blame] | 383 | const int *head_cost_table, |
| 384 | const int *tail_cost_table) { |
Hui Su | 751a233 | 2018-01-23 11:35:03 -0800 | [diff] [blame] | 385 | if (eob_val == LAST_EOB) return av1_cost_literal(1); |
hui su | c0cf71d | 2017-07-20 16:38:50 -0700 | [diff] [blame] | 386 | const int comb_symb = 2 * AOMMIN(token, TWO_TOKEN) - eob_val + is_first; |
| 387 | int cost = head_cost_table[comb_symb]; |
| 388 | if (token > ONE_TOKEN) cost += tail_cost_table[token - TWO_TOKEN]; |
| 389 | return cost; |
| 390 | } |
| 391 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 392 | struct TileInfo; |
| 393 | struct TileDataEnc; |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 394 | struct AV1_COMP; |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 395 | struct macroblock; |
| 396 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 397 | int av1_compute_rd_mult(const struct AV1_COMP *cpi, int qindex); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 398 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 399 | void av1_initialize_rd_consts(struct AV1_COMP *cpi); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 400 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 401 | void av1_initialize_me_consts(const struct AV1_COMP *cpi, MACROBLOCK *x, |
| 402 | int qindex); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 403 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 404 | void av1_model_rd_from_var_lapndz(int64_t var, unsigned int n, |
| 405 | unsigned int qstep, int *rate, int64_t *dist); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 406 | |
Yue Chen | b23d00a | 2017-07-28 17:01:21 -0700 | [diff] [blame] | 407 | int av1_get_switchable_rate(const AV1_COMMON *const cm, MACROBLOCK *x, |
| 408 | const MACROBLOCKD *xd); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 409 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 410 | int av1_raster_block_offset(BLOCK_SIZE plane_bsize, int raster_block, |
| 411 | int stride); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 412 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 413 | int16_t *av1_raster_block_offset_int16(BLOCK_SIZE plane_bsize, int raster_block, |
| 414 | int16_t *base); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 415 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 416 | YV12_BUFFER_CONFIG *av1_get_scaled_ref_frame(const struct AV1_COMP *cpi, |
| 417 | int ref_frame); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 418 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 419 | void av1_init_me_luts(void); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 420 | |
Yaowu Xu | 4306b6e | 2016-09-27 12:55:32 -0700 | [diff] [blame] | 421 | void av1_set_mvcost(MACROBLOCK *x, MV_REFERENCE_FRAME ref_frame, int ref, |
| 422 | int ref_mv_idx); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 423 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 424 | void av1_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size, |
| 425 | const struct macroblockd_plane *pd, |
| 426 | ENTROPY_CONTEXT t_above[2 * MAX_MIB_SIZE], |
| 427 | ENTROPY_CONTEXT t_left[2 * MAX_MIB_SIZE]); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 428 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 429 | void av1_set_rd_speed_thresholds(struct AV1_COMP *cpi); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 430 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 431 | void av1_set_rd_speed_thresholds_sub8x8(struct AV1_COMP *cpi); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 432 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 433 | void av1_update_rd_thresh_fact(const AV1_COMMON *const cm, |
| 434 | int (*fact)[MAX_MODES], int rd_thresh, int bsize, |
| 435 | int best_mode_index); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 436 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 437 | static INLINE int rd_less_than_thresh(int64_t best_rd, int thresh, |
| 438 | int thresh_fact) { |
| 439 | return best_rd < ((int64_t)thresh * thresh_fact >> 5) || thresh == INT_MAX; |
| 440 | } |
| 441 | |
Urvang Joshi | 5264844 | 2016-10-13 17:27:51 -0700 | [diff] [blame] | 442 | void av1_mv_pred(const struct AV1_COMP *cpi, MACROBLOCK *x, |
| 443 | uint8_t *ref_y_buffer, int ref_y_stride, int ref_frame, |
| 444 | BLOCK_SIZE block_size); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 445 | |
| 446 | static INLINE void set_error_per_bit(MACROBLOCK *x, int rdmult) { |
| 447 | x->errorperbit = rdmult >> RD_EPB_SHIFT; |
| 448 | x->errorperbit += (x->errorperbit == 0); |
| 449 | } |
| 450 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 451 | void av1_setup_pred_block(const MACROBLOCKD *xd, |
| 452 | struct buf_2d dst[MAX_MB_PLANE], |
| 453 | const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col, |
| 454 | const struct scale_factors *scale, |
Imdad Sardharwalla | af8e264 | 2018-01-19 11:46:34 +0000 | [diff] [blame] | 455 | const struct scale_factors *scale_uv, |
| 456 | const int num_planes); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 457 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 458 | int av1_get_intra_cost_penalty(int qindex, int qdelta, |
| 459 | aom_bit_depth_t bit_depth); |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 460 | |
Yue Chen | b23d00a | 2017-07-28 17:01:21 -0700 | [diff] [blame] | 461 | void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x, |
| 462 | FRAME_CONTEXT *fc); |
| 463 | |
Jingning Han | dfd7232 | 2017-08-09 14:04:12 -0700 | [diff] [blame] | 464 | #if CONFIG_LV_MAP |
Imdad Sardharwalla | af8e264 | 2018-01-19 11:46:34 +0000 | [diff] [blame] | 465 | void av1_fill_coeff_costs(MACROBLOCK *x, FRAME_CONTEXT *fc, |
| 466 | const int num_planes); |
Jingning Han | dfd7232 | 2017-08-09 14:04:12 -0700 | [diff] [blame] | 467 | #endif |
| 468 | |
hui su | bd57abe | 2017-07-24 18:14:03 -0700 | [diff] [blame] | 469 | void av1_fill_token_costs_from_cdf(av1_coeff_cost *cost, |
| 470 | coeff_cdf_model (*cdf)[PLANE_TYPES]); |
| 471 | |
Yaowu Xu | c27fc14 | 2016-08-22 16:08:15 -0700 | [diff] [blame] | 472 | #ifdef __cplusplus |
| 473 | } // extern "C" |
| 474 | #endif |
| 475 | |
Yaowu Xu | f883b42 | 2016-08-30 14:01:10 -0700 | [diff] [blame] | 476 | #endif // AV1_ENCODER_RD_H_ |