From patchwork Sat Sep 14 10:45:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 51582 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:9fc3:0:b0:48e:c0f8:d0de with SMTP id k3csp300465vqy; Sat, 14 Sep 2024 04:11:37 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCX9YMUUtQXP9qWlvvI2TePcLH78W5KFvAsbNPCHkvnr4HqpcT7jJzoC2tKuj+IasiPMRXQJZn2UpThwlOuJqAGu@gmail.com X-Google-Smtp-Source: AGHT+IEtQXTBy985D24hho/alo6Fbt8b8ZvONFriHNfRmX+tnCuIa6lrOTVpXiZGdThlpBQa6X/0 X-Received: by 2002:a05:6402:1f0e:b0:5be:fa43:8017 with SMTP id 4fb4d7f45d1cf-5c413e1eecbmr7523943a12.16.1726312296869; Sat, 14 Sep 2024 04:11:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726312296; cv=none; d=google.com; s=arc-20240605; b=imjRzvrMLjSv5gAFUzR5Ze4DkkPZdJ6o8S5ZqTv2R657GUFuhqkCLK6gY/9kVY21c7 Pbq4FpLv9UyWyYV5w849efw70vff4+DZYu/BRfbQUlC5RXyDo0KnMgu8THFmCrEgHWdu uuBJ3td/8Jgol8LsEkvQdoLcHgv+6XtP6SXx/xhxrPI6rkrcpqJ+UUL0tPS5V0GaxPWO GfK8RBIL4faXd1uNjGJK7LIy5dWNNovacCYQS7G3iPH8//riaW9BpeqqE7UUHhPLr47+ g45DyiLncGHvuPpEE2yM35cg9tGZe0BWN4WEUG7OFhRBnJaJVTXddad7Cf+rKsfC8gzr tK4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding: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=EnEMeHKgqbE+5BncJOMAwRWS4xs8qZ7nPTJFwbYRk80=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Q3v4brwd7q7+XYCiZ/Pnr93M88nODp/6m8sTeSdfalt9ZjQqpCvwxttDK591hRxV9C He9aLvJZbZditAT1MRvxifsvOWx2fIUjqJIIXWPIT+4FAN/xdwRQnY9mewrDxFufLj5e 0Ercae+uRQToxCgkB3WyvdE8AHlmGe+g9QtHV32Yf9izytYuYlk976vY2SZ5lTMQwoNy E7MsMMLanGbhVn1sNkXmOkN0QOrPGyqsGeP5Ax1IXUe3DN9dcSTE5oyZyk5lYGM8sOAE pviEAObfPmlbedHZxPL9s9Tv2RdOOKuePHWp+BopEYzp9Hjfr9NvuIZ+gn9BUP527OVy gXIA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@khirnov.net header.s=mail header.b=dW5Q64wd; 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 4fb4d7f45d1cf-5c42bb4e462si877853a12.118.2024.09.14.04.11.36; Sat, 14 Sep 2024 04:11:36 -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=@khirnov.net header.s=mail header.b=dW5Q64wd; 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 B780368DC74; Sat, 14 Sep 2024 14:10:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail1.khirnov.net (quelana.khirnov.net [94.230.150.81]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9F27068DA8C for ; Sat, 14 Sep 2024 14:10:48 +0300 (EEST) Authentication-Results: mail1.khirnov.net; dkim=pass (2048-bit key; unprotected) header.d=khirnov.net header.i=@khirnov.net header.a=rsa-sha256 header.s=mail header.b=dW5Q64wd; dkim-atps=neutral Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 46BDA4E05 for ; Sat, 14 Sep 2024 13:10:48 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id pfoPs8ZkA7St for ; Sat, 14 Sep 2024 13:10:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=khirnov.net; s=mail; t=1726312246; bh=6f436dYgo2JIPWb15eOwwHI16m3E0danxEWK0Vj+ZUw=; h=From:To:Subject:Date:In-Reply-To:References:From; b=dW5Q64wdEeZaL8oH/GOr90uOUqs+9xo5+4uI5G7f8v6xpWpC3RJgX0HVkeL81NoCT b762BCGrIPfUCZcVHWzYl2Wem9fHr7sjIf/yz45ZtoQMd+UUitDowMESCmhzSIeeyc n7dXVPrUwDdNLsVcsFL8Tl+LorlIxvS/6UcUq0uPVH5azqfKEZ8bjNq1fgs8dO3Vz9 J5ifSRrhsU/8BQxG5QFb2KKhapPHd2lfkaa0F55z6955aKQH9+STIRl4k0OkfiLLCV CkTgyVZ5tPvo/XZq+06RfiZ94xf/obOJNeVA+sMXKXEKnKQbnYoj/5EWDtxBV1HutG pKC6JKkEAj2bQ== Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail1.khirnov.net (Postfix) with ESMTPS id 57AFA4DEE for ; Sat, 14 Sep 2024 13:10:46 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 142BA3A0F6F for ; Sat, 14 Sep 2024 13:10:41 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 14 Sep 2024 12:45:30 +0200 Message-ID: <20240914111036.17164-6-anton@khirnov.net> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240914111036.17164-1-anton@khirnov.net> References: <20240914111036.17164-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 05/23] avcodec/hevc/sei: add support for 3D Reference Displays Information SEI 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: o0XXqZu2l85a From: James Almer Signed-off-by: James Almer Signed-off-by: Anton Khirnov --- libavcodec/hevc/sei.c | 55 +++++++++++++++++++++++++++++++++++++++++++ libavcodec/hevc/sei.h | 17 +++++++++++++ 2 files changed, 72 insertions(+) diff --git a/libavcodec/hevc/sei.c b/libavcodec/hevc/sei.c index b55ba71a8d..e11a33773c 100644 --- a/libavcodec/hevc/sei.c +++ b/libavcodec/hevc/sei.c @@ -150,6 +150,59 @@ static int decode_nal_sei_timecode(HEVCSEITimeCode *s, GetBitContext *gb) return 0; } +static int decode_nal_sei_3d_reference_displays_info(HEVCSEITDRDI *s, GetBitContext *gb) +{ + s->prec_ref_display_width = get_ue_golomb(gb); + if (s->prec_ref_display_width > 31) + return AVERROR_INVALIDDATA; + s->ref_viewing_distance_flag = get_bits1(gb); + if (s->ref_viewing_distance_flag) { + s->prec_ref_viewing_dist = get_ue_golomb(gb); + if (s->prec_ref_viewing_dist > 31) + return AVERROR_INVALIDDATA; + } + s->num_ref_displays = get_ue_golomb(gb); + if (s->num_ref_displays > 31) + return AVERROR_INVALIDDATA; + s->num_ref_displays += 1; + + for (int i = 0; i < s->num_ref_displays; i++) { + int length; + s->left_view_id[i] = get_ue_golomb(gb); + s->right_view_id[i] = get_ue_golomb(gb); + s->exponent_ref_display_width[i] = get_bits(gb, 6); + if (s->exponent_ref_display_width[i] > 62) + return AVERROR_INVALIDDATA; + else if (!s->exponent_ref_display_width[i]) + length = FFMAX(0, (int)s->prec_ref_display_width - 30); + else + length = FFMAX(0, (int)s->exponent_ref_display_width[i] + + (int)s->prec_ref_display_width - 31); + s->mantissa_ref_display_width[i] = get_bits_long(gb, length); + if (s->ref_viewing_distance_flag) { + s->exponent_ref_viewing_distance[i] = get_bits(gb, 6); + if (s->exponent_ref_viewing_distance[i] > 62) + return AVERROR_INVALIDDATA; + else if (!s->exponent_ref_viewing_distance[i]) + length = FFMAX(0, (int)s->prec_ref_viewing_dist - 30); + else + length = FFMAX(0, (int)s->exponent_ref_viewing_distance[i] + + (int)s->prec_ref_viewing_dist - 31); + s->mantissa_ref_viewing_distance[i] = get_bits_long(gb, length); + } + s->additional_shift_present_flag[i] = get_bits1(gb); + if (s->additional_shift_present_flag[i]) { + s->num_sample_shift[i] = get_bits(gb, 10); + if (s->num_sample_shift[i] > 1023) + return AVERROR_INVALIDDATA; + s->num_sample_shift[i] -= 512; + } + } + s->three_dimensional_reference_displays_extension_flag = get_bits1(gb); + + return 0; +} + static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type) @@ -163,6 +216,8 @@ static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte, return decode_nal_sei_active_parameter_sets(s, gb, logctx); case SEI_TYPE_TIME_CODE: return decode_nal_sei_timecode(&s->timecode, gb); + case SEI_TYPE_THREE_DIMENSIONAL_REFERENCE_DISPLAYS_INFO: + return decode_nal_sei_3d_reference_displays_info(&s->tdrdi, gb); default: { int ret = ff_h2645_sei_message_decode(&s->common, type, AV_CODEC_ID_HEVC, gb, gbyte, logctx); diff --git a/libavcodec/hevc/sei.h b/libavcodec/hevc/sei.h index c97d22d423..a9d6a52080 100644 --- a/libavcodec/hevc/sei.h +++ b/libavcodec/hevc/sei.h @@ -79,12 +79,29 @@ typedef struct HEVCSEITimeCode { int32_t time_offset_value[3]; } HEVCSEITimeCode; +typedef struct HEVCSEITDRDI { + uint8_t prec_ref_display_width; + uint8_t ref_viewing_distance_flag; + uint8_t prec_ref_viewing_dist; + uint8_t num_ref_displays; + uint16_t left_view_id[31]; + uint16_t right_view_id[31]; + uint8_t exponent_ref_display_width[31]; + uint8_t mantissa_ref_display_width[31]; + uint8_t exponent_ref_viewing_distance[31]; + uint8_t mantissa_ref_viewing_distance[31]; + uint8_t additional_shift_present_flag[31]; + int16_t num_sample_shift[31]; + uint8_t three_dimensional_reference_displays_extension_flag; +} HEVCSEITDRDI; + typedef struct HEVCSEI { H2645SEI common; HEVCSEIPictureHash picture_hash; HEVCSEIPictureTiming picture_timing; int active_seq_parameter_set_id; HEVCSEITimeCode timecode; + HEVCSEITDRDI tdrdi; } HEVCSEI; struct HEVCParamSets;