From patchwork Thu Aug 15 00:56:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eugene Lyapustin X-Patchwork-Id: 14516 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A70C8449CDA for ; Thu, 15 Aug 2019 03:56:26 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 917C868AB79; Thu, 15 Aug 2019 03:56:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 68F90680987 for ; Thu, 15 Aug 2019 03:56:18 +0300 (EEST) Received: by mail-lj1-f171.google.com with SMTP id t3so778994ljj.12 for ; Wed, 14 Aug 2019 17:56:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=FnSMMSYvzoq5WKlwlkkcFew53rc8titic/dpKIwD1Ak=; b=ek2uACiKC5O+7w66qzffPEKlUwMv2mamRjLCn4lVnEIXJtRAGjhLfvDMI+8hARvVx6 qDDgSDVJ1GY5OU6S9j0TaGah3JUoAwk6xnXxNrs1mGmKLdKRontFTTtp95hMetESim7f PtNF3bDTKau4oBLBX7lZuVEVeAJKcJpFMOSr1kRCT2iqZJxEcAB69CyMvEk3ZA5X2mBg FScj35B2YHg11fdRGWL4KPf8dfv62G11m1iM2WRv9Gb61sewi5N/2CowVoJEmTX7WgI/ oi593Om+Jp0Sa1Ubg7cehA/58KCfAEWh4/Tk7KeQNlKWFO4wWUN9Qwwuh4RSlxnSUgeZ qN4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FnSMMSYvzoq5WKlwlkkcFew53rc8titic/dpKIwD1Ak=; b=Dgdu1wFAa/2gO2EC7fkDTMu6c7jn3cGc/B9hrT8D8k1Ke5FbPcz2zJVqQOlTIIAJVV e4i+Wnk94s2XMXEFf+q7kilsMlJcCPIlp9gYTjXVFHV8m9J7YIIRerpBbJ+8/euGus9w Cvrk12M8wiL9/eVG2bKD0uLP+wEzhF2p7kOBWvrFg1JxcDfaGvexAwXPh89cLp1SlRaC UbCx5R5S566UivDA+vXrPiWTATUJ6twFPXSflbo33w0qda6DnWVYB0jNr4+YX0NLI27T z/SnSIgawW1M7dq4Rt1Sus9gaYA3VbScREQKwTdrHDJExHGDFa91p8PDPR6u6ZuaWjDo bxdg== X-Gm-Message-State: APjAAAWVEhML5NXHcTEOLKIZ7G7QLTb5EX6+v6Hpt7kXE3n0yGnomDNz ZiNskPO+zPRiRsfrGrm903MVSnQEEP4= X-Google-Smtp-Source: APXvYqzQwPWI3PSeTMEaz4+hbrdKJpV/4e9qJuVBFeYlT9fE8B2LEOYmak0z++GpcER/bTMeJgpbwA== X-Received: by 2002:a2e:3a0e:: with SMTP id h14mr1287053lja.180.1565830577592; Wed, 14 Aug 2019 17:56:17 -0700 (PDT) Received: from unis-note.localdomain ([176.109.79.157]) by smtp.gmail.com with ESMTPSA id d16sm178517lfi.31.2019.08.14.17.56.16 for (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Wed, 14 Aug 2019 17:56:16 -0700 (PDT) From: Eugene Lyapustin To: ffmpeg-devel@ffmpeg.org Date: Thu, 15 Aug 2019 03:56:13 +0300 Message-Id: <20190815005613.4287-4-unishifft@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190815005613.4287-1-unishifft@gmail.com> References: <20190815005613.4287-1-unishifft@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/3] avfilter/vf_v360: add dual fisheye format X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Eugene Lyapustin --- doc/filters.texi | 20 ++++++++++++++ libavfilter/vf_v360.c | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index 6c70ffceb1..feb3a123b6 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -17972,6 +17972,26 @@ Format specific options: @item v_fov Set horizontal/vertical field of view. Values in degrees. @end table + +@item dfisheye +Dual fisheye. @i{(input only)} + +Format specific options: +@table @option +@item in_pad +Set padding proprtion. Values in decimals. + +Example values: +@table @samp +@item 0 +No padding. +@item 0.01 +1% padding. +@end table + +Default value is @b{@samp{0}}. +@end table + @end table @item interp diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c index 22e1f726a7..e8ce4e790d 100644 --- a/libavfilter/vf_v360.c +++ b/libavfilter/vf_v360.c @@ -48,6 +48,7 @@ enum Projections { CUBEMAP_6_1, EQUIANGULAR, FLAT, + DUAL_FISHEYE, NB_PROJECTIONS, }; @@ -136,6 +137,7 @@ static const AVOption v360_options[] = { { "c3x2", "cubemap3x2", 0, AV_OPT_TYPE_CONST, {.i64=CUBEMAP_3_2}, 0, 0, FLAGS, "in" }, { "c6x1", "cubemap6x1", 0, AV_OPT_TYPE_CONST, {.i64=CUBEMAP_6_1}, 0, 0, FLAGS, "in" }, { "eac", "equi-angular", 0, AV_OPT_TYPE_CONST, {.i64=EQUIANGULAR}, 0, 0, FLAGS, "in" }, + { "dfisheye", "dual fisheye", 0, AV_OPT_TYPE_CONST, {.i64=DUAL_FISHEYE}, 0, 0, FLAGS, "in" }, { "output", "set output projection", OFFSET(out), AV_OPT_TYPE_INT, {.i64=CUBEMAP_3_2}, 0, NB_PROJECTIONS-1, FLAGS, "out" }, { "e", "equirectangular", 0, AV_OPT_TYPE_CONST, {.i64=EQUIRECTANGULAR}, 0, 0, FLAGS, "out" }, { "c3x2", "cubemap3x2", 0, AV_OPT_TYPE_CONST, {.i64=CUBEMAP_3_2}, 0, 0, FLAGS, "out" }, @@ -1593,6 +1595,58 @@ static void flat_to_xyz(const V360Context *s, vec[2] = l_z / norm; } +/** + * Calculate frame position in dual fisheye format for corresponding 3D coordinates on sphere. + * + * @param s filter context + * @param vec coordinates on sphere + * @param width frame width + * @param height frame height + * @param us horizontal coordinates for interpolation window + * @param vs vertical coordinates for interpolation window + * @param du horizontal relative coordinate + * @param dv vertical relative coordinate + */ +static void xyz_to_dfisheye(const V360Context *s, + const float *vec, int width, int height, + uint16_t us[4][4], uint16_t vs[4][4], float *du, float *dv) +{ + const float scale = 1.f - s->in_pad; + + const float ew = width / 2.f; + const float eh = height; + + const float phi = atan2f(-vec[1], -vec[0]); + const float theta = acosf(fabsf(vec[2])) / M_PI; + + float uf = (theta * cosf(phi) * scale + 0.5f) * ew; + float vf = (theta * sinf(phi) * scale + 0.5f) * eh; + + int ui, vi; + int u_shift; + int i, j; + + if (vec[2] >= 0) { + u_shift = 0; + } else { + u_shift = ceilf(ew); + uf = ew - uf; + } + + ui = floorf(uf); + vi = floorf(vf); + + *du = uf - ui; + *dv = vf - vi; + + for (i = -1; i < 3; i++) { + for (j = -1; j < 3; j++) { + us[i + 1][j + 1] = av_clip(u_shift + ui + j, 0, width - 1); + vs[i + 1][j + 1] = av_clip( vi + i, 0, height - 1); + } + } +} + /** * Calculate rotation matrix for yaw/pitch/roll angles. */ @@ -1730,6 +1784,12 @@ static int config_output(AVFilterLink *outlink) case FLAT: av_log(ctx, AV_LOG_ERROR, "Flat format is not accepted as input.\n"); return AVERROR(EINVAL); + case DUAL_FISHEYE: + in_transform = xyz_to_dfisheye; + err = 0; + wf = inlink->w; + hf = inlink->h; + break; default: av_log(ctx, AV_LOG_ERROR, "Specified input format is not handled.\n"); return AVERROR_BUG; @@ -1770,6 +1830,9 @@ static int config_output(AVFilterLink *outlink) w = roundf(wf * s->flat_range[0] / s->flat_range[1] / 2.f); h = roundf(hf); break; + case DUAL_FISHEYE: + av_log(ctx, AV_LOG_ERROR, "Dual fisheye format is not accepted as output.\n"); + return AVERROR(EINVAL); default: av_log(ctx, AV_LOG_ERROR, "Specified output format is not handled.\n"); return AVERROR_BUG;