diff mbox series

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

Message ID 20210319115354.943985-1-daniel.playfair.cal@gmail.com
State New
Headers show
Series [FFmpeg-devel] vf_v360: fix (i)flat_range for fisheye projection
Related show

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Daniel Playfair Cal March 19, 2021, 11:53 a.m. UTC
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@gmail.com>
---

This version avoids the use of double literals.

 libavfilter/vf_v360.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)
diff mbox series

Patch

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;