[FFmpeg-devel] [PATCH 4/4] avfilter/vf_v360: refactor (i)flat_range for fisheye
Paul B Mahol
onemda at gmail.com
Sun Mar 21 18:30:20 EET 2021
Sorry, but I cannot apply this set as is, It makes at least one serious
regression.
For example try this filtergraph:
v360=input=e:output=fisheye:h_fov=180:v_fov=180,v360=input=fisheye:output=e:ih_fov=180:iv_fov=180
On Sun, Mar 21, 2021 at 1:45 PM Daniel Playfair Cal <
daniel.playfair.cal at gmail.com> wrote:
> This changes the iflat_range and flat_range values for the fisheye
> projection to match their meaning for the flat/rectilinear projection.
> That is, the range is between the two x or two y coordinates of the
> outermost points above/below or left/right of the center, in the
> flat/rectilinear 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 68bb2f7b0f..3158451963 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.5f * s->h_fov * M_PI / 180.f;
> + s->flat_range[1] = 0.5f * 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.5f * s->ih_fov * M_PI / 180.f;
> + s->iflat_range[1] = 0.5f * 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 = -0.5f < uf && uf < 0.5f && -0.5f < vf && vf <
> 0.5f;
> int ui, vi;
> --
> 2.31.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list