From patchwork Mon Sep 27 23:16:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30611 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp4626486iob; Mon, 27 Sep 2021 16:16:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyuW6xUrK2SuXK9uYRc1zAWMelL38WlAZ4+jRf/SRlpXGO6SG3UCGVARsvna0zKP1flMN2T X-Received: by 2002:a50:9d42:: with SMTP id j2mr3589112edk.7.1632784614660; Mon, 27 Sep 2021 16:16:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632784614; cv=none; d=google.com; s=arc-20160816; b=Am3eSrCG+11c7ciRnPrrvqHskcg/mdSDpSrbqPrx1b7dvdrEXDLbvOQXYb9G1vUeiW mD/z5wvj2xlXwKoBGkzMRfH8z69sqJLvC1y/Q+1aEebR+ZGRDg4Yr3wbAt1uXzWHg3bt KspHqjM6pdUeFW+R21S/SESnuTVs5GJK0VRfgmksbTZdLhMS7P1M/sMzlSC+RLvfXSB5 uWQaU9PkQ3QqS8ODmOGMU2/fmzgCyFIxzr1cRUnMsWuhEFNspcVEK8FcDKThlb/Yv3kU Dou6K0XR2utRlxUXOkWkaD4hVAwcgM2b2tyz2OJj8ttRnEXmesOMg8stTPiASaK6S+YS iKUQ== 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=kE+VgK2P50/G1c93uUluYl/7ZeqAnUhjodAwsaXrJGM=; b=HswfE10O3GdpcYFVAH+WM6blvszUYqCjRCCqz8eGTG0u7BtJEx3i4wlIJceRaOKfBJ nQSLhBPyQLO5aNIjSbupcKEU0lcECEHRaN2/GWsHxMOq8WWh0Ncz03xoPQWf4E4L1xT1 NMgFgW5M7N7THRoY4sD/SJEy8xNCEJfOvPV54UwW4LylZx3hx8H/EwyqiDoLa9SoSux8 nVxQctO1AiwZu8utFcNCOBs7ttfvTfsbQ9G0qCntSPZfK54PZMc83uY+AlHm+Y6/lGOX 1RpcnhM7yXaNN5ifJFsNX9p9QjOwP2fzkTHSYhsKA08e+Fgc1rFXEDpKrlw8FFUAQvWO BKSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=npPKdGHZ; 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 l17si20590482ejh.84.2021.09.27.16.16.53; Mon, 27 Sep 2021 16:16: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=npPKdGHZ; 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 658A16898E4; Tue, 28 Sep 2021 02:16:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BD056680867 for ; Tue, 28 Sep 2021 02:16:44 +0300 (EEST) Received: by mail-wr1-f51.google.com with SMTP id w29so54541772wra.8 for ; Mon, 27 Sep 2021 16:16:44 -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=Hbn0SFfWZuYul5OfcUCO9oUBw9gtoMYuUYxhOzK4r4Y=; b=npPKdGHZ/lrJEwzba+ApwB8Vbg0vFDGbFA1jfiSZ4SelVjV9ilXxyCKkjufXZlDME5 PLuMlRfDaB3kaX02YYVJYmotAKOzcI0Lcd07dCFaNU59PEbMlnKaVsumIWS3y85uxtVx YjakuLGkJ+m/q9FuOxZFRnU8DAw2V1hgJkfJwL/oa1g3wTWrPy4yRKiMcTs2/NbtEG7S 8eAE/rIp8+O6YJ+35UjvRXmSDKs3IhClciiHhuq72IIAHv+tY+OxWe9leE4PObSN2OqS t8R16Y+jq+ETyyasbfEygrIDxwbMJD/glag/0ARfEACEuh94J6fvrfXMEw9unTFmcGKT Pplg== 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=Hbn0SFfWZuYul5OfcUCO9oUBw9gtoMYuUYxhOzK4r4Y=; b=Zh7EgoE8ETlV6M9vw8zhAk3GAilY8Nk5hHdNGLaL+w7uMHZKUO73ZiTwN0pW6jh8Yx /mSXaRA2m1L1yJJgjac3+b6P3pEfY3jaBEq1PVwxwHxMvZJJqqWnn7671UAn7a6robuP cxcaS1LrtXr6y8UCyX9XE+iPiJe+kQBXafG9RLkX4/zRfvdYbAQMjoGnvGU510ff6cAp mHYUmN05sEJBa8DDhYmYjphHXWGxs8O6T0Y7jMmqozbHsoM5SNjD3jtQc3btOXl7xccm mi8m8wnbKct6HJLeG47jOxQJLUXMf0RT7uLLXYsq8V61rGusKjRcIUt97limKKL0W6Q+ HEog== X-Gm-Message-State: AOAM532eo1nV9TETcUg1DOtgXphnhEwBtlU/gIKasRCgk7EEKNYShFxh Zl7VQ9Aw+BgHxEq1IbixcWU1iSRH3rZCPQ== X-Received: by 2002:a5d:5746:: with SMTP id q6mr2794952wrw.434.1632784603671; Mon, 27 Sep 2021 16:16:43 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id l6sm948730wrm.64.2021.09.27.16.16.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Sep 2021 16:16:43 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 01:16:29 +0200 Message-Id: <20210927231632.306250-1-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 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: HCNEBEaPj40X 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 | 120 ++++++++++++++++++++++++++++++++++++++++ libavformat/dovi_isom.h | 35 ++++++++++++ 2 files changed, 155 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..747ffc8b2c --- /dev/null +++ b/libavformat/dovi_isom.c @@ -0,0 +1,120 @@ +/* + * 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) +{ + uint32_t buf; + AVDOVIDecoderConfigurationRecord *dovi; + size_t dovi_size; + int ret; + + 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 + + // Has enough remaining data + if (size >= 5) { + 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..8ff59ef495 --- /dev/null +++ b/libavformat/dovi_isom.h @@ -0,0 +1,35 @@ +/* + * 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 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 Mon Sep 27 23:16:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30613 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp4626617iob; Mon, 27 Sep 2021 16:17:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzdLOq3mQ4JrR+NP2DB8QkpPzWBcUl1ymjtHqQlbjeSCij/QbNPp97iC5IU6yQ8yjyRAjtZ X-Received: by 2002:a17:906:3fc9:: with SMTP id k9mr3211228ejj.248.1632784625261; Mon, 27 Sep 2021 16:17:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632784625; cv=none; d=google.com; s=arc-20160816; b=O9LRgi3rqalqWZQ9wV6jOybkkDvSLQ5D9AWlkdB24G64UDtmrNH9ymuoegjGEWvOLO EIlPbQ1f9wG+8vVZmQ2TbD8EKIIombXRG6iX59T5TsoZIBUr1udKag3mV22+Yn20EqDQ RnbHP0km5uS3INgUiL+V6b43lxsAZ72mAwmC+Eh9AniWO59oMGl9VJZG+/kqZ1AqNMPR qWJ3kPN2ak+Yh9ait9SA8GtlI934AkqqGtpa3ov0mn3vMegwbqyOkZPBPP2ZQN4cpH8C VXgOhA2w1V0KSU01KvTFXOx7BNKqKHQTB5XorIkqBQV/DUCiY/WvDk2vkVZQXgOjFu+l vFBg== 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=GYHk3D9OemO75ljWhGi9G0+oTz4V5jph/0Mdyeduj2M=; b=atlKDAbqk/1cDpdfwfSc4li1uYGPFJZutEkFO6fAxz/cj2HbQSqMR6xXexC917nkoC 8oncGiG9JxsgQkW3Ott4GHKCcIvMqpzOzL/b+RtJcg/LJRiGiKty84xtjJHUcEmNA+di 2ubFVC4rMkc80dVguJH2qrFPguTQSAwiyYDp27+P8eKnL2v/AqQ+X3munZ1bQO3+tumK D2lkkeSffB34bBJj5f+pAz5ECMGArQAzddgcXSGNfKMhOoNfpE1cbKfWhr/nhHP078Fk gjL7vzNHro+/DiI+TqRuqse1ZHK3YbtDcAHAiYgxRogvVdm/grQy3Mn5UyolXX2/5OGu mk8g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=RnGKipq8; 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 5si19610108eji.132.2021.09.27.16.17.04; Mon, 27 Sep 2021 16:17:05 -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=RnGKipq8; 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 7A64668A0C3; Tue, 28 Sep 2021 02:16:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F3EA06808CD for ; Tue, 28 Sep 2021 02:16:44 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id s21so14636494wra.7 for ; Mon, 27 Sep 2021 16:16:44 -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=ibTF1AZKvd4MuIPBZUH5cs7DTQSoif8CUqricVSgqhY=; b=RnGKipq88GkgbaN/18neIe/XnPKKFRgTu2HhYR5TQ1ZbzyWT+flaXIBbJLoqg5LvIi fLY/4UIRadWV5b0UvK6yedwcH14eDSIsm3FMDmJJz22qeVugRzlBr6ivYoLjQHs21j/k ryfjrlmn3FJHfC3DLN1KhuprngjCmFbU+T5BoSxVTiSLk/0voZotOOjXxQkCOBoxIjrK KzACcgWpRXEKqEaCvP4cGVmmAUG1UmhjRi1PO6Z6CTmwyfHNS7XxzqwPHopP3lrBfFQ4 AL0Pl5UUnQjHMBgaYixfMQlMve4Qt2/5tT6FkrfOll5E7gU3dVr3OIzhWl/FwU2n4rBr mkEA== 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=ibTF1AZKvd4MuIPBZUH5cs7DTQSoif8CUqricVSgqhY=; b=198Qb3l64Qdv8IR2i4hTFLOObUYtiNB36k/Iz8eqDpvUtMLbMckN7WItY7+RCDHVGv Po7RABT3/cbecTA5QuJ4k/d5lZFs7z0kpL34IfZTprwoGzkuENKWDHY9esA7fAAHpozG FaWnyYbnV36F6GjXQ2hTtS4cTCOj1J6SZlZE+C4riKfzerZWP7zpZCGgJm+2e2Yi1wsL iEcbml6h3+KCqfZ3DdT0E8FCnjMa0LYhl5etxIFAvnDoI1Aw3oO3oDjltRAHhKHrLYpy tQB8Yh+akqwGr+GeZYhs2IiED7KXtthAGEyoTC6kcBzcqAAxY1Sti9eERGZ6IWQTAa8T yZqg== X-Gm-Message-State: AOAM533UDA4DF/0LVdxYJye9YvWI0fX9RiIkBpSLHSatqmRQ7Kzrjuou +o3PP+dazvYXLiKJRr0Q2Dnoae0BmSdODg== X-Received: by 2002:a5d:6245:: with SMTP id m5mr2271702wrv.148.1632784604211; Mon, 27 Sep 2021 16:16:44 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id l6sm948730wrm.64.2021.09.27.16.16.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Sep 2021 16:16:43 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 01:16:30 +0200 Message-Id: <20210927231632.306250-2-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927231632.306250-1-tcChlisop0@gmail.com> References: <20210927231632.306250-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 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: z7L9fCkcuAR+ Adds handling of dvcC/dvvC block addition mappings. The parsing creates AVDOVIDecoderConfigurationRecord side data for the video track. The configuration block is written when muxing into MKV 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..afd9ce46d1 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); +} + +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 Mon Sep 27 23:16:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30612 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp4626831iob; Mon, 27 Sep 2021 16:17:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzT/JeGJUi8bxGuyQmTXK7pCmj+JcS+SQxue+xyKzThYCAEkZoREPLFudnVLeDNK9An/hBz X-Received: by 2002:a50:8226:: with SMTP id 35mr3567059edf.54.1632784644694; Mon, 27 Sep 2021 16:17:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632784644; cv=none; d=google.com; s=arc-20160816; b=ox45qzrFsvHDqjC4tAuwBQlxVg/mGCm8lqTRlwYv7IA1Rwdtc1quYe5N106pqyijce uDAY7pe0Ut5jTHUcVldmDUtELHgQKIBoq6YN1vn7q30GdwBGOQvp5A4SpjWHL71Tyb6m uXG+DFk9Pu7lqZjb2eVGuCyxhcrQp7lPTaJlrHwwGEQn/7vDsZxru03kTmWMEkZfN+wh 1PzNh6Z3OXK/KdPYPMX0pL6aXW4xHIDYgCRxytlyCoHAjBSsIqCYeXV11OXJaRr50RKd pqFavu0ZHXVhtBm09VhK595kLtjdq46ckZlDamlkZRkiJaP40VdoArD/8hEZijc+Jmce 9OjQ== 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=gsdkUrHrhTnVuSxNq7Riv+aW/EkZbclWFy3IjGEM71o=; b=im7+/PcpYPOssIOI8FXSLnRXW7bTjvoJiPd3N8ElzUxyEku+XJCgak0heOv/GMsCU1 f/cLZwS5B6htwL2qZx2OIFzex2XLaYkM04va7a2kBhmYq+W3tHk7AIMlFgIIQQAUy0E5 LH/gTq5mnX2TVOdXcEQI5s6wUQPI5+tKYAnlnTNh06/cT6SA869aqIo3zva+Ne7U9pdu QLBcVvqHt8rarkzRKe95OuRhMdXQdIjuq5LxUrEreqBkGhpoUMgDklmlmLNThMLN4pDB BOzTY3QoV6MjLDlo3x7fu1ViFPAQZHhVBnXNQ28DTyUuxj3cl0NKZqLDSFSDOPwrBn5n sdyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b="jE/cSgdC"; 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 ay15si19245786edb.592.2021.09.27.16.17.24; Mon, 27 Sep 2021 16:17:24 -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="jE/cSgdC"; 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 510CE68091D; Tue, 28 Sep 2021 02:16:56 +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 3A82A6899EB for ; Tue, 28 Sep 2021 02:16:46 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id c73-20020a1c9a4c000000b0030d040bb895so1222649wme.2 for ; Mon, 27 Sep 2021 16:16:46 -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=lmmWs8OwsXJrrU22+bwVbnof0ZU8PtMbqB+r4D9RxyE=; b=jE/cSgdC7flChrtWgGartFRvNTzOptU0stAfLsJZkQPgz3DSRnKcU8QE0J9Iw966Wf pt5Zu4PW+2Sfq4AyavkDFsjGu+CTFw6GaRAz6X6MhViF8XZbEku4V/2x/sYV4Zz1d7lq lIQXy5dgC5Rox+xpfGxJ6yvgtSAYypwSglmgqtadz6C5o2/GTy2Mw8N//xSBHxLqY0Ua DkNJsHzwbpcRG6f5Wv8aHJ1+6VisK1TmWLjwp5WHyvIKBwCuDWQaqepz40eEu00t4uQh seGPxM3r6PHjcMoK+8zOEq7TX4/AQTm2X8k0BhuxPHe7cEqCyEK1ML3QDdMo4uBTpbDI SaAg== 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=lmmWs8OwsXJrrU22+bwVbnof0ZU8PtMbqB+r4D9RxyE=; b=5h8PtPoM6Re6viXWjNXAxsWrU0VCY4Gag+gEp98S0OCA8s6TYUTM2ayXbBPluBkwQA 7WmGWGR+ElkxPfbvs3+aHDoxyeh5+tOQ4+qKfrk4OhAuqAIAXZqS7mSXtW6IDZZyjJu7 3/2eAJi9D2Dxu8Xyv884o2PHlOS8UjbMC/vK0kZiaOytmYxK6XsVakpa6D+M5zF2ir8X 0cehNAZ5n96nb83M3+NfQ1e6wT4Ls4PugTPBafhQRILqzcu7vbRzHIWhUaSgNUhyufoN 9CKeLQQHxMmK3DlIA42s4cVPqH4fkQvhMinBtCQBaWdxW97W/FprSxIb/iWQtvumublA XbEw== X-Gm-Message-State: AOAM530CVrH/gtjjsRH3jg/dfK1erypUNZQnyuaKJKagNKkATgnTP/+d HuN3pOoLojtCjc6OpnP3m+1Ph0XXKo8HCw== X-Received: by 2002:a05:600c:22c6:: with SMTP id 6mr1619908wmg.96.1632784604762; Mon, 27 Sep 2021 16:16:44 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id l6sm948730wrm.64.2021.09.27.16.16.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Sep 2021 16:16:44 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 01:16:31 +0200 Message-Id: <20210927231632.306250-3-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927231632.306250-1-tcChlisop0@gmail.com> References: <20210927231632.306250-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 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: utOH0PM+eSg8 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..f30a7145e6 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); } static const MOVParseTableEntry mov_default_parse_table[] = { From patchwork Mon Sep 27 23:16:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30610 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp4626744iob; Mon, 27 Sep 2021 16:17:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwNmvELVOw9JrrIC5g62jH23Vw/nB60qG1RXxQNFlFTuJ4XJTA0l7xVXWDWVnR4HpkqlPte X-Received: by 2002:a17:906:ae83:: with SMTP id md3mr3319404ejb.84.1632784635071; Mon, 27 Sep 2021 16:17:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632784635; cv=none; d=google.com; s=arc-20160816; b=fjPOuHEXrEjq25RSIJ4aMHnZ0CzdW8ZV47U8eKdmw5hdjVRNN605xXRCYlLPOVrf4F fwxBA+pzlZYw7ZD020ZlpkF/rGwGbhYbLG9VaKz8smDFAvdboqzfGXQSyI3viuBDpqcZ +GMVu5j+/105HoNTqRpVE3CYlmN/at/0wK38z1i6+83aNSbuv+JpA/uHkSf34+dvQTNM 0td+Xjt+9QCJWkKsN+hz+51Ggsn+s33P6zw48JruzuTcWZIom/iGOc6yauDp6ouveeYm kcKobAKyQmQwZEwQ3Yjso9hmf08DI0VGjBmpCd8E9kWNCGLpY1WyTDkYpnmqsE1apsaY 1MPQ== 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=4XyJHz+TSG/evfpTXityXSH16+AcQSBVKBndr4vyaCw=; b=SzTlaLga1cExPYVI5rDocS/9LqUsFYbekfUFAgnQ3WdpbbLDvNf6QYeSHkOWt5nDNX MirpSeCg4Jc9PGPBwu57HUAST8TD8UHdctVa/fwfehqG6v3IiYzHSERqP16NXvg8XgxZ sjN7bWbiOfdptGmxoXgpCdiZ3Fsj0OAvMwdkeKA6pCVzqb377VQBw0iyiQFU/hTnQSiG 7TjySSMhnG7yfQjM0ltbVAEUucl3uRRNWPnqM8JETkX4Nx7pbC3zjVrHxNDM3mbPEIH0 oGMG8tU1Mpd8aiVZPRBRtU2ctqlXAn760suYMd9QOuvVJLPjzxGpYqiKddRzYCgNREmy KTFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=EaS0zSKT; 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 y8si2174361ejk.35.2021.09.27.16.17.14; Mon, 27 Sep 2021 16:17:15 -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=EaS0zSKT; 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 7D88668A196; Tue, 28 Sep 2021 02:16:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CDA956808E6 for ; Tue, 28 Sep 2021 02:16:45 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id u18so54702898wrg.5 for ; Mon, 27 Sep 2021 16:16:45 -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=Ne0eZPGwk4gftoAaSU9/RX1GnJWTCw4nsHxhVitdsPA=; b=EaS0zSKTr0x+z2WmNwMG9cwwzGHswAJExC0Tv0Mqsm6xDbdvllgarPdx9eXX5i050P XzGETk+fNVgQhtq5WuFWZypt8DbAtvZc8cAp3cC+NOeo9mBrcOAGna9xoz8R+hX5SPaL 0Je+Lfaweb3CHTcIMA4nos8GlgZUA/t3wp4myNFQWf4+s0RXJ1KFEmiBXiWdmLm4xZou KpFR0DEYrwQkrzN//5NfJMFeuN9NSXVziFXljXAUp7brUWlMKaaTHsDCnTaTTTbAYf6M ke+WeSIbERCO0pktxydxRpLoSt8hgNpnf20UEuOEIcnhSY89wg6L2T4zsaLLbG+Tb+jc b8TQ== 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=Ne0eZPGwk4gftoAaSU9/RX1GnJWTCw4nsHxhVitdsPA=; b=XUK9AKOXcTtD31fXfCHJtfhViuq1DdrTwIfWPq1SKx00SaYhz8qVPAxqi5VBai521m nQZ/I399BHvpS9OrMQ9+aLUziJJZqsrFAEwjg+di1/5c4et3+EXTVUTz+Ph0G/9CaLB0 O548gJqcauZvnCf5IWeOQr52JA3bDZ6hmlEsl3OUBBPF+L/TFFLafBy94WinCxB3vcgW fZtKxrtFHF1zVa0+lWkx95gUQ269yxkfVTC+mFLQ8u951OSuA6JBe4jjpgeZuJnbZffN QZV2lliz3iXXnCzAIEFm0nPSJBBZ8iZJW4wEjAYujoK3hMfsPwQRsvF3lQXU+1pKW6Y2 djow== X-Gm-Message-State: AOAM5331RII+pls0igrz5pdiPxIIC+zLc/je9b5SLFlOMdMwjAApxsea 99UHzPoTcLE06dKfO2nlHoq/jkB0t+Ir+g== X-Received: by 2002:a5d:6d07:: with SMTP id e7mr2822981wrq.378.1632784605240; Mon, 27 Sep 2021 16:16:45 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id l6sm948730wrm.64.2021.09.27.16.16.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Sep 2021 16:16:44 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Sep 2021 01:16:32 +0200 Message-Id: <20210927231632.306250-4-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927231632.306250-1-tcChlisop0@gmail.com> References: <20210927231632.306250-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 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: I6BEpThLPFWq Also fixes incorrect parsing of dv_bl_signal_compatibility_id, which was often set to zero instead of the actual value, for mpegts only. 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..276864be93 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)) < 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: