From patchwork Sat Mar 23 17:37:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Niklas Haas X-Patchwork-Id: 47376 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c889:b0:1a3:b6bb:3029 with SMTP id hb9csp328516pzb; Sat, 23 Mar 2024 10:38:04 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCULGnohP3lyGLb3+0VZyo4FGK19norpRkCF/x3CkWhVDJH6Y3R10kSSl+ZXkGHbfMb1ajC0Ejl71blYXUgMDeZvCDeIggqR7bwzVg== X-Google-Smtp-Source: AGHT+IHR9o0osgVlc05HUeBvEIQa892FDvz+qxMpONVJTj4W7KdZQ1v3dUQf5ZPbPbuqKVai4DFU X-Received: by 2002:a05:6512:282:b0:515:9578:d3bb with SMTP id j2-20020a056512028200b005159578d3bbmr1609967lfp.69.1711215483932; Sat, 23 Mar 2024 10:38:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1711215483; cv=none; d=google.com; s=arc-20160816; b=KmorhNwtFXz/83j/jsyQgbeKOY8X/pJU/5I3oxp4bKfLvyAo4QHCoGU1tAMcZlCocR rr8kTwAtRf27f+wpLBvepWiLQg2FHknDR924q9skA3APFRlC98DiN6LbKa2MFwwAV0jh 9cT3dEOaMvYxuOHz8E/wuFNlr/M0kR4WwYS9vxxH4BAWwfR+vWoz26YUEuWYhVcaUZtr 8RvxOBRatsc1HXvyzzpDnSrV4IxaUZejKBxtmnmaMYhQzrIsB6tj6Q5gxO/ixKMh8hhF wXehYvMTOqI2tdhghLIWxfwgbVOTcbclE2SHHOf91zhIZpOPc0joBPcYTdDkxDpo3K2z lbnA== 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=QmxjolZaYijgoWJt453sEkcydLgAaxGzfuRrKKhOXzQ=; fh=xmAeKtysnShNOmkhiJmYkS30uw4Fu2hvBJ7qlIwukxQ=; b=S0mZ8dLd3WZ9INBUxuPDeOBoYrfD5+0brCaoyXKRFi8q4al2mkhAgoUTiXMBOhUF18 ME8yRIIFZPSO0YDAKH1t4CU+NHlWQ+l35m21hZuaJm4kT8I6BGHPoFhTCiMEubRruulx fvw0IFZj9+X7doY0s1/lGZY6cecbvCCCFCCy2zG/0yh7T9cCoOmvM7675vBEvU5Y1a9C drpHfOfKONa9ZEjQdfk5g4iTNtvlnj3d4PGuJawu5CYWsd+/G1xSZySt3L0AHG1QAm9H 9T+SvRpdCRvtbd2toAkCkXpVmiMiMju1/BI0sZ+HRCeM0BVd4W+cemICYInfWx8/lvtA Wh7w==; 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="uLO/dIdr"; 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 s2-20020a170906454200b00a4653cc39fesi973557ejq.829.2024.03.23.10.38.03; Sat, 23 Mar 2024 10:38:03 -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="uLO/dIdr"; 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 29F0568D3F1; Sat, 23 Mar 2024 19:37:50 +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 1803768D326 for ; Sat, 23 Mar 2024 19:37:42 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=haasn.xyz; s=mail; t=1711215461; bh=W381fYEgYXdI81GoAsyaxPbQgqCIJAYDoxfq0UVU/ac=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uLO/dIdrwW9kObPuPllUvZcQNljY6HokyULyknYObMFDs33H1VMUomTtJgkoARkMQ UOGntX4jVNH3iXC+HBIiguxfl3yMCuexKRqz+OKXBcZgS7sumKPpdJEZG9ylXj7jAV 5BelYHVnsQc+cr+B8pXXikTPY+Aax3/TTCvFvfJk= Received: from haasn.dev (unknown [10.30.0.2]) by haasn.dev (Postfix) with ESMTP id 83462428A0; Sat, 23 Mar 2024 18:37:41 +0100 (CET) From: Niklas Haas To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Mar 2024 18:37:32 +0100 Message-ID: <20240323173735.26224-3-ffmpeg@haasn.xyz> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240323173735.26224-1-ffmpeg@haasn.xyz> References: <20240323173735.26224-1-ffmpeg@haasn.xyz> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/6] 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: 0D95mbHFX4BO 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 c84a942f476..24a1cdf39a8 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, @@ -202,17 +204,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 +231,46 @@ 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); + + if ((ret = init_get_bits8(gb, s->rpu_buf, emdf_payload_size)) < 0) + return ret; } 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..506974a74bf 100644 --- a/libavcodec/dovi_rpu.h +++ b/libavcodec/dovi_rpu.h @@ -49,6 +49,8 @@ typedef struct DOVIContext { */ struct DOVIVdr *vdr[DOVI_MAX_DM_ID+1]; ///< RefStruct references uint8_t dv_profile; + uint8_t *rpu_buf; ///< temporary buffer + unsigned rpu_buf_sz; } DOVIContext;