mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/vf_v360: make FOV adjusted for dual fisheye too
Remove any usage of padding for this format.
This commit is contained in:
parent
d8147c4e2d
commit
2970846fc1
@ -19043,19 +19043,19 @@ Dual fisheye.
|
|||||||
|
|
||||||
Format specific options:
|
Format specific options:
|
||||||
@table @option
|
@table @option
|
||||||
@item in_pad
|
@item h_fov
|
||||||
@item out_pad
|
@item v_fov
|
||||||
Set padding proportion. Values in decimals.
|
@item d_fov
|
||||||
|
Set output horizontal/vertical/diagonal field of view. Values in degrees.
|
||||||
|
|
||||||
Example values:
|
If diagonal field of view is set it overrides horizontal and vertical field of view.
|
||||||
@table @samp
|
|
||||||
@item 0
|
|
||||||
No padding.
|
|
||||||
@item 0.01
|
|
||||||
1% padding.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
Default value is @b{@samp{0}}.
|
@item ih_fov
|
||||||
|
@item iv_fov
|
||||||
|
@item id_fov
|
||||||
|
Set input horizontal/vertical/diagonal field of view. Values in degrees.
|
||||||
|
|
||||||
|
If diagonal field of view is set it overrides horizontal and vertical field of view.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item barrel
|
@item barrel
|
||||||
|
@ -2991,16 +2991,14 @@ static int dfisheye_to_xyz(const V360Context *s,
|
|||||||
int i, int j, int width, int height,
|
int i, int j, int width, int height,
|
||||||
float *vec)
|
float *vec)
|
||||||
{
|
{
|
||||||
const float scale = 1.f + s->out_pad;
|
|
||||||
|
|
||||||
const float ew = width / 2.f;
|
const float ew = width / 2.f;
|
||||||
const float eh = height;
|
const float eh = height;
|
||||||
|
|
||||||
const int ei = i >= ew ? i - ew : i;
|
const int ei = i >= ew ? i - ew : i;
|
||||||
const float m = i >= ew ? 1.f : -1.f;
|
const float m = i >= ew ? 1.f : -1.f;
|
||||||
|
|
||||||
const float uf = ((2.f * ei) / ew - 1.f) * scale;
|
const float uf = s->flat_range[0] * ((2.f * ei) / ew - 1.f);
|
||||||
const float vf = ((2.f * j + 1.f) / eh - 1.f) * scale;
|
const float vf = s->flat_range[1] * ((2.f * j + 1.f) / eh - 1.f);
|
||||||
|
|
||||||
const float h = hypotf(uf, vf);
|
const float h = hypotf(uf, vf);
|
||||||
const float lh = h > 0.f ? h : 1.f;
|
const float lh = h > 0.f ? h : 1.f;
|
||||||
@ -3034,8 +3032,6 @@ static int xyz_to_dfisheye(const V360Context *s,
|
|||||||
const float *vec, int width, int height,
|
const float *vec, int width, int height,
|
||||||
int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
|
int16_t us[4][4], int16_t vs[4][4], float *du, float *dv)
|
||||||
{
|
{
|
||||||
const float scale = 1.f - s->in_pad;
|
|
||||||
|
|
||||||
const float ew = width / 2.f;
|
const float ew = width / 2.f;
|
||||||
const float eh = height;
|
const float eh = height;
|
||||||
|
|
||||||
@ -3043,8 +3039,8 @@ static int xyz_to_dfisheye(const V360Context *s,
|
|||||||
const float lh = h > 0.f ? h : 1.f;
|
const float lh = h > 0.f ? h : 1.f;
|
||||||
const float theta = acosf(fabsf(vec[2])) / M_PI;
|
const float theta = acosf(fabsf(vec[2])) / M_PI;
|
||||||
|
|
||||||
float uf = (theta * (vec[0] / lh) * s->input_mirror_modifier[0] * scale + 0.5f) * ew;
|
float uf = (theta * (vec[0] / lh) * s->input_mirror_modifier[0] / s->iflat_range[0] + 0.5f) * ew;
|
||||||
float vf = (theta * (vec[1] / lh) * s->input_mirror_modifier[1] * scale + 0.5f) * eh;
|
float vf = (theta * (vec[1] / lh) * s->input_mirror_modifier[1] / s->iflat_range[1] + 0.5f) * eh;
|
||||||
|
|
||||||
int ui, vi;
|
int ui, vi;
|
||||||
int u_shift;
|
int u_shift;
|
||||||
@ -3657,6 +3653,14 @@ static void fov_from_dfov(int format, float d_fov, float w, float h, float *h_fo
|
|||||||
*v_fov = 2.f * atan2f(h * 0.5f, l) * 360.f / M_PI;
|
*v_fov = 2.f * atan2f(h * 0.5f, l) * 360.f / M_PI;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case DUAL_FISHEYE:
|
||||||
|
{
|
||||||
|
const float d = 0.5f * hypotf(w * 0.5f, h);
|
||||||
|
|
||||||
|
*h_fov = d / w * 2.f * d_fov;
|
||||||
|
*v_fov = d / h * d_fov;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case FISHEYE:
|
case FISHEYE:
|
||||||
{
|
{
|
||||||
const float d = 0.5f * hypotf(w, h);
|
const float d = 0.5f * hypotf(w, h);
|
||||||
@ -3928,7 +3932,7 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
case DUAL_FISHEYE:
|
case DUAL_FISHEYE:
|
||||||
s->in_transform = xyz_to_dfisheye;
|
s->in_transform = xyz_to_dfisheye;
|
||||||
err = 0;
|
err = prepare_fisheye_in(ctx);
|
||||||
wf = w;
|
wf = w;
|
||||||
hf = h;
|
hf = h;
|
||||||
break;
|
break;
|
||||||
@ -4058,7 +4062,7 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
break;
|
break;
|
||||||
case DUAL_FISHEYE:
|
case DUAL_FISHEYE:
|
||||||
s->out_transform = dfisheye_to_xyz;
|
s->out_transform = dfisheye_to_xyz;
|
||||||
prepare_out = NULL;
|
prepare_out = prepare_fisheye_out;
|
||||||
w = lrintf(wf);
|
w = lrintf(wf);
|
||||||
h = lrintf(hf);
|
h = lrintf(hf);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user