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 0A8A24C4EF for ; Thu, 13 Nov 2025 13:37:56 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'cZ1PBWdPDJ2uDdkRUuOcNltETJosD6KlKTCXjiT6QTQ=', expected b'o/9qglvSEKpntla7EeMEchX4MammtQOglPfu6CEdmVo=')) header.d=ffmpeg.org header.i=@ffmpeg.org 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=1763041039; h=mime-version : to : date : message-id : 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=cZ1PBWdPDJ2uDdkRUuOcNltETJosD6KlKTCXjiT6QTQ=; b=DOlhSb8cnMdrKQHw5gw8blS7JDFWly8gRCmHpfhcikwUvSMWvqbCjISwWkbxTvWjEC48+ ttgSMZb/bbk1NTjMz3WguxuA0RkRRdjeDebu/VsJNlBl7h/b8StI0l87yEYEGgXRdDiAvZI KXIcI2LzXFrB1sBCCB1RHxc+GoTisWRni1l1POROz8F68X5Wp38EnQK7SeA7CXZIOAomxCj HQYM80ypbQwD1MgLxrp3dQ+KFA0j6ZGXK71ogdqun4/sAZwsLZqf3qXztD2b2eD1IdDSpg9 Q9ESvfx5h+9fhqKkakp64NH+nPxE6jNt9iY5w+kQj9taovsZ6Y2YPv2UZrWw== Received: from [172.19.0.2] (unknown [172.19.0.2]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 075DE68FD0F; Thu, 13 Nov 2025 15:37:19 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1763040994; b=LkHcoXDrU/GwAObJ+wLiEDalJsVr0C7dDJCqDlZXceIoefV60h9UtJs1cvIrLNmJd/ndf 4MrwDfAXmSUFQAchppl1vqshScy43HOnDQg+EqpzwIXAsvexC92804ZRLvJf7hjDHoYq8jt bNF/Uql4ys+uoqoaZ/ahGJANzBMMP0ii/8ebodxh6tjQ85L+ZN5kfsK4DGlTBkrC/oqhW+T s0YrGHqzmUauwGJEtpuZYWoo0SYQFWTE8rY6b5/WdresnsSNASsO8TMTYP91r2w62oHWdw6 OcpE8aROwa4i5w2+IRE8H6KmyJmN8LPzY8cG2pMMGYcVdH+bbq2AFdezv/Gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1763040994; 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=MYltrhydgWZW5nJlwgf7h801bGaZ7JuXb+EbtHoFCv4=; b=YWIEEN+xUK4oLm2cYukEDYVNa1gSomOuhkAgRFppgFl5/uxB2e071+CwFYNsTJYO5WXrE 8urGDGiNp9WjMZ9rU+/u046ouRfblkaJWggTWh3gkgKuP1dkB1tkLvqvrL32QUnMg7dWsfo HEJKY9Xcui/OjbkTvmFREWe3g/OKRevfbyFuwcbqy4XMqsXoC/SpR0fVQYv3RebWsTTmrCU 2FAt7CIKH2Bwglv2aBdyh/fHLNqT4jlIrF7LRYpSEQaEb9Kjk64yf016uhaKj+ddGZPShNm j09Pf/E/Vf2uL9p/KdHAb4EQxe6ME6zrIOPQZnvCQM2HL/KuLchrRYSFkPGA== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1763040984; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=o/9qglvSEKpntla7EeMEchX4MammtQOglPfu6CEdmVo=; b=BwctqWXGAxgD+EP4wGjFAgiu9CN3pa/9qnPRQJGRENK87Y55x9AuVeWh5YsSA06CRHjb2 iqcuejANh7X8zEMISjfZ2fOTFubunME7eAVp3Yr5fY7AXHM4UG2WwCR01wo8NPD7YMZF1ud E0js93QDeRv22dUoUp0Hy0eDyMbYcbKNZN7iqXvi4DASU1JyGRGTxmxKArZl/E9HIs4bky9 1dJf24S7eAnL6cu6Ro5IuvemR35ncjFCtjECqs6Wk4Z23U48XGMM3Eh+Zp6gfQV6We1vqfM euricFmNT6qQrJ8ex13PpPVEuCugdSXJCXmCxYXjn6yA8eb7xSgQpC7odddA== Received: from 188d6d40ca7a (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id C815B68FC32 for ; Thu, 13 Nov 2025 15:36:24 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Thu, 13 Nov 2025 13:36:24 -0000 Message-ID: <176304098500.25.16268315010120171438@2cb04c0e5124> Message-ID-Hash: YFLDNUB2PTE65XZD36GT73HUVHRQF6EF X-Message-ID-Hash: YFLDNUB2PTE65XZD36GT73HUVHRQF6EF X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation 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 X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] libavfilter: fix Spherical Mapping side data lost after uniform scale (PR #20910) 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: Zhao Zhili via ffmpeg-devel Cc: Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20910 opened by Zhao Zhili (quink) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20910 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20910.patch >>From cc85c6566eb2fb93a71aa4eadc318f14a0a44710 Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Thu, 13 Nov 2025 17:53:29 +0800 Subject: [PATCH 1/2] libavutil/frame: add aspect ratio dependent property Mark AV_FRAME_DATA_SPHERICAL as aspect ratio dependent instead of size dependent. After uniform scaling, the AV_FRAME_DATA_SPHERICAL side data should be preserved. --- doc/APIchanges | 3 +++ libavutil/frame.h | 9 +++++++++ libavutil/side_data.c | 2 +- libavutil/version.h | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 9d128ae77b..98e693e4b1 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2025-03-28 API changes, most recent first: +2025-11-13 - xxxxxxxxxx - lavu 60.18.100 - frame.h + Add AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT. + 2025-11-01 - xxxxxxxxxx - lavc 62.19.100 - avcodec.h Schedule AVCodecParser and av_parser_init() to use enum AVCodecID for codec ids on the next major version bump. diff --git a/libavutil/frame.h b/libavutil/frame.h index 088b24b717..dd497236c2 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -321,6 +321,15 @@ enum AVSideDataProps { * or adjusted to the new layout. */ AV_SIDE_DATA_PROP_CHANNEL_DEPENDENT = (1 << 4), + + /** + * Side data depends on the video aspect ratio. Side data with this property + * loses its meaning with non-uniform scale. + * + * @note Cropping also affects side data with this property, even when the + * resulting aspect ratio matches the original input. + */ + AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT = (1 << 5), }; /** diff --git a/libavutil/side_data.c b/libavutil/side_data.c index bbbeb70ecd..44e72c75b6 100644 --- a/libavutil/side_data.c +++ b/libavutil/side_data.c @@ -51,7 +51,7 @@ static const AVSideDataDescriptor sd_props[] = { [AV_FRAME_DATA_MASTERING_DISPLAY_METADATA] = { "Mastering display metadata", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT }, [AV_FRAME_DATA_CONTENT_LIGHT_LEVEL] = { "Content light level metadata", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT }, [AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT] = { "Ambient viewing environment", AV_SIDE_DATA_PROP_GLOBAL }, - [AV_FRAME_DATA_SPHERICAL] = { "Spherical Mapping", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_SIZE_DEPENDENT }, + [AV_FRAME_DATA_SPHERICAL] = { "Spherical Mapping", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT }, [AV_FRAME_DATA_ICC_PROFILE] = { "ICC profile", AV_SIDE_DATA_PROP_GLOBAL | AV_SIDE_DATA_PROP_COLOR_DEPENDENT }, [AV_FRAME_DATA_EXIF] = { "EXIF metadata", AV_SIDE_DATA_PROP_GLOBAL }, [AV_FRAME_DATA_SEI_UNREGISTERED] = { "H.26[45] User Data Unregistered SEI message", AV_SIDE_DATA_PROP_MULTI }, diff --git a/libavutil/version.h b/libavutil/version.h index b16b88bfca..9dd8394b83 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 60 -#define LIBAVUTIL_VERSION_MINOR 17 +#define LIBAVUTIL_VERSION_MINOR 18 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -- 2.49.1 >>From 5fcc5263e7b99a0c9d90378dcd20e58862fbcb5a Mon Sep 17 00:00:00 2001 From: Zhao Zhili Date: Thu, 13 Nov 2025 17:59:38 +0800 Subject: [PATCH 2/2] avfilter/vf_scale*: remove ASPECT_RATIO_DEPENDENT side data when aspect ratio changed --- libavfilter/vf_libplacebo.c | 5 ++++- libavfilter/vf_scale.c | 12 ++++++++---- libavfilter/vf_scale_cuda.c | 5 ++++- libavfilter/vf_scale_npp.c | 5 ++++- libavfilter/vf_scale_vaapi.c | 5 ++++- libavfilter/vf_scale_vt.c | 6 ++++-- libavfilter/vf_scale_vulkan.c | 5 ++++- libavfilter/vf_zscale.c | 5 ++++- 8 files changed, 36 insertions(+), 12 deletions(-) diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c index 42501c51f2..2c4f9f4532 100644 --- a/libavfilter/vf_libplacebo.c +++ b/libavfilter/vf_libplacebo.c @@ -1031,8 +1031,11 @@ static int output_frame(AVFilterContext *ctx, int64_t pts) out->color_primaries = s->color_primaries; /* Strip side data if no longer relevant */ - if (out->width != ref->width || out->height != ref->height) + if (out->width != ref->width || out->height != ref->height) { changed |= AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (ref->width * out->height != out->width * ref->height) + changed |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; + } if (ref->color_trc != out->color_trc || ref->color_primaries != out->color_primaries) changed |= AV_SIDE_DATA_PROP_COLOR_DEPENDENT; av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, changed); diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index 61d3ee0a0f..6f5f1cd7ac 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -674,8 +674,10 @@ static int config_props(AVFilterLink *outlink) av_freep(&flags_val); if (inlink->w != outlink->w || inlink->h != outlink->h) { - av_frame_side_data_remove_by_props(&outlink->side_data, &outlink->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (inlink->w * outlink->h != outlink->w * inlink->h) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; + av_frame_side_data_remove_by_props(&outlink->side_data, &outlink->nb_side_data, prop); } if (scale->in_primaries != scale->out_primaries || scale->in_transfer != scale->out_transfer) { @@ -852,8 +854,10 @@ scale: out->color_trc = scale->out_transfer; if (out->width != in->width || out->height != in->height) { - av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; + av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, prop); } if (in->color_primaries != out->color_primaries || in->color_trc != out->color_trc) { diff --git a/libavfilter/vf_scale_cuda.c b/libavfilter/vf_scale_cuda.c index 88a6e20610..115a0ba7e6 100644 --- a/libavfilter/vf_scale_cuda.c +++ b/libavfilter/vf_scale_cuda.c @@ -545,8 +545,11 @@ static int cudascale_scale(AVFilterContext *ctx, AVFrame *out, AVFrame *in) return ret; if (out->width != in->width || out->height != in->height) { + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + prop); } return 0; diff --git a/libavfilter/vf_scale_npp.c b/libavfilter/vf_scale_npp.c index 8e9113521c..f5e3069c2d 100644 --- a/libavfilter/vf_scale_npp.c +++ b/libavfilter/vf_scale_npp.c @@ -868,8 +868,11 @@ scale: return ret; if (out->width != in->width || out->height != in->height) { + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + prop); } return 0; diff --git a/libavfilter/vf_scale_vaapi.c b/libavfilter/vf_scale_vaapi.c index 1ba925afa5..951dbfe992 100644 --- a/libavfilter/vf_scale_vaapi.c +++ b/libavfilter/vf_scale_vaapi.c @@ -146,9 +146,12 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) goto fail; if (output_frame->width != input_frame->width || output_frame->height != input_frame->height) { + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (input_frame->width * output_frame->height != output_frame->width * input_frame->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; av_frame_side_data_remove_by_props(&output_frame->side_data, &output_frame->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + prop); } if (ctx->colour_primaries != AVCOL_PRI_UNSPECIFIED) diff --git a/libavfilter/vf_scale_vt.c b/libavfilter/vf_scale_vt.c index 3d4ba44dc6..f0ae2e12aa 100644 --- a/libavfilter/vf_scale_vt.c +++ b/libavfilter/vf_scale_vt.c @@ -161,8 +161,10 @@ static int scale_vt_filter_frame(AVFilterLink *link, AVFrame *in) out->crop_right = 0; out->crop_bottom = 0; if (out->width != in->width || out->height != in->height) { - av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; + av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, prop); } av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c index f8e069f4a4..9deeae7cf0 100644 --- a/libavfilter/vf_scale_vulkan.c +++ b/libavfilter/vf_scale_vulkan.c @@ -356,8 +356,11 @@ static int scale_vulkan_filter_frame(AVFilterLink *link, AVFrame *in) goto fail; if (out->width != in->width || out->height != in->height) { + int prop = AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + prop |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, - AV_SIDE_DATA_PROP_SIZE_DEPENDENT); + prop); } if (s->out_range != AVCOL_RANGE_UNSPECIFIED) diff --git a/libavfilter/vf_zscale.c b/libavfilter/vf_zscale.c index 9ea50133c6..c90445328e 100644 --- a/libavfilter/vf_zscale.c +++ b/libavfilter/vf_zscale.c @@ -818,8 +818,11 @@ static int filter_frame(AVFilterLink *link, AVFrame *in) (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h, INT_MAX); - if (out->width != in->width || out->height != in->height) + if (out->width != in->width || out->height != in->height) { changed |= AV_SIDE_DATA_PROP_SIZE_DEPENDENT; + if (in->width * out->height != out->width * in->height) + changed |= AV_SIDE_DATA_PROP_ASPECT_RATIO_DEPENDENT; + } if (out->color_trc != in->color_trc || out->color_primaries != in->color_primaries) changed |= AV_SIDE_DATA_PROP_COLOR_DEPENDENT; av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data, changed); -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org