diff options
author | Paul B Mahol <onemda@gmail.com> | 2020-01-17 20:01:23 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-01-18 10:27:11 +0100 |
commit | aa42a1e6d7fad0c2a793f63b46b5a82a80561428 (patch) | |
tree | e55cffad83716e004ec6a0d053194c2cd2480752 /libavfilter | |
parent | b3cfbd7194f0bf4dacaa08f77bcad8af4ddf7fe9 (diff) | |
download | ffmpeg-aa42a1e6d7fad0c2a793f63b46b5a82a80561428.tar.gz |
avfilter/vf_v360: add spline16 interpolation
Diffstat (limited to 'libavfilter')
-rw-r--r-- | libavfilter/v360.h | 1 | ||||
-rw-r--r-- | libavfilter/vf_v360.c | 52 |
2 files changed, 53 insertions, 0 deletions
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; } @@ -467,6 +470,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. * * @param a dividend @@ -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); } |