[FFmpeg-devel] [PATCH] lavfi/vf_v360: add missing 0.5 subpixel shift
黄宇星(凌怀)
huangyuxing.hyx at alibaba-inc.com
Tue Jul 13 11:29:10 EEST 2021
Signed-off-by: 凌怀 <huangyuxing.hyx at alibaba-inc.com>
---
libavfilter/vf_v360.c | 49 ++++++++++++++++++++++++++++++-------------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c
index 0c47883d4d..c0dafe6bbe 100644
--- a/libavfilter/vf_v360.c
+++ b/libavfilter/vf_v360.c
@@ -1790,8 +1790,8 @@ static int hequirect_to_xyz(const V360Context *s,
int i, int j, int width, int height,
float *vec)
{
- const float phi = ((2.f * i + 0.5f) / width - 1.f) * M_PI_2;
- const float theta = ((2.f * j + 0.5f) / height - 1.f) * M_PI_2;
+ const float phi = ((2.f * i + 1.0f) / width - 1.f) * M_PI_2;
+ const float theta = ((2.f * j + 1.0f) / height - 1.f) * M_PI_2;
const float sin_phi = sinf(phi);
const float cos_phi = cosf(phi);
@@ -2158,8 +2158,8 @@ static int xyz_to_equirect(const V360Context *s,
const float phi = atan2f(vec[0], vec[2]);
const float theta = asinf(vec[1]);
- const float uf = (phi / s->iflat_range[0] + 1.f) * width / 2.f;
- const float vf = (theta / s->iflat_range[1] + 1.f) * height / 2.f;
+ const float uf = (phi / s->iflat_range[0] + 1.f) * width / 2.f - 0.5f;
+ const float vf = (theta / s->iflat_range[1] + 1.f) * height / 2.f - 0.5f;
const int ui = floorf(uf);
const int vi = floorf(vf);
@@ -2866,7 +2866,7 @@ static int fisheye_to_xyz(const V360Context *s,
int i, int j, int width, int height,
float *vec)
{
- const float uf = s->flat_range[0] * ((2.f * i) / width - 1.f);
+ const float uf = s->flat_range[0] * ((2.f * i + 1.f) / width - 1.f);
const float vf = s->flat_range[1] * ((2.f * j + 1.f) / height - 1.f);
const float phi = atan2f(vf, uf);
@@ -2932,6 +2932,9 @@ static int xyz_to_fisheye(const V360Context *s,
uf = (uf + 0.5f) * width;
vf = (vf + 0.5f) * height;
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3007,8 +3010,8 @@ static int xyz_to_pannini(const V360Context *s,
const float x = S * sinf(phi);
const float y = S * tanf(theta);
- const float uf = (x + 1.f) * width / 2.f;
- const float vf = (y + 1.f) * height / 2.f;
+ const float uf = (x + 1.f) * width / 2.f - 0.5f;
+ const float vf = (y + 1.f) * height / 2.f - 0.5f;
const int ui = floorf(uf);
const int vi = floorf(vf);
@@ -3115,8 +3118,8 @@ static int xyz_to_cylindrical(const V360Context *s,
const float phi = atan2f(vec[0], vec[2]) / s->iflat_range[0];
const float theta = asinf(vec[1]);
- const float uf = (phi + 1.f) * (width - 1) / 2.f;
- const float vf = (tanf(theta) / s->iflat_range[1] + 1.f) * height / 2.f;
+ const float uf = (phi + 1.f) * (width - 1) / 2.f - 0.5f;
+ const float vf = (tanf(theta) / s->iflat_range[1] + 1.f) * height / 2.f - 0.5f;
const int ui = floorf(uf);
const int vi = floorf(vf);
@@ -3225,8 +3228,8 @@ static int xyz_to_cylindricalea(const V360Context *s,
const float phi = atan2f(vec[0], vec[2]) / s->iflat_range[0];
const float theta = asinf(vec[1]);
- const float uf = (phi + 1.f) * (width - 1) / 2.f;
- const float vf = (sinf(theta) / s->iflat_range[1] + 1.f) * height / 2.f;
+ const float uf = (phi + 1.f) * (width - 1) / 2.f - 0.5f;
+ const float vf = (sinf(theta) / s->iflat_range[1] + 1.f) * height / 2.f - 0.5f;
const int ui = floorf(uf);
const int vi = floorf(vf);
@@ -3361,6 +3364,9 @@ static int xyz_to_tetrahedron(const V360Context *s,
uf *= width;
vf *= height;
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3397,7 +3403,7 @@ static int dfisheye_to_xyz(const V360Context *s,
const int ei = i >= ew ? i - ew : i;
const float m = i >= ew ? 1.f : -1.f;
- const float uf = s->flat_range[0] * ((2.f * ei) / ew - 1.f);
+ const float uf = s->flat_range[0] * ((2.f * ei + 1.f) / ew - 1.f);
const float vf = s->flat_range[1] * ((2.f * j + 1.f) / eh - 1.f);
const float h = hypotf(uf, vf);
@@ -3452,6 +3458,9 @@ static int xyz_to_dfisheye(const V360Context *s,
uf = ew - uf;
}
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3491,8 +3500,8 @@ static int barrel_to_xyz(const V360Context *s,
const int ew = 4 * width / 5;
const int eh = height;
- const float phi = ((2.f * i) / ew - 1.f) * M_PI / scale;
- const float theta = ((2.f * j) / eh - 1.f) * theta_range / scale;
+ const float phi = ((2.f * i + 1.f) / ew - 1.f) * M_PI / scale;
+ const float theta = ((2.f * j + 1.f) / eh - 1.f) * theta_range / scale;
const float sin_phi = sinf(phi);
const float cos_phi = cosf(phi);
@@ -3596,6 +3605,9 @@ static int xyz_to_barrel(const V360Context *s,
vf = 0.5f * eh * (vf * scale + 1.f);
}
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3692,6 +3704,9 @@ static int xyz_to_barrelsplit(const V360Context *s,
vf = height * 0.25f * (vf * scaleh + 1.f) + v_offset;
}
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3910,6 +3925,9 @@ static int xyz_to_tspyramid(const V360Context *s,
uf *= width;
vf *= height;
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
@@ -3995,6 +4013,9 @@ static int xyz_to_octahedron(const V360Context *s,
uf *= width;
vf *= height;
+ uf -= 0.5f;
+ vf -= 0.5f;
+
ui = floorf(uf);
vi = floorf(vf);
More information about the ffmpeg-devel
mailing list