From patchwork Thu Sep 23 00:46:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30462 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1087742iob; Wed, 22 Sep 2021 17:46:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzLmW2EVDJMFqUFtPdsERG1LIYSxmwMoiT2Vygl38tGG5L48FhS4ujfFLfP1fyDd6iBOLh/ X-Received: by 2002:a17:907:9908:: with SMTP id ka8mr2323257ejc.164.1632358010262; Wed, 22 Sep 2021 17:46:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632358010; cv=none; d=google.com; s=arc-20160816; b=TRIwdLuw0DXL4+wn0tscuSjA6Ed0I00LS15EQEAtlzVEZ5W2bowt9EcixMJGLhBeEe d/VXKmCJEfVtsXgmcYU7cSp9AkUTrHn9EeOKY7enoJRumr8+7bgGnNfLofwz9QZg2JZH iUTeJqxUEPVTDIm3lRkinW8u/NetWmO+TC0GuMXCJ6JF3R7dMExw9RAqC/7xPn2Ccgp4 B7MWG39gPX+yqvirU30MB5c2jHkGKPeAs7kDUY5Vl0UMyiPlsZVR2sLa9peu5YJuQOg+ IbiPRDolSaQ1z3CfKtk7fkRCRQuqfGDVBccm6U3zoubh/0BkwGF+O3yl44H/4beU/NJI wojw== 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=vrIu5uzSAckegi4mbDia4Za6XtsLkfrx7PtP0IvDHFk=; b=ksAlTShwuWxVV9q+LuNWkHr2O27CfVUf+OGfnmLn2HsiajoARZsylPbxcMJyJutY2G BewTJKxId4xAnIWRKL+ROtNI7GwFX0y6FaTwQu+YIwiNSR0hIAIjvIAJb4J6LRiAYYuw 1P9vocIrTn0eDzbzbkF6v/wkZlyH2lvBEws+TXK7VbQXeeEpSAgCmL/gMccA10yBKnyE NunEJwYtHGbIbICBy0QPMBqoe3hO5g0IglYfYdI+XjjbETqnOvc+xEJB4htB/0o7vW3M wu+qzBIfHJwQDYbIIb44P9SsoESx1Dt+C9wHXQIcW0pmaU/InaUNCKiArcwoXU2TcQPx JTfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=H0N0hAdm; 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 s30si4556644ejm.715.2021.09.22.17.46.49; Wed, 22 Sep 2021 17:46:50 -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=H0N0hAdm; 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 AD9AF68AA90; Thu, 23 Sep 2021 03:46:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f48.google.com (mail-qv1-f48.google.com [209.85.219.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5D2468A4E5 for ; Thu, 23 Sep 2021 03:46:28 +0300 (EEST) Received: by mail-qv1-f48.google.com with SMTP id a14so3196272qvb.6 for ; Wed, 22 Sep 2021 17:46:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=npGaD9OUSqf0qT84nrJ464NiGrmjMjzyKnACW6DsaO0=; b=H0N0hAdmWgRYAUg6j9bDSISQsE4w4LLxttLQtGH0/OKkmWCLx4A2A/7cHJNYa9qXMe pDTXxKFbop08sxHuItePF8IYbGflvjKtPut3ZcVPBChqMERqr1M21SIPT80DJz1kF7rZ r4sQCvqVS/prkdC7NDWW4J6vwqGtwfep8t59+p3S0p26ovlZAWGnXOHzRTOuwwddKrj3 GvccoHtk4iJOYQzpxizHUF3SJ7IooRc4wM/NzRjDCdjBD+5muzfd2Qyq5wBDx1MK/W75 Pru1QJVXIQoazxMNUrE9Ov6TrGQKvm1hPjQhpjF/rkKjUhU0jSSieS/R57yzUiJxocSC Zvww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=npGaD9OUSqf0qT84nrJ464NiGrmjMjzyKnACW6DsaO0=; b=wAXU9P/7dHJ40HqOedn7sHGg2ibVuZ/IB9e0jqmDoInZV+Lk+PCt6LwgQai6mv7bwQ dT+sA4qdWuw2CbR3PppXEgXytSHx5vLWvoBuh+2HmTO2C00EPMTs76U511LmSMmL4fL9 a3Lo00A5sldpzc0ZpobvLHQAL1Jgyj1jfFfDxKQvA3ommJPt/ORiMeEyqfZDev0zY27L 89Ffdqjwbbbfvy27m9BbnqeB+o7YMsVrcZ8y4LyEyJ1c5yV7A/aePqqIjd7Ke/AG00kf Fy/z+IAhlu6SqPqbMZ252pZvlWcU/dPAqVitLWxYRuIe1a5TkZUFJ3FOLwFMl85UI01Z LL1A== X-Gm-Message-State: AOAM531NtbE5JkHr79Tg64/n3+wWO7O3+ebkdwpbwSRUWa+evWr8oLhT 8vYxIJK4ErIvS05HgY5QXPdgMW+aR8KzNQ== X-Received: by 2002:a0c:ef04:: with SMTP id t4mr2020619qvr.61.1632357987555; Wed, 22 Sep 2021 17:46:27 -0700 (PDT) Received: from nark.. (modemcable017.92-130-66.mc.videotron.ca. [66.130.92.17]) by smtp.gmail.com with ESMTPSA id j26sm2511618qtr.53.2021.09.22.17.46.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Sep 2021 17:46:27 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Sep 2021 20:46:21 -0400 Message-Id: <20210923004624.476145-2-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210923004624.476145-1-tcChlisop0@gmail.com> References: <20210923004624.476145-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/5] avformat/matroskadec: Parse dvcC/dvvC block additional mapping 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: YZaikEOBzvlL The parsing was implemented in isom, for the unification of the mov/mpegts DOVI parsing into one function, in a later patch. Most of the implementation was done by Plex developers. Signed-off-by: quietvoid --- libavformat/isom.c | 51 +++++++++++++++++++++++++++++++++++++++ libavformat/isom.h | 5 ++++ libavformat/matroskadec.c | 13 ++++++++++ 3 files changed, 69 insertions(+) diff --git a/libavformat/isom.c b/libavformat/isom.c index 4df5440023..80a8f4d7b0 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -430,3 +430,54 @@ void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout) } avio_wb32(pb, 0); // mNumberChannelDescriptions } + +int ff_mov_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, GetBitContext *gb) +{ + AVDOVIDecoderConfigurationRecord *dovi; + size_t dovi_size; + int ret; + + if (gb->size_in_bits < 32) + return AVERROR_INVALIDDATA; + + dovi = av_dovi_alloc(&dovi_size); + if (!dovi) + return AVERROR(ENOMEM); + + dovi->dv_version_major = get_bits(gb, 8); + dovi->dv_version_minor = get_bits(gb, 8); + + dovi->dv_profile = get_bits(gb, 7); + dovi->dv_level = get_bits(gb, 6); + dovi->rpu_present_flag = get_bits1(gb); + dovi->el_present_flag = get_bits1(gb); + dovi->bl_present_flag = get_bits1(gb); + + // Has enough remaining data + if (gb->size_in_bits >= 36) { + dovi->dv_bl_signal_compatibility_id = get_bits(gb, 4); + } else { + // 0 stands for None + // Dolby Vision V1.2.93 profiles and levels + dovi->dv_bl_signal_compatibility_id = 0; + } + + ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, + (uint8_t *)dovi, dovi_size); + if (ret < 0) { + av_free(dovi); + return ret; + } + + av_log(s, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, " + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", + dovi->dv_version_major, dovi->dv_version_minor, + dovi->dv_profile, dovi->dv_level, + dovi->rpu_present_flag, + dovi->el_present_flag, + dovi->bl_present_flag, + dovi->dv_bl_signal_compatibility_id + ); + + return 0; +} diff --git a/libavformat/isom.h b/libavformat/isom.h index 34a58c79b7..44bd839852 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -27,6 +27,9 @@ #include #include +#include "libavcodec/get_bits.h" + +#include "libavutil/dovi_meta.h" #include "libavutil/encryption_info.h" #include "libavutil/mastering_display_metadata.h" #include "libavutil/spherical.h" @@ -390,4 +393,6 @@ static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags) #define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p') #define MOV_MP4_TTML_TAG MKTAG('s', 't', 'p', 'p') +int ff_mov_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, GetBitContext *gb); + #endif /* AVFORMAT_ISOM_H */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 8ae553953d..4633067d48 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2323,6 +2323,14 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, return 0; } +static int mkv_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const MatroskaTrack *track, + EbmlBin *bin) +{ + GetBitContext gb; + init_get_bits8(&gb, bin->data, bin->size); + return ff_mov_parse_dvcc_dvvc(s, st, &gb); +} + static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, const MatroskaTrack *track) { int i, ret; @@ -2333,6 +2341,11 @@ static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, c MatroskaBlockAdditionMapping *mapping = &mappings[i]; switch (mapping->type) { + case MKBETAG('d','v','c','C'): + case MKBETAG('d','v','v','C'): + if ((ret = mkv_parse_dvcc_dvvc(s, st, track, &mapping->extradata)) < 0) + return ret; + break; default: av_log(s, AV_LOG_DEBUG, "Unknown block additional mapping type %i, value %i, name \"%s\"\n",