From patchwork Fri Oct 13 14:24:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 44246 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4b15:b0:15d:8365:d4b8 with SMTP id fp21csp1039778pzb; Fri, 13 Oct 2023 07:28:35 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHtnEePg/HTOLXRpnC3V+CIm34x+5g8uFtmHoREF5VoiziLZZluCICsj4gDMzndwXKyepJE X-Received: by 2002:a17:906:d3:b0:9b2:d64a:9ecd with SMTP id 19-20020a17090600d300b009b2d64a9ecdmr23879528eji.66.1697207314877; Fri, 13 Oct 2023 07:28:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697207314; cv=none; d=google.com; s=arc-20160816; b=fhros+MBUiEuQ31wsGb5Ms+bPNYCy/VhZ+QlNN749qxUeBJPJG5SBFYzLIkrgLZz1l AI2Ac2IjBaNQjKUkBex+DzVKlGqLCUkMqLOufcH6u2rQG95ly0BfpsmLC6khy+lhtkAy VX9827vXWTEsoXgcO7TN26KEUxrfmynP4f/TUZ/PZ24tkfg5ixsz7B37IuGYs19xrH97 0ERdIGmOP5aAl4XjtXOTkbwlij1ryMZl1g4rIgGNEY2h6pykKkPey5Cl73VUrD+pfkVV JP86dkXHK/TnhRayi2BPHv1JT2kfdCCzxQn5CS6y94chJ0+0Zct7yWaHG9xlGoHRO7LE DCow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=KkJQfEEi91IsT8l6u8iyfois84ohFWBDpUdweJK8zkA=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=DftqR5bSQe3BzsR1mAjBdMExPIs/UW8sQg1Ny7QoWAgA8hV+pF7Ug4JaX3N15vf9lI Ln8tU/VIaotPB07W/NzffzvtqJi8uvyq5UQ2QN9vLd8cydxdgxnA57OjkZ0POoTD29Ky X0snmKhhj5upAYuQwEhTNneX+8Pjpgw5YE6tiI87/X8/FbWXMkuRdK/NFgAA5lqSCORd ngYBiIVZj3vIXoGM8LbLwkFqfYxhSrdRF+/mapf77rZRsB4Z7w0uvb/NJjlvJfARRo2J 5hsbht2X5IHs2j8vAAbdFdvW/EE815G/qcz7qnYN3Wagqyjv1q/hN6oXNmYGnNCUgggv CnXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=gK8knlY8; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y12-20020a17090614cc00b009b95012a678si8621811ejc.381.2023.10.13.07.28.23; Fri, 13 Oct 2023 07:28:34 -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=@haasn.xyz header.s=mail header.b=gK8knlY8; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 606A468CA00; Fri, 13 Oct 2023 17:27:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from haasn.dev (haasn.dev [78.46.187.166]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5D6C568C9AE for ; Fri, 13 Oct 2023 17:27:15 +0300 (EEST) Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id E8B074BC29; Fri, 13 Oct 2023 16:27:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1697207232; bh=d25rzPzhHwGz9WqLmnDGV9GQwZ5386g7utiVSedl6Tc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gK8knlY8/56Ux1s4YSR0uUcXHUXqJYUXvjVvlMR4JA/MhVDxXCrpEWjD5RHCcm4dH UaYIvuDnmXsjVjyR+kmNiI3UkxS/D185xnA5xPjbTwBHC76v1Cw0JAXX8K69qmyzCj LNjiMudQi/QnrglkIdQsnE5TuwC7/sGBVI7q7ym0= From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Fri, 13 Oct 2023 16:24:44 +0200 Message-ID: <20231013142706.23971-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231013142706.23971-1-ffmpeg@haasn.xyz> References: <20231013142706.23971-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 06/13] avcodec/encode: enforce AVCodec capabilities at encode time X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: TxB51AVhC1Ip From: Niklas Haas In general, the logic is always the same: if the codec supports only a single format, enforce it if possible. Otherwise, throw an error when an incompatible format is thrown. To preserve backwards compatibility and make this check less pedantic than it needs to be, always consider 'AVCOL_*_UNKNOWN/UNSPECIFIED' a valid value. That way, we will only throw an error if the user explicitly set a color value that we explicitly know is unsupported. --- libavcodec/encode.c | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/libavcodec/encode.c b/libavcodec/encode.c index a436be2657..f22b17f33e 100644 --- a/libavcodec/encode.c +++ b/libavcodec/encode.c @@ -611,6 +611,108 @@ static int encode_preinit_video(AVCodecContext *avctx) avctx->color_range = AVCOL_RANGE_JPEG; } + if (c->csps) { + for (i = 0; c->csps[i] != AVCOL_SPC_UNSPECIFIED; i++) + if (avctx->colorspace == c->csps[i]) + break; + if (c->csps[i] == AVCOL_SPC_UNSPECIFIED) { + av_log(avctx, AV_LOG_ERROR, + "Specified colorspace %s is not supported by the %s encoder.\n", + av_color_space_name(avctx->colorspace), c->name); + av_log(avctx, AV_LOG_ERROR, "Supported colorspaces:\n"); + for (int p = 0; c->csps[p] != AVCOL_SPC_UNSPECIFIED; p++) { + av_log(avctx, AV_LOG_ERROR, " %s\n", + av_color_space_name(c->csps[p])); + } + return AVERROR(EINVAL); + } + } + + if (c->color_ranges) { + for (i = 0; c->color_ranges[i] != AVCOL_RANGE_UNSPECIFIED; i++) { + if (avctx->color_range == c->color_ranges[i]) + break; + } + if (c->color_ranges[i] == AVCOL_RANGE_UNSPECIFIED) { + if (i == 1 && !avctx->color_range) { + avctx->color_range = c->color_ranges[0]; + } else if (avctx->color_range) { + av_log(avctx, AV_LOG_ERROR, + "Specified color range %s is not supported by the %s encoder.\n", + av_color_range_name(avctx->color_range), c->name); + av_log(avctx, AV_LOG_ERROR, "Supported color ranges:\n"); + for (int p = 0; c->color_ranges[p] != AVCOL_RANGE_UNSPECIFIED; p++) { + av_log(avctx, AV_LOG_ERROR, " %s\n", + av_color_range_name(c->color_ranges[p])); + } + return AVERROR(EINVAL); + } + } + } + + if (c->chroma_locs) { + for (i = 0; c->chroma_locs[i] != AVCHROMA_LOC_UNSPECIFIED; i++) + if (avctx->chroma_sample_location == c->chroma_locs[i]) + break; + if (c->chroma_locs[i] == AVCHROMA_LOC_UNSPECIFIED) { + if (i == 1 && !avctx->chroma_sample_location) { + avctx->chroma_sample_location = c->chroma_locs[0]; + } else if (avctx->chroma_sample_location) { + av_log(avctx, AV_LOG_ERROR, + "Specified chroma sample location %s is not supported by the %s encoder.\n", + av_chroma_location_name(avctx->chroma_sample_location), c->name); + av_log(avctx, AV_LOG_ERROR, "Supported chroma sample locations:\n"); + for (int p = 0; c->chroma_locs[p] != AVCHROMA_LOC_UNSPECIFIED; p++) { + av_log(avctx, AV_LOG_ERROR, " %s\n", + av_chroma_location_name(c->chroma_locs[p])); + } + return AVERROR(EINVAL); + } + } + } + + if (c->primaries) { + for (i = 0; c->primaries[i] != AVCOL_PRI_UNSPECIFIED; i++) + if (avctx->color_primaries == c->primaries[i]) + break; + if (c->primaries[i] == AVCOL_PRI_UNSPECIFIED) { + if (i == 1 && !avctx->color_primaries) { + avctx->color_primaries = c->primaries[0]; + } else if (avctx->color_primaries) { + av_log(avctx, AV_LOG_ERROR, + "Specified color primaries %s is not supported by the %s encoder.\n", + av_color_primaries_name(avctx->color_primaries), c->name); + av_log(avctx, AV_LOG_ERROR, "Supported color primaries:\n"); + for (int p = 0; c->primaries[p] != AVCOL_PRI_UNSPECIFIED; p++) { + av_log(avctx, AV_LOG_ERROR, " %s\n", + av_color_primaries_name(c->primaries[p])); + } + return AVERROR(EINVAL); + } + } + } + + if (c->trcs) { + for (i = 0; c->trcs[i] != AVCOL_TRC_UNSPECIFIED; i++) + if (avctx->color_trc == c->trcs[i]) + break; + if (c->trcs[i] == AVCOL_TRC_UNSPECIFIED) { + if (i == 1 && !avctx->color_trc) { + avctx->color_trc = c->trcs[0]; + } else if (avctx->color_trc) { + av_log(avctx, AV_LOG_ERROR, + "Specified color transfer characteristics %s is not supported by the %s encoder.\n", + av_color_transfer_name(avctx->color_trc), c->name); + av_log(avctx, AV_LOG_ERROR, "Supported color transfer characteristics:\n"); + for (int p = 0; c->trcs[p] != AVCOL_TRC_UNSPECIFIED; p++) { + av_log(avctx, AV_LOG_ERROR, " %s\n", + av_color_transfer_name(c->trcs[p])); + } + return AVERROR(EINVAL); + } + } + } + if ( avctx->bits_per_raw_sample < 0 || (avctx->bits_per_raw_sample > 8 && pixdesc->comp[0].depth <= 8)) { av_log(avctx, AV_LOG_WARNING, "Specified bit depth %d not possible with the specified pixel formats depth %d\n",