]> git.sesse.net Git - ffmpeg/commitdiff
avfilter/vf_v360: support transposed input/output
authorPaul B Mahol <onemda@gmail.com>
Sat, 7 Sep 2019 14:32:16 +0000 (16:32 +0200)
committerPaul B Mahol <onemda@gmail.com>
Sat, 7 Sep 2019 20:09:17 +0000 (22:09 +0200)
doc/filters.texi
libavfilter/v360.h
libavfilter/vf_v360.c

index 07e776ab0f441149f766db89d7e47a9a30c6edad..79808686bac59ae0fcfa6d02e52747b48d317151 100644 (file)
@@ -18084,6 +18084,12 @@ Default value is @b{@samp{ypr}}.
 @item d_flip
 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
 
 @subsection Examples
index 2da25445f91a4d327115ede5907bb1803773a088..5badb437aa7c15f82a3d6c3a08fce47f684796e8 100644 (file)
@@ -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];
index c90f16bfa75ac6e4482bf64b5dd18f7e3d54e585..d9ac7adb5466d148020c897f9ec071ca4f0d478a 100644 (file)
@@ -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);
             }
         }