diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-09-07 16:32:16 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-09-07 22:09:17 +0200 |
commit | a06d70350b2b0609320e99bfa6680a81434ba823 (patch) | |
tree | e7e63b8e0d8f134ebb3ced495a6c69929ea1004e /libavfilter | |
parent | 12b909ba319d32ed100d9b26021aa9b6976424d7 (diff) | |
download | ffmpeg-a06d70350b2b0609320e99bfa6680a81434ba823.tar.gz |
avfilter/vf_v360: support transposed input/output
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/v360.h | 1 | ||||
-rw-r--r-- | libavfilter/vf_v360.c | 24 |
2 files changed, 20 insertions, 5 deletions
diff --git a/libavfilter/v360.h b/libavfilter/v360.h index 2da25445f9..5badb437aa 100644 --- a/libavfilter/v360.h +++ b/libavfilter/v360.h @@ -99,6 +99,7 @@ typedef struct V360Context { float yaw, pitch, roll; int h_flip, v_flip, d_flip; + int in_transpose, out_transpose; float h_fov, v_fov; float flat_range[3]; diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c index c90f16bfa7..d9ac7adb54 100644 --- a/libavfilter/vf_v360.c +++ b/libavfilter/vf_v360.c @@ -93,9 +93,11 @@ static const AVOption v360_options[] = { { "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"}, { "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"}, - { "v_flip", "flip 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"}, + { "h_flip", "flip out video horizontally", OFFSET(h_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "h_flip"}, + { "v_flip", "flip out video vertically", OFFSET(v_flip), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS, "v_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 } }; @@ -2165,6 +2167,12 @@ static int config_output(AVFilterLink *outlink) } else if (s->width > 0 || s->height > 0) { av_log(ctx, AV_LOG_ERROR, "Both width and height values should be specified.\n"); 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); @@ -2223,10 +2231,16 @@ static int config_output(AVFilterLink *outlink) uint16_t *v = s->v[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); 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); } } |