From patchwork Tue Mar 21 17:06:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 40765 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2758978pzb; Tue, 21 Mar 2023 10:07:28 -0700 (PDT) X-Google-Smtp-Source: AK7set91+Mo9uQMa45BbRvq/U4P4Ba3MwkuC9b1WY6aLB/CPVIDMbx9IdLAq4jGluQXJfOj1wlOd X-Received: by 2002:a17:906:158e:b0:92f:a0d5:211c with SMTP id k14-20020a170906158e00b0092fa0d5211cmr3215262ejd.35.1679418448493; Tue, 21 Mar 2023 10:07:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679418448; cv=none; d=google.com; s=arc-20160816; b=l+WUqfO0JA6XOaDtv5X1lkTcY2s9tbN1Q3HNAGt6GA6GzmMlOfSrRrXLIAjzzoZwoo raTObbcbPbhsTIaY5IKbSfQ7dB9gkRMPoCt+JfsgSjqYC0GbqX4JFa/Va19tkpdmxGvv UwyOePldIvTlsd8t61NF/V/BRaoyeJrFRNR5mgfjdsIgRUeeQzi+fbwjNf50A96RLhMk WQdw4Gg+jwMa3NlbJR5MGS2y5gdGatfLVq4bMZc7xniQXrsr0V+ONf5hGgrYAfOwXxBZ zE5x9aWcRNMmSOGkmoi77q7TsGE/j4OSg+rpc4H+KsxPKzlsw4vQNIvjejEyYvZC+gNG ngrg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; 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=vHgb5T1WOWYApJN7lBW5NWCCMGAJolwW2BOwJHjek4g=; b=B1AjLvAsf4ZSHChfj4P30Srzsp52JAeOujv8vLpWARCVJCtoo71hUCM/3+uRbFBoVb Xt4Sqe/fNjkuY1/q50IlPnCobx/ce5meF0nNOLg0KgFVnAaKcVL9qSQhuMIlKNpIapkY jZS2WP7LgkPjGPCszTf+aF1rfy7wgq9spgzHuw0yYuyegXQBzus8jiGUl/QyEISYvLOa o2e5ulgNMbVkbffRp23+t2MDoF3sDTu1z5AVHO0EH7s6rdTeQ86Qa1xqnvlCiChZ3iT4 SHsJQG1SySfw7nAQtQFA/qytIckZCgrMnTvfaN4lK5SbuhRjtJ2r9JVE9MGrL8alOdf+ u2nw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=OBNLPcJJ; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id qa17-20020a170907869100b009333cf9aaf0si11241864ejc.537.2023.03.21.10.07.24; Tue, 21 Mar 2023 10:07:28 -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=@gmail.com header.s=20210112 header.b=OBNLPcJJ; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 82BB668BD75; Tue, 21 Mar 2023 19:07:03 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 816AF68C207 for ; Tue, 21 Mar 2023 19:06:55 +0200 (EET) Received: by mail-oi1-f176.google.com with SMTP id bf30so5052972oib.12 for ; Tue, 21 Mar 2023 10:06:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679418413; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=qFY2ud2CvU/FLxJfR/riyLvIvfGC14MZD7orU28BZME=; b=OBNLPcJJK12EHKkKpakESOX3znrkIormkfl9h36K3YqqOAMoFCiycD6hQmHIQHJRjj lfDE0aMDRrgS4bVKShBo6P7E13NiOHRN9A3YzBCLB14KB+JD7jXcgBfIwRq0m07jVOmx OIBj9ChnYEO0wpo7mZHy7131F186H7vHnEXLdNqns3fgAqrqV+caaFqI44N1PAOLCqzk WPM2J3aJO2aQwoEPFEAHKOFkOunU4LSEN+g0XNE+ugxuHZdgBrPU+x7s+AL0iUPU1Ta8 jHe9VzsANtcqoZel1U2duyoWmaMUcLEaWh9l1dWX2Y/gLvSb7oJ1+9mCWrMVdYo7qmU4 SXxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679418413; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qFY2ud2CvU/FLxJfR/riyLvIvfGC14MZD7orU28BZME=; b=3ROalnNi7P/L6VmNkSzdqb9tvUoN3BVwzvRijPVkS+xxw/f/0d7cVmmn06jZUNDmn1 7MYB2EqQFuI3ZQWJYp/h2g2kIGFsBMwNJmK/SybDy986Vz0Q/UvGGuQDtg64GgWFafuj KEWILq4nsH81oPFyoPuEOnzmV/juD+51tzuB4wdgvsaUSPJ9Tth12n8kqB7u1ZiTUslK N9J5YEIMcdddrfhEa7i+FbO/5vmTwgqpdNKBmyDAA6hpUq7T2z0WYhHORuqMb4jiBrZH UtX7SR22iNvEzZUL/HKdAvJAO/3Bw9oA0jxu911Mr4aVKEID/UXNdAJMTQUHMbITsElw K/jw== X-Gm-Message-State: AO0yUKWcJQXD/EUVlfYzGC85aZk0aR4Qxy8UPuHzqLDp/26UnP4Izq9B E9pCdgpj/HVCIm08/iXiNCLtiIispSo= X-Received: by 2002:aca:121a:0:b0:383:fc9f:e76 with SMTP id 26-20020aca121a000000b00383fc9f0e76mr1292529ois.51.1679418413651; Tue, 21 Mar 2023 10:06:53 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id b11-20020aca1b0b000000b003872148d322sm845876oib.22.2023.03.21.10.06.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 10:06:53 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Mar 2023 14:06:33 -0300 Message-Id: <20230321170637.10907-3-jamrial@gmail.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230321170637.10907-1-jamrial@gmail.com> References: <20230321170637.10907-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/7] avformat/matroskadec: export Dynamic HDR10+ packet side data 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: 4GreGCMFxd5v Signed-off-by: James Almer --- libavformat/matroska.h | 5 +++ libavformat/matroskadec.c | 76 +++++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 45077ed33f..8a9c1b5119 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -358,6 +358,11 @@ typedef enum { MATROSKA_VIDEO_PROJECTION_TYPE_MESH = 3, } MatroskaVideoProjectionType; +typedef enum { + MATROSKA_BLOCK_ADD_ID_TYPE_DEFAULT = 0, + MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35 = 4, +} MatroskaBlockAddIDType; + /* * Matroska Codec IDs, strings */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index ef914f92f8..b1d2391840 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -40,6 +40,7 @@ #include "libavutil/dict.h" #include "libavutil/dict_internal.h" #include "libavutil/display.h" +#include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "libavutil/lzo.h" @@ -284,6 +285,7 @@ typedef struct MatroskaTrack { int needs_decoding; uint64_t max_block_additional_id; EbmlList block_addition_mappings; + int blockaddid_itu_t_t35; uint32_t palette[AVPALETTE_COUNT]; int has_palette; @@ -423,6 +425,8 @@ typedef struct MatroskaDemuxContext { MatroskaCluster current_cluster; + int is_webm; + /* WebM DASH Manifest live flag */ int is_live; @@ -2378,7 +2382,7 @@ static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaT return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size); } -static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, const MatroskaTrack *track) +static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, MatroskaTrack *track) { const EbmlList *mappings_list = &track->block_addition_mappings; MatroskaBlockAdditionMapping *mappings = mappings_list->elem; @@ -2388,6 +2392,18 @@ static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, c MatroskaBlockAdditionMapping *mapping = &mappings[i]; switch (mapping->type) { + case MATROSKA_BLOCK_ADD_ID_TYPE_ITU_T_T35: + if (mapping->value != 4) { + int strict = s->strict_std_compliance >= FF_COMPLIANCE_STRICT; + av_log(s, strict ? AV_LOG_ERROR : AV_LOG_WARNING, + "Invalid Block Addition Value 0x%"PRIx64" for Block Addition Mapping Type " + "\"ITU T.35 metadata\"\n", mapping->value); + if (!strict) + break; + return AVERROR_INVALIDDATA; + } + track->blockaddid_itu_t_t35 = 1; + break; case MKBETAG('d','v','c','C'): case MKBETAG('d','v','v','C'): if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0) @@ -2814,10 +2830,12 @@ static int matroska_parse_tracks(AVFormatContext *s) AV_WL16(extradata, 0x410); } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) { fourcc = AV_RL32(track->codec_priv.data); - } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) { + } else if (codec_id == AV_CODEC_ID_VP9) { /* we don't need any value stored in CodecPrivate. make sure that it's not exported as extradata. */ track->codec_priv.size = 0; + /* Assume BlockAddID 4 is ITU-T T.35 metadata if WebM */ + track->blockaddid_itu_t_t35 = matroska->is_webm; } else if (codec_id == AV_CODEC_ID_ARIB_CAPTION && track->codec_priv.size == 3) { int component_tag = track->codec_priv.data[0]; int data_component_id = AV_RB16(track->codec_priv.data + 1); @@ -3081,6 +3099,8 @@ static int matroska_read_header(AVFormatContext *s) return AVERROR_INVALIDDATA; } } + matroska->is_webm = !strcmp(ebml.doctype, "webm"); + ebml_free(ebml_syntax, &ebml); matroska->pkt = si->parse_pkt; @@ -3615,12 +3635,54 @@ static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, } static int matroska_parse_block_additional(MatroskaDemuxContext *matroska, - AVPacket *pkt, + MatroskaTrack *track, AVPacket *pkt, const uint8_t *data, int size, uint64_t id) { - uint8_t *side_data = av_packet_new_side_data(pkt, - AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, - size + 8); + uint8_t *side_data; + int res; + + switch (id) { + case 4: { + int country_code, provider_code; + int provider_oriented_code, application_identifier; + size_t hdrplus_size; + AVDynamicHDRPlus *hdrplus; + + if (!track->blockaddid_itu_t_t35) + break; //ignore + + /* ITU-T T.35 metadata */ + country_code = bytestream_get_byte(&data); + provider_code = bytestream_get_be16(&data); + + if (country_code != 0xB5 || provider_code != 0x3C) + break; // ignore + + provider_oriented_code = bytestream_get_be16(&data); + application_identifier = bytestream_get_byte(&data); + + if (provider_oriented_code != 1 || application_identifier != 4) + break; // ignore + + hdrplus = av_dynamic_hdr_plus_alloc(&hdrplus_size); + if (!hdrplus) + return AVERROR(ENOMEM); + + if ((res = av_dynamic_hdr_plus_from_t35(hdrplus, data, size)) < 0 || + (res = av_packet_add_side_data(pkt, AV_PKT_DATA_DYNAMIC_HDR10_PLUS, + (uint8_t *)hdrplus, hdrplus_size)) < 0) { + av_free(hdrplus); + return res; + } + + return 0; + } + default: + break; + } + + side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, + size + 8); if (!side_data) return AVERROR(ENOMEM); @@ -3692,7 +3754,7 @@ static int matroska_parse_frame(MatroskaDemuxContext *matroska, if (!more->additional.size) continue; - res = matroska_parse_block_additional(matroska, pkt, more->additional.data, + res = matroska_parse_block_additional(matroska, track, pkt, more->additional.data, more->additional.size, more->additional_id); if (res < 0) { av_packet_unref(pkt);