[FFmpeg-cvslog] avfilter/vf_v360: refactor uf/vf scaling

Paul B Mahol git at videolan.org
Fri Sep 24 23:31:12 EEST 2021


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Sep 24 11:06:29 2021 +0200| [d098e16f09870583562c374c5e2f932988f70f42] | committer: Paul B Mahol

avfilter/vf_v360: refactor uf/vf scaling

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d098e16f09870583562c374c5e2f932988f70f42
---

 libavfilter/vf_v360.c | 77 ++++++++++++++++++++++++++-------------------------
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c
index 58915c5487..6d65127db5 100644
--- a/libavfilter/vf_v360.c
+++ b/libavfilter/vf_v360.c
@@ -1373,6 +1373,11 @@ static void process_cube_coordinates(const V360Context *s,
     rotate_cube_face(new_uf, new_vf, s->in_cubemap_face_rotation[*face]);
 }
 
+static av_always_inline float scale(float x, float s)
+{
+    return (0.5f * x + 0.5f) * s - 0.5f;
+}
+
 static av_always_inline float rescale(int x, int s)
 {
     return (2.f * x + 1.f) / s - 1.f;
@@ -1892,8 +1897,8 @@ static int xyz_to_stereographic(const V360Context *s,
     const float x = vec[0] * c / s->iflat_range[0];
     const float y = vec[1] * c / s->iflat_range[1];
 
-    const float uf = (x + 1.f) * width  / 2.f;
-    const float vf = (y + 1.f) * height / 2.f;
+    const float uf = scale(x, width);
+    const float vf = scale(y, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -1998,8 +2003,8 @@ static int xyz_to_equisolid(const V360Context *s,
     const float x = vec[0] * c / s->iflat_range[0];
     const float y = vec[1] * c / s->iflat_range[1];
 
-    const float uf = (x + 1.f) * width  / 2.f;
-    const float vf = (y + 1.f) * height / 2.f;
+    const float uf = scale(x, width);
+    const float vf = scale(y, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2110,8 +2115,8 @@ static int xyz_to_orthographic(const V360Context *s,
     const float x = vec[0] * c / s->iflat_range[0];
     const float y = vec[1] * c / s->iflat_range[1];
 
-    const float uf = (x + 1.f) * width  / 2.f;
-    const float vf = (y + 1.f) * height / 2.f;
+    const float uf = scale(x, width);
+    const float vf = scale(y, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2164,11 +2169,11 @@ static int xyz_to_equirect(const V360Context *s,
                            const float *vec, int width, int height,
                            int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
 {
-    const float phi   = atan2f(vec[0], vec[2]);
-    const float theta = asinf(vec[1]);
+    const float phi   = atan2f(vec[0], vec[2]) / s->iflat_range[0];
+    const float theta = asinf(vec[1]) / s->iflat_range[1];
 
-    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 float uf = scale(phi, width);
+    const float vf = scale(theta, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2205,11 +2210,11 @@ static int xyz_to_hequirect(const V360Context *s,
                             const float *vec, int width, int height,
                             int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
 {
-    const float phi   = atan2f(vec[0], vec[2]);
-    const float theta = asinf(vec[1]);
+    const float phi   = atan2f(vec[0], vec[2]) / M_PI_2;
+    const float theta = asinf(vec[1]) / M_PI_2;
 
-    const float uf = (phi   / M_PI_2 + 1.f) * width  / 2.f;
-    const float vf = (theta / M_PI_2 + 1.f) * height / 2.f;
+    const float uf = scale(phi, width);
+    const float vf = scale(theta, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2272,8 +2277,8 @@ static int xyz_to_flat(const V360Context *s,
     float vf = vec[1] * c / s->iflat_range[1];
     int visible, ui, vi;
 
-    uf = zf >= 0.f ? (uf + 1.f) * width  / 2.f : 0.f;
-    vf = zf >= 0.f ? (vf + 1.f) * height / 2.f : 0.f;
+    uf = zf >= 0.f ? scale(uf, width)  : 0.f;
+    vf = zf >= 0.f ? scale(vf, height) : 0.f;
 
     ui = floorf(uf);
     vi = floorf(vf);
@@ -2309,11 +2314,11 @@ static int xyz_to_mercator(const V360Context *s,
                            const float *vec, int width, int height,
                            int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
 {
-    const float phi   = atan2f(vec[0], vec[2]);
-    const float theta = vec[1];
+    const float phi   = atan2f(vec[0], vec[2]) / M_PI;
+    const float theta = av_clipf(logf((1.f + vec[1]) / (1.f - vec[1])) / (2.f * M_PI), -1.f, 1.f);
 
-    const float uf = (phi / M_PI + 1.f) * width / 2.f;
-    const float vf = (av_clipf(logf((1.f + theta) / (1.f - theta)) / (2.f * M_PI), -1.f, 1.f) + 1.f) * height / 2.f;
+    const float uf = scale(phi, width);
+    const float vf = scale(theta, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2379,9 +2384,10 @@ static int xyz_to_ball(const V360Context *s,
 {
     const float l = hypotf(vec[0], vec[1]);
     const float r = sqrtf(1.f - vec[2]) / M_SQRT2;
+    const float d = l > 0.f ? l : 1.f;
 
-    const float uf = (1.f + r * vec[0] / (l > 0.f ? l : 1.f)) * width  * 0.5f;
-    const float vf = (1.f + r * vec[1] / (l > 0.f ? l : 1.f)) * height * 0.5f;
+    const float uf = scale(r * vec[0] / d, width);
+    const float vf = scale(r * vec[1] / d, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -2563,8 +2569,8 @@ static int xyz_to_sinusoidal(const V360Context *s,
     const float theta = asinf(vec[1]);
     const float phi   = atan2f(vec[0], vec[2]) * cosf(theta);
 
-    const float uf = (phi   / M_PI   + 1.f) * width  / 2.f;
-    const float vf = (theta / M_PI_2 + 1.f) * height / 2.f;
+    const float uf = scale(phi / M_PI, width);
+    const float vf = scale(theta / M_PI_2, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -3016,8 +3022,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 - 0.5f;
-    const float vf = (y + 1.f) * height / 2.f - 0.5f;
+    const float uf = scale(x, width);
+    const float vf = scale(y, height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -3124,8 +3130,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 = scale(phi, width);
+    const float vf = scale(tanf(theta) / s->iflat_range[1], height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -3234,8 +3240,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 = scale(phi, width);
+    const float vf = scale(sinf(theta) / s->iflat_range[1], height);
 
     const int ui = floorf(uf);
     const int vi = floorf(vf);
@@ -3448,8 +3454,8 @@ static int xyz_to_dfisheye(const V360Context *s,
     const float lh    = h > 0.f ? h : 1.f;
     const float theta = acosf(fabsf(vec[2])) / M_PI;
 
-    float uf = (theta * (vec[0] / lh) / s->iflat_range[0] + 0.5f) * ew;
-    float vf = (theta * (vec[1] / lh) / s->iflat_range[1] + 0.5f) * eh;
+    float uf = scale(theta * (vec[0] / lh) / s->iflat_range[0], ew);
+    float vf = scale(theta * (vec[1] / lh) / s->iflat_range[1], eh);
 
     int ui, vi;
     int u_shift;
@@ -3998,11 +4004,8 @@ static int xyz_to_octahedron(const V360Context *s,
         uf = (1.f - fabsf(zf)) * FFSIGN(uf);
     }
 
-    uf = uf * 0.5f + 0.5f;
-    vf = vf * 0.5f + 0.5f;
-
-    uf *= width;
-    vf *= height;
+    uf = scale(uf, width);
+    vf = scale(vf, height);
 
     ui = floorf(uf);
     vi = floorf(vf);



More information about the ffmpeg-cvslog mailing list