From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 076BB4A1C1 for ; Sat, 23 Mar 2024 17:59:04 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C477A68D38C; Sat, 23 Mar 2024 19:59:01 +0200 (EET) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2067.outbound.protection.outlook.com [40.92.91.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D7F1D68D33C for ; Sat, 23 Mar 2024 19:58:55 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Gl4DXDG/8fV0rIFl7Fu6MARt7dSoGaXI2seYjbB7EbLtOHiMRkYlNdAWrMF2NFzMiGrphgb4dykjk4YIGHzrZBbcanlEM+7R5wd7SDXuk7HL86bj6gWifz8elugbqYkfGfKl8EDf3ufbH4xPEk4QCaohn6HvsMchs/4P7Vzt/DBZ8TVqNR6roOvGd8OZFUBljYkDWYzGK6i5yLoMVqOWtW30eIwF2L1/7zrIcEb7F8LlUXSyL7hclwpyH4M4Nv/gK77YJR8N52gjvOMP8J2Eny1aLegyrenNexldz29GyvjBVVyYQz2bi5UI38jcJanT0NjaUdaHZRPGxPj3aznekw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=6ot2VcdoaSGIIdsZtBkevZc+emBY0hqvTjgNhIob/3o=; b=JVfyu7+bYj84bpc28gQcMOLMLZ0lRcxC3oeZ40GDdqFrgmqfO9PMJOw6i1Lbcvf6OP4eyrKSL191KGUbLitPLFoV/3qLlz2rf0ElWYH47K8E+O4qMbXxQASuzGOTDPG9cw2EU1E6zRAjJrrOZGCJQ8stA1hA3NZl4r/tdEJdt//1Bhex4jEH2e9D9KmyLcUhkSeqv1No6/OROyTL7dAlVoDWuQsg85/ISuKBUW6zRmAgFTrkSU2XfiIa6YdIsc6dyaBePEh8aQTJ6XTBpDDk/qCd3LHydZDjxqo42YsNEQcCmkqF2g8THHRLJbLIYiyv1YSDucC38sXW8cwAruM46A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ot2VcdoaSGIIdsZtBkevZc+emBY0hqvTjgNhIob/3o=; b=PqcZZaFkJbxQfgZS71SQr4tJWQxAnti1Se8xfPTuK8LdVL+ZenJSUoWccfhNp5FD3jPpUlp8r3vzVI79wnp29ZfNssvT7jJF416Vr6b0OxLZ3xTEpEKmNo1cP2iSXKLjq1Ltq3vlz3cc8W1eHgMQC+yE6YEFktHLbu1PeYk8jp/JGvdFGi46DMI1X6DVEjE73d2FFiruqkpRMfRjHPticY5gBIGaVO7tQ6IVXauVaVimfVHiY3d09TC0zqyaTmcWQuIN4TIvAIntUk1aAnmX++vVOdXTmbB+HQ0lIMFn9ePUrkzsaoBxBxmmI3lfnkNsiRr6mCnhXlZfwVgMlZWIsA== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0532.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:328::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.26; Sat, 23 Mar 2024 17:58:53 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::4a3b:cf76:cddc:c68d%4]) with mapi id 15.20.7409.026; Sat, 23 Mar 2024 17:58:53 +0000 Message-ID: Date: Sat, 23 Mar 2024 18:58:51 +0100 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20240323173735.26224-1-ffmpeg@haasn.xyz> <20240323173735.26224-2-ffmpeg@haasn.xyz> From: Andreas Rheinhardt In-Reply-To: <20240323173735.26224-2-ffmpeg@haasn.xyz> X-TMN: [B9cO5eJNf6bQlvXX2QN6xnYvnUQeOaNtI8HEUzJBtxQ=] X-ClientProxiedBy: ZR0P278CA0089.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:22::22) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <5e4aa882-ef60-4501-b2c7-92e898437171@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0532:EE_ X-MS-Office365-Filtering-Correlation-Id: 12d06aad-90e6-4d7f-e496-08dc4b62e6d9 X-MS-Exchange-SLBlob-MailProps: Cq7lScuPrnqkjmXb1vlddM5aSa/Epk3AibO10AcKiLpYJqzt0nzxx5Dfjjl9P+m9pd/peB6LK85KTvg/sfZCYBjwx0ZWi7FGZye+/0rTBIp87pK6m+l3Q/+mE8dQT8IYQbHE/VBXNx6FQy/UHXN10OoJ3BxBiZSe+V9V6WV/7h/xMLQE85o4/WU9K6J/cfcApxV0JdWFpW3EbzKY3ERcYDDFEcY5abfn/Fn3cTIoKynRoCc1n+Z4WfsYuirb1Bi0sx0+U1rAenctGjJHvDc1mr8DeGpJcMFncDkeF19lQlFmSUhpo9hRy5IOYzNXv070YUStUMi/lI8VZGHVl/ZSgJ2x7/CXftkGtPDjEqSOvf1zWcNjtmWsO8JYjRZPlcj8g5VdtkkPSpKbsDsxwf4tibcZPtQaFYECP/c3My3twF/3uL5NdcDArIiUG/BWu69OreAmA5tUH+JH6Vx5z1fv2Emv24PjwgPW/IuLNLznScb+RHh2ZIyYHS4p+isbStOZAf6E7aC5raF6Mdo7I3bnUFBpBVX3HdzmpMaHsBRGubWFWHa3VF5FKtPq9oa27CoF0GgA9+ARX4ltfA2l2ClzoZ94AW8xiVXP+3IcvhNt6HMF1ycc8Xy08NXK/TfB9S0EG3Zv4T5bwu1jO6oaFXgdLh4/76twO47H0szr800+YqD+2QumPJYsyB0uXGM2kVIW9M3d0M9TZAjmAnMp1BulK6v0qWhMxukgMSZJimGzhaMOOV3xn6lWB5LCzEK8i5AatxfJmYeZqKo= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: QLiWLtOictF8pdvv374lDVYmyotDMgu34QjSVwbRl85BhK5WzDrsiNXMPqiEy6+5KnCyixtkusuhVs7UYpaWeTjtR+fophD/IF97CuCM/p/bvpihsGf1l1li7HAPRtaxahn4N+Sj7KvQRWLGS/oiQrSdpbahzuT3i5tQ/ZfPmq8Xy1lHtqWwgocWlnr4vaCAEuUY6Ao9+oO6gJsnHWHg61FTA96zgE4LGbPD6fnGuI1GNm+hvtcoz+W2L0ZNcn2GRpUyx8m+grqdMQVX0/RY0WLSNfz75S2KHE6/Xg9Iz7gB+RuFYP1JPRneRKDM0BoNBX3hy6FyZd0MGMB2+lEznqGA5pjLHc8ejqR3TZqFXuLB3Rk51ZQy1u0eMNolJvldizJSWaVhnUgtOjlTjm6KPnLDeBE7Jr73HtbjiofHU8YF4VdDYb+RPM3e7R3fLEZybKOl6Q1k9QWTIdCCsaC4QE57JgvN4Sr8iIRfSQi+vsJ+M6V7NuaI50KguIj5Br2SPNpp6tPLRpRKtaUqUzs29TTVrdXX6frWX6MHdXH5Y0/d8OlYt6oBu0ZueFdrvCkS X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?dUtkSVh1YnVBcHNBcGNEcElUdVIwZVFwU29sY29tSWZYd1JpYUtmbnlKMVpT?= =?utf-8?B?Rm42R1pNc1k2NytCTlFkemtTRWdEVkVLUFZoTFgwcVJWQ1RJeFdWZUJhNlRN?= =?utf-8?B?NXlna0RXcURwWWx1bTJrK0NIOVlNc2dSNGF2a2k4emdDOUowZzF5ZENQOXQ3?= =?utf-8?B?S25sVTR6L0ptakFQQjhGUmNMSjNBOGgrSm5DRVdHSy8vNWdjd3dFR0JPdmo0?= =?utf-8?B?NFYrUi80TUEyL2dOYm1yaUs4ZTI1Zi9scUxsSkVBVlhVVUY4ZzIwM0QrdzBS?= =?utf-8?B?cVlXWHc0OEZDNWpnNGtVQ3k3WTArcGlqMUdVa3AxQ05HakR3SkdDN0toNzBz?= =?utf-8?B?cjk1SmEwd09ZWDVpdk5xd3psSFU1U3ZrVUF4YzJPZzI2TkNnSDM1SW9pZHYr?= =?utf-8?B?VUNkT01KN2cwUzdKQ2t0dXVlR2FGSFBlSHpSTHMxYVRBcTBlMm5HZnNUZnhx?= =?utf-8?B?T1RtamNFb0VON2VNSytkdUdkeUZOU3lDR2Q5a2xiMjdsSzlxTHpiQXZYU2RL?= =?utf-8?B?Q1BDQmxrT05kQU5zci80OW11SklydWUzSHZRTm1jNkI5SkMvN0V1UUpnby9z?= =?utf-8?B?VlBkL1dEVXJhOElPQm5DUDZmdDBaRFl6clliRGcxY2pYSW95ZkEvSnVscjZH?= =?utf-8?B?eTFZM2o0WDNOVkFjbkg5N0pScHE1Znh4aGFWMHloc2h6NTd0QkxXTTJPMGU1?= =?utf-8?B?dGg2L2hsWTU4MHI5eFc4bXAzZU9FN1NvcnJRM2doZ1lhTjd1WFNqVnVPY1Nr?= =?utf-8?B?MHZOTE1rSis1OGNZSkdjUTFQRW9KdkNqVVNxNndvTkV5S1lKNzVRSWc5dEtk?= =?utf-8?B?R0NWUDlHbVo1bG9OeVN3aXI0NTZCSWJhTjFhVHU5bGMwOFBrQlNFOE5ERkts?= =?utf-8?B?ei8zOHpNMWU3SUFDQ1J2aWZJMnQ0R0thKzA1SmIxSzRxaE5pSTAvcUxWQVlw?= =?utf-8?B?YXZRODJ0Wm8zbXkwSXUvSlpHR2FOTlUzcnFmSWk5Z3ArU3dRQ3Rycm8rS09P?= =?utf-8?B?VTJYeFJ6NVduakRid296WjNqWGkvaFU0OWh1WXY1SHZybnNNeVQ2ZGgwL2Q4?= =?utf-8?B?SXdLdnltbHYrbWpTdVNkemZWUTllRWlWUEtyWENIQUpUZkhGSTJrYXBBTFRw?= =?utf-8?B?L2RFb3dzcnNGczBsaEVGeG90cUc2TjJOb0Z5aDIrN2F2RkY1OStRdDI2QkNl?= =?utf-8?B?ZzJVTE5MTzNOY05pOWN6dDNwOUlNSjlKTUJadFdoR2FPWlFaeVdrRUVpUEc5?= =?utf-8?B?QjVUdWg5dGI3YUt1SGNZZGZUcDIrZ20zbzNBTDg1aGs4ZHFHdHEyaFpxUXVh?= =?utf-8?B?eXUxWE5yaEVEaGc3Um02WVFvbHBnRXcvYUhxTlp1WnJsZm5sWnlmc2pEdmxz?= =?utf-8?B?Ty8vYnFydnE0WkJhanpRWXV3b0k1ZWR3K1N1SFhzSEhPTzB2TVhaV3o2QmdQ?= =?utf-8?B?aW85RVJGSk1qMlE4bThPaEZVOGc4ZzJka2tENEpJcXdJRmZ1N3VURVBEbElY?= =?utf-8?B?c1Z5VHJyZzVBTXhnK1ROc0tVMHFsYnVQSEF2NXFqSXZKbTVTTzlDb3h0Vkwr?= =?utf-8?B?bTVUNnBqejVIalIvOE5sdGZJM2tBaW9JekVpMkJEbDUwclREeXE0ZTFvb3dC?= =?utf-8?B?U09TZjlWaTBhVjZTbmZHSE4wS1Nic05vVmZBbzNMc0EyZ3hqRGluaWhyc3dI?= =?utf-8?B?TEl6MURwTWxMa0oxWDM5bG93c05sS3Y4WC9uWjNEdlBBc0lNd2hJc0ZnPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12d06aad-90e6-4d7f-e496-08dc4b62e6d9 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2024 17:58:53.3815 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0P250MB0532 Subject: Re: [FFmpeg-devel] [PATCH 2/6] avutil/dovi_meta: add dolby vision extension blocks 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Niklas Haas: > From: Niklas Haas > > As well as accessors plus a function for allocating this struct with > extension blocks, > > Definitions generously taken from quietvoid/dovi_tool, which is > assembled as a collection of various patent fragments, as well as output > by the official Dolby Vision bitstream verifier tool. > --- > doc/APIchanges | 5 ++ > libavutil/dovi_meta.c | 36 ++++++++-- > libavutil/dovi_meta.h | 154 ++++++++++++++++++++++++++++++++++++++++++ > libavutil/version.h | 2 +- > 4 files changed, 190 insertions(+), 7 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 739f33501e9..8b59150dc1f 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -2,6 +2,11 @@ The last version increases of all libraries were on 2024-03-07 > > API changes, most recent first: > > +2024-03-xx - xxxxxxxxxx - lavu 59.6.100 - dovi_meta.h > + Add AVDOVIMetadata.ext_block_{offset,size}, AVDOVIMetadata.num_ext_blocks, > + AVDOVIDmData and AVDOVIDmLevel{1..6,8..11,254..255}, av_dovi_get_ext(), > + av_dovi_find_level() and av_dovi_metadata_alloc_ext(), > + > 2024-03-xx - xxxxxxxxxx - lavu 59.5.100 - dovi_meta.h > Add AVDOVIDataMapping.nlq_pivots. > > diff --git a/libavutil/dovi_meta.c b/libavutil/dovi_meta.c > index 9c50da561ed..17e18bf95f9 100644 > --- a/libavutil/dovi_meta.c > +++ b/libavutil/dovi_meta.c > @@ -18,6 +18,8 @@ > * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > */ > > +#include > + > #include "dovi_meta.h" > #include "mem.h" > > @@ -39,22 +41,44 @@ typedef struct AVDOVIMetadataInternal { > AVDOVIRpuDataHeader header; > AVDOVIDataMapping mapping; > AVDOVIColorMetadata color; > + AVDOVIDmData ext_blocks[]; > } AVDOVIMetadataInternal; > > -AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size) > +AVDOVIMetadata *av_dovi_metadata_alloc_ext(int num_ext_blocks, size_t *size) > { > - AVDOVIMetadataInternal *dovi = av_mallocz(sizeof(AVDOVIMetadataInternal)); > + const size_t alloc_size = sizeof(AVDOVIMetadataInternal) + > + num_ext_blocks * sizeof(AVDOVIDmData); > + > + AVDOVIMetadataInternal *dovi = av_mallocz(alloc_size); > if (!dovi) > return NULL; > > if (size) > - *size = sizeof(*dovi); > + *size = alloc_size; > > dovi->metadata = (struct AVDOVIMetadata) { > - .header_offset = offsetof(AVDOVIMetadataInternal, header), > - .mapping_offset = offsetof(AVDOVIMetadataInternal, mapping), > - .color_offset = offsetof(AVDOVIMetadataInternal, color), > + .header_offset = offsetof(AVDOVIMetadataInternal, header), > + .mapping_offset = offsetof(AVDOVIMetadataInternal, mapping), > + .color_offset = offsetof(AVDOVIMetadataInternal, color), > + .ext_block_offset = offsetof(AVDOVIMetadataInternal, ext_blocks), > + .ext_block_size = sizeof(AVDOVIDmData), > }; > > return &dovi->metadata; > } > + > +AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size) > +{ > + return av_dovi_metadata_alloc_ext(0, size); > +} > + > +AVDOVIDmData *av_dovi_find_level(const AVDOVIMetadata *data, uint8_t level) > +{ > + for (int i = 0; i < data->num_ext_blocks; i++) { > + AVDOVIDmData *ext = av_dovi_get_ext(data, i); > + if (ext->level == level) > + return ext; > + } > + > + return NULL; > +} > diff --git a/libavutil/dovi_meta.h b/libavutil/dovi_meta.h > index 6afc7b055a7..e77d9853f67 100644 > --- a/libavutil/dovi_meta.h > +++ b/libavutil/dovi_meta.h > @@ -29,7 +29,9 @@ > > #include > #include > + > #include "rational.h" > +#include "csp.h" > > /* > * DOVI configuration > @@ -187,6 +189,130 @@ typedef struct AVDOVIColorMetadata { > uint16_t source_diagonal; > } AVDOVIColorMetadata; > > +typedef struct AVDOVIDmLevel1 { > + /* Per-frame brightness metadata */ > + uint16_t min_pq; > + uint16_t max_pq; > + uint16_t avg_pq; > +} AVDOVIDmLevel1; > + > +typedef struct AVDOVIDmLevel2 { > + /* Usually derived from level 8 (at different levels) */ > + uint16_t target_max_pq; > + uint16_t trim_slope; > + uint16_t trim_offset; > + uint16_t trim_power; > + uint16_t trim_chroma_weight; > + uint16_t trim_saturation_gain; > + int16_t ms_weight; > +} AVDOVIDmLevel2; > + > +typedef struct AVDOVIDmLevel3 { > + uint16_t min_pq_offset; > + uint16_t max_pq_offset; > + uint16_t avg_pq_offset; > +} AVDOVIDmLevel3; > + > +typedef struct AVDOVIDmLevel4 { > + uint16_t anchor_pq; > + uint16_t anchor_power; > +} AVDOVIDmLevel4; > + > +typedef struct AVDOVIDmLevel5 { > + /* Active area definition */ > + uint16_t left_offset; > + uint16_t right_offset; > + uint16_t top_offset; > + uint16_t bottom_offset; > +} AVDOVIDmLevel5; > + > +typedef struct AVDOVIDmLevel6 { > + /* Static HDR10 metadata */ > + uint16_t max_luminance; > + uint16_t min_luminance; > + uint16_t max_cll; > + uint16_t max_fall; > +} AVDOVIDmLevel6; > + > +typedef struct AVDOVIDmLevel8 { > + /* Extended version of level 2 */ > + uint8_t target_display_index; > + uint16_t trim_slope; > + uint16_t trim_offset; > + uint16_t trim_power; > + uint16_t trim_chroma_weight; > + uint16_t trim_saturation_gain; > + uint16_t ms_weight; > + uint16_t target_mid_contrast; > + uint16_t clip_trim; > + uint8_t saturation_vector_field[6]; > + uint8_t hue_vector_field[6]; > +} AVDOVIDmLevel8; > + > +typedef struct AVDOVIDmLevel9 { > + /* Source display characteristics */ > + uint8_t source_primary_index; > + AVColorPrimariesDesc source_display_primaries; > +} AVDOVIDmLevel9; > + > +typedef struct AVDOVIDmLevel10 { > + /* Target display characteristics */ > + uint8_t target_display_index; > + uint16_t target_max_pq; > + uint16_t target_min_pq; > + uint8_t target_primary_index; > + AVColorPrimariesDesc target_display_primaries; > +} AVDOVIDmLevel10; > + > +typedef struct AVDOVIDmLevel11 { > + uint8_t content_type; > + uint8_t whitepoint; > + uint8_t reference_mode_flag; > + uint8_t sharpness; > + uint8_t noise_reduction; > + uint8_t mpeg_noise_reduction; > + uint8_t frame_rate_conversion; > + uint8_t brightness; > + uint8_t color; > +} AVDOVIDmLevel11; > + > +typedef struct AVDOVIDmLevel254 { > + /* DMv2 info block, always present in samples with DMv2 metadata */ > + uint8_t dm_mode; > + uint8_t dm_version_index; > +} AVDOVIDmLevel254; > + > +typedef struct AVDOVIDmLevel255 { > + /* Debug block, not really used in samples */ > + uint8_t dm_run_mode; > + uint8_t dm_run_version; > + uint8_t dm_debug[4]; > +} AVDOVIDmLevel255; > + > +/** > + * Dolby Vision metadata extension block. > + * > + * @note sizeof(AVDOVIDmData) is not part of the public API. > + */ > +typedef struct AVDOVIDmData { > + uint8_t level; /* [1, 255] */ > + union { > + AVDOVIDmLevel1 l1; > + AVDOVIDmLevel2 l2; /* may appear multiple times */ > + AVDOVIDmLevel3 l3; > + AVDOVIDmLevel4 l4; > + AVDOVIDmLevel5 l5; > + AVDOVIDmLevel6 l6; > + /* level 7 is currently unused */ > + AVDOVIDmLevel8 l8; /* may appear multiple times */ > + AVDOVIDmLevel9 l9; > + AVDOVIDmLevel10 l10; /* may appear multiple times */ > + AVDOVIDmLevel11 l11; > + AVDOVIDmLevel254 l254; > + AVDOVIDmLevel255 l255; > + }; Unnamed unions are C11 > +} AVDOVIDmData; > + > /** > * Combined struct representing a combination of header, mapping and color > * metadata, for attaching to frames as side data. > @@ -203,6 +329,10 @@ typedef struct AVDOVIMetadata { > size_t header_offset; /* AVDOVIRpuDataHeader */ > size_t mapping_offset; /* AVDOVIDataMapping */ > size_t color_offset; /* AVDOVIColorMetadata */ > + > + size_t ext_block_offset; /* offset to start of ext blocks array */ > + size_t ext_block_size; /* size per element */ > + int num_ext_blocks; /* number of extension blocks */ > } AVDOVIMetadata; > > static av_always_inline AVDOVIRpuDataHeader * > @@ -223,6 +353,19 @@ av_dovi_get_color(const AVDOVIMetadata *data) > return (AVDOVIColorMetadata *)((uint8_t *) data + data->color_offset); > } > > +static av_always_inline AVDOVIDmData * > +av_dovi_get_ext(const AVDOVIMetadata *data, int index) > +{ > + return (AVDOVIDmData *)((uint8_t *) data + data->ext_block_offset + > + data->ext_block_size * index); This is not const-correct. > +} > + > +/** > + * Find an extension block with a given level, or NULL. In the case of > + * multiple extension blocks, only the first is returned. > + */ > +AVDOVIDmData *av_dovi_find_level(const AVDOVIMetadata *data, uint8_t level); > + > /** > * Allocate an AVDOVIMetadata structure and initialize its > * fields to default values. > @@ -234,4 +377,15 @@ av_dovi_get_color(const AVDOVIMetadata *data) > */ > AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size); > > +/** > + * Allocate an AVDOVIMetadata with a given number of extension blocks. > + * > + * @param num_ext_blocks The number of extension blocks to allocate > + * @param size If this parameter is non-NULL, the size in bytes of the > + * allocated struct will be written here on success > + * > + * @return the newly allocated struct or NULL on failure > + */ > +AVDOVIMetadata *av_dovi_metadata_alloc_ext(int num_ext_blocks, size_t *size); > + Not another boilerplate allocator. > #endif /* AVUTIL_DOVI_META_H */ > diff --git a/libavutil/version.h b/libavutil/version.h > index 8a1ecd44516..f874a4fd439 100644 > --- a/libavutil/version.h > +++ b/libavutil/version.h > @@ -79,7 +79,7 @@ > */ > > #define LIBAVUTIL_VERSION_MAJOR 59 > -#define LIBAVUTIL_VERSION_MINOR 5 > +#define LIBAVUTIL_VERSION_MINOR 6 > #define LIBAVUTIL_VERSION_MICRO 100 > > #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".