From patchwork Mon Aug 29 15:23:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vittorio Giovara X-Patchwork-Id: 326 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp1751061vsd; Mon, 29 Aug 2016 08:46:35 -0700 (PDT) X-Received: by 10.194.127.37 with SMTP id nd5mr16118925wjb.156.1472485595075; Mon, 29 Aug 2016 08:46:35 -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 r7si32664640wjt.42.2016.08.29.08.46.30; Mon, 29 Aug 2016 08:46:35 -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 1A541689C40; Mon, 29 Aug 2016 18:46:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f195.google.com (mail-qk0-f195.google.com [209.85.220.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 962AB689B59 for ; Mon, 29 Aug 2016 18:23:45 +0300 (EEST) Received: by mail-qk0-f195.google.com with SMTP id o1so10540461qkd.2 for ; Mon, 29 Aug 2016 08:23:50 -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=YqEtB5lLNK7j6WCf9F4/T6CdOPaSVQ5ABBngHzQWvLk=; b=aBI9Ny6u4jJn1oF4yDYmbo1bVlMCPnp3HnSqfNAj3g2oZyKF6rrR2sXPFGTamCj3gk kYeo/tN16q8V8Ybk/GX9IlkKqATgHWl3SoDN7MTFcfRzFslR7sSrkpbd7Wj8NlzWB8o4 JFptwt0zP1Dz+rzMvMF0hMFpo7XHaEcoJk0ldTijRHnh8Gdu5HiGUOWrqY+3C7Bqqb0O JvVhyvK836VehV8ZoKz870gFd6Uk+58Qmx6KjuBlVKuwsqjuN/xLYcLvE0dlmtlAkV8U gM6BSb/CccUd3uZUe/LwhiueCOhlJmZEP+OSB4myL+OOAoMK75G4t/FS7+14nQM491wi +Z/Q== 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=YqEtB5lLNK7j6WCf9F4/T6CdOPaSVQ5ABBngHzQWvLk=; b=ADqqfAOvjwzltTHe1wNBbal7x2SPRMY5gBbPra4kBWkmcQzHZNZs3oqujW4yFGmD3Y Rn+M7e6FgvnTcxzbySl+kgjfjffbDOACzkTQju+khahHUOo7z7xO+Aj9MuL8Wg1fxB1s 0CY0vWDHGPB39EdO01GtH7c2CuxN0CTbcP43FUR8NOfwKezKLhcy+ThZz7nzIC35IXNP wL8m1k/Vq1Al/aoOYYhDTPWj39I0PMV8HlzxxgzhZaQBS0btD7ETRW/jasU9X3DASQbJ B5wIdq+7mV4ZPgLwro7NEIDpnR87XsCzikFNVMHD+tZjgZhKQ6B5HghsOfntujUl7Nnn xX0w== X-Gm-Message-State: AE9vXwMhiqSw7D8QCmmJlII0FFMWRu2z5seG7B3ydV60aZK10EpBFIAvIncIuGd8RjVbxQ== X-Received: by 10.55.187.68 with SMTP id l65mr19650372qkf.178.1472484228819; Mon, 29 Aug 2016 08:23:48 -0700 (PDT) Received: from vimacbookpro.vimeo.iac.corp ([216.112.253.9]) by smtp.gmail.com with ESMTPSA id c5sm1334395qke.32.2016.08.29.08.23.47 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Aug 2016 08:23:48 -0700 (PDT) From: Vittorio Giovara To: ffmpeg-devel@ffmpeg.org Date: Mon, 29 Aug 2016 11:23:46 -0400 Message-Id: <20160829152346.80447-1-vittorio.giovara@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCHv2] 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, as well as a generic option to set all properties at once. Signed-off-by: Vittorio Giovara --- * added iall option * updated filter documentation Please CC. Vittorio doc/filters.texi | 20 ++++++++++++++++++++ libavfilter/vf_colorspace.c | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index b50d7a6..8045840 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -5235,6 +5235,7 @@ Convert colorspace, transfer characteristics or color primaries. The filter accepts the following options: @table @option +@anchor{all} @item all Specify all color properties at once. @@ -5266,6 +5267,10 @@ BT.2020 @end table +@item iall +Override all input properties at once. Same accepted values as @ref{all}. + +@anchor{space} @item space Specify output colorspace. @@ -5291,6 +5296,10 @@ BT.2020 with non-constant luminance @end table +@item ispace +Override input colorspace. Same accepted values as @ref{space}. + +@anchor{trc} @item trc Specify output transfer characteristics. @@ -5319,6 +5328,10 @@ BT.2020 for 12-bits content @end table +@item itrc +Override input transfer characteristics. Same accepted values as @ref{trc}. + +@anchor{primaries} @item primaries Specify output color primaries. @@ -5344,6 +5357,10 @@ BT.2020 @end table +@item iprimaries +Override input color primaries. Same accepted values as @ref{primaries}. + +@anchor{range} @item range Specify output color range. @@ -5357,6 +5374,9 @@ JPEG (full) range @end table +@item irange +Override input color range. Same accepted values as @ref{range}. + @item format Specify output color format. diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index e4022f8..c1ef5b3 100644 --- a/libavfilter/vf_colorspace.c +++ b/libavfilter/vf_colorspace.c @@ -128,11 +128,11 @@ 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 Colorspace user_all, user_iall; + 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,10 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->out_primaries || !s->in_primaries) { s->in_prm = in->color_primaries; + if (s->user_iall != CS_UNSPECIFIED) + s->in_prm = default_prm[FFMIN(s->user_iall, CS_NB)]; + 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 +642,10 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->in_txchr) { av_freep(&s->lin_lut); s->in_trc = in->color_trc; + if (s->user_iall != CS_UNSPECIFIED) + s->in_trc = default_trc[FFMIN(s->user_iall, CS_NB)]; + 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 +688,13 @@ static int create_filtergraph(AVFilterContext *ctx, if (!s->in_lumacoef) { s->in_csp = in->colorspace; + if (s->user_iall != CS_UNSPECIFIED) + s->in_csp = default_csp[FFMIN(s->user_iall, CS_NB)]; + 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, @@ -1002,6 +1016,9 @@ static const AVOption colorspace_options[] = { { "all", "Set all color properties together", OFFSET(user_all), AV_OPT_TYPE_INT, { .i64 = CS_UNSPECIFIED }, CS_UNSPECIFIED, CS_NB - 1, FLAGS, "all" }, + { "iall", "Set all input color properties together", + OFFSET(user_iall), AV_OPT_TYPE_INT, { .i64 = CS_UNSPECIFIED }, + CS_UNSPECIFIED, CS_NB - 1, FLAGS, "all" }, ENUM("bt470m", CS_BT470M, "all"), ENUM("bt470bg", CS_BT470BG, "all"), ENUM("bt601-6-525", CS_BT601_6_525, "all"), @@ -1014,6 +1031,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 +1044,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 +1066,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"),