[FFmpeg-devel] [PATCH] vf_v360: fix (i)flat_range for fisheye projection

Daniel Playfair Cal daniel.playfair.cal at gmail.com
Fri Mar 19 11:47:02 EET 2021


This changes the iflat_range and flat_range values for the fisheye
projection so that they indicate the maximum angle between an observed
point and the center (direction the camera is facing). This matches the
meaning of those variables in the flat projection.

Signed-off-by: Daniel Playfair Cal <daniel.playfair.cal at gmail.com>
---
 libavfilter/vf_v360.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c
index 94473cd5b3..d4f0836937 100644
--- a/libavfilter/vf_v360.c
+++ b/libavfilter/vf_v360.c
@@ -2807,9 +2807,8 @@ static int prepare_fisheye_out(AVFilterContext *ctx)
 {
     V360Context *s = ctx->priv;
 
-    s->flat_range[0] = s->h_fov / 180.f;
-    s->flat_range[1] = s->v_fov / 180.f;
-
+    s->flat_range[0] = 0.5 * s->h_fov * M_PI / 180.f;
+    s->flat_range[1] = 0.5 * s->v_fov * M_PI / 180.f;
     return 0;
 }
 
@@ -2827,8 +2826,8 @@ 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 vf = s->flat_range[1] * ((2.f * j + 1.f) / height - 1.f);
+    const float uf = 2.f * s->flat_range[0] / M_PI * ((2.f * i) / width  - 1.f);
+    const float vf = 2.f * s->flat_range[1] / M_PI * ((2.f * j + 1.f) / height - 1.f);
 
     const float phi   = atan2f(vf, uf);
     const float theta = M_PI_2 * (1.f - hypotf(uf, vf));
@@ -2858,8 +2857,8 @@ static int prepare_fisheye_in(AVFilterContext *ctx)
 {
     V360Context *s = ctx->priv;
 
-    s->iflat_range[0] = s->ih_fov / 180.f;
-    s->iflat_range[1] = s->iv_fov / 180.f;
+    s->iflat_range[0] = 0.5 * s->ih_fov * M_PI / 180.f;
+    s->iflat_range[1] = 0.5 * s->iv_fov * M_PI / 180.f;
 
     return 0;
 }
@@ -2882,10 +2881,10 @@ static int xyz_to_fisheye(const V360Context *s,
 {
     const float h   = hypotf(vec[0], vec[1]);
     const float lh  = h > 0.f ? h : 1.f;
-    const float phi = atan2f(h, vec[2]) / M_PI;
+    const float phi = atan2f(h, vec[2]);
 
-    float uf = vec[0] / lh * phi / s->iflat_range[0];
-    float vf = vec[1] / lh * phi / s->iflat_range[1];
+    float uf = 0.5f * vec[0] / lh * phi / s->iflat_range[0];
+    float vf = 0.5f * vec[1] / lh * phi / s->iflat_range[1];
 
     const int visible = hypotf(uf, vf) <= 0.5f;
     int ui, vi;
-- 
2.31.0



More information about the ffmpeg-devel mailing list