From patchwork Tue Sep 15 21:16:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 22424 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 412EE44ACBC for ; Wed, 16 Sep 2020 00:16:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 257AE68B9D4; Wed, 16 Sep 2020 00:16:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D434A68B9B6 for ; Wed, 16 Sep 2020 00:16:45 +0300 (EEST) Received: by mail-lf1-f41.google.com with SMTP id b22so4593093lfs.13 for ; Tue, 15 Sep 2020 14:16:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=iDWE+aLHAjIp0BC+JL0wZ8SMUlpQJ8BX04u4/+gUqkc=; b=f7XIhBXzaDAqXEBVLG/rhoK1N2NyZ1c3bJSeh6HJsUCnBoa24Tyby2udgnfZzyGPzh fa72SLASi/DuMZa21X69YELNt83HDE4CktgqQfqHZmmpwiyJAjer6dinC8XBd7NZwtpz 2jmX/EZNc3SaTic5YAFBDWmlg+nOVIMmjNwnFwZuLtbvT19qRllNPjS+ioXtY+zywmJT pugxnYaofonixa4vaG6CMsJqxolzmPgtc0sD6Mt9CV4Bl3hNGZ9jnQ3IbfUHjVMAc6jQ smskGEf6rEcbC869Z45gVVEaiuwkM8b7vOpDPEnJiSIS+S6aU0KFVMbE06PV6xCoMMbL lm1g== 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:mime-version :content-transfer-encoding; bh=iDWE+aLHAjIp0BC+JL0wZ8SMUlpQJ8BX04u4/+gUqkc=; b=G1BEFcKsWRGZiQNOP4iX/7QHtyXkeCLZ/bdzISQ9N9F1y5X2ebNN3fIXTs05kelpHa Onicfq0KjY7Jyi556JB64d4B09RNZWT/pG8Wipn8e4FZOXzaTJkFtBv2XVG22Tgvg+WR ifbsFirjrJGtIgRS/gW7PxjHxviIZsdHl/UIKWFfBDYRrR3WzOZZEdeqQARr8/xNczHN faRD18hPtwepOnDXNx5uzTremetNpNWxezdKIyuButHkGDUssg0f1q0GKKbqAq9MUmYa RGXK1WdrUzfyFkI+8WXj9UOORBamHk5OzgytDGb9DS1Y2edUOWGH7y0bOXxZVl7vZKcB GQaQ== X-Gm-Message-State: AOAM533PWkyXvovcTDfAcYEwYkzayI3J394IC1uhIDKB7osIgpVowg+K Hxz447jQvYlxROKr4R6w0rPCka1hCdY= X-Google-Smtp-Source: ABdhPJx70o/5dOkXNse16YUf4pLDup5ye38GGi/Wyk84U97mmd9ebvUdIf/0Liv19se5G2Flsu5g+A== X-Received: by 2002:ac2:5458:: with SMTP id d24mr6062749lfn.446.1600204604764; Tue, 15 Sep 2020 14:16:44 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id 13sm4198852lfn.239.2020.09.15.14.16.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2020 14:16:44 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Wed, 16 Sep 2020 00:16:43 +0300 Message-Id: <20200915211643.259961-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avfilter/vf_scale: set RGB to always be full range 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" This value - while it looks like the actual range of the content - is nothing but the internal value of swscale. Thus, if we have RGB content, force the value to 1. Swscale will ignore it, but at least the value of the output AVFrame will now properly be "full range" instead of "limited range", as it is right now. --- libavfilter/vf_scale.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 58eee96744..12df27edf4 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -751,6 +751,15 @@ scale: || scale->out_range != AVCOL_RANGE_UNSPECIFIED) { int in_full, out_full, brightness, contrast, saturation; const int *inv_table, *table; + const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(out->format); + if (!out_desc) { + av_log(ctx, AV_LOG_ERROR, + "Failed to get the pixel format descriptor for format %d!\n", + out->format); + av_frame_free(&in); + av_frame_free(frame_out); + return AVERROR_INVALIDDATA; + } sws_getColorspaceDetails(scale->sws, (int **)&inv_table, &in_full, (int **)&table, &out_full, @@ -768,7 +777,15 @@ scale: else if (in_range != AVCOL_RANGE_UNSPECIFIED) in_full = (in_range == AVCOL_RANGE_JPEG); if (scale->out_range != AVCOL_RANGE_UNSPECIFIED) + // note: this can be silently overridden by + // sws_setColorspaceDetails for non-YCbCr formats out_full = (scale->out_range == AVCOL_RANGE_JPEG); + else if (out_desc->flags & AV_PIX_FMT_FLAG_RGB) + // the range values received from swscale are its internal + // identifiers, and will not be nonzero for any sort of RGB. + // thus, if we do not set it to nonzero ourselves, this will + // be incorrect. + out_full = 1; sws_setColorspaceDetails(scale->sws, inv_table, in_full, table, out_full,