[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