Add classified distortion model based on sse_norm
Upto 2% speed-up in terms of intstruction count (tested on crew_cif).
A slight chage in coding efficiency of the order of ~0.01-0.02 on
lowres, midres (20 frames).
STATS_CHANGED
Change-Id: I907d334647eab85e629bdc175e77de0397076554
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 668de67..602a7e7 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -717,6 +717,10 @@
0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 1, 1, 2, 2
};
+static int sse_norm_model_cat_lookup(double sse_norm) {
+ return (sse_norm > 16.0);
+}
+
static const double interp_rgrid_surf[4][33 * 18] = {
{
29.726102, 30.738006, 25.294088, 25.736759, 41.255961,
@@ -1390,27 +1394,43 @@
},
};
-static const double interp_dgrid_curv[65] = {
- 14.604855, 14.604855, 14.604855, 14.604855, 14.604855, 14.604855, 14.604855,
- 14.604855, 14.604855, 14.604855, 14.604855, 14.604855, 14.555776, 14.533692,
- 14.439920, 14.257791, 13.977230, 13.623229, 13.064884, 12.355411, 11.560773,
- 10.728960, 9.861975, 8.643612, 6.916021, 5.154769, 3.734940, 2.680051,
- 1.925506, 1.408410, 1.042223, 0.767641, 0.565392, 0.420116, 0.310427,
- 0.231711, 0.172999, 0.128293, 0.094992, 0.072171, 0.052972, 0.039354,
- 0.029555, 0.022857, 0.016832, 0.013297, 0.000000, 0.000000, 0.000000,
- 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
- 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
- 0.000000, 0.000000,
+static const double interp_dgrid_curv[2][65] = {
+ {
+ 16.000000, 15.962891, 15.925174, 15.886888, 15.848074, 15.808770,
+ 15.769015, 15.728850, 15.688313, 15.647445, 15.606284, 15.564870,
+ 15.525918, 15.483820, 15.373330, 15.126844, 14.637442, 14.184387,
+ 13.560070, 12.880717, 12.165995, 11.378144, 10.438769, 9.130790,
+ 7.487633, 5.688649, 4.267515, 3.196300, 2.434201, 1.834064,
+ 1.369920, 1.035921, 0.775279, 0.574895, 0.427232, 0.314123,
+ 0.233236, 0.171440, 0.128188, 0.092762, 0.067569, 0.049324,
+ 0.036330, 0.027008, 0.019853, 0.015539, 0.011093, 0.008733,
+ 0.007624, 0.008105, 0.005427, 0.004065, 0.003427, 0.002848,
+ 0.002328, 0.001865, 0.001457, 0.001103, 0.000801, 0.000550,
+ 0.000348, 0.000193, 0.000085, 0.000021, 0.000000,
+ },
+ {
+ 16.000000, 15.996116, 15.984769, 15.966413, 15.941505, 15.910501,
+ 15.873856, 15.832026, 15.785466, 15.734633, 15.679981, 15.621967,
+ 15.560961, 15.460157, 15.288367, 15.052462, 14.466922, 13.921212,
+ 13.073692, 12.222005, 11.237799, 9.985848, 8.898823, 7.423519,
+ 5.995325, 4.773152, 3.744032, 2.938217, 2.294526, 1.762412,
+ 1.327145, 1.020728, 0.765535, 0.570548, 0.425833, 0.313825,
+ 0.232959, 0.171324, 0.128174, 0.092750, 0.067558, 0.049319,
+ 0.036330, 0.027008, 0.019853, 0.015539, 0.011093, 0.008733,
+ 0.007624, 0.008105, 0.005427, 0.004065, 0.003427, 0.002848,
+ 0.002328, 0.001865, 0.001457, 0.001103, 0.000801, 0.000550,
+ 0.000348, 0.000193, 0.000085, 0.000021, -0.000000,
+ },
};
void av1_model_rd_curvfit(BLOCK_SIZE bsize, double sse_norm, double xqr,
double *rate_f, double *distbysse_f) {
- (void)sse_norm;
const double x_start = -15.5;
const double x_end = 16.5;
const double x_step = 0.5;
const double epsilon = 1e-6;
const int rcat = bsize_model_cat_lookup[bsize];
+ const int dcat = sse_norm_model_cat_lookup(sse_norm);
(void)x_end;
xqr = AOMMAX(xqr, x_start + x_step + epsilon);
@@ -1423,7 +1443,7 @@
const double *prate = &interp_rgrid_curv[rcat][(xi - 1)];
*rate_f = interp_cubic(prate, xo);
- const double *pdist = &interp_dgrid_curv[(xi - 1)];
+ const double *pdist = &interp_dgrid_curv[dcat][(xi - 1)];
*distbysse_f = interp_cubic(pdist, xo);
}
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index d7bf816..d61da9c 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5831,7 +5831,7 @@
// tighter.
assert(cpi->sf.model_based_prune_tx_search_level >= 0 &&
cpi->sf.model_based_prune_tx_search_level <= 2);
- static const int prune_factor_by8[] = { 4, 6 };
+ static const int prune_factor_by8[] = { 3, 5 };
if (!model_skip &&
((model_rd *
prune_factor_by8[cpi->sf.model_based_prune_tx_search_level - 1]) >>
@@ -10031,7 +10031,6 @@
best_rd = RDCOST(x->rdmult, best_rd_stats.rate,
best_rd_stats.dist);
if (best_rd < ref_best_rd) ref_best_rd = best_rd;
-
skip = 1;
break;
}