Changed the confidence weight determination part.
Also tuned several parameters and fixed some macro conditions.
Change-Id: Ib48cb891028c8550eb2256f9bd15980f7b503831
diff --git a/av1/common/optical_flow_ref.c b/av1/common/optical_flow_ref.c
index f87c967..60e5b99 100644
--- a/av1/common/optical_flow_ref.c
+++ b/av1/common/optical_flow_ref.c
@@ -1211,12 +1211,14 @@
MV this_mvs[2] = { mv_ref->mv[0].as_mv, mv_ref->mv[1].as_mv };
MV_REFERENCE_FRAME ref_frame[2] = { mv_ref->ref_frame[0],
mv_ref->ref_frame[1] };
+#if OPFL_TPL
if (ref_frame[0] == OPFL_FRAME && ref_frame[1] == NONE_FRAME) {
this_mvs[0] = mv_ref->opfl_ref_mvs[0].as_mv;
this_mvs[1] = mv_ref->opfl_ref_mvs[1].as_mv;
ref_frame[0] = mv_ref->opfl_ref_frame[0];
ref_frame[1] = mv_ref->opfl_ref_frame[1];
}
+#endif
for (int r = 0; r < 2; r++) {
if (ref_frame[r] == NONE_FRAME || ref_frame[r] == OPFL_FRAME) continue;
@@ -1353,14 +1355,14 @@
MV this_mvs[2] = { mv_ref->mv[0].as_mv, mv_ref->mv[1].as_mv };
MV_REFERENCE_FRAME ref_frame[2] = { mv_ref->ref_frame[0],
mv_ref->ref_frame[1] };
-
+#if OPFL_TPL
if (ref_frame[0] == OPFL_FRAME && ref_frame[1] == NONE_FRAME) {
this_mvs[0] = mv_ref->opfl_ref_mvs[0].as_mv;
this_mvs[1] = mv_ref->opfl_ref_mvs[1].as_mv;
ref_frame[0] = mv_ref->opfl_ref_frame[0];
ref_frame[1] = mv_ref->opfl_ref_frame[1];
}
-
+#endif
for (int r = 0; r < 2; r++) {
int ref_offset;
switch (ref_frame[r]) {
@@ -1407,13 +1409,14 @@
MV this_mvs[2] = { mv_ref->mv[0].as_mv, mv_ref->mv[1].as_mv };
MV_REFERENCE_FRAME ref_frame[2] = { mv_ref->ref_frame[0],
mv_ref->ref_frame[1] };
+#if OPFL_TPL
if (ref_frame[0] == OPFL_FRAME && ref_frame[1] == NONE_FRAME) {
this_mvs[0] = mv_ref->opfl_ref_mvs[0].as_mv;
this_mvs[1] = mv_ref->opfl_ref_mvs[1].as_mv;
ref_frame[0] = mv_ref->opfl_ref_frame[0];
ref_frame[1] = mv_ref->opfl_ref_frame[1];
}
-
+#endif
for (int r = 0; r < 2; r++) {
int ref_offset;
switch (ref_frame[r]) {
@@ -1845,7 +1848,7 @@
DB_MV *mv_start_new = mf_new + AVG_MF_BORDER * mvstr + AVG_MF_BORDER;
int i, j;
- // allocate buffers
+ // allocate temp buffers
Ex = buf_struct->Ex;
Ey = buf_struct->Ey;
Et = buf_struct->Et;
@@ -1910,8 +1913,8 @@
SPARSE_MTX A, L, LtL;
// check if pointing out of bound
double boundFactor = 0.01;
- double pixExpFactor = 0.005;
- double mvExpFactor = 0.008;
+ double pixExpFactor = 0.001;
+ double mvExpFactor = 0.001;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
pixel_weight[i * width + j] = 1;
@@ -1931,20 +1934,31 @@
(1 - buf_struct->dst_pos) * mv_start[i * mvstr + j].col;
int is_out = (i0 < 0 || i0 > fheight - 1 || i1 < 0 || i1 > fheight - 1 ||
j0 < 0 || j0 > fwidth - 1 || j1 < 0 || j1 > fwidth - 1);
- if (is_out) {
- pixel_weight[i * width + j] = 0.001;
+ if (is_out && OPFL_BOUND_HANDLING) {
+ pixel_weight[i * width + j] = boundFactor * boundFactor;
mv_weight[i * width + j] = boundFactor;
- } else if (level > 2 && numWarpedRounds > 2) {
- pixel_weight[i * width + j] =
- exp(-pixExpFactor * Et[i * width + j] * Et[i * width + j]);
- pixel_weight[i * width + j] = (pixel_weight[i * width + j] > 0.001)
- ? pixel_weight[i * width + j]
- : 0.001;
- mv_weight[i * width + j] =
- exp(-mvExpFactor * Et[i * width + j] * Et[i * width + j]);
+ } else if (level >= 0 && numWarpedRounds >= 0 && OPFL_CONF_WTS) {
+ double avg = 0;
+ double minDiff = 1000;
+ double curWt;
+ double count = 0;
+ for (int ii = -2; ii <= 2; ii++) {
+ for (int jj = -2; jj <= 2; jj++) {
+ if (i + ii < 0 || i + ii >= height || j + jj < 0 || j + jj >= width)
+ continue;
+ count += 1;
+ curWt =
+ Et[(i + ii) * width + j + jj] * Et[(i + ii) * width + j + jj];
+ avg = avg * (count - 1) / count + curWt / count;
+ if (curWt > minDiff) minDiff = curWt;
+ }
+ }
+ mv_weight[i * width + j] = exp(-mvExpFactor * avg);
mv_weight[i * width + j] = (mv_weight[i * width + j] > boundFactor)
? mv_weight[i * width + j]
: boundFactor;
+ pixel_weight[i * width + j] =
+ mv_weight[i * width + j] * mv_weight[i * width + j];
}
}
}
@@ -3652,17 +3666,19 @@
// if refs agrees better, weights should be closer to each other
double diffWts = (dstpel_y0[i * width + j] - dstpel_y1[i * width + j]);
diffWts = 0.1 * diffWts * diffWts;
- if (diffWts > 2) diffWts = 2;
+ if (diffWts > 50) diffWts = 50;
+ if (diffWts < 10) diffWts = 0;
if (inside0 == 0 && inside1 == 0) {
ref0wts[i * width + j] = 1 - pos;
ref1wts[i * width + j] = pos;
} else {
if (inside0)
- ref0wts[i * width + j] = exp(-diffWts * totalused0);
+ ref0wts[i * width + j] =
+ exp(-0.01 * diffWts * totalused0) * (1 - dstpos);
else
ref0wts[i * width + j] = 0;
if (inside1)
- ref1wts[i * width + j] = exp(-diffWts * totalused1);
+ ref1wts[i * width + j] = exp(-0.01 * diffWts * totalused1) * dstpos;
else
ref1wts[i * width + j] = 0;
}
diff --git a/av1/common/optical_flow_ref.h b/av1/common/optical_flow_ref.h
index 0d2e3f4..9770d71 100644
--- a/av1/common/optical_flow_ref.h
+++ b/av1/common/optical_flow_ref.h
@@ -23,7 +23,8 @@
#if CONFIG_OPFL
// Constant MACRO defs
-#define AVG_MF_BORDER 32
+#define AVG_MF_BORDER 4
+#define OPFL_MF_FRAME_BORDER 32
#define MAX_MV_LENGTH_1D 160
#define DERIVATIVE_FILTER_LENGTH 7
@@ -49,11 +50,13 @@
#define OPFL_MV_PRED 1
#define OPFL_TPL 1
#define OPFL_TPL_NEIGHBOR 1
+#define OPFL_BOUND_HANDLING 1
+#define OPFL_CONF_WTS 1
#define OPFL_EXP_INIT 1
#define OPFL_DERIVE_INIT_MV 1
-#define OPFL_CHECK_INIT_MV 1
-#define OPFL_INIT_MOTION_SEARCH 1
+#define OPFL_CHECK_INIT_MV 0
+#define OPFL_INIT_MOTION_SEARCH 0
#define OPFL_EXP_DERV 0
@@ -73,7 +76,6 @@
} OPFL_BLEND_METHOD;
#define OPFL_BLEND_METHOD_USED OPFL_SIMPLE_BLEND
-
// motion field struct with double precision
typedef struct db_mv {
double row;