mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avfilter/vf_v360: support transposed input/output
This commit is contained in:
parent
12b909ba31
commit
a06d70350b
@ -18084,6 +18084,12 @@ Default value is @b{@samp{ypr}}.
|
|||||||
@item d_flip
|
@item d_flip
|
||||||
Flip the output video horizontally/vertically/in-depth. Boolean values.
|
Flip the output video horizontally/vertically/in-depth. Boolean values.
|
||||||
|
|
||||||
|
@item in_trans
|
||||||
|
Set if input video is transposed. Boolean value, by default disabled.
|
||||||
|
|
||||||
|
@item out_trans
|
||||||
|
Set if output video needs to be transposed. Boolean value, by default disabled.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@subsection Examples
|
@subsection Examples
|
||||||
|
@ -99,6 +99,7 @@ typedef struct V360Context {
|
|||||||
float yaw, pitch, roll;
|
float yaw, pitch, roll;
|
||||||
|
|
||||||
int h_flip, v_flip, d_flip;
|
int h_flip, v_flip, d_flip;
|
||||||
|
int in_transpose, out_transpose;
|
||||||
|
|
||||||
float h_fov, v_fov;
|
float h_fov, v_fov;
|
||||||
float flat_range[3];
|
float flat_range[3];
|
||||||
|
@ -93,9 +93,11 @@ static const AVOption v360_options[] = {
|
|||||||
{ "rorder", "rotation order", OFFSET(rorder), AV_OPT_TYPE_STRING, {.str="ypr"}, 0, 0, FLAGS, "rorder"},
|
{ "rorder", "rotation order", OFFSET(rorder), AV_OPT_TYPE_STRING, {.str="ypr"}, 0, 0, FLAGS, "rorder"},
|
||||||
{ "h_fov", "horizontal field of view", OFFSET(h_fov), AV_OPT_TYPE_FLOAT, {.dbl=90.f}, 0.f, 180.f, FLAGS, "h_fov"},
|
{ "h_fov", "horizontal field of view", OFFSET(h_fov), AV_OPT_TYPE_FLOAT, {.dbl=90.f}, 0.f, 180.f, FLAGS, "h_fov"},
|
||||||
{ "v_fov", "vertical field of view", OFFSET(v_fov), AV_OPT_TYPE_FLOAT, {.dbl=45.f}, 0.f, 90.f, FLAGS, "v_fov"},
|
{ "v_fov", "vertical field of view", OFFSET(v_fov), AV_OPT_TYPE_FLOAT, {.dbl=45.f}, 0.f, 90.f, FLAGS, "v_fov"},
|
||||||
{ "h_flip", "flip video horizontally", OFFSET(h_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "h_flip"},
|
{ "h_flip", "flip out video horizontally", OFFSET(h_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "h_flip"},
|
||||||
{ "v_flip", "flip video vertically", OFFSET(v_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "v_flip"},
|
{ "v_flip", "flip out video vertically", OFFSET(v_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "v_flip"},
|
||||||
{ "d_flip", "flip video indepth", OFFSET(d_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "d_flip"},
|
{ "d_flip", "flip out video indepth", OFFSET(d_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "d_flip"},
|
||||||
|
{ "in_trans", "transpose video input", OFFSET(in_transpose), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "in_transpose"},
|
||||||
|
{ "out_trans", "transpose video output", OFFSET(out_transpose), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "out_transpose"},
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2165,6 +2167,12 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
} else if (s->width > 0 || s->height > 0) {
|
} else if (s->width > 0 || s->height > 0) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Both width and height values should be specified.\n");
|
av_log(ctx, AV_LOG_ERROR, "Both width and height values should be specified.\n");
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
} else {
|
||||||
|
if (s->out_transpose)
|
||||||
|
FFSWAP(int, w, h);
|
||||||
|
|
||||||
|
if (s->in_transpose)
|
||||||
|
FFSWAP(int, w, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
s->planeheight[1] = s->planeheight[2] = FF_CEIL_RSHIFT(h, desc->log2_chroma_h);
|
s->planeheight[1] = s->planeheight[2] = FF_CEIL_RSHIFT(h, desc->log2_chroma_h);
|
||||||
@ -2223,10 +2231,16 @@ static int config_output(AVFilterLink *outlink)
|
|||||||
uint16_t *v = s->v[p] + (j * width + i) * elements;
|
uint16_t *v = s->v[p] + (j * width + i) * elements;
|
||||||
int16_t *ker = s->ker[p] + (j * width + i) * elements;
|
int16_t *ker = s->ker[p] + (j * width + i) * elements;
|
||||||
|
|
||||||
out_transform(s, i, j, width, height, vec);
|
if (s->out_transpose)
|
||||||
|
out_transform(s, j, i, height, width, vec);
|
||||||
|
else
|
||||||
|
out_transform(s, i, j, width, height, vec);
|
||||||
rotate(rot_mat, vec);
|
rotate(rot_mat, vec);
|
||||||
mirror(mirror_modifier, vec);
|
mirror(mirror_modifier, vec);
|
||||||
in_transform(s, vec, in_width, in_height, r_tmp.u, r_tmp.v, &du, &dv);
|
if (s->in_transpose)
|
||||||
|
in_transform(s, vec, in_height, in_width, r_tmp.v, r_tmp.u, &du, &dv);
|
||||||
|
else
|
||||||
|
in_transform(s, vec, in_width, in_height, r_tmp.u, r_tmp.v, &du, &dv);
|
||||||
calculate_kernel(du, dv, &r_tmp, u, v, ker);
|
calculate_kernel(du, dv, &r_tmp, u, v, ker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user