From patchwork Tue Sep 28 21:20:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30647 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp5615615iob; Tue, 28 Sep 2021 14:21:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxGrGbsmUTLre7eAy320VynajthtWJ/pG3lH3MobwhG7Zq/+1DwZxya3QB7lq7q79HLAODO X-Received: by 2002:a17:906:a246:: with SMTP id bi6mr9187720ejb.389.1632864108961; Tue, 28 Sep 2021 14:21:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632864108; cv=none; d=google.com; s=arc-20160816; b=SF1udz5I2MhRp+XecumtameZ2NKKx+JIQ2K3NbUqOyOShFbMgW7zudls0gDbxrO9B1 IcvFROsdhMEtZ//mHnzC4PLx9FT46duQFXof0Va4otSVFIUPNtBzinqAQSg4CofaGGMQ RyzqjT+uYzG4sKbUzAtwcbcVX6P7wq0lP91D+LVkdphk1QQh0mOL+l55eGlQONCAEK8Z QPZFrrfhTm7OwZ8mMXvEmT/wnM0RZo6evPAYk100jmzimcjcimdIPizbxtVAlCoEZ3DJ 0NED+nXP5/RsOfFxKY1Y0nQ/ZXOkHpCB/3g/DJ2gyubNZQCavPmXwoKqiMe0z4V20GdZ BtFA== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=P18sEIw6uTEUIQPqDZB61uwSaQStolqBjsBCBre9kTY=; b=nljw9fY6/ldW9HUlB34TCovzBdfDjVpN6Qn6fgnaodq/JnoQ1q/B8sSHBuBBtTuUxl YTt9TeJeGt8bWVkNlKwX7lWrhEZAiH2+BKMqj0W3T1I9JZoRRyfhMnRlwr78NugOk+mS gZiNfIT4HopwIV2hCRL/vZwCjxDBTBkjFYBpvRph+vD6UsMLe0QaVYlbZVL5bsSVGqMg QKxiMSpq50Uag6BfmehcdimyVSLWzrN0lXNNe0yJnBNoukkClwcTUng72tj9ecedpQ8B mtOzrgvep3nonXrxaNji7asG3ob7NI3zGy6MiN++9Uu2BUd6+2Dw6NLImxao+UMdzLs1 Z2dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=eE2KaqY8; 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 fx1si253632ejb.310.2021.09.28.14.21.25; Tue, 28 Sep 2021 14:21: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=@gmail.com header.s=20210112 header.b=eE2KaqY8; 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 2D88268A6C5; Wed, 29 Sep 2021 00:21:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1B2E368024D for ; Wed, 29 Sep 2021 00:21:15 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id j27so166605wms.0 for ; Tue, 28 Sep 2021 14:21:15 -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:mime-version :content-transfer-encoding; bh=p33KIbxEH5RKS0gH7622Q+rTpXP7BNkxPQD3PpMI3uo=; b=eE2KaqY8ksBJX2dZ54/b8DC2coO+tWoGZd4DLh0+uxjGjM1/2jVs6WsoOnkgAm4KvY +BWlgajBROiJ4R9KJlRwUCY1klMJia0u2HfmJpzdMlX+/poL02e864KWmLHhjWnnERoR NOADu8KosobLVWVfAyhuyEllOsSfTPZfZF8wFZhpkaqs8BnRy4aamFJl/Ul3qVlemGWE rqmtvGYgKkvkT2QJvFLKPHfaUY7eTYcAC41gbzvjUCdWTloiVsDwhZpzr/Rf9vrkXuJJ Z32Hwk1mbvwCFS/GGhnCPZteG+EUocxblvYozh4AbM4+n2eaS7rK07zCu+PeCrRD131o Ztug== 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:mime-version :content-transfer-encoding; bh=p33KIbxEH5RKS0gH7622Q+rTpXP7BNkxPQD3PpMI3uo=; b=ggLfdIMS6a3SKXRKBRNx/qDehCs/xS5E+39DMjGP5lzbmRPYaUXB6cUI6cIddWfi7v y4JjWLxwspAezW9p55ZIMD4ZqYDNt4n8K+s4WSqVa3SV6jfgdarUD/ubC25CqdCbsRzH pV0jGlvaAp6/pJHWPKXdeCPz+kfITAl2Lqr6odXO3PqKKkR1gZXWGKhihZ+MRCo4FK5Y 2rNmlYw2UBBiBx+AV0Y3+9SBdjFGh+D8+aygfadIrQ3A7ZweAUHZIjs5FofkaimKZGET rC9fYolvA5r0UPt9JN7alVZWFq4pm1+/50ukCwxTaxy8mnXFb/g+wJh+FGSwrelqae0I TIAg== X-Gm-Message-State: AOAM530X9ohQhRGTzTZUDss7oLQlfKFpvhZw5LGNWWn1/64vXWqCgPgL 7k0K1zooJc1adpDaO4wicSuToVUHR1E9Uw== X-Received: by 2002:a1c:4407:: with SMTP id r7mr6932195wma.8.1632864074288; Tue, 28 Sep 2021 14:21:14 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id d24sm148419wmb.35.2021.09.28.14.21.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Sep 2021 14:21:14 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 23:20:53 +0200 Message-Id: <20210928212056.328511-1-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 1/4] avformat/dovi_isom: Implement Dolby Vision configuration parsing/writing 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: 7u0HiAxtbc45 According to specification "Dolby Vision Stream Within the ISO Base Media File Format Version 2.2" This only adds support for the "Dolby Vision configuration box". Other configuration boxes, such as "Dolby Vision enhancement layer configuration box" are not supported. The new functions will be used to implement parsing/writing the DOVI config for Matroska, as well as to refactor MOV/MPEG TS to parse the DOVI box/descriptor using dovi_isom. Signed-off-by: quietvoid --- libavformat/dovi_isom.c | 133 ++++++++++++++++++++++++++++++++++++++++ libavformat/dovi_isom.h | 36 +++++++++++ 2 files changed, 169 insertions(+) create mode 100644 libavformat/dovi_isom.c create mode 100644 libavformat/dovi_isom.h diff --git a/libavformat/dovi_isom.c b/libavformat/dovi_isom.c new file mode 100644 index 0000000000..4f204d3dec --- /dev/null +++ b/libavformat/dovi_isom.c @@ -0,0 +1,133 @@ +/* + * DOVI ISO Media common code + * Copyright (c) 2021 quietvoid + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/dovi_meta.h" + +#include "libavcodec/put_bits.h" + +#include "avformat.h" +#include "dovi_isom.h" + +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size, + int has_dependency_pid) +{ + uint32_t buf; + AVDOVIDecoderConfigurationRecord *dovi; + size_t dovi_size; + int ret; + int min_compat_size; + + if (size > (1 << 30) || size < 4) + return AVERROR_INVALIDDATA; + + dovi = av_dovi_alloc(&dovi_size); + if (!dovi) + return AVERROR(ENOMEM); + + dovi->dv_version_major = *buf_ptr++; // 8 bits + dovi->dv_version_minor = *buf_ptr++; // 8 bits + + buf = *buf_ptr++ << 8; + buf |= *buf_ptr++; + + dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits + dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits + dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit + dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit + dovi->bl_present_flag = buf & 0x01; // 1 bit + + // For MPEG2 TS + if (has_dependency_pid && !dovi->bl_present_flag) { + // dependency_pid 13 bits + reserved 3 bits + buf = *buf_ptr++ << 8; + buf |= *buf_ptr++; + + min_compat_size = 7; + } else { + min_compat_size = 5; + } + + // Has enough remaining data + if (size >= min_compat_size) { + dovi->dv_bl_signal_compatibility_id = ((*buf_ptr++) >> 4) & 0x0f; // 4 bits + } 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; +} + +int ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], uint64_t size, + AVDOVIDecoderConfigurationRecord *dovi) +{ + PutBitContext pb; + init_put_bits(&pb, out, size); + + if (size < ISOM_DVCC_DVVC_SIZE) + return AVERROR(EINVAL); + + put_bits(&pb, 8, dovi->dv_version_major); + put_bits(&pb, 8, dovi->dv_version_minor); + put_bits(&pb, 7, dovi->dv_profile); + put_bits(&pb, 6, dovi->dv_level); + put_bits(&pb, 1, dovi->rpu_present_flag); + put_bits(&pb, 1, dovi->el_present_flag); + put_bits(&pb, 1, dovi->bl_present_flag); + put_bits(&pb, 4, dovi->dv_bl_signal_compatibility_id); + + put_bits(&pb, 28, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + put_bits32(&pb, 0); /* reserved */ + flush_put_bits(&pb); + + av_log(s, AV_LOG_DEBUG, "DOVI in %s box, version: %d.%d, profile: %d, level: %d, " + "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", + dovi->dv_profile > 7 ? "dvvC" : "dvcC", + 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 put_bytes_output(&pb); +} diff --git a/libavformat/dovi_isom.h b/libavformat/dovi_isom.h new file mode 100644 index 0000000000..e1c6d6d63a --- /dev/null +++ b/libavformat/dovi_isom.h @@ -0,0 +1,36 @@ +/* + * DOVI ISO Media common code + * Copyright (c) 2021 quietvoid + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVFORMAT_DOVI_ISOM_H +#define AVFORMAT_DOVI_ISOM_H + +#include "libavutil/dovi_meta.h" + +#include "avformat.h" + +#define ISOM_DVCC_DVVC_SIZE 24 + +int ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size, + int has_dependency_pid); +int ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], uint64_t size, + AVDOVIDecoderConfigurationRecord *dovi); + +#endif /* AVFORMAT_DOVI_ISOM_H */ From patchwork Tue Sep 28 21:20:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30649 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp5615471iob; Tue, 28 Sep 2021 14:21:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzw12Z+5+EoMjTeaY8Oiq9oxvl1s+IUmfU9WS8AgRsrocMcfgIG8Cb16gSR8ukdhzKqgHTe X-Received: by 2002:aa7:c2d3:: with SMTP id m19mr10407246edp.267.1632864097409; Tue, 28 Sep 2021 14:21:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632864097; cv=none; d=google.com; s=arc-20160816; b=gQ6pKVpJRQ6cctXhSFxzU4s3fxm5E5DFxKnozp9KeNq+4o8S/0mfHZ9xTxY0g174jG LGwEJdqPcczYX/g6OAejH4yn6yCn/9HIrjuPkeESTDbkWK+WLDXMgusOcXlpJ8aQ4glo MUj/dWg8oJGnawOuRmIFn5Z0m732RDrUKAZWKJqgaGqvgCDGzofzTOqOdsbCFgIRCrjS o6A5CxCIwywVAC8/hyaUQ0ms7JWhbTkIruqveT/h+OhCkalQKw6k5A3XEYNAbr/pNUNd ZsNqQ5SofcQT0MlDPr5QFkT5amj+HDznLVhmopn/63ztJgroEJfzAmARnYIO1nDXQUFx 21Dw== 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=RG6EBIhX88rXUiGj7RLyyE7s9J7BFEldBfaLkzK9s+o=; b=DNyoRzYdBOK0pxA/9BIzMYoJlxP6YWetyTleHdmt8ybajeoYxYntWFBskQBi9gV6NM 0+PbcO+kI6Ous1tPA5b8Dy90EEk+Yv252DVApyIC3QFK0Fm4YuzJvTqaY8hyOBrangfw 1SgYOwIDHN0rvf2Upwv+v1ckC45sO4ipfbHP44ZZabdaCzR107L8/jXIZMMUIHH4ryO7 GqWNpXGnXfVUwe0DynrwiOcTZR2sVUvh+d4ZNWBWGyF7e7I4s1MZnJU1jn05KlUFyNEj hwnMXwhnhSeNp5sXAjsFMOctC69nc4HlGkOY07U4QYwc4RQvafiJvBHOZHV+OVpB9CSQ jbVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=UtTGP5ox; 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 b2si305909edm.471.2021.09.28.14.21.35; Tue, 28 Sep 2021 14:21:37 -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=UtTGP5ox; 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 16B8668A6F6; Wed, 29 Sep 2021 00:21:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CE79E68024D for ; Wed, 29 Sep 2021 00:21:15 +0300 (EEST) Received: by mail-wr1-f48.google.com with SMTP id v17so644441wrv.9 for ; Tue, 28 Sep 2021 14:21:15 -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=soTBmJLuaN6N+7ajkL0Yx4Nw1Ylf/fXsTKrU2uzJU30=; b=UtTGP5ox+CEECVHtCkRIvqojNl7i4xmnjSco53FhD3hN9SM+SR22Wnyhk9bsJamNkj tcH47UsI/kSFiYxdS4puq1GMjVx5mjDnH1wtDLb7h+gW48eEHCcKvfjyzyZI/y1pKwSw O45ZPhi7Ni5phcEq5F4/5mGhVOe3/eZw3ZrG3d20xw+U7E9fGMstLxTbk14yLutwPZkS cNCz+qWIBgoVYFhNb2pRcmaRMadN6QP3lw3RYQUr2WDNRfGzt5GR9hMaYKNMhzQXFCCq uwGNGTfCyogyv5VvOiUhVgDlzMnrffwBJnaTgwdKnXgnZxVfsS72ovIHdNVV7GdBb9l6 2q9Q== 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=soTBmJLuaN6N+7ajkL0Yx4Nw1Ylf/fXsTKrU2uzJU30=; b=W+izdq2lJg2xCXKJY26Kpfb41S/oG/p0FCyao7bi6yhA13eHJGtxaJMkiWAqGToQdQ OlrCHyQdUz8lStwYcPo7RqhUDH24Ki6DO8PpcFEQfhE7Tp54j8wzKZmCpOyh9RsEjiIJ gQ36YV8HvCsz+6P1PbjdX/rYNBEb8K5Q70a4RO2HpLO9pgNjbepKm013Os8bB+mSyFHS 9ujlzurvSXhtjUPWt8nWPRsEdRqYEuwQAr7JqcLTL7I7bM6asfITEqDmQGMX1cKEY0h0 ILSffV0ZFs7dZ3PTBiIhUFFDBxMoZ+w1IVcrC2uwRr9DXAlekRvZhU/onzF3gUDQMv4W 7Ipw== X-Gm-Message-State: AOAM532HQ577VgoHf/DczJfsuS1xyGZzPHamscybODorCT/TLTMOp+nn oCDgmgzozFmZYImUdNaubKm1NXEiSP6Crw== X-Received: by 2002:adf:d4cb:: with SMTP id w11mr2680734wrk.125.1632864074959; Tue, 28 Sep 2021 14:21:14 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id d24sm148419wmb.35.2021.09.28.14.21.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Sep 2021 14:21:14 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 23:20:54 +0200 Message-Id: <20210928212056.328511-2-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210928212056.328511-1-tcChlisop0@gmail.com> References: <20210928212056.328511-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 2/4] avformat/matroska{dec, enc}: Parse BlockAdditionMapping elements 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: aL/jTLCkKNRk Adds handling of dvcC/dvvC block addition mappings. The parsing creates AVDOVIDecoderConfigurationRecord side data. The configuration block is written when muxing into Matroska, if DOVI side data is present for the track. In version 2.2 of the Dolby ISOM specification, there is also dvwC but it is not in the Matroska spec. Most of the Matroska element parsing was implemented by Plex developers. Signed-off-by: quietvoid --- libavformat/Makefile | 4 +-- libavformat/matroska.h | 9 ++++++ libavformat/matroskadec.c | 58 +++++++++++++++++++++++++++++++++++++-- libavformat/matroskaenc.c | 45 ++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 4 deletions(-) diff --git a/libavformat/Makefile b/libavformat/Makefile index c45caa3eed..680030014d 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -313,11 +313,11 @@ OBJS-$(CONFIG_M4V_MUXER) += rawenc.o OBJS-$(CONFIG_MATROSKA_DEMUXER) += matroskadec.o matroska.o \ flac_picture.o isom_tags.o rmsipr.o \ oggparsevorbis.o vorbiscomment.o \ - qtpalette.o replaygain.o + qtpalette.o replaygain.o dovi_isom.o OBJS-$(CONFIG_MATROSKA_MUXER) += matroskaenc.o matroska.o \ av1.o avc.o hevc.o isom_tags.o \ flacenc_header.o avlanguage.o \ - vorbiscomment.o wv.o + vorbiscomment.o wv.o dovi_isom.o OBJS-$(CONFIG_MCA_DEMUXER) += mca.o OBJS-$(CONFIG_MCC_DEMUXER) += mccdec.o subtitles.o OBJS-$(CONFIG_MD5_MUXER) += hashenc.o diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 2d04a6838b..16491aae22 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -111,6 +111,7 @@ #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240 #define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F #define MATROSKA_ID_TRACKMAXBLKADDID 0x55EE +#define MATROSKA_ID_TRACKBLKADDMAPPING 0x41E4 /* IDs in the trackvideo master */ #define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3 @@ -189,6 +190,12 @@ #define MATROSKA_ID_ENCODINGSIGKEYID 0x47E4 #define MATROSKA_ID_ENCODINGSIGNATURE 0x47E3 +/* IDs in the block addition mapping master */ +#define MATROSKA_ID_BLKADDIDVALUE 0x41F0 +#define MATROSKA_ID_BLKADDIDNAME 0x41A4 +#define MATROSKA_ID_BLKADDIDTYPE 0x41E7 +#define MATROSKA_ID_BLKADDIDEXTRADATA 0x41ED + /* ID in the cues master */ #define MATROSKA_ID_POINTENTRY 0xBB @@ -385,4 +392,6 @@ extern const char * const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_P int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode); +#define DVCC_DVVC_BLOCK_TYPE_NAME "Dolby Vision configuration" + #endif /* AVFORMAT_MATROSKA_H */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 500c83ac3a..96818bf295 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -53,6 +53,7 @@ #include "avformat.h" #include "avio_internal.h" +#include "dovi_isom.h" #include "internal.h" #include "isom.h" #include "matroska.h" @@ -239,6 +240,13 @@ typedef struct MatroskaTrackOperation { EbmlList combine_planes; } MatroskaTrackOperation; +typedef struct MatroskaBlockAdditionMapping { + uint64_t value; + char *name; + uint64_t type; + EbmlBin extradata; +} MatroskaBlockAdditionMapping; + typedef struct MatroskaTrack { uint64_t num; uint64_t uid; @@ -269,6 +277,7 @@ typedef struct MatroskaTrack { int ms_compat; int needs_decoding; uint64_t max_block_additional_id; + EbmlList block_addition_mappings; uint32_t palette[AVPALETTE_COUNT]; int has_palette; @@ -419,8 +428,8 @@ typedef struct MatroskaDemuxContext { // incomplete type (6.7.2 in C90, 6.9.2 in C99). // Removing the sizes breaks MSVC. static EbmlSyntax ebml_syntax[3], matroska_segment[9], matroska_track_video_color[15], matroska_track_video[19], - matroska_track[32], matroska_track_encoding[6], matroska_track_encodings[2], - matroska_track_combine_planes[2], matroska_track_operation[2], matroska_tracks[2], + matroska_track[33], matroska_track_encoding[6], matroska_track_encodings[2], + matroska_track_combine_planes[2], matroska_track_operation[2], matroska_block_addition_mapping[5], matroska_tracks[2], matroska_attachments[2], matroska_chapter_entry[9], matroska_chapter[6], matroska_chapters[2], matroska_index_entry[3], matroska_index[2], matroska_tag[3], matroska_tags[2], matroska_seekhead[2], matroska_blockadditions[2], matroska_blockgroup[8], matroska_cluster_parsing[8]; @@ -570,6 +579,14 @@ static EbmlSyntax matroska_track_operation[] = { CHILD_OF(matroska_track) }; +static EbmlSyntax matroska_block_addition_mapping[] = { + { MATROSKA_ID_BLKADDIDVALUE, EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, value) }, + { MATROSKA_ID_BLKADDIDNAME, EBML_STR, 0, 0, offsetof(MatroskaBlockAdditionMapping, name) }, + { MATROSKA_ID_BLKADDIDTYPE, EBML_UINT, 0, 0, offsetof(MatroskaBlockAdditionMapping, type) }, + { MATROSKA_ID_BLKADDIDEXTRADATA, EBML_BIN, 0, 0, offsetof(MatroskaBlockAdditionMapping, extradata) }, + CHILD_OF(matroska_track) +}; + static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKNUMBER, EBML_UINT, 0, 0, offsetof(MatroskaTrack, num) }, { MATROSKA_ID_TRACKNAME, EBML_UTF8, 0, 0, offsetof(MatroskaTrack, name) }, @@ -593,6 +610,7 @@ static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKOPERATION, EBML_NEST, 0, 0, offsetof(MatroskaTrack, operation), { .n = matroska_track_operation } }, { MATROSKA_ID_TRACKCONTENTENCODINGS, EBML_NEST, 0, 0, 0, { .n = matroska_track_encodings } }, { MATROSKA_ID_TRACKMAXBLKADDID, EBML_UINT, 0, 0, offsetof(MatroskaTrack, max_block_additional_id), { .u = 0 } }, + { MATROSKA_ID_TRACKBLKADDMAPPING, EBML_NEST, 0, sizeof(MatroskaBlockAdditionMapping), offsetof(MatroskaTrack, block_addition_mappings), { .n = matroska_block_addition_mapping } }, { MATROSKA_ID_SEEKPREROLL, EBML_UINT, 0, 0, offsetof(MatroskaTrack, seek_preroll), { .u = 0 } }, { MATROSKA_ID_TRACKFLAGENABLED, EBML_NONE }, { MATROSKA_ID_TRACKFLAGLACING, EBML_NONE }, @@ -2306,6 +2324,38 @@ 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) +{ + return ff_isom_parse_dvcc_dvvc(s, st, bin->data, bin->size, 0); +} + +static int mkv_parse_block_addition_mappings(AVFormatContext *s, AVStream *st, const MatroskaTrack *track) +{ + const EbmlList *mappings_list = &track->block_addition_mappings; + MatroskaBlockAdditionMapping *mappings = mappings_list->elem; + int ret; + + for (int i = 0; i < mappings_list->nb_elem; i++) { + 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 0x%"PRIx64", value %"PRIu64", name \"%s\"\n", + mapping->type, mapping->value, mapping->name ? mapping->name : ""); + } + } + + return 0; +} + static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID *codec_id) { const AVCodecTag *codec_tags; @@ -2893,6 +2943,10 @@ static int matroska_parse_tracks(AVFormatContext *s) if (track->flag_textdescriptions) st->disposition |= AV_DISPOSITION_DESCRIPTIONS; } + + ret = mkv_parse_block_addition_mappings(s, st, track); + if (ret < 0) + return ret; } return 0; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index f17665b0c1..ed6cc36727 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -27,6 +27,7 @@ #include "avformat.h" #include "avio_internal.h" #include "avlanguage.h" +#include "dovi_isom.h" #include "flacenc.h" #include "internal.h" #include "isom.h" @@ -1113,6 +1114,44 @@ static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, return 0; } +static int mkv_write_dovi(AVFormatContext *s, AVIOContext *pb, AVStream *st) +{ + int ret; + AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *) + av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL); + + if (dovi) { + ebml_master mapping; + uint8_t buf[ISOM_DVCC_DVVC_SIZE]; + uint32_t type; + + uint64_t size; + uint64_t expected_size = (2 + 1 + (sizeof(DVCC_DVVC_BLOCK_TYPE_NAME) - 1)) + + (2 + 1 + 4) + (2 + 1 + ISOM_DVCC_DVVC_SIZE); + + if (dovi->dv_profile > 7) { + type = MKBETAG('d', 'v', 'v', 'C'); + } else { + type = MKBETAG('d', 'v', 'c', 'C'); + } + + if ((ret = ff_isom_put_dvcc_dvvc(s, buf, sizeof(buf), dovi)) < 0) + return ret; + + size = ret; + + mapping = start_ebml_master(pb, MATROSKA_ID_TRACKBLKADDMAPPING, expected_size); + + put_ebml_string(pb, MATROSKA_ID_BLKADDIDNAME, DVCC_DVVC_BLOCK_TYPE_NAME); + put_ebml_uint(pb, MATROSKA_ID_BLKADDIDTYPE, type); + put_ebml_binary(pb, MATROSKA_ID_BLKADDIDEXTRADATA, buf, size); + + end_ebml_master(pb, mapping); + } + + return 0; +} + static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, AVStream *st, mkv_track *track, AVIOContext *pb, int is_default) @@ -1312,6 +1351,12 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, mkv_write_video_projection(s, pb, st); end_ebml_master(pb, subinfo); + + if (mkv->mode != MODE_WEBM) { + if ((ret = mkv_write_dovi(s, pb, st)) < 0) + return ret; + } + break; case AVMEDIA_TYPE_AUDIO: From patchwork Tue Sep 28 21:20:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30646 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp5615909iob; Tue, 28 Sep 2021 14:22:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz2xm/7jxvWqpa/KnwC6jOH4OULKYoYfvckkNYWSt+ufJiTsMqzWU9KhjXjeKkO8d0CcuwZ X-Received: by 2002:a17:906:401:: with SMTP id d1mr9633885eja.242.1632864128087; Tue, 28 Sep 2021 14:22:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632864128; cv=none; d=google.com; s=arc-20160816; b=SdHOmqA+vsCPlN/f3MkWn+KQoWp+ub+HU6xLxtrCetaKSA6/zYpXolXeYwk41h3vYX oukmFPhMFp+CPZe9QMYDU/cflDmG3TZnssdW57itxmI2dOkJqrIvijshSpENrlqe7GqW IfTntj7bvk8EqitjhxZ6X0z28DL0T9gsX1lVt4CyehGxRHkWl21duoZgbwHkDRzNI+kR I9x2apiEyOHSaQWQA5d0r9ePmNVA8RzdVTkWk7drQfmY6RWiUJ7GhPDX5ljBy2O6nqMH AI2T2xTytjAun2J1tpgNW6U9fBXcIrydvWCFwUbyvCTE1p4X9nJNm4/B4h7YMqTV8WLU YL/w== 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=1Do5uQpRKW99dvfI7+x9+XekIqB8HNN0Bt7bGt7r2Xw=; b=GnBs9J8YthCF++x4tN1IV3p7YN+MhML/zPlx9IJM90ks1/bCt1DVMvl9bCApMrZBC3 2FtolwEhyZ8rR57ibIH/B/3xz3aXrRog1u1CeiT2UunhFtBUym+eg0Ad58AsuqbhZiTW wWeXCNKOvI/8GZ041cqgWBD+0g9sqnWgfFy4HS+6WPRUmfJOfKVttMNyqtKIhZSjKh0H NZB+TdIEQj0lhXrCDMLPGUpXmhw+2mUHIvRLvMWWeFjFgHnoICY23TM097B6zkbbHM+V DIhsVEPjcj3pn1xImE/Ao2d0F/psrR+1eS9BDhIF4ePxK+JmnCuoiIwoIfC1ftj7naf3 OLlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b="exgOEkY/"; 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 q11si213856edj.483.2021.09.28.14.21.45; Tue, 28 Sep 2021 14:22:08 -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="exgOEkY/"; 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 38AC868A6EE; Wed, 29 Sep 2021 00:21:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 46D9868A69A for ; Wed, 29 Sep 2021 00:21:16 +0300 (EEST) Received: by mail-wr1-f52.google.com with SMTP id w29so651751wra.8 for ; Tue, 28 Sep 2021 14:21:16 -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=GxQ+gVjVoulo9VbK5nDWYdgZxZTQgQqK3GrUlFbAWps=; b=exgOEkY/X/00hGVvt+H0U1XMGcHzDV/7M7mG2l4ZwTecwmSpU6Fe3izMBQRCF9AGTm oWs1rMgIbw2lA5i4KIGahPo8bSUp6FPyLpLUm3UF0zI1x/kEhm17hZlwkc6yS+ufydPM IstWWk2ZAXIMyeIc6RiSZQDJdV5vWL2heuR/3SpVH2Qx4sj3JiHYMVcoiqOe/mVr3EaS 0K7NjLC+4Ldi4bbDO1OYzARH95zJFw87/pgsqTtpJGlItbOzya66d4YkYhUdINpDV4/N 3G9UKX4oFz3Q/xZSzCPYohR+6Og0Ng7b470EUlMHlF64ukfgaO7NXNa8qwK8/XDnNRJI meHQ== 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=GxQ+gVjVoulo9VbK5nDWYdgZxZTQgQqK3GrUlFbAWps=; b=H5xWyf+ThRaxTo/dhwQEDnp1d2Lj+YgGwuegP6MoftgERTOhEiOC5hp4nhtDfzF8IH QlyTSdltUnyz+x8j73+YaicJEwosWOknlRGCKt2DPiBq+bmn9Qhar7rfEnLU/nAlCzmn bZxffusIO2rkTZa0wF8Z9ZTz3vDUUOJIV4pNbAlmmnkbPyIVmMp0vXkPEMrOiKsYH1aH xb0bZZF9U15PIdTH+ulQOKIBie/scRIG1RCHUOefq3UikD/v2tJoGP2DbpZgfmWqxcQ7 4WEH+tfIaottZCvhSg8kZOa0iLxesSYp3N8jXoTUVB7cq5fO+ZnbgIlcKoPGVpHdxow+ hQRg== X-Gm-Message-State: AOAM530p+8V1Gn7TGN2jf9EKOzrrVnjwfg3KH0+dskhk23zcLkfprkvi GGACRlbS+3YZlrQiUDmc4g8Cp4hS5Ux8wQ== X-Received: by 2002:a5d:69cb:: with SMTP id s11mr2730069wrw.228.1632864075561; Tue, 28 Sep 2021 14:21:15 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id d24sm148419wmb.35.2021.09.28.14.21.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Sep 2021 14:21:15 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 23:20:55 +0200 Message-Id: <20210928212056.328511-3-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210928212056.328511-1-tcChlisop0@gmail.com> References: <20210928212056.328511-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 3/4] avformat/mov: Refactor DOVI box parsing to use ff_isom_parse_dvcc_dvvc 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: b9EW9WL2FQ24 Read at most 24 bytes, but in reality only 5 bytes are used for parsing. The rest of the bytes are reserved in the specification. Signed-off-by: quietvoid --- libavformat/mov.c | 50 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 41 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index d0b8b2595b..71294b5e19 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -54,6 +54,7 @@ #include "avformat.h" #include "internal.h" #include "avio_internal.h" +#include "dovi_isom.h" #include "riff.h" #include "isom.h" #include "libavcodec/get_bits.h" @@ -6799,58 +6800,25 @@ static int mov_read_dmlp(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; - uint32_t buf; - AVDOVIDecoderConfigurationRecord *dovi; - size_t dovi_size; + uint8_t buf[ISOM_DVCC_DVVC_SIZE + AV_INPUT_BUFFER_PADDING_SIZE]; int ret; + int64_t read_size = atom.size; if (c->fc->nb_streams < 1) return 0; st = c->fc->streams[c->fc->nb_streams-1]; - if ((uint64_t)atom.size > (1<<30) || atom.size < 4) - return AVERROR_INVALIDDATA; - - dovi = av_dovi_alloc(&dovi_size); - if (!dovi) - return AVERROR(ENOMEM); - - dovi->dv_version_major = avio_r8(pb); - dovi->dv_version_minor = avio_r8(pb); - - buf = avio_rb16(pb); - dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits - dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits - dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit - dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit - dovi->bl_present_flag = buf & 0x01; // 1 bit - if (atom.size >= 24) { // 4 + 4 + 4 * 4 - buf = avio_r8(pb); - dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits - } else { - // 0 stands for None - // Dolby Vision V1.2.93 profiles and levels - dovi->dv_bl_signal_compatibility_id = 0; + // At most 24 bytes + if (read_size > ISOM_DVCC_DVVC_SIZE) { + read_size = ISOM_DVCC_DVVC_SIZE; } - ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, - (uint8_t *)dovi, dovi_size); - if (ret < 0) { - av_free(dovi); + if ((ret = avio_read(pb, buf, read_size)) < 0) return ret; - } - av_log(c, AV_LOG_TRACE, "DOVI in dvcC/dvvC box, 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 - ); + read_size = ret; - return 0; + return ff_isom_parse_dvcc_dvvc(c->fc, st, buf, read_size, 0); } static const MOVParseTableEntry mov_default_parse_table[] = { From patchwork Tue Sep 28 21:20:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30648 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp5615713iob; Tue, 28 Sep 2021 14:21:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzsqjy5cxzzMwDrhFP8hffHfGswU3Y0VniDrEfxFMUr93B+YBECaCQxJ0bE0MbQsMo+oJ6d X-Received: by 2002:a17:907:1de0:: with SMTP id og32mr9189523ejc.348.1632864114324; Tue, 28 Sep 2021 14:21:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632864114; cv=none; d=google.com; s=arc-20160816; b=htC/o5mMXcDG2BBc2KoZMgAyz65VNwcSmmVdYT4GXYIS8AA/1PzSRVjRj0A98ijZAB oGvHzAFQBfQITEiafjosQQQX6Xn/7cnGHtMyxvQPc8VEooFCkbwTTUXLJoy9+AubXtPx xip2Xno/h/f/P/bhKtCUn9jNSqrSVtj1yDdmXDtKbjwaI+Gb8MUHVnKm5eB4I5oq8m39 5x9eN0JL7zMjzThsN+sVi2Hr1nPzDhFyXe7TqZqLEG/zrLbKRL8cabMg+KyRAPKCTtvD xp5jgtImPYHaQqr46S1X8mBiyeahFBtfrpJPGLnhLw6KQ0RqPcd5vp1p7aIIUayk+Odo 9tkw== 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=WA4/gy+6MMpRxcDyu8rZjPE6FzthZ8yQqU3GVOZ/U8A=; b=nzMimGuOINYxt/EfPqgJ0DN1WOPtWMpUKJh1/IKLka4i8Xe4Q0j/8sR0sawvZp4/qX MhhjZg4wbDgXeFPX5rF/4h4iRClJ4vS1Lj4T0xKjvTwskQfOzK+GjRdCSvYrT+qcCYBV HRxKKVkj9H4x4exipJuEoCuChHJ0mUpwUQaRdpk9bAUTZbMAQdgaPro89HXIIHjvegby kTH1Pxr27NdiGXUudfo7nnrYLy5sCXEDuEcvGC4/JoSYPgY030PLPu0yEMhQ8RsrWivE EUxDh2ibbmX/dFkmBIf4SV88xll3MZyAhCjsGtNbB5dD64V2RTKjIIYCaQGzbUdWzPYc 4OkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=FR1BIiwl; 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 x2si274507ejy.385.2021.09.28.14.21.53; Tue, 28 Sep 2021 14:21:54 -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=FR1BIiwl; 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 3DAA16805D6; Wed, 29 Sep 2021 00:21:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE22E68A6C5 for ; Wed, 29 Sep 2021 00:21:16 +0300 (EEST) Received: by mail-wm1-f51.google.com with SMTP id q127-20020a1ca785000000b0030cb71ea4d1so139030wme.1 for ; Tue, 28 Sep 2021 14:21:16 -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=Obc23D25oHYtMUrb9xzBLrMWfQlUsShAys37iHRB2HA=; b=FR1BIiwlfBnHpigO2Jfyy/jTNp7g4vUFcL+Zbuec78dFpqHIccaAFxE0r/5WLWfEYA LyI22cHw8pAsCiYxkrd47ATjRE2j0tZnszjkj/HnQG1K1cVaDspLuxHOsNT+uomWEckO t7VMi3/uOepZZxUqYj9tCwbdvjQHdPnYQcY0ZnCIVyiVyI7P4gtGejfzPWzPD0uV9zN4 lzxmJgHU5yodprpZq+in6s9KM1KxisdQ9K08AaDVpdK+p3esKzHWqfD0x9PcCkcNgc86 Jv5NWyVIXEN6VVKek7h8dz4CjHV8m99dOeRa3GciVc/xaKB24EbaEGNwBofVCYw8EVHF 8GFA== 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=Obc23D25oHYtMUrb9xzBLrMWfQlUsShAys37iHRB2HA=; b=go/SNs0jwQi5EgFMe3FQHTPVeDhw339EfZJyEAUzy8pPL5uHNbrwd0wRosXmfI0ddJ aJxdLwDFuremjPuw9a0WOtuY0w+0KAY1DpaQ61I6KN8L/AiNeuLGNwRkQA65CszONCNR 7Hogo87/T7mOKF8TnxBhF8K+U/5ZjLG5jnhAPCut0oRITHbyi+FyixoSMty3t9az/W36 6TrpbI1VF67ed8u/JpuNCAKeMFRKjmcmN1uw+DTgSE/l5fqBr+sOY9ycX0Ty1GxM5rva VOyLJ/l1MLDjxx6CuQm5jqcTwoOTMAIIPI8nfoUojq0WAT9HNE7Gutrdtk3VRlkqjma+ 1y3A== X-Gm-Message-State: AOAM530a5EqxXU8QNqR04cE+klYbbrEZzVDm5NTfbNm03C6V9cj3vObJ 4vvOH/BjM24+/qIIXRJ28g+hYNkfZmpu/w== X-Received: by 2002:a05:600c:22da:: with SMTP id 26mr6704071wmg.100.1632864076066; Tue, 28 Sep 2021 14:21:16 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id d24sm148419wmb.35.2021.09.28.14.21.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Sep 2021 14:21:15 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 23:20:56 +0200 Message-Id: <20210928212056.328511-4-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210928212056.328511-1-tcChlisop0@gmail.com> References: <20210928212056.328511-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v6 4/4] avformat/mpegts: Refactor DOVI descriptor parsing to use ff_isom_parse_dvcc_dvvc 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: WJaKl4xK9jxt Also fixes incorrect parsing of dv_bl_signal_compatibility_id, with correct skipping of dependency_pid in DOVI TS descriptor. Signed-off-by: quietvoid --- libavformat/mpegts.c | 43 +++---------------------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index da8eee2414..0d46a26c89 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -37,8 +37,10 @@ #include "mpegts.h" #include "internal.h" #include "avio_internal.h" +#include "dovi_isom.h" #include "mpeg.h" #include "isom.h" + #if CONFIG_ICONV #include #endif @@ -2162,49 +2164,10 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type break; case 0xb0: /* DOVI video stream descriptor */ { - uint32_t buf; - AVDOVIDecoderConfigurationRecord *dovi; - size_t dovi_size; int ret; - if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8 - return AVERROR_INVALIDDATA; - dovi = av_dovi_alloc(&dovi_size); - if (!dovi) - return AVERROR(ENOMEM); - - dovi->dv_version_major = get8(pp, desc_end); - dovi->dv_version_minor = get8(pp, desc_end); - buf = get16(pp, desc_end); - dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits - dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits - dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit - dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit - dovi->bl_present_flag = buf & 0x01; // 1 bit - if (desc_end - *pp >= 20) { // 4 + 4 * 4 - buf = get8(pp, desc_end); - dovi->dv_bl_signal_compatibility_id = (buf >> 4) & 0x0f; // 4 bits - } 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); + if ((ret = ff_isom_parse_dvcc_dvvc(fc, st, *pp, desc_len, 1)) < 0) return ret; - } - - av_log(fc, 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); } break; default: