From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 78B444F4CC for ; Thu, 26 Feb 2026 18:06:14 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'PzPrvjGV0rgDI35ImZqUAzaPuSITvm3JfJmEwCULAB4=', expected b'J1VfPkAkojzDf16jCPRe4romJGWe52DyH1Bhj1Q0MHA=')) header.d=gmail.com header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1772129158; h=to : date : message-id : in-reply-to : references : mime-version : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=op1aPSKhhZEF1xRhZHC8uRHxCyAlFH/YykL7xIGw0tQ=; b=UdHGfckxh/fmeKRhxaBvwU8zciyg20LlEYUjPpriEMGD4+MaMMyOglcnTvBtltOxCzIOr 1vSUGejb1BF12I+nRo7efb9Y+qLWbFJCbZRFi4gI7kFN1lUGU8JoAcDr3LwJB+tCmdIXeyV gl68AkYCyYbme9iEbRcr6fUt6XSVhJUWObYVee3KUf7OyrR75BHaWhU7KLOK92OLQ6vduV0 o+VRIR/gu0DjdCt0rGYU0XwMRmMkyGgnXNzCyCm7eYf+GNiUYFC+NIepJGgXfzV1trnczfC JNme5mg0O1k0kmtK86cO7sGgZWu+EfO3MXNAjOF8zhgM3aCyaY7ZveYheF8g== Received: from [172.18.0.3] (unknown [172.18.0.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id ADCD66912FD; Thu, 26 Feb 2026 20:05:58 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1772129145; b=e1mID64FexgA67uLyaAGviTNn0c3vODzhnl3GgRdZ+1bgI1WoNmZoP1LrO4qefuzbwX+S PSoTiK1tKWSiul1ToZQ15awLAJvIeuZBVJEOjPJuqyU/JEL6iyw9ISU3jWLejojhSSKLm9G 0oMX4ZqT6Dj8L/EVzJAJUD2sIH3dqmHkDC4/Y9u4RrWT76EOGwqwOgfr+ePqDKmPJaGTnJC 1UZJYMv3VH9DWMeNGBs+b9TrautEqC5JP7ymbAjeqXNxOp6qJQl6wW1jQn7WwftD+mqWNah Owgryg3YorCzJjGd+lrzB+cpz5Uj7fFsjHRIjdhcjU/JsAQ2/sxl6FWsHINQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1772129145; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=PzPrvjGV0rgDI35ImZqUAzaPuSITvm3JfJmEwCULAB4=; b=YjuFYIkZTYCWChyLcAefcg1+wEoxVaZu2dJuIAHcLuJYwXEl/H1S3LzcKpZRqNQEEvuqO DMxZSQhvx5ghUvuvjm7+mJ7gIVFLgFF7CJKJn6sRtIOC4XYeuY0OMqdsS7mSbPyr59wsZ0R Zb6HLfaJrYEtVw3JIGBDFTn3xTMMxFHAK0Uy2jHG3awwJv1+fm/UAnbibE9Q2p1i0SnmBMC oxaeQRMqvBNhxaGNLdaUKcSHYWA30PA5QPw8hYs600Svwa/YBOYksnawQtE0c7KEsBwmcVD 3v413POVYVlFlLdEMsmrFnfuiIAdzWMXgexGJnNy6/6mcm+gtJwg/Rapc3Zw== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=gmail.com; arc=none; dmarc=pass header.from=gmail.com policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=gmail.com; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=gmail.com policy.dmarc=quarantine Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 0632B691245 for ; Thu, 26 Feb 2026 20:05:31 +0200 (EET) Received: by mail-dy1-f179.google.com with SMTP id 5a478bee46e88-2bdc8bb60f5so795080eec.1 for ; Thu, 26 Feb 2026 10:05:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772129129; x=1772733929; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=J1VfPkAkojzDf16jCPRe4romJGWe52DyH1Bhj1Q0MHA=; b=G86dNXjKTJwxXGmlUo6H8baTDrgsJOMjrit+mD4cFBHR7z6C7sIG7NPRibqD7cGQYz rqC0to5sZRhDIap0B7KbjtLfLWo1sR1IKzxTj8dZPtBkJyEQ/fiEueZGAXQk80NVN7ch 0tj4PfgIuMfj2cOPFJSVsLHGP+XmXnD10vEkxL581zQ5ujMXROWksKDopLXBU5TkyBlG oGjBxXCQaa4WyKNsaSy66YwXecU5ZvaIJD0dZDgueCYjqLSLbeZiXB+HOxZVC7TJuRZJ +VpG0815bBjk4GOOGFAxHeZ76w8g5nv2xZOj5iQZk53sMDAONtGEPLcve82wTPapMVCP ISMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772129129; x=1772733929; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=J1VfPkAkojzDf16jCPRe4romJGWe52DyH1Bhj1Q0MHA=; b=tlR8+Rj19gtFneg6mbJlmJy1b53ThPHCgLv7PVOgzuI5Cu2dDGgkW+RwVafD7M1W2b qiZp1yaJdEJdF8acrmFj+6W+oaQxI8l5C3UB/yGzWuP9Zhjd0JeT5HwsJg+gA64XuiQu SCdNMrk7FcpUWeEARh5sSx49id8HbVfE89uiXg69nrgeDUJyRWHeiHfPNDpzm256haQO YNs8uZ8owVHOuwQrmHRlNakrkB4PugqvzBMpzTquxMHU78qaeCuxVApyTzVxfWSFOuMS Jjl6JEIjL7OIzivairK3funrxG1qDpRN7F7iJH4JDObzS3X8dlnlegO72p8dBJ+ET5Iw 8eUQ== X-Gm-Message-State: AOJu0Yz00vUr10ANETxj+uGvxz/fYDM8naJguQaNPqhZzTMCziUtR+LQ zfM/14PqRxMMP0l/j3720cqw1Sl18iW3tUo1k9++0Xdl9oZ/H7T4s6ngO03zCw== X-Gm-Gg: ATEYQzzpPrcxJlTH8eTcAIATswQ0TthGmgqKNutHd4cxMrgsGjTEN2Q8l6ABOMOjows NoT7jrOOf1aMmfnQNm+ULK8B7hV/SMynj72lolKmwKPGkps6hZhC+8eeEUqnjkTBB189BRvBNuE p+AVStd58zjN2Se3DKdxlYUjMzkIJv0hZPWhjm1GR8gnn52tQAU938G58QpRHlo0LEHjBSyTSPt 2qwIGgk1b++/p1HVjwR4RvUfqW8ZII7h23+43Ff/3ZmC0HU8iWpIo1H9lmxQuI4Hq+kAavVQpBE UxtJvLjkMI0BYSFRryu6KCzjRPGRMynZTMaix5NezG6Lk+ynHqL7BUdZ4oEWOY6CjjingH4Otue Gvw1xw2sF0zxDokQIHhD5mpvo4QVpAKEBW1eO7wzApQgNaCBoovoVcymwzRzK+6RoPaESL8x6Bh Mv95FiUMmXT21a4mPe2rchF/ILcsHurIDFlExY2rOkWseGosZ22+ls+Pg= X-Received: by 2002:a05:7300:4348:b0:2ac:1e68:2342 with SMTP id 5a478bee46e88-2bdd3051c19mr1248207eec.39.1772129128228; Thu, 26 Feb 2026 10:05:28 -0800 (PST) Received: from HQ-LDQQM144XL.rbxinfra.net ([204.9.184.13]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-127899dfc47sm3101362c88.6.2026.02.26.10.05.27 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 26 Feb 2026 10:05:27 -0800 (PST) X-Google-Original-From: Guangyu Sun To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Feb 2026 10:05:25 -0800 Message-ID: <20260226180525.30060-1-gsun@roblox.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260223192155.27035-1-gsun@roblox.com> References: <20260223192155.27035-1-gsun@roblox.com> MIME-Version: 1.0 Message-ID-Hash: PFZX7SWWLYQ4FKWSATGGCJ44GU2WVJHI X-Message-ID-Hash: PFZX7SWWLYQ4FKWSATGGCJ44GU2WVJHI X-MailFrom: SRS0=li08=A6=gmail.com=sunguangyucn@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH v3] avcodec/libvpxenc: fix sRGB colorspace for non-RGB pixel formats List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Guangyu Sun via ffmpeg-devel Cc: Guangyu Sun Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: When encoding VP9 with a YUV pixel format (e.g. yuv420p) and AVCOL_SPC_RGB colorspace metadata, libvpxenc unconditionally set VPX_CS_SRGB. This produced a spec-violating bitstream: Profile 0 (4:2:0) with sRGB colorspace, which is only valid for Profile 1/3 (4:4:4). The resulting file is undecodable. Fix this by setting ctx->vpx_cs to VPX_CS_SRGB in set_pix_fmt() for 4:4:4 YUV formats when AVCOL_SPC_RGB is set, matching the existing GBRP path. This covers the legitimate case of RGB data in YUV444 containers (e.g. H.264 High 4:4:4 with identity matrix). With this change, any AVCOL_SPC_RGB that reaches the switch in set_colorspace() is guaranteed to be a subsampled format where sRGB is invalid. Return an error so the user can fix their pipeline rather than silently producing incorrect output. To reproduce: ffmpeg -f lavfi -i testsrc=s=64x64:d=1:r=1 \ -c:v libvpx-vp9 -pix_fmt yuv420p -colorspace rgb bad.webm ffprobe bad.webm # -> "vp9 (Profile 0), none(pc, gbr/...), 64x64" ffmpeg -i bad.webm -f null - # -> 0 frames decoded, error Signed-off-by: Guangyu Sun --- v2: - Only fall back to BT.709 if the pixel format is not 4:4:4, addressing feedback regarding Profile 1/3 support. v3: - Hard error via AVERROR(EINVAL) - set_colorspace() now returns int, and the call site in vpx_init() propagates the error libavcodec/libvpxenc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 88c058c403..c181927a1d 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -838,6 +838,8 @@ static int set_pix_fmt(AVCodecContext *avctx, vpx_codec_caps_t codec_caps, ctx->vpx_cs = VPX_CS_SRGB; case AV_PIX_FMT_YUV444P: case AV_PIX_FMT_YUVA444P: + if (avctx->colorspace == AVCOL_SPC_RGB) + ctx->vpx_cs = VPX_CS_SRGB; enccfg->g_profile = 1; *img_fmt = VPX_IMG_FMT_I444; return 0; @@ -879,6 +881,8 @@ static int set_pix_fmt(AVCodecContext *avctx, vpx_codec_caps_t codec_caps, case AV_PIX_FMT_YUVA444P10: case AV_PIX_FMT_YUV444P12: case AV_PIX_FMT_YUVA444P12: + if (avctx->colorspace == AVCOL_SPC_RGB) + ctx->vpx_cs = VPX_CS_SRGB; if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) { enccfg->g_profile = 3; *img_fmt = VPX_IMG_FMT_I44416; @@ -893,7 +897,7 @@ static int set_pix_fmt(AVCodecContext *avctx, vpx_codec_caps_t codec_caps, return AVERROR_INVALIDDATA; } -static void set_colorspace(AVCodecContext *avctx) +static int set_colorspace(AVCodecContext *avctx) { enum vpx_color_space vpx_cs; VPxContext *ctx = avctx->priv_data; @@ -902,7 +906,11 @@ static void set_colorspace(AVCodecContext *avctx) vpx_cs = ctx->vpx_cs; } else { switch (avctx->colorspace) { - case AVCOL_SPC_RGB: vpx_cs = VPX_CS_SRGB; break; + case AVCOL_SPC_RGB: + av_log(avctx, AV_LOG_ERROR, + "RGB colorspace is not compatible with pixel format %s.\n", + av_get_pix_fmt_name(avctx->pix_fmt)); + return AVERROR(EINVAL); case AVCOL_SPC_BT709: vpx_cs = VPX_CS_BT_709; break; case AVCOL_SPC_UNSPECIFIED: vpx_cs = VPX_CS_UNKNOWN; break; case AVCOL_SPC_RESERVED: vpx_cs = VPX_CS_RESERVED; break; @@ -913,10 +921,11 @@ static void set_colorspace(AVCodecContext *avctx) default: av_log(avctx, AV_LOG_WARNING, "Unsupported colorspace (%d)\n", avctx->colorspace); - return; + return 0; } } codecctl_int(avctx, VP9E_SET_COLOR_SPACE, vpx_cs); + return 0; } #if VPX_ENCODER_ABI_VERSION >= 11 @@ -1277,7 +1286,9 @@ static av_cold int vpx_init(AVCodecContext *avctx, codecctl_int(avctx, VP9E_SET_FRAME_PARALLEL_DECODING, ctx->frame_parallel); if (ctx->aq_mode >= 0) codecctl_int(avctx, VP9E_SET_AQ_MODE, ctx->aq_mode); - set_colorspace(avctx); + res = set_colorspace(avctx); + if (res < 0) + return res; #if VPX_ENCODER_ABI_VERSION >= 11 set_color_range(avctx); #endif -- 2.52.0 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org