From patchwork Sat Mar 23 19:19:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47383 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369019pzb; Sat, 23 Mar 2024 12:25:05 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWDFbFOKlMh1uT7lFbxjJ7ZDBcVSADqKCV/7bWn5OjIKLTK5mKKF8S0chSyxqUG5QG2SFJp90cd0GvPN8vZSGb+AsylEYySMSeXtg== X-Google-Smtp-Source: AGHT+IHendqLhcDPl3wLHlvEleZdemgFi+YC1GhB0KQkMtv2zgaldbt+ReSNKg9QGMlnf6LA5d7B X-Received: by 2002:a17:906:308f:b0:a46:df38:6d4b with SMTP id 15-20020a170906308f00b00a46df386d4bmr1799844ejv.66.1711221904911; Sat, 23 Mar 2024 12:25:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221904; cv=none; d=google.com; s=arc-20160816; b=jhz2XAeM5OxfYp9K/CEMbHC58N43DQxiVN5jSu1RXCpqnX15TVcH10nA5nZwz/2lW1 x4FeIxAtsdxMzTTq50cGSDhZ+a8xmcQ+DHcD4W8o9fxGBwYQklDdX/5OTrwwdI+c12Qh 3EfHY0cO5IOcZ8jLyd1ANsuoSrcn62GBCtOsX+PgtXvAbz2rKFK88AfILjHbe5WghmiT vNhjetZrOPjl8m1fvyPynx7KWji1IfGrpZotiioTzgvZUgeqKqM5pQ2eNroLeJZVX5ea 4Tnew23MLHEPEtqNcj1m4Fiybo26sGSszcOsKuMFSqCPesez0htu5fIBqafdJgJC7qDG Be6w== 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=ODh5M715TV5JdCW//vCVX14Gtc26nChWS7Fwg4Z+6MQ=; fh=C56SNERGsx7JRMjLZiHmpTAKnRl/jfaA+FIG9zHupRY=; b=vt49OKpcjbb4hbfZaoV8zUA4w4EAEBHKSRADeZsstISoIr4FlV+ZZhAADyUbHZMjQM XXmMjtvgTGh2yXpY2Vx2pVwYIo8qFey/DLIRV3vYLZmWZxDt1tENGIQRLZLcbC+V4f9O 6DIXVjIy/1pgd+UqmWaJ7vjo/E93XiiAeeMtMNIr+ntt3NFyz5Sjt16x1oe62DY2tTUS 1QpQe7w209cBaLnjGBvg/ZUflZa7qImQh3WWjuz1mDFoA3pUli8ReFPNTIaux4R0nhk5 Go+B9/IP3Ubo70uk9X4rA6yzASB2D4jO/+zc+///jq5LWN+i+8DYseeS0inN2fde4T/1 4DmQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b="t3CYuSq/"; 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 l7-20020a170906414700b00a462a380c3esi1027066ejk.874.2024.03.23.12.25.04; Sat, 23 Mar 2024 12:25:04 -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="t3CYuSq/"; 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 36C1668D42A; Sat, 23 Mar 2024 21:24:52 +0200 (EET) 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 00CD168D10E for ; Sat, 23 Mar 2024 21:24:43 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221883; bh=XFtLjCeqH6WiP28yRiJmyA92guUdDNTIKJOaE0uyCgc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=t3CYuSq/kyOYEP+AvWtb4+Nd4X3ajuR30JxtyE0C1/avogY8HKFpVVrom8WSPcrpl LSbNbaYThGAPhIsOn9stmcr7ihk3mdB/zHMEPz9VjiwOpgUdXOFhQ7UgqYwOzq1+qa rBdVZzOeUx/ezU33CfLUYlbBUElinx05STvjHbOY= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id C128D42824; Sat, 23 Mar 2024 20:24:43 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:50 +0100 Message-ID: <20240323192440.38264-2-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/8] avutil/dovi_meta: add AVDOVIDataMapping.nlq_pivots 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: quietvoid , Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xz80siBWajyy From: quietvoid The NLQ pivots are not documented but should be present in the header for profile 7 RPU format. It has been verified using Dolby's verification toolkit. Signed-off-by: quietvoid Signed-off-by: Niklas Haas --- doc/APIchanges | 3 +++ libavcodec/dovi_rpu.c | 9 ++++++++- libavutil/dovi_meta.h | 1 + libavutil/version.h | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 77629072552..2f34018ea1b 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-03-xx - xxxxxxxxxx - lavu 59.7.100 - dovi_meta.h + Add AVDOVIDataMapping.nlq_pivots. + 2024-03-xx - xxxxxxxxxx - lavu 59.6.100 - film_grain_params.h Add av_film_grain_params_select(). diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 31c64fb0602..c84a942f476 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -109,7 +109,7 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) /* Copy only the parts of these structs known to us at compiler-time. */ #define COPY(t, a, b, last) memcpy(a, b, offsetof(t, last) + sizeof((b)->last)) COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, disable_residual_flag); - COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq[2].linear_deadzone_threshold); + COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots); COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal); return 0; } @@ -346,7 +346,14 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) } if (use_nlq) { + int nlq_pivot = 0; vdr->mapping.nlq_method_idc = get_bits(gb, 3); + + for (int i = 0; i < 2; i++) { + nlq_pivot += get_bits(gb, hdr->bl_bit_depth); + vdr->mapping.nlq_pivots[i] = av_clip_uint16(nlq_pivot); + } + /** * The patent mentions another legal value, NLQ_MU_LAW, but it's * not documented anywhere how to parse or apply that type of NLQ. diff --git a/libavutil/dovi_meta.h b/libavutil/dovi_meta.h index 3d11e02bffc..46b13b33995 100644 --- a/libavutil/dovi_meta.h +++ b/libavutil/dovi_meta.h @@ -147,6 +147,7 @@ typedef struct AVDOVIDataMapping { uint32_t num_x_partitions; uint32_t num_y_partitions; AVDOVINLQParams nlq[3]; /* per component */ + uint16_t nlq_pivots[2]; } AVDOVIDataMapping; /** diff --git a/libavutil/version.h b/libavutil/version.h index 445102073fc..80e6aacd0fa 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 6 +#define LIBAVUTIL_VERSION_MINOR 7 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Sat Mar 23 19:19:51 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47384 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369056pzb; Sat, 23 Mar 2024 12:25:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWCkkzUA6LM7FUyTftPWaEVqsX59n5z+6UuvMOM2QzVowTrptzeWBJ0iMCgPsZM0c2GKr1qGKTnlxYK08QQSvItfe/RLr2qquJxcw== X-Google-Smtp-Source: AGHT+IEEAkbZL6zOZt3aMSmkDBIEPxmP9DAZN6cQkk0q8snqAaDiYLiGgRqDA1lKN4exIoFIISA4 X-Received: by 2002:a17:906:114a:b0:a47:34a5:83be with SMTP id i10-20020a170906114a00b00a4734a583bemr1875348eja.0.1711221913490; Sat, 23 Mar 2024 12:25:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221913; cv=none; d=google.com; s=arc-20160816; b=QVXdEJ+K+9ZAzTKz4gSz9uiCpHXdctAuGOEyBhQxDBTPjkYXTggAckBt7EVnDUPArX fb3BJG4nXdM9ILZ63WLHf6je9znZJZNmuz0wwNGtIG7CQjlaS1qCIMmGhVN+qbV/w/+j +bYQN6sIQrZlrQugVoBBm528u8ULVvmGyMqWpPtM5HcWZ6ylsgZ1ldgyiXGbi9+HOyUV HA7LG0j/XKGP/sn0nkL8AAq64S6a8j9iFPxGVtdDLZ6g3DuAzzfOadpcwKNBqaW1RMbO 0KJ0jkjZ2Ga86q2XApIS8eI1Z2rY1hVTyeraBfVoMlCgQJqqLgveO56ETLf8jJcF4F21 ZGCA== 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=VrTC3lSezVKJCS7LXDxFd9ftJCER0FJXpNYeAQr/ahg=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=Hx4InipPOqjc/If4La71alHSPp2isLx6UPirL2FGoTJn7lMoqDjvD25fUuHoqrhnPE 9j30g8S9mu+fKlCkfanZN20a30SU2GaLHUMFC+mxij21QkabPrkzzf4ZfigoOpSSZbQN +mZxQOKW8q4wRWNoZz532KBRH2b/Iimv44UOCInNIiTpLwJ0wsSTiFCZXkB3MQT8fU04 zN7h8ZDCwxDzJHJuFrjqOIuqzo0QcxsGQXRmE0c+qKgJ0HREZH92W3A89LizC0WspRoh OexqRSeiwBSZ4u/GLORqFIVJ0FpR/lNACP4BIpdwGnDQsCYfk2xPxviNdUsOgaaRfrBc +RuA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=pXTvxj9v; 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 f17-20020a1709067f9100b00a46bda1dbf5si972272ejr.567.2024.03.23.12.25.13; Sat, 23 Mar 2024 12:25:13 -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=pXTvxj9v; 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 704AE68D16F; Sat, 23 Mar 2024 21:24:53 +0200 (EET) 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 4968368D10E for ; Sat, 23 Mar 2024 21:24:44 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221884; bh=MfWTCV+ZEVTSOFQmZvWq1G1d+x3K9NDxTxvJiVO2+y4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pXTvxj9vnfLPh1ShRPvXS3R+aGdv4x4xpOa+SOooc9KxYYyAtOxtp8NBnTI3wzSpP mpmgApHWNDoJYzNKtyffThhEFcDMGUu2iqqKs3GzFqTs4iTwFzAGfWnwkfh3VXghXB 7U1ZZJ94f/2Y7/3U5/UUslO7Hjz+SzAcqyFdNu0g= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 02564428A0; Sat, 23 Mar 2024 20:24:43 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:51 +0100 Message-ID: <20240323192440.38264-3-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/8] 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 Cc: Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: j7d0JJpRLTRi 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 | 22 ++++++- libavutil/dovi_meta.h | 146 ++++++++++++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 4 files changed, 171 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 2f34018ea1b..fa406c445e7 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.8.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() + and av_dovi_find_level(). + 2024-03-xx - xxxxxxxxxx - lavu 59.7.100 - dovi_meta.h Add AVDOVIDataMapping.nlq_pivots. diff --git a/libavutil/dovi_meta.c b/libavutil/dovi_meta.c index 9c50da561ed..dfa4a438ed4 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,6 +41,7 @@ typedef struct AVDOVIMetadataInternal { AVDOVIRpuDataHeader header; AVDOVIDataMapping mapping; AVDOVIColorMetadata color; + AVDOVIDmData ext_blocks[AV_DOVI_MAX_EXT_BLOCKS]; } AVDOVIMetadataInternal; AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size) @@ -51,10 +54,23 @@ AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size) *size = sizeof(*dovi); 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; } + +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 46b13b33995..e10332f8d7e 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; + }; +} AVDOVIDmData; + /** * Combined struct representing a combination of header, mapping and color * metadata, for attaching to frames as side data. @@ -203,6 +329,13 @@ 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 */ + + /* static limit on num_ext_blocks, derived from bitstream limitations */ +#define AV_DOVI_MAX_EXT_BLOCKS 32 } AVDOVIMetadata; static av_always_inline AVDOVIRpuDataHeader * @@ -223,6 +356,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); +} + +/** + * 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. diff --git a/libavutil/version.h b/libavutil/version.h index 80e6aacd0fa..0a3f5dd0c92 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 7 +#define LIBAVUTIL_VERSION_MINOR 8 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ From patchwork Sat Mar 23 19:19:52 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47385 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369096pzb; Sat, 23 Mar 2024 12:25:22 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCWMtBms97Nqapkp9F9xIeTLHpzIuJhWu5gfFUFGa/pcg2Y+JheozwqmcGQ8tsGnrW9M1j9S1uSo6Ty3iMU6HwpmjgFb91owFy1+QA== X-Google-Smtp-Source: AGHT+IEmBby6felCmKOlc8Q8EbAMg8+Gfa62la++T0r9sfmcGTGr0eX3XC8HdZ5gzcdE9JtdMZDP X-Received: by 2002:a19:2d5a:0:b0:513:2992:bd92 with SMTP id t26-20020a192d5a000000b005132992bd92mr1786799lft.11.1711221922701; Sat, 23 Mar 2024 12:25:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221922; cv=none; d=google.com; s=arc-20160816; b=L7Qpfnj0QI3lV9KTJorUouzUhob8eyWdleCFs8/uMaRL57ZmV/wnOTUUPNtm+LuT7t g6FjnNYoVYnMBDsJ625nbgWwgoXzfQeMn+CNnCN6kJCSY6oI/486wAQlqgVFxzssaAEg 9bzkMOi+aztgMdiajLYZEm3pbyTmkj9GJMAPRb9os9zTGW6K8xKw7cJjnlriRxTNznTu kZ6W1PIducOiCVhC7LKPSDibrlb/13ZVzS809QWVeJykT1PNZH2588NISCMigGblWly3 TCkytkPWO7A7OljGbhmH0swqYevnstSd8tEIxrLhyiftqS49AuKQlczH6z9+XZsn7BkI g0PQ== 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=+Hbt9qdum2Spl5Fkf1UxFmkitIZvTsfcnT/A3K6HpBw=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=SNs+sIlHg8m0gwFdSHHTsyVTydqK+54Ld8mo/un+kFNtbEOcMU+slNXCuES5N24LpT FMWD3pqQR2S1I8FdpNGkoIdNHecsCCX8J7gqUY/3YhvRdhNQvFC1DNxLVA4pha8ITrrB RQWFh2trYUCuj87dikv8yxpKw5gfnFqrI4LbcGt6SkSTiKsYKylwCERsiq7mCq+Lw6MV QXGwsqv/fB7qmYgddWkPyYFxN4uGR3x81wDnrczZvoyT1bjYrL72/P6z/Y/40o//zZ+g hEQyZYD+W/J7EC7Vas/Zo/yMh/vsftwsbkBMNTHB34AA27SqZwhP19WNsk+Rsm+OkC/H 25wA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=Csi0D782; 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 er19-20020a056402449300b0056874ed2dd6si1096689edb.378.2024.03.23.12.25.22; Sat, 23 Mar 2024 12:25:22 -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=Csi0D782; 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 8756068D1B3; Sat, 23 Mar 2024 21:24:54 +0200 (EET) 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 7731B68D10E for ; Sat, 23 Mar 2024 21:24:44 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221884; bh=G3K5ePz8kQ6cExfcOAs1BLbI+39AMTEMiGq+xPuZGaU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Csi0D7823SnWD5++HyGvyKxOR5z1NWRO5TxwxcPyzYCUkQxJ/YSTR/JlcLfjsff+3 O8R1+RwMhn6pRi6sNF4oA/YpWElgVR6EPugEnrbteuTuqcoIM6l4vr7L4LqrKOvEMZ QqBNrD/QNPz+Dqw16YohGvY7cpo9O8/YXqKGEzto= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 38260429D1; Sat, 23 Mar 2024 20:24:44 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:52 +0100 Message-ID: <20240323192440.38264-4-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 3/8] avcodec/dovi_rpu: switch to AVERROR_INVALIDDATA 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: 7saPKj4aaxWX From: Niklas Haas Instead of AVERROR(EINVAL) --- libavcodec/dovi_rpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index c84a942f476..53f8c288db0 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -483,5 +483,5 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) fail: ff_dovi_ctx_unref(s); /* don't leak potentially invalid state */ - return AVERROR(EINVAL); + return AVERROR_INVALIDDATA; } From patchwork Sat Mar 23 19:19:53 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47386 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369131pzb; Sat, 23 Mar 2024 12:25:31 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCW7sYUQ2qJ8ZcCeAfdVZr+W4r5YCKpMt/RuVbsIR5J4rr/HcdkZ60cURM6hbQgWS6sVbmBX/SqVpxYJi4lD/jef4yqCBiAq4UlOQA== X-Google-Smtp-Source: AGHT+IHqpfLv2hjXisVSO7Xn4PI73L64BznGHvCy2q3rD7gChP6Y/T7QkfohZoFRGV/0XemVnp8S X-Received: by 2002:a17:906:36d9:b0:a46:ddba:56ee with SMTP id b25-20020a17090636d900b00a46ddba56eemr1938816ejc.4.1711221931287; Sat, 23 Mar 2024 12:25:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221931; cv=none; d=google.com; s=arc-20160816; b=Ror2TNHI7N6v6msvc85C+HTCEVR9QqwLdvzsYEFsmHfSoemCVOnnbINGVXOzrw6Sj/ ReaZEuZGJydv0SEoK64kM6vuNf33Wxl3yyOI9gOIXk1YIfdOjWFieh+y3vytvpboeL+t HijU4XOO0f/qUN3UtMckD4LxfL3FJJnk2P2oPA9+SsNkZ7W7DHgifa0jqiTtMfbx2NTI iUkFsHxiPHp4tbBYlRRJ6B8AkrQ3pqvs20O78NfXY1pfgXC91Sxet3Jv1fqqkx2DK54w teqck1dsZAccmyP6hEzyRSWFrkEUyAGX7a3I1O3cPhpRuQUIr2a3nPC49kfvyb240FmC wpQQ== 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=4u2n6M7/weDo6VBahWyLELGKnNXMI7zPVmXVoyHI4/o=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=0G19d79vQbbqvmEnbuo6c4wdebdqX72hauSRmLgGB3bZYQUl+kig76A5B4NZ8iUd1C tNjGY2Wvmv9gbP9lIa0atLbfcVF+OmJJyd+gFSvg2zmM4dUEQ1EXwUwZm9yU2KcYwhVb /1GkDmwW284xX/xEjqYjUs5OQqBHpLatQL0eSl4tiOXI2JmwpfN/BZgGT/yE6RJmm6w9 Mt3Dj7cTiBkFl6nvRWOGO/a/V3jlQLnM9D6LY+x6W2fRliOxYYSMEGpvQmcmVd7FtJti 7Y78/mjl9QRRrhZwfSAbsRgVFFqFQU/TMEWWUWyCSgKf146XS21EneKr6nLYxROaiWSG mtmA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=vnJcucbN; 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 u20-20020a170906409400b00a470e13d19fsi1037662ejj.872.2024.03.23.12.25.30; Sat, 23 Mar 2024 12:25:31 -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=vnJcucbN; 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 8EAD768D592; Sat, 23 Mar 2024 21:24:55 +0200 (EET) 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 A50B668D10E for ; Sat, 23 Mar 2024 21:24:44 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221884; bh=UXUPVNHSyClfzORZ7X33BzdoW+/XEx9N8DW/hyHozkE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vnJcucbNzkWBjh5ZtU5sHFup6VckTap85CMTUvt2HMJZs+BdcPzsNG9k1qW2GUMKe rFm5iDzF3lbf9YZILnW7sUfRb8xTKQBHC0dyT3357g0r/0xwpnBxDwHASfi9Th6ffP cm//cUjPIqlfNLt1zBQDR1y//m+Wmj+qSTh45Bjw= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 77D53429E8; Sat, 23 Mar 2024 20:24:44 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:53 +0100 Message-ID: <20240323192440.38264-5-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 4/8] avcodec/dovi_rpu: strip container in separate step 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: y95EBrHnpbvB From: Niklas Haas This ensures that `gb` in the following section is fully byte-aligned, points at the start of the actual RPU, and ends on the CRC terminator. This is important for both calculation of the CRC, as well as dovi extension block parsing (which aligns to byte boundaries in various places). --- libavcodec/dovi_rpu.c | 48 +++++++++++++++++++++++++++++++++++-------- libavcodec/dovi_rpu.h | 2 ++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 53f8c288db0..d792a429217 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -23,6 +23,7 @@ #include "libavutil/buffer.h" +#include "avcodec.h" #include "dovi_rpu.h" #include "golomb.h" #include "get_bits.h" @@ -45,6 +46,7 @@ void ff_dovi_ctx_unref(DOVIContext *s) { for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++) ff_refstruct_unref(&s->vdr[i]); + av_free(s->rpu_buf); *s = (DOVIContext) { .logctx = s->logctx, @@ -59,6 +61,9 @@ void ff_dovi_ctx_flush(DOVIContext *s) *s = (DOVIContext) { .logctx = s->logctx, .dv_profile = s->dv_profile, + /* preserve temporary buffer */ + .rpu_buf = s->rpu_buf, + .rpu_buf_sz = s->rpu_buf_sz, }; } @@ -202,17 +207,17 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) DOVIVdr *vdr; int ret; - uint8_t nal_prefix; uint8_t rpu_type; uint8_t vdr_seq_info_present; uint8_t vdr_dm_metadata_present; uint8_t use_prev_vdr_rpu; uint8_t use_nlq; uint8_t profile; - if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0) - return ret; - /* Container header */ + if (rpu_size < 5) + goto fail; + + /* Container */ if (s->dv_profile == 10 /* dav1.10 */) { /* DV inside AV1 re-uses an EMDF container skeleton, but with fixed * values - so we can effectively treat this as a magic byte sequence. @@ -229,18 +234,43 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) * discard_unknown_payload : f(1) = 1 */ const unsigned header_magic = 0x01be6841u; - unsigned header, emdf_payload_size; - header = get_bits_long(gb, 27); - VALIDATE(header, header_magic, header_magic); + unsigned emdf_header, emdf_payload_size, emdf_protection; + if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0) + return ret; + emdf_header = get_bits_long(gb, 27); + VALIDATE(emdf_header, header_magic, header_magic); emdf_payload_size = get_variable_bits(gb, 8); VALIDATE(emdf_payload_size, 6, 512); if (emdf_payload_size * 8 > get_bits_left(gb)) return AVERROR_INVALIDDATA; + + /* The payload is not byte-aligned (off by *one* bit, curse Dolby), + * so copy into a fresh buffer to preserve byte alignment of the + * RPU struct */ + av_fast_padded_malloc(&s->rpu_buf, &s->rpu_buf_sz, emdf_payload_size); + if (!s->rpu_buf) + return AVERROR(ENOMEM); + for (int i = 0; i < emdf_payload_size; i++) + s->rpu_buf[i] = get_bits(gb, 8); + rpu = s->rpu_buf; + rpu_size = emdf_payload_size; + + /* Validate EMDF footer */ + emdf_protection = get_bits(gb, 5 + 12); + VALIDATE(emdf_protection, 0x400, 0x400); } else { - nal_prefix = get_bits(gb, 8); - VALIDATE(nal_prefix, 25, 25); + /* NAL RBSP with prefix and trailing zeroes */ + VALIDATE(rpu[0], 25, 25); /* NAL prefix */ + rpu++; + rpu_size--; + /* Strip trailing padding bytes */ + while (rpu_size && rpu[rpu_size - 1] == 0) + rpu_size--; } + if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0) + return ret; + /* RPU header */ rpu_type = get_bits(gb, 6); if (rpu_type != 2) { diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 51c5fdbb879..755171c9237 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -48,6 +48,8 @@ typedef struct DOVIContext { * Private fields internal to dovi_rpu.c */ struct DOVIVdr *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references + uint8_t *rpu_buf; ///< temporary buffer + unsigned rpu_buf_sz; uint8_t dv_profile; } DOVIContext; From patchwork Sat Mar 23 19:19:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47388 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369213pzb; Sat, 23 Mar 2024 12:25:48 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUVtl8Q78xFmNBQlM4fwZso+ANcVbf/QdHgCZafx7mLz120ScgdkRVi3Pfe2ciWeBmng7EULyEhZmML2aFXFNbxzMtc78U4GWJBQA== X-Google-Smtp-Source: AGHT+IEHMDBuhz8B4tMraHhLbGaTC6mwhaAw0xSCUxT/qmjFHbH7X94+pk8M0/EM5QCmOe8EFUN9 X-Received: by 2002:a17:906:5288:b0:a46:fbc6:d0cd with SMTP id c8-20020a170906528800b00a46fbc6d0cdmr2044111ejm.1.1711221948238; Sat, 23 Mar 2024 12:25:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221948; cv=none; d=google.com; s=arc-20160816; b=EOzWjCleVONRXhevwtOfXzUCSkrIacm3Y3hSRp0w1jtP+KZMTY72b47CIWRVeEaI6Q tGPucHTp+SYWr5NiPTtwBOeWA7aL7uJPNBH+OxNsX+tiFbyx5YndhOMIDwoqqces5r4F njYTMexLXKtF+PJGWUObASWNsa+/DxbkKYGA+zD3gYBCcEY18jUynTPmWJe3PPMY0PLf u4Xf9qvHBpo1vVRJCkWu2PlysstEEB3j8bkyaQikl955TEzWfrrk+pnk1OkjjTJEg+Az ro7AoYHNlY62GoSjv3udVDLVtMaxN4sYRFIwCW5cD5rV8RB5yC+9fyk5vTlNZhVzqODR Hv1g== 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=jXkGN1LA5wWnw7ZTkWEApjPJNOBzkNoDDe8WpVc8ZVY=; fh=C56SNERGsx7JRMjLZiHmpTAKnRl/jfaA+FIG9zHupRY=; b=OVpwG4IO+oE8KEJIVk5t/D6W+ydJJeyvsXBrCLLlyr2PTutMvHfHTqEt9z99zhymgQ nJWZvBKgdACVJNTFqmCQPXw4oXrkAzw2/25s5UE25rF6f/qmGuwz7pNPYG8/BmTHT7tT 235w8NxQhstQ6h5/Dre6kYS++3ckwkChnwBWoSuo9/dMuSVopIGaQW4wzLa6d6ZhBbNT ZWyM+LM+x1DX1/Jl0eqGSV45FXktTnKtn0FtFQxeTYahb7caCZKTwVKBLUdpixNie7ah /tt8WAvD+iOpFytSUH62n65NELbh/OXbZGvt9B0qWBDaZLS6txWg/5j3EqWkV8eBc2z0 qi7g==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=LWgQpyzm; 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 m10-20020a1709060d8a00b00a4663b17910si1013224eji.739.2024.03.23.12.25.47; Sat, 23 Mar 2024 12:25:48 -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=LWgQpyzm; 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 AAF0568D5AB; Sat, 23 Mar 2024 21:24:57 +0200 (EET) 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 1620868D4C7 for ; Sat, 23 Mar 2024 21:24:49 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221884; bh=cvFD+Lty1iX4TRbXO2nCANAW/L1HnhBlZcUWAyIJUQ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LWgQpyzmYbdCs2MD7yTQ/eGOP62CfmauTHIoZ4LOeiAx0ZHWgEDfEVEBnVOOuG3yj Rj70pFtl/ODTRoDttaxZ8bPJgNrgtmHRUX95nYFEOmbr/AIF87MqOScXButgTAQZy0 6sPOjA60xHxO9HY0tVKm48OJThC7uszUFx5Ao9rg= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id B0349429F3; Sat, 23 Mar 2024 20:24:44 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:54 +0100 Message-ID: <20240323192440.38264-6-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 5/8] avcodec/dovi_rpu: verify RPU data CRC32 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: quietvoid , Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: f+UFEpLg+ulr From: Niklas Haas The Dolby Vision RPU contains a CRC32 to validate the payload against. The implementation is CRC32/MPEG-2. The CRC is only verified with the AV_EF_CRCCHECK flag. Co-authored-by: quietvoid --- libavcodec/av1dec.c | 3 ++- libavcodec/dovi_rpu.c | 18 ++++++++++++++++-- libavcodec/dovi_rpu.h | 3 ++- libavcodec/hevcdec.c | 3 ++- libavcodec/libdav1d.c | 3 ++- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 32a795e7580..e8753d302ae 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -1001,7 +1001,8 @@ static int export_itut_t35(AVCodecContext *avctx, AVFrame *frame, provider_oriented_code != 0x800) break; - ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer); + ret = ff_dovi_rpu_parse(&s->dovi, gb.buffer, gb.buffer_end - gb.buffer, + avctx->err_recognition); if (ret < 0) { av_log(avctx, AV_LOG_WARNING, "Error parsing DOVI OBU.\n"); break; // ignore diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index d792a429217..d584d99590a 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -22,6 +22,7 @@ */ #include "libavutil/buffer.h" +#include "libavutil/crc.h" #include "avcodec.h" #include "dovi_rpu.h" @@ -200,7 +201,8 @@ static inline unsigned get_variable_bits(GetBitContext *gb, int n) } \ } while (0) -int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) +int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, + int err_recognition) { AVDOVIRpuDataHeader *hdr = &s->header; GetBitContext *gb = &(GetBitContext){0}; @@ -268,6 +270,19 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) rpu_size--; } + if (!rpu_size || rpu[rpu_size - 1] != 0x80) + goto fail; + + if (err_recognition & AV_EF_CRCCHECK) { + uint32_t crc = av_bswap32(av_crc(av_crc_get_table(AV_CRC_32_IEEE), + -1, rpu, rpu_size - 1)); /* exclude 0x80 */ + if (crc) { + av_log(s->logctx, AV_LOG_ERROR, "RPU CRC mismatch: %X\n", crc); + if (err_recognition & AV_EF_EXPLODE) + goto fail; + } + } + if ((ret = init_get_bits8(gb, rpu, rpu_size)) < 0) return ret; @@ -508,7 +523,6 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size) color->source_diagonal = get_bits(gb, 10); } - /* FIXME: verify CRC32, requires implementation of AV_CRC_32_MPEG_2 */ return 0; fail: diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 755171c9237..8dcc65bb40a 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -79,7 +79,8 @@ void ff_dovi_update_cfg(DOVIContext *s, const AVDOVIDecoderConfigurationRecord * * * Returns 0 or an error code. */ -int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size); +int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, + int err_recognition); /** * Attach the decoded AVDOVIMetadata as side data to an AVFrame. diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 575836e340c..3c8ec531a5d 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3207,7 +3207,8 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) return AVERROR(ENOMEM); memcpy(s->rpu_buf->data, nal->raw_data + 2, nal->raw_size - 2); - ret = ff_dovi_rpu_parse(&s->dovi_ctx, nal->data + 2, nal->size - 2); + ret = ff_dovi_rpu_parse(&s->dovi_ctx, nal->data + 2, nal->size - 2, + s->avctx->err_recognition); if (ret < 0) { av_buffer_unref(&s->rpu_buf); av_log(s->avctx, AV_LOG_WARNING, "Error parsing DOVI NAL unit.\n"); diff --git a/libavcodec/libdav1d.c b/libavcodec/libdav1d.c index ddcd0708b4f..f022a4ad05c 100644 --- a/libavcodec/libdav1d.c +++ b/libavcodec/libdav1d.c @@ -567,7 +567,8 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) provider_oriented_code != 0x800) break; - res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, gb.buffer_end - gb.buffer); + res = ff_dovi_rpu_parse(&dav1d->dovi, gb.buffer, gb.buffer_end - gb.buffer, + c->err_recognition); if (res < 0) { av_log(c, AV_LOG_WARNING, "Error parsing DOVI OBU.\n"); break; // ignore From patchwork Sat Mar 23 19:19:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47387 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369170pzb; Sat, 23 Mar 2024 12:25:40 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUQEOT5zdsAn8Zh1JZYlfoJIm3ubUUNjYWjYMI9v7o6rsfASd3AFnxx8+2Xy1MepWQPBaLXRTk76Afry0WVJS+WDIctXkH9oQ5y6g== X-Google-Smtp-Source: AGHT+IEEJV4Ds8YgEmtYW0sf8Qi1lzXI5pMbjX6HV2Y+wVaFMXeKCBA7T7m1GjDrRoLYKswxO5tO X-Received: by 2002:a17:906:a107:b0:a47:34bd:db75 with SMTP id t7-20020a170906a10700b00a4734bddb75mr1930198ejy.5.1711221939882; Sat, 23 Mar 2024 12:25:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221939; cv=none; d=google.com; s=arc-20160816; b=w6qg6PLOKgPC4eLglFFE4yBwaf7LTHo0YqlSc2xZ5PsfMl+pQ19JeoY4DRhDi1qF4w UiB44WQAt1ABdHTus53X0aiPrEZl1gGNlkwcWerklmawhZDBZRXT8WerbpGFys0GY95k pU2Uu3UL5EUlCreuLlzIGLExyXlcRdW/wFz2gaQ0g00N/0RKePplRm+eMkGh20oilfpS Cc7iPRiGUoXo4i5Iv/rBYg8AHpXOr9ILnHlF7znJp6h7gcET/anpj3VMgnz9jn2vIcPE KB0XemoQ6uBC7vO567roMVkLmLo+hWwIuYYBMl7ntSYCTMDCFFoWt9D2gpDPhk0A0b7R dIQw== 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=ySJG9HcCyCE6A41qkLz1Mh7mXgYZFzmQZF78bkgKgfE=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=nWHbbL8T7L82k7rjxc8GQ6D0bzJ6bPSizDwEk2zL/BzpzTHZnTFjIutHAmKj/ETiXN O4lYXa4XrOnfSlhBgcbyrWdsQ4OFFPzn+oAANzgGC/hREjy5v16gEKTr53a5w03DtULq Ci+PQzM8QpZZZSXM+rpdJekzKstRC+N1bGT7r00JJQYLtGLdriALi58zUEj1mgIli/IO dSCrDZOiU8vXkMJZNzRCmTs5jSX7HZv3tw8+1gBFOMHV34HkQ+ozGnYo37MBZOiz0lO1 4tB319puXMsw0O5QWGQDq/Ah1mM+bEQH2wS8rtfYENYV7dzuVbAOCK9Oo1Y6bEHDIky/ RPkw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=D5yQtVwC; 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 r4-20020a170906280400b00a43db2d8b90si961079ejc.325.2024.03.23.12.25.39; Sat, 23 Mar 2024 12:25:39 -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=D5yQtVwC; 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 8ABB568D5A4; Sat, 23 Mar 2024 21:24:56 +0200 (EET) 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 0D98868D4BA for ; Sat, 23 Mar 2024 21:24:49 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221884; bh=ZSYtv/Kmv7RhP0fp+W+eyu1+4q0mvbx7Bmx/xnWTrDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D5yQtVwC21nwjQk1BAsNVyeMt/iXC9feX++uYeCyCWejbxtukEgT1euCc8zbtjDLx +/6zlVhLGd08d6TExGEUnWQpZjNiJPYHyvwijGCMLYhIoqNJ4EMt22/A578vdpVYxr GTJjVBCt4sa94udWRfBdPq+bKaIKDAxqOPo7ybVg= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id E5C5442A34; Sat, 23 Mar 2024 20:24:44 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:55 +0100 Message-ID: <20240323192440.38264-7-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 6/8] avcodec/dovi_rpu: add ext_blocks array to DOVIContext 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: 24zk+YJxuU35 From: Niklas Haas --- libavcodec/dovi_rpu.c | 3 +++ libavcodec/dovi_rpu.h | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index d584d99590a..6097bd5422f 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -47,6 +47,7 @@ void ff_dovi_ctx_unref(DOVIContext *s) { for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++) ff_refstruct_unref(&s->vdr[i]); + ff_refstruct_unref(&s->ext_blocks); av_free(s->rpu_buf); *s = (DOVIContext) { @@ -58,6 +59,7 @@ void ff_dovi_ctx_flush(DOVIContext *s) { for (int i = 0; i < FF_ARRAY_ELEMS(s->vdr); i++) ff_refstruct_unref(&s->vdr[i]); + ff_refstruct_unref(&s->ext_blocks); *s = (DOVIContext) { .logctx = s->logctx, @@ -76,6 +78,7 @@ void ff_dovi_ctx_replace(DOVIContext *s, const DOVIContext *s0) s->dv_profile = s0->dv_profile; for (int i = 0; i <= DOVI_MAX_DM_ID; i++) ff_refstruct_replace(&s->vdr[i], s0->vdr[i]); + ff_refstruct_replace(&s->ext_blocks, s0->ext_blocks); } void ff_dovi_update_cfg(DOVIContext *s, const AVDOVIDecoderConfigurationRecord *cfg) diff --git a/libavcodec/dovi_rpu.h b/libavcodec/dovi_rpu.h index 8dcc65bb40a..9f26f332ceb 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -44,6 +44,12 @@ typedef struct DOVIContext { const AVDOVIDataMapping *mapping; const AVDOVIColorMetadata *color; + /** + * Currently active extension blocks, updates on every ff_dovi_rpu_parse() + */ + AVDOVIDmData *ext_blocks; + int num_ext_blocks; + /** * Private fields internal to dovi_rpu.c */ From patchwork Sat Mar 23 19:19:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47389 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369261pzb; Sat, 23 Mar 2024 12:25:56 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVeA/+cUx2eyqjsgAytwKD8DqNZSCrRVhoqiGA+lflgwf6NwPtgUoahoiMwVP2gEaCxc6YfBMBosGi0csP1RzxuIsOK8zd6esRpEw== X-Google-Smtp-Source: AGHT+IEZZpgjcV74hIHKlHDqWP7R7ocf/CHQGv9NkjuVU6nrUf3R/vvJsShVbjy1OZx3+HVcVkcT X-Received: by 2002:a50:d7d1:0:b0:56b:f2d2:eb8d with SMTP id m17-20020a50d7d1000000b0056bf2d2eb8dmr1917645edj.29.1711221956471; Sat, 23 Mar 2024 12:25:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221956; cv=none; d=google.com; s=arc-20160816; b=n1LVrbYJrmpGzyQ/pcx8e87JdfbhiInhlk5PI2xlP+qYW0ztr2ctXWYTx2hFLv8WMA aZzjWa62Z12uth0HbU23A67lFjcTExVb7GJmYclopEU62mYGR3FWOgchLONHaR2QTo17 /C+rsQoJ5AgbxQxudi9rwVQ0hEgp32tLq7fkkRiHy07KrGx6mrEvaJGf++xhuREBOEkt rpltHmxqFo1yjq+ue+j+QFXDmO8oBdYTyahLDRblRPEbTdtt/ZY7zakltARLZnciULAT eOMyfxdeh7HTxroIfkCUJ4vjv99tNUhWDIzSM51+2iNtmEVlaDO20uKeOw35vPqolfHT 4f7w== 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=c28jFXuvyOwqDvpAGQZh9mkCGkCQM7ANWTYklXeTeKA=; fh=C56SNERGsx7JRMjLZiHmpTAKnRl/jfaA+FIG9zHupRY=; b=ZN8NAlO8EFPBe/YQ+9g3UhSi4qjAPRX3uSl3epEbBCXbWXENxtMwvT1uNPOioQi1eb mdDGakX7rvGwWNo17Yggj8hwqedSkq7VN3OZzgNol3DePoWp5tFlU3HQrnfflzG/UUt1 r0L/I8NJxKUuEqW0PykKuAeqpmWVBMbk8y0E8dMqML6YnZl4WG8EysbIEsUY0GsxEc4H 5RWyUYmA8Jot+MZ4IWdtHvByTP3cWre/GO8Njnx37i5RipniKHI9+lz1wqDqM38ynW7E j3I87+gJIUlVmx6oCQ67x7QYScuu6A8XcVdhYUhO1KGWVpM3ri6E0J1VSMZfT3Y0RC1S Orng==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=cH7jdhxM; 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 v16-20020a056402175000b0056be8eae73esi1057809edx.452.2024.03.23.12.25.56; Sat, 23 Mar 2024 12:25:56 -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=cH7jdhxM; 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 21C0F68D5B8; Sat, 23 Mar 2024 21:24:59 +0200 (EET) 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 3C26568D1B3 for ; Sat, 23 Mar 2024 21:24:49 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221885; bh=Izw6HJmwgZxF1ZHu3hXEJZ/gJhLXxCU6sby/N9IfwtQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cH7jdhxMlznfgv+e9vRZ6EdzHahEse5AmfPorP0uXcr1j90dyGn95KHdRR8TQjlo8 HuWgVSJV5dyU/5yhnlVY/tUs7B5fRLCG5J0HOqeauaw/jG/0g3Idd+FLwDQP2GbYZ1 5b+u3QIjisb6TQyVhZCQdbf6dGiKj8fAD8DzXNK0= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 29B9542B27; Sat, 23 Mar 2024 20:24:45 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:56 +0100 Message-ID: <20240323192440.38264-8-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 7/8] avcodec/dovi_rpu: parse 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 Cc: quietvoid , Niklas Haas Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: JSZII9ld5Fu7 From: Niklas Haas We split the inner loop between v1 and v2 extension blocks to print a warning where an extension block was encountered in an unexpected context. Co-authored-by: quietvoid --- libavcodec/dovi_rpu.c | 178 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index 6097bd5422f..b3defd87bda 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -204,6 +204,170 @@ static inline unsigned get_variable_bits(GetBitContext *gb, int n) } \ } while (0) +static void parse_ext_v1(DOVIContext *s, GetBitContext *gb, AVDOVIDmData *dm) +{ + switch (dm->level) { + case 1: + dm->l1.min_pq = get_bits(gb, 12); + dm->l1.max_pq = get_bits(gb, 12); + dm->l1.avg_pq = get_bits(gb, 12); + break; + case 2: + dm->l2.target_max_pq = get_bits(gb, 12); + dm->l2.trim_slope = get_bits(gb, 12); + dm->l2.trim_offset = get_bits(gb, 12); + dm->l2.trim_power = get_bits(gb, 12); + dm->l2.trim_chroma_weight = get_bits(gb, 12); + dm->l2.trim_saturation_gain = get_bits(gb, 12); + dm->l2.ms_weight = get_bits(gb, 13) - 8192; + break; + case 4: + dm->l4.anchor_pq = get_bits(gb, 12); + dm->l4.anchor_power = get_bits(gb, 12); + break; + case 5: + dm->l5.left_offset = get_bits(gb, 13); + dm->l5.right_offset = get_bits(gb, 13); + dm->l5.top_offset = get_bits(gb, 13); + dm->l5.bottom_offset = get_bits(gb, 13); + break; + case 6: + dm->l6.max_luminance = get_bits(gb, 16); + dm->l6.min_luminance = get_bits(gb, 16); + dm->l6.max_cll = get_bits(gb, 16); + dm->l6.max_fall = get_bits(gb, 16); + break; + case 255: + dm->l255.dm_run_mode = get_bits(gb, 8); + dm->l255.dm_run_version = get_bits(gb, 8); + for (int i = 0; i < 4; i++) + dm->l255.dm_debug[i] = get_bits(gb, 8); + break; + default: + av_log(s->logctx, AV_LOG_WARNING, + "Unknown Dolby Vision DM v1 level: %u\n", dm->level); + } +} + +static inline AVCIExy get_cie_xy(GetBitContext *gb) +{ + AVCIExy xy; + const int denom = 32767; + xy.x = av_make_q(get_sbits(gb, 16), denom); + xy.y = av_make_q(get_sbits(gb, 16), denom); + return xy; +} + +static void parse_ext_v2(DOVIContext *s, GetBitContext *gb, AVDOVIDmData *dm, + int ext_block_length) +{ + switch (dm->level) { + case 3: + dm->l3.min_pq_offset = get_bits(gb, 12); + dm->l3.max_pq_offset = get_bits(gb, 12); + dm->l3.avg_pq_offset = get_bits(gb, 12); + break; + case 8: + dm->l8.target_display_index = get_bits(gb, 8); + dm->l8.trim_slope = get_bits(gb, 12); + dm->l8.trim_offset = get_bits(gb, 12); + dm->l8.trim_power = get_bits(gb, 12); + dm->l8.trim_chroma_weight = get_bits(gb, 12); + dm->l8.trim_saturation_gain = get_bits(gb, 12); + dm->l8.ms_weight = get_bits(gb, 12) - 8192; + if (ext_block_length < 12) + break; + dm->l8.target_mid_contrast = get_bits(gb, 12); + if (ext_block_length < 13) + break; + dm->l8.clip_trim = get_bits(gb, 12); + if (ext_block_length < 19) + break; + for (int i = 0; i < 6; i++) + dm->l8.saturation_vector_field[i] = get_bits(gb, 8); + if (ext_block_length < 25) + break; + for (int i = 0; i < 6; i++) + dm->l8.hue_vector_field[i] = get_bits(gb, 8); + break; + case 9: + dm->l9.source_primary_index = get_bits(gb, 8); + if (ext_block_length < 17) + break; + dm->l9.source_display_primaries.prim.r = get_cie_xy(gb); + dm->l9.source_display_primaries.prim.g = get_cie_xy(gb); + dm->l9.source_display_primaries.prim.b = get_cie_xy(gb); + dm->l9.source_display_primaries.wp = get_cie_xy(gb); + break; + case 10: + dm->l10.target_display_index = get_bits(gb, 8); + dm->l10.target_max_pq = get_bits(gb, 12); + dm->l10.target_min_pq = get_bits(gb, 12); + dm->l10.target_primary_index = get_bits(gb, 8); + if (ext_block_length < 21) + break; + dm->l10.target_display_primaries.prim.r = get_cie_xy(gb); + dm->l10.target_display_primaries.prim.g = get_cie_xy(gb); + dm->l10.target_display_primaries.prim.b = get_cie_xy(gb); + dm->l10.target_display_primaries.wp = get_cie_xy(gb); + break; + case 11: + dm->l11.content_type = get_bits(gb, 8); + dm->l11.whitepoint = get_bits(gb, 4); + dm->l11.reference_mode_flag = get_bits(gb, 1); + skip_bits(gb, 3); /* reserved */ + dm->l11.sharpness = get_bits(gb, 2); + dm->l11.noise_reduction = get_bits(gb, 2); + dm->l11.mpeg_noise_reduction = get_bits(gb, 2); + dm->l11.frame_rate_conversion = get_bits(gb, 2); + dm->l11.brightness = get_bits(gb, 2); + dm->l11.color = get_bits(gb, 2); + break; + case 254: + dm->l254.dm_mode = get_bits(gb, 8); + dm->l254.dm_version_index = get_bits(gb, 8); + break; + default: + av_log(s->logctx, AV_LOG_WARNING, + "Unknown Dolby Vision DM v2 level: %u\n", dm->level); + } +} + +static int parse_ext_blocks(DOVIContext *s, GetBitContext *gb, int ver) +{ + int num_ext_blocks, ext_block_length, start_pos, parsed_bits; + + num_ext_blocks = get_ue_golomb_31(gb); + align_get_bits(gb); + if (s->num_ext_blocks + num_ext_blocks > AV_DOVI_MAX_EXT_BLOCKS) + return AVERROR_INVALIDDATA; + + if (!s->ext_blocks) { + s->ext_blocks = ff_refstruct_allocz(sizeof(AVDOVIDmData) * AV_DOVI_MAX_EXT_BLOCKS); + if (!s->ext_blocks) + return AVERROR(ENOMEM); + } + + while (num_ext_blocks--) { + AVDOVIDmData *dm = &s->ext_blocks[s->num_ext_blocks++]; + ext_block_length = get_ue_golomb_31(gb); + dm->level = get_bits(gb, 8); + start_pos = get_bits_count(gb); + + switch (ver) { + case 1: parse_ext_v1(s, gb, dm); break; + case 2: parse_ext_v2(s, gb, dm, ext_block_length); break; + } + + parsed_bits = get_bits_count(gb) - start_pos; + if (parsed_bits > ext_block_length * 8) + return AVERROR_INVALIDDATA; + skip_bits(gb, ext_block_length * 8 - parsed_bits); + } + + return 0; +} + int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, int err_recognition) { @@ -526,6 +690,20 @@ int ff_dovi_rpu_parse(DOVIContext *s, const uint8_t *rpu, size_t rpu_size, color->source_diagonal = get_bits(gb, 10); } + /* Parse extension blocks */ + s->num_ext_blocks = 0; + if ((ret = parse_ext_blocks(s, gb, 1)) < 0) { + ff_dovi_ctx_unref(s); + return ret; + } + + if (get_bits_left(gb) > 48 /* padding + CRC32 + terminator */) { + if ((ret = parse_ext_blocks(s, gb, 2)) < 0) { + ff_dovi_ctx_unref(s); + return ret; + } + } + return 0; fail: From patchwork Sat Mar 23 19:19:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47390 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp369309pzb; Sat, 23 Mar 2024 12:26:05 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX4UzSa78ArOVfYdfi6h4CUGnGFACefWp37Wweg6azjQhk3LrjJk0e9I2t0tSoofV+1Q3ByApAj+SlX0WFvL0R3QkRkdiKsuSfigA== X-Google-Smtp-Source: AGHT+IHYoH2KAnO+crqLLiql5AbyCNDTOstVMXEHWBZFEfYOox4HH92Of2Ooso+U7LVRLBUXTe7R X-Received: by 2002:a05:6512:220f:b0:515:a799:604e with SMTP id h15-20020a056512220f00b00515a799604emr315933lfu.41.1711221965559; Sat, 23 Mar 2024 12:26:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711221965; cv=none; d=google.com; s=arc-20160816; b=0ALUr+NF7swhMhxIAo4H8nB6L9IZoAtzYKkK4TrID/IcNY9B3gpQLCJOazJ9ZrC0Ww hDpq6xvCFVAbe5rfPyp0qakNTbLCa/RxHVyNKD+YBXqpCmObkcBXHYZjXKpC1o9TpgQb +rK1J0dEopn+rAp49aTWu+526GtMBDa5eqiMb8qp+43nb2LF75ia3cAr04yxE9KV8cfI MVAv7UUB1yRZms3kv7mmgeikH70/wfRmreRev69LZP0ty3MqgKwqwYuFQr9LXgrdTiuK IGaiSykC7CgQFClRTXN+gvPXxSM24TeZEHWEhWP+DvvH5VjBQGGBDAwnanQqF1JLYKX0 y9dA== 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=z++Paps/nEtwoI0bU+1rYDMXSeEIfOXL2KI/rhkvAXs=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=xc4vpvbikp0zxtBbA5VRk3IgdvqxMUPPXCMle7HK+Ktws848lEM9kGk/jP/eF7KDkS BrM8bcL/SHoKC4bn7hmW8dUiYREOApqWI1MSAyOm/5x8KGGNSAeGejwVPWtQq2LWO1Cm ofAd7GE0bTqLxR7/j3cf+ZmNT8zxL5yHqvRu1S84h7yic/OMt6QkA/xPUwFMgaDGIL/F 5l4b1IEqO8km0ZbwwPTj94qFQPkg5bWlIkGWj/dxW48vwMsflcDfmXy7Gq5Cqsom5QZw lPTAhHj7Cah3axDJ20cptmbEIKAk2LfC9zjHSn9Dpd6EdwoWnxKET/bLo+8Qnw66E3hQ KLCA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@haasn.xyz header.s=mail header.b=EcZpWbKR; 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 t9-20020a056402524900b0056bd49c466asi1073052edd.317.2024.03.23.12.26.04; Sat, 23 Mar 2024 12:26:05 -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=EcZpWbKR; 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 199A968D5CB; Sat, 23 Mar 2024 21:25:00 +0200 (EET) 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 358C268D4BA for ; Sat, 23 Mar 2024 21:24:49 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711221885; bh=tQrJ4LbE58TvS/usAqwln4GDvyQnTY0OoExVnX/HCBU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EcZpWbKR9/vFTnIbXPRpeuu8qq+MBKngiQi4K7jSF7G4zDRRJ5DMnDw1H7NmLHZlJ bGGiGYYsYPlBLRKqyhO9gR3VGtCeggYjl+noFobYBLHzlv5Pv6iyvfm1bhpRnWfDcs 9mx96ZNIkFxJhyrmEcI+/7q8LpwFNmbuBT323GVk= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 628AA4301F; Sat, 23 Mar 2024 20:24:45 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 20:19:57 +0100 Message-ID: <20240323192440.38264-9-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323192440.38264-1-ffmpeg@haasn.xyz> References: <20240323192440.38264-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 8/8] avcodec/dovi_rpu: attach ext blocks to frames 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: YbfPXW2+IXgi From: Niklas Haas --- libavcodec/dovi_rpu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavcodec/dovi_rpu.c b/libavcodec/dovi_rpu.c index b3defd87bda..2b4d2b470c2 100644 --- a/libavcodec/dovi_rpu.c +++ b/libavcodec/dovi_rpu.c @@ -94,7 +94,7 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) AVFrameSideData *sd; AVBufferRef *buf; AVDOVIMetadata *dovi; - size_t dovi_size; + size_t dovi_size, ext_sz; if (!s->mapping || !s->color) return 0; /* incomplete dovi metadata */ @@ -120,6 +120,9 @@ int ff_dovi_attach_side_data(DOVIContext *s, AVFrame *frame) COPY(AVDOVIRpuDataHeader, av_dovi_get_header(dovi), &s->header, disable_residual_flag); COPY(AVDOVIDataMapping, av_dovi_get_mapping(dovi), s->mapping, nlq_pivots); COPY(AVDOVIColorMetadata, av_dovi_get_color(dovi), s->color, source_diagonal); + ext_sz = FFMIN(sizeof(AVDOVIDmData), dovi->ext_block_size); + for (int i = 0; i < s->num_ext_blocks; i++) + memcpy(av_dovi_get_ext(dovi, i), &s->ext_blocks[i], ext_sz); return 0; }