From patchwork Thu Nov 30 22:11:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 6477 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp413615jah; Thu, 30 Nov 2017 14:12:39 -0800 (PST) X-Google-Smtp-Source: AGs4zMZegNSx+4R3gzgyNiwV9dZSJgtgzmUUbaSur436ytBQ4qhIqdkFPBO6z4goN+kzU5jpXCj/ X-Received: by 10.28.122.11 with SMTP id v11mr3128925wmc.104.1512079959301; Thu, 30 Nov 2017 14:12:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512079959; cv=none; d=google.com; s=arc-20160816; b=UiukFBBOI8tqjYX5F87gePmDqiD4f2gAMaJck54E/QcVyHSvM64KOIYRpSlZvKFUVX JQVhDb+KnhKICnghv5mgvoBMj35djpZWZ98ICmRT0co2YZI99I8GakPb3fCGGn2b/joB eHpnE56BrbTKjju4SG5uT0cy+j+t72mYOPqDwdqBdQyGk4RauuVTiOrNxkb0XF9iAqOw xllzL5uPPyKKUh23xoi7YACYPPhnVJnaxk2lKhRAx+U8Z1snMe9FWDyN5B4q6OE+bCBy A54XPNPWfg+o9Mj/AXfda+SZ3sBp0fAeH5NBzVbepPdzeFIDKOsBEn54BOrm9ec3OxUf W/iQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=7XF5yTxBrxUA2WP8mcPfqkX6liiFq92iyQwSCGea7t8=; b=CYKEALbJi+uQQkfCxYGLSOAyhxRq4GuRG73rxvxolkZmhg5N9HygsZ8/hM1JCnt0HU gSisaOcnmAtKYHN2elRjXBy6VcyliUSOTwAOWABgquiqoy6q6TCPVZjZm0AVzX7WpljL XxQn5wyPSZsyOB0jBSRNi2/TGVVhF+tQb9K/N3BdKQv/fo+8AVRq0fqgb8xVG1TK78q1 lR/3uagFh6+dhBwNkBIO7I4ts7kKMMx/MRoRB65FqWu34FQYr4LAPoHqgeviww55Fr0u RVJeYO3So8T004Aijdp/j5DcL21tk2kt6Yo/Mlgi+buFTu/K6vile46cH0HsnpkcTed5 PSNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kpqEHTR4; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 7si3791125wmb.168.2017.11.30.14.12.37; Thu, 30 Nov 2017 14:12:39 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kpqEHTR4; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1B09D68A349; Fri, 1 Dec 2017 00:12:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 382A168A202 for ; Fri, 1 Dec 2017 00:12:25 +0200 (EET) Received: by mail-wm0-f66.google.com with SMTP id y82so3278274wmg.1 for ; Thu, 30 Nov 2017 14:12:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=Qkq2RM0j+eiF/+MOmZVZoL55ZbCpK5WMn0+8Br+I9Gw=; b=kpqEHTR4JnKYhPXr+e01LRlpKiSVolijzfoPe2r8nCzps8G8DMdkpDOg5Og4Z9iXVI 6IqXdOnM7cBhXwxMNSrpRWyo+l5RX59kkjWO6NXugee5bKy39t8DtEC8dYUX29NnrhG3 F70ecSAlW6Fd7J8u1TP6y/KP2gq+LYht5Vixg/QvriYKmxu/0cBCB2ep03iF0nMIWmr3 /8R8860huEAvBdpuvSxCPYUYal+Y0hW2PFoJ/q0rFUcBXEj3QrlVzY/Jz1yvFR8hY6nF e8GPIoN+Z7+GVUsIe/vCgWGlSorerKVrsO15H+J0fKXC5BcAmYXOH2eOM/pxXISI2lzM 7eTQ== 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; bh=Qkq2RM0j+eiF/+MOmZVZoL55ZbCpK5WMn0+8Br+I9Gw=; b=ClHYlADeOA78tjhrdIfHFPSFlESCbCKPgOoqrgnUeh3cBA6/zjFDr5/6nK4mtdQnp+ +5c4vY1Y4ZYbj0KMcd7tlIi+o8ilEU2WK9lMxvlqfBD2lV76ch6DDOxLFrq0h91qaOL2 tKK6QWD4dOZgp+08imBl4qGudQpLGNrXvt3OuhRwUjbMAG/5qJ0orOj11WGLkK2YWNvU NLNPjQ2cOjlmooL6/f66O92pekXCijwcrE3pfVIV9xGvcRoSqVRqa5Gd4HEjBq2q+eiS +uqS03wTc1cQNTr0/mavejGtFG8AzPxG7Gy2s1tpIQAu14TUXOXdc7qshthkhQ5iU5je ve3Q== X-Gm-Message-State: AJaThX6MoxgUy6DLJLonJ7THmqb2k+zryRGhJ1p+Hj+j00oqtO1QJBnW mA5XjMTfMiG+YxZVXXu1Apkdrg== X-Received: by 10.28.199.75 with SMTP id x72mr2868667wmf.87.1512079947962; Thu, 30 Nov 2017 14:12:27 -0800 (PST) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id j15sm5653131wmg.48.2017.11.30.14.12.26 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 30 Nov 2017 14:12:27 -0800 (PST) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Thu, 30 Nov 2017 23:11:46 +0100 Message-Id: <20171130221146.15471-1-onemda@gmail.com> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_stereo3d: implement auto detection by using frame side data 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- doc/filters.texi | 4 ++++ libavfilter/avfilter.c | 30 ++++++++++++++++++++++++++++++ libavfilter/internal.h | 2 ++ libavfilter/vf_stereo3d.c | 37 ++++++++++++++++++++++++++++++++++--- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 4a4efc70c8..e8da5e21a6 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -14057,6 +14057,10 @@ Set stereoscopic image format of input. Available values for input image formats are: @table @samp +@item auto +set input format using frame side data +If such data is not available filter will return unchanged input. + @item sbsl side by side parallel (left eye left, right eye right) diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index b98b32bacb..0d4bfd2671 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -378,6 +378,36 @@ int avfilter_config_links(AVFilterContext *filter) return 0; } +static int reset_links(AVFilterContext *filter) +{ + int i, ret; + + if (!filter) + return 0; + + for (i = 0; i < filter->nb_outputs; i++) { + AVFilterLink *link = filter->outputs[i]; + + link->init_state = AVLINK_UNINIT; + link->frame_rate.num = link->frame_rate.den = 0; + link->w = link->h = 0; + + ret = reset_links(link->dst); + if (ret < 0) + return ret; + } + + if (!i) + return avfilter_config_links(filter); + + return 0; +} + +int ff_reconfig_links(AVFilterContext *filter) +{ + return reset_links(filter); +} + void ff_tlog_link(void *ctx, AVFilterLink *link, int end) { if (link->type == AVMEDIA_TYPE_VIDEO) { diff --git a/libavfilter/internal.h b/libavfilter/internal.h index f9679ed1d7..5062bb7296 100644 --- a/libavfilter/internal.h +++ b/libavfilter/internal.h @@ -411,4 +411,6 @@ static inline int ff_norm_qscale(int qscale, int type) */ int ff_filter_get_nb_threads(AVFilterContext *ctx); +int ff_reconfig_links(AVFilterContext *ctx); + #endif /* AVFILTER_INTERNAL_H */ diff --git a/libavfilter/vf_stereo3d.c b/libavfilter/vf_stereo3d.c index 8b22f880ca..6665a2631b 100644 --- a/libavfilter/vf_stereo3d.c +++ b/libavfilter/vf_stereo3d.c @@ -25,6 +25,7 @@ #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" #include "avfilter.h" #include "drawutils.h" #include "formats.h" @@ -47,8 +48,8 @@ enum StereoCode { ANAGLYPH_YB_DUBOIS, // anaglyph yellow/blue dubois ANAGLYPH_RB_GRAY, // anaglyph red/blue gray ANAGLYPH_RG_GRAY, // anaglyph red/green gray - MONO_L, // mono output for debugging (left eye only) - MONO_R, // mono output for debugging (right eye only) + MONO_L, // mono output (left eye only) + MONO_R, // mono output (right eye only) INTERLEAVE_ROWS_LR, // row-interleave (left eye has top row) INTERLEAVE_ROWS_RL, // row-interleave (right eye has top row) SIDE_BY_SIDE_LR, // side by side parallel (left eye left, right eye right) @@ -66,7 +67,8 @@ enum StereoCode { INTERLEAVE_COLS_LR, // column-interleave (left eye first, right eye second) INTERLEAVE_COLS_RL, // column-interleave (right eye first, left eye second) HDMI, // HDMI frame pack (left eye first, right eye second) - STEREO_CODE_COUNT // TODO: needs autodetection + AUTO, // guess input format using frame's metadata. + STEREO_CODE_COUNT }; typedef struct StereoComponent { @@ -173,6 +175,7 @@ static const AVOption stereo3d_options[] = { { "irr", "interleave rows right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_ROWS_RL}, 0, 0, FLAGS, "in" }, { "icl", "interleave columns left first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_LR}, 0, 0, FLAGS, "in" }, { "icr", "interleave columns right first", 0, AV_OPT_TYPE_CONST, {.i64=INTERLEAVE_COLS_RL}, 0, 0, FLAGS, "in" }, + { "auto", "guess using frame metadata", 0, AV_OPT_TYPE_CONST, {.i64=AUTO}, 0, 0, FLAGS, "in" }, { "out", "set output format", OFFSET(out.format), AV_OPT_TYPE_INT, {.i64=ANAGLYPH_RC_DUBOIS}, 0, STEREO_CODE_COUNT-1, FLAGS, "out"}, { "ab2l", "above below half height left first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_LR}, 0, 0, FLAGS, "out" }, { "ab2r", "above below half height right first", 0, AV_OPT_TYPE_CONST, {.i64=ABOVE_BELOW_2_RL}, 0, 0, FLAGS, "out" }, @@ -366,6 +369,9 @@ static int config_output(AVFilterLink *outlink) int ret; s->aspect = inlink->sample_aspect_ratio; + if (s->in.format == AUTO || (s->in.format == s->out.format)) + return 0; + switch (s->in.format) { case INTERLEAVE_COLS_LR: case INTERLEAVE_COLS_RL: @@ -670,6 +676,31 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *inpicref) int out_off_left[4], out_off_right[4]; int i, ret; + if (s->in.format == AUTO) { + AVFrameSideData *sd = av_frame_get_side_data(inpicref, AV_FRAME_DATA_STEREO3D); + AVFilterLink *link; + + if (sd) { + AVStereo3D *s3d = (AVStereo3D *)sd->data; + + switch (s3d->type) { + case AV_STEREO3D_SIDEBYSIDE: s->in.format = SIDE_BY_SIDE_LR; break; + case AV_STEREO3D_SIDEBYSIDE_QUINCUNX: s->in.format = SIDE_BY_SIDE_LR; break; + case AV_STEREO3D_TOPBOTTOM: s->in.format = ABOVE_BELOW_LR; break; + case AV_STEREO3D_CHECKERBOARD: s->in.format = CHECKERBOARD_LR; break; + case AV_STEREO3D_FRAMESEQUENCE: s->in.format = ALTERNATING_LR; break; + case AV_STEREO3D_LINES: s->in.format = INTERLEAVE_ROWS_LR; break; + case AV_STEREO3D_COLUMNS: s->in.format = INTERLEAVE_COLS_LR; break; + default: s->in.format = s->out.format = MONO_L; + }; + } else { + s->in.format = s->out.format = MONO_L; + } + + if ((ret = ff_reconfig_links(ctx)) < 0) + return ret; + } + if (s->in.format == s->out.format) return ff_filter_frame(outlink, inpicref);