[FFmpeg-cvslog] avfilter/vf_v360: add spline16 interpolation

Paul B Mahol git at videolan.org
Sat Jan 18 14:47:40 EET 2020


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri Jan 17 20:01:23 2020 +0100| [aa42a1e6d7fad0c2a793f63b46b5a82a80561428] | committer: Paul B Mahol

avfilter/vf_v360: add spline16 interpolation

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=aa42a1e6d7fad0c2a793f63b46b5a82a80561428
---

 doc/filters.texi      |  3 +++
 libavfilter/v360.h    |  1 +
 libavfilter/vf_v360.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index aa7dad5702..c8ac4311f5 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -19024,6 +19024,9 @@ Bicubic interpolation.
 @item lanc
 @item lanczos
 Lanczos interpolation.
+ at item sp16
+ at item spline16
+Spline16 interpolation.
 @end table
 
 Default value is @b{@samp{line}}.
diff --git a/libavfilter/v360.h b/libavfilter/v360.h
index d7db62ce27..9f74272133 100644
--- a/libavfilter/v360.h
+++ b/libavfilter/v360.h
@@ -54,6 +54,7 @@ enum InterpMethod {
     BILINEAR,
     BICUBIC,
     LANCZOS,
+    SPLINE16,
     NB_INTERP_METHODS,
 };
 
diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c
index 88f8ea2f8a..e2e38db412 100644
--- a/libavfilter/vf_v360.c
+++ b/libavfilter/vf_v360.c
@@ -99,6 +99,8 @@ static const AVOption v360_options[] = {
     {     "cubic", "bicubic interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=BICUBIC},         0,                   0, FLAGS, "interp" },
     {      "lanc", "lanczos interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=LANCZOS},         0,                   0, FLAGS, "interp" },
     {   "lanczos", "lanczos interpolation",                      0, AV_OPT_TYPE_CONST,  {.i64=LANCZOS},         0,                   0, FLAGS, "interp" },
+    {      "sp16", "spline16 interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=SPLINE16},        0,                   0, FLAGS, "interp" },
+    {  "spline16", "spline16 interpolation",                     0, AV_OPT_TYPE_CONST,  {.i64=SPLINE16},        0,                   0, FLAGS, "interp" },
     {         "w", "output width",                   OFFSET(width), AV_OPT_TYPE_INT,    {.i64=0},               0,           INT16_MAX, FLAGS, "w"},
     {         "h", "output height",                 OFFSET(height), AV_OPT_TYPE_INT,    {.i64=0},               0,           INT16_MAX, FLAGS, "h"},
     { "in_stereo", "input stereo format",        OFFSET(in_stereo), AV_OPT_TYPE_INT,    {.i64=STEREO_2D},       0,    NB_STEREO_FMTS-1, FLAGS, "stereo" },
@@ -314,6 +316,7 @@ void ff_v360_init(V360Context *s, int depth)
         break;
     case BICUBIC:
     case LANCZOS:
+    case SPLINE16:
         s->remap_line = depth <= 8 ? remap4_8bit_line_c : remap4_16bit_line_c;
         break;
     }
@@ -466,6 +469,48 @@ static void lanczos_kernel(float du, float dv, const XYRemap *rmap,
     }
 }
 
+/**
+ * Calculate 1-dimensional spline16 coefficients.
+ *
+ * @param t relative coordinate
+ * @param coeffs coefficients
+ */
+static void calculate_spline16_coeffs(float t, float *coeffs)
+{
+    coeffs[0] = ((-1.f / 3.f * t + 0.8f) * t - 7.f / 15.f) * t;
+    coeffs[1] = ((t - 9.f / 5.f) * t - 0.2f) * t + 1.f;
+    coeffs[2] = ((6.f / 5.f - t) * t + 0.8f) * t;
+    coeffs[3] = ((1.f / 3.f * t - 0.2f) * t - 2.f / 15.f) * t;
+}
+
+/**
+ * Calculate kernel for spline16 interpolation.
+ *
+ * @param du horizontal relative coordinate
+ * @param dv vertical relative coordinate
+ * @param rmap calculated 4x4 window
+ * @param u u remap data
+ * @param v v remap data
+ * @param ker ker remap data
+ */
+static void spline16_kernel(float du, float dv, const XYRemap *rmap,
+                            uint16_t *u, uint16_t *v, int16_t *ker)
+{
+    float du_coeffs[4];
+    float dv_coeffs[4];
+
+    calculate_spline16_coeffs(du, du_coeffs);
+    calculate_spline16_coeffs(dv, dv_coeffs);
+
+    for (int i = 0; i < 4; i++) {
+        for (int j = 0; j < 4; j++) {
+            u[i * 4 + j] = rmap->u[i][j];
+            v[i * 4 + j] = rmap->v[i][j];
+            ker[i * 4 + j] = lrintf(du_coeffs[j] * dv_coeffs[i] * 16385.f);
+        }
+    }
+}
+
 /**
  * Modulo operation with only positive remainders.
  *
@@ -2681,6 +2726,13 @@ static int config_output(AVFilterLink *outlink)
         sizeof_uv = sizeof(uint16_t) * s->elements;
         sizeof_ker = sizeof(uint16_t) * s->elements;
         break;
+    case SPLINE16:
+        s->calculate_kernel = spline16_kernel;
+        s->remap_slice = depth <= 8 ? remap4_8bit_slice : remap4_16bit_slice;
+        s->elements = 4 * 4;
+        sizeof_uv = sizeof(uint16_t) * s->elements;
+        sizeof_ker = sizeof(uint16_t) * s->elements;
+        break;
     default:
         av_assert0(0);
     }



More information about the ffmpeg-cvslog mailing list