From patchwork Thu Aug 25 23:14:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vittorio Giovara X-Patchwork-Id: 298 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp54440vsd; Thu, 25 Aug 2016 16:27:17 -0700 (PDT) X-Received: by 10.194.164.229 with SMTP id yt5mr116684wjb.39.1472167637112; Thu, 25 Aug 2016 16:27:17 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u140si34023045wmu.87.2016.08.25.16.27.15; Thu, 25 Aug 2016 16:27:17 -0700 (PDT) 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; 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 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 A6E3A689A46; Fri, 26 Aug 2016 02:27:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f195.google.com (mail-qt0-f195.google.com [209.85.216.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 440596898EB for ; Fri, 26 Aug 2016 02:26:57 +0300 (EEST) Received: by mail-qt0-f195.google.com with SMTP id u25so2336636qtb.3 for ; Thu, 25 Aug 2016 16:27:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=A6KkTo9IwjJTBDyHb7H8NbX15lLvkLnZYUjKznze2sE=; b=cHSOGhXr0QBaBrH34H+/KmR8rX7OkwvI3d3z0JKpUw8/aCbjDlhw1HdC5E4eoq8IYy 0tzFRg6wg/MnFjnMOsMipStOSx9ewQBLvWrxCye/p3HVQwiKyrdrNOBtkkKAQyk80f7F /nOsXpHbAZXF5a0ZMwF3AbryRYnGPft7ArqDUXoPBpVBoI1G7IBueZgCKNUB7vGvZt2p zkfXRiPTABM5v6u2rNUxLxDYKneNkSSxQzWTNzfsI8pEkKHMF2VQajNGX1sa+W77YcQj OEa8dm5/ph7XqbFmfR7TmkubGvEijvSqu0pXhNqxMSofZp3BwBr7xtwiBxMdGArZIlNH asJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=A6KkTo9IwjJTBDyHb7H8NbX15lLvkLnZYUjKznze2sE=; b=Rahesu8+TR3mjveEZVMv0NY1QneFZP6UYpHubt/SilVVcxyA1hOIBtWy3a0ePQpoic BFlAQkCn1WRpW039rylYdwxG+S4NAnKaIWRod9RgoovCbpGSiT9gWWWcNhfmoFXoiYFu LAbWFxIjRCleCCY5yzUgh4yS3oNg226d+quEp6IphXY/oo7PUjg6gM5UpPN7vJiJqlwN ooiMEsmZT29HMI5UuHTPkVUdigTZ6WIFQdpPSU7wvb5M63+eKtJwYb/vOJdamxKQd2hL 4trOiIWXFugVZrzih9O+aUN/VjttGJDjxF/SCeOOJlJMN0q3xYnzBA4eF1govMsKh5zT TDxQ== X-Gm-Message-State: AE9vXwPnVSr62hK+u9l/BsulcJB30ECPPpwy4L+8XAD+X8pKjZw7voka7jm6uhpv6WMk/Q== X-Received: by 10.200.51.101 with SMTP id u34mr142863qta.54.1472166902202; Thu, 25 Aug 2016 16:15:02 -0700 (PDT) Received: from vimacbookpro.vimeo.iac.corp ([216.112.253.9]) by smtp.gmail.com with ESMTPSA id l32sm8866834qta.23.2016.08.25.16.15.01 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 25 Aug 2016 16:15:01 -0700 (PDT) From: Vittorio Giovara To: ffmpeg-devel@ffmpeg.org Date: Thu, 25 Aug 2016 19:14:59 -0400 Message-Id: <20160825231459.15314-3-vittorio.giovara@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20160825231459.15314-1-vittorio.giovara@gmail.com> References: <20160825231459.15314-1-vittorio.giovara@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/3] vf_colorspace: Allow overriding input color properties 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" The filter needs input frames with color properties filled out by the decoder. Since this is not always possible, add input options to the filter so that user may override color space, color primaries, transfer characteristics, and color range. Signed-off-by: Vittorio Giovara --- Please keep me in CC. Vittorio libavfilter/vf_colorspace.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index 37e77d1..8ef362e 100644 --- a/libavfilter/vf_colorspace.c +++ b/libavfilter/vf_colorspace.c @@ -129,10 +129,10 @@ typedef struct ColorSpaceContext { ColorSpaceDSPContext dsp; enum Colorspace user_all; - enum AVColorSpace in_csp, out_csp, user_csp; - enum AVColorRange in_rng, out_rng, user_rng; - enum AVColorTransferCharacteristic in_trc, out_trc, user_trc; - enum AVColorPrimaries in_prm, out_prm, user_prm; + enum AVColorSpace in_csp, out_csp, user_csp, user_icsp; + enum AVColorRange in_rng, out_rng, user_rng, user_irng; + enum AVColorTransferCharacteristic in_trc, out_trc, user_trc, user_itrc; + enum AVColorPrimaries in_prm, out_prm, user_prm, user_iprm; enum AVPixelFormat in_format, user_format; int fast_mode; enum DitherMode dither; @@ -581,6 +581,8 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->out_primaries || !s->in_primaries) { s->in_prm = in->color_primaries; + if (s->user_iprm != AVCOL_PRI_UNSPECIFIED) + s->in_prm = s->user_iprm; s->in_primaries = get_color_primaries(s->in_prm); if (!s->in_primaries) { av_log(ctx, AV_LOG_ERROR, @@ -638,6 +640,8 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->in_txchr) { av_freep(&s->lin_lut); s->in_trc = in->color_trc; + if (s->user_itrc != AVCOL_TRC_UNSPECIFIED) + s->in_trc = s->user_itrc; s->in_txchr = get_transfer_characteristics(s->in_trc); if (!s->in_txchr) { av_log(ctx, AV_LOG_ERROR, @@ -680,7 +684,11 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->in_lumacoef) { s->in_csp = in->colorspace; + if (s->user_icsp != AVCOL_SPC_UNSPECIFIED) + s->in_csp = s->user_icsp; s->in_rng = in->color_range; + if (s->user_irng != AVCOL_RANGE_UNSPECIFIED) + s->in_rng = s->user_irng; s->in_lumacoef = get_luma_coefficients(s->in_csp); if (!s->in_lumacoef) { av_log(ctx, AV_LOG_ERROR, @@ -1014,6 +1022,9 @@ static const AVOption colorspace_options[] = { { "space", "Output colorspace", OFFSET(user_csp), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED }, AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "csp" }, + { "ispace", "Input colorspace", + OFFSET(user_icsp), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED }, + AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "csp" }, ENUM("bt709", AVCOL_SPC_BT709, "csp"), ENUM("fcc", AVCOL_SPC_FCC, "csp"), ENUM("bt470bg", AVCOL_SPC_BT470BG, "csp"), @@ -1024,12 +1035,18 @@ static const AVOption colorspace_options[] = { { "range", "Output color range", OFFSET(user_rng), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_NB - 1, FLAGS, "rng" }, + { "irange", "Input color range", + OFFSET(user_irng), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, + AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_NB - 1, FLAGS, "rng" }, ENUM("mpeg", AVCOL_RANGE_MPEG, "rng"), ENUM("jpeg", AVCOL_RANGE_JPEG, "rng"), { "primaries", "Output color primaries", OFFSET(user_prm), AV_OPT_TYPE_INT, { .i64 = AVCOL_PRI_UNSPECIFIED }, AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "prm" }, + { "iprimaries", "Input color primaries", + OFFSET(user_iprm), AV_OPT_TYPE_INT, { .i64 = AVCOL_PRI_UNSPECIFIED }, + AVCOL_PRI_RESERVED0, AVCOL_PRI_NB - 1, FLAGS, "prm" }, ENUM("bt709", AVCOL_PRI_BT709, "prm"), ENUM("bt470m", AVCOL_PRI_BT470M, "prm"), ENUM("bt470bg", AVCOL_PRI_BT470BG, "prm"), @@ -1040,6 +1057,9 @@ static const AVOption colorspace_options[] = { { "trc", "Output transfer characteristics", OFFSET(user_trc), AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED }, AVCOL_TRC_RESERVED0, AVCOL_TRC_NB - 1, FLAGS, "trc" }, + { "itrc", "Input transfer characteristics", + OFFSET(user_itrc), AV_OPT_TYPE_INT, { .i64 = AVCOL_TRC_UNSPECIFIED }, + AVCOL_TRC_RESERVED0, AVCOL_TRC_NB - 1, FLAGS, "trc" }, ENUM("bt709", AVCOL_TRC_BT709, "trc"), ENUM("gamma22", AVCOL_TRC_GAMMA22, "trc"), ENUM("gamma28", AVCOL_TRC_GAMMA28, "trc"),