From patchwork Thu Oct 28 22:33:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 31244 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:a610:0:0:0:0:0 with SMTP id q16csp1025246ioi; Thu, 28 Oct 2021 15:35:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxv2Nd8jW7wrX8tM/909Wt/O+8/Mol9SZqfvKnl5OlXb9XC7jhMYWa3CBVzQyfEjn5uIQRA X-Received: by 2002:a17:906:c041:: with SMTP id bm1mr8998348ejb.280.1635460541629; Thu, 28 Oct 2021 15:35:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635460541; cv=none; d=google.com; s=arc-20160816; b=gthm2sjmK+bPDiFzCks1ggx521V9S+oM/7T2UfeaWgceBO9SAmOxhWDCcayU7jY3fa B+Q4B39RFgG6h4Sb79+jKf6GNyVod6QzAye7iUBAdJA2kfoIbAgw+Jo5Wiu7Vbzt4IHS zA8tGKjsl8nMOUivyhUczhrfcoV7V60slNN6oHF/dk7srWm1qFNosHSa3/U3WcsNxQR+ d1ub/oPFQF+TUc7LvRgVjpef92PmHIrCV2AGzeLna8BxBZxvW/oD4cAWCi2ZhSk5/AtU fXiO1ohhas0sIDweJN2uODXbagOL35Ko+0Xkm/dTo3Nx4Nh4WtNvjAgAZDM1GjnZiJld yvtQ== 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=vbTsryBUhrSyeeODnFRdcyTdwnfAfBz9n3DCQS/uWSg=; b=D/DapKSD052hwhNgiA6XgRZGq7OIPXV2I6kaoZGy/Y1jzJ3cZ+y8omh7oaKEPeFZaU Pm0gURh0qdSmJosVIdsxcFPZM59aTvOmYuXEUwzflkr2d7MgRJ0zC2wSy3n9apbUrgy+ pVed15ZJuAZIkqTLiSoqHdeLSuCynhtgvVlP/sWqL3Q+HAvcpys2mW+btXVv+IDZpwEN aXM8BUSOtWKXUmn1O8sxTdervNdkFVMhtkJzR70i4T7XjRgxxImTA30MCFBzB3aBweKn 2YYVHaHsbZUWo/xZmAP0eXlRXMRSOMg+eTgYZ102Cri8RRlHHk1V9UJDy3skTgGGTYC+ wwiQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=liIm2l1x; 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 l10si6494620edb.64.2021.10.28.15.35.41; Thu, 28 Oct 2021 15:35:41 -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=liIm2l1x; 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 A799468AA84; Fri, 29 Oct 2021 01:35:28 +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 1B38E68A755 for ; Fri, 29 Oct 2021 01:35:22 +0300 (EEST) Received: by mail-wr1-f45.google.com with SMTP id d10so12857057wrb.1 for ; Thu, 28 Oct 2021 15:35:22 -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=Nx3xpYqI5B2Dn0u29mMZCoANspQ2eAxFyRkxSnNXIk0=; b=liIm2l1xPzjsmQRv9u/jA7/ICsVNhRA9tHry85w+aYoe0UQIZSgjTpCGu9qcbRb349 F+LQF2JQvnx+au+xVQ5S/elMljUE3hlXoRAhfpOtc0gkpzabqad8k66Y+dvVRkO3abNt TtCBoOHfCNagIkJoXe1K13tGIuisWqAiuoZNpzf8tKprMBhDaMQw11iXuH+6PoL4rpge UIfQxbjm0G1j+zNL9lAFrNdqyWmNAItUjrAfASx+c2OUnWSgpYFlCcSkOEJHdJaJCScE lS0eWnEKqpr/YRMFmBXj5fLfC/x3aLzmcaMJM0Bf5HalMNHY0FHuAWC2yAxLE/H/93OI QWGQ== 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=Nx3xpYqI5B2Dn0u29mMZCoANspQ2eAxFyRkxSnNXIk0=; b=TGHSbkiND/JuD4u8cgUbT8mQiLI74E5mYsilJ9Htwp7cNABtK9CqrzztezZjeK6ZyK 4WEbLMT8JZaM1i/xCu5/M/7dryNaUgNu8xxpOXT6mYxl6UI2xhMOtDi4Y0WjSw4NSdS5 3KqgJrvB/w/SPvM5AirxYSG0vsUj6tlkr3BtFTV6fWxltb45N+VsJ7I2E8l5sI1dCsP5 hl9u212gwyrLsPC0emrtuGu7ZV70q6zC1LSaAvPYnowpjY7DjHmCLxTMBaNxjzBmE0nx /5l7R0lv7PJ/G/KIwEczN9H86cUEv+P30MGfzqEyNbTDG/OhCrWKFN6RTKlNvWYPVIUZ aHGg== X-Gm-Message-State: AOAM530a8nkYdsNeH0vgxlc8BzYmE5Hl5Dl0NJyv6POxPXxC1SVK2F1B CwU9w4fdVVJdkkBaDPptwE0YnvnUO9wgYA== X-Received: by 2002:a05:6000:2ca:: with SMTP id o10mr9081111wry.383.1635460521283; Thu, 28 Oct 2021 15:35:21 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id x7sm6798265wmi.43.2021.10.28.15.35.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Oct 2021 15:35:20 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Oct 2021 00:33:39 +0200 Message-Id: <20211028223342.1169258-2-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211028223342.1169258-1-tcChlisop0@gmail.com> References: <20211028223342.1169258-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 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: d4cEVD6vuJ7c Both parse/write implementations are based on mov/movenc. 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 both mov/movenc to use dovi_isom functions. Signed-off-by: quietvoid --- libavformat/dovi_isom.c | 121 ++++++++++++++++++++++++++++++++++++++++ libavformat/dovi_isom.h | 35 ++++++++++++ 2 files changed, 156 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..54f17c90a5 --- /dev/null +++ b/libavformat/dovi_isom.c @@ -0,0 +1,121 @@ +/* + * 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 in dvcC/dvvC/dvwC 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); + + return 0; +} + +int ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], uint64_t size, + AVDOVIDecoderConfigurationRecord *dovi) +{ + PutBitContext pb; + + if (size < ISOM_DVCC_DVVC_SIZE) + return AVERROR(EINVAL); + + init_put_bits(&pb, out, size); + + 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 > 10 ? "dvwC" : (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..d33e436a4f --- /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 Thu Oct 28 22:33:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 31246 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:a610:0:0:0:0:0 with SMTP id q16csp1025367ioi; Thu, 28 Oct 2021 15:35:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzHd/jeNEwenRsqFnrUb9CQzZWL/ae/wWr6W+vPGnvTR5kfE4erBy3EhuIvCYQpTGLdRycg X-Received: by 2002:a05:6402:354c:: with SMTP id f12mr9909902edd.170.1635460551651; Thu, 28 Oct 2021 15:35:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635460551; cv=none; d=google.com; s=arc-20160816; b=Lh1llsvWeA9pt+GP6AeVu0FYm1vqct19ICZXwcm+SOLFU4z438pUEbmffRsp7W3Vpj BD/Tjcd3IuSVSddPjLOTjg76QDAUAsoWwa0c4u/mkE6un6RepJq6umJHWybxOQ0KVkpT 63o3upsdicetE/rZNCvX0EpdkjGZNHg71G6XVsaI4WIeJcJks09mXnCuSJqQ16zEONLO dSyTKO92fRqCcriXcLCnlyfSaFqrBDmRbTaUBXUx6pyupS31yxb5GVINX1x1wpYulHsc CmG67nlMAQZvBIrWyfJaayHFflHaAiJupKaBLgoprBsknztKYuv6oiojEK9+/iufiaug fT3g== 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=K3A0L5Y2yujzPBOGmVmtSIkOsHZATVzXdge21MgIZjs=; b=uY4zpPrg0DyQBNbwLbCT8lNF49NeKIcW+U9wRYNAqvFudRw8P7Mw/dFqxbEIaQACpr FnDH1u+QB/tedDV98uF/S6aM87lDBh0rflE6sL1sJa/oNzAa95RmQUOt2NYvd8EBAn3S 62Co1G/RL1za8uYyv46VGw//tT2AihAhwkFuNZ8sW3VWIGQJKyZ7PwkCrXupGpPdDu+o kVdVMF0Gmafz6Bx1M6a4ugSuVQslf/LfoGFqGrVL4vEYMvo8FrFEDSWSpPxp069EJnC1 Qm4v563VWhc/2SH8jdMxSEoqlSSTZ2TeazjgyRoQsi21+if2FfWnafJAQlWLpr0w6qzE EFQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=WA3GAAYC; 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 bd6si1908568edb.303.2021.10.28.15.35.51; Thu, 28 Oct 2021 15:35:51 -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=WA3GAAYC; 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 C4F1968A8F0; Fri, 29 Oct 2021 01:35:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D06E768A323 for ; Fri, 29 Oct 2021 01:35:22 +0300 (EEST) Received: by mail-wr1-f43.google.com with SMTP id r8so20454wra.7 for ; Thu, 28 Oct 2021 15:35:22 -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=QX1iKPafH/5ZTAW523fD7Au3Z2bQ50p0xlRpOIswlFI=; b=WA3GAAYC9to/jL4yiVo6kCoT7crEL+sv6Zv3M8SA5S9xrZ9RJBznpRfEaZ3gD+sb2q CP8u+QP+rpnK8G1EzPm3pvdFs4yGsAQXvRFtQN4eAQbGvLgCQKRAmqcXujJYpAdbW01l ovcLAIWHJZ5zsxJJ5foZFEzQsVvoWeiHQ2SmlloThCYSnCyj6EGhmMQwc9LIpN4EEDlY ggR/XmsFVYDvUMDH1q+YVxaUXzc3dwbnriU2mTa9zdGqjACgBbMMaWBly4GhmXaBmJDj Vp8XtEQguKFeGYM1auHLArFhkzNRjLpm0TsfNgWq0GJYXJzHZ6Ezu7auWAlp2n2TXFVi pD9w== 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=QX1iKPafH/5ZTAW523fD7Au3Z2bQ50p0xlRpOIswlFI=; b=IZ2p1jgYe24k5RzB8EOClv4YDvUybuBpA8qIEkmXVZgkKCkSBfqkqAkp0K8CBVPqow Lx0z/vBQGYM6WVotosk4XPqz7yb+f4y0c/4cOEfrwekg/0NmpZG+ePewAEe1OArAsZja hNcBKy7cJ4eJMWEICCfJN9bWBylnI8xTJJwd8uh0pGFqb8z+MCwEyMwfG1J9VJFkG+4b FEOPAOWB53fzcehFmvlleD8vBME/6G3iIAl41fJ91Xqa3gzFLSZc6nHWsHRy8cQ6kBxo t5oxRiNqa2JfGNd+oSgWbqfSjLOsTgw61732qfNj5qcK8KQl7+UltlAUMicbX2csBACB iKJg== X-Gm-Message-State: AOAM533Og1XXsvoCPyDfpxX9plPuMIFRSLYf51EoEGzqcnUOZrmqd9rM HPetGGQZKdHBUfs3r0pL4N38E1u/mcR8BQ== X-Received: by 2002:adf:b604:: with SMTP id f4mr9420747wre.111.1635460522050; Thu, 28 Oct 2021 15:35:22 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id x7sm6798265wmi.43.2021.10.28.15.35.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Oct 2021 15:35:21 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Oct 2021 00:33:40 +0200 Message-Id: <20211028223342.1169258-3-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211028223342.1169258-1-tcChlisop0@gmail.com> References: <20211028223342.1169258-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 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: BNuQTBUyZ/dE 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. Most of the Matroska element parsing is based on Plex's FFmpeg source code. 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 3d6c8ef8f5..f70db4551c 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -314,11 +314,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 b2c4927e43..9e922c70f1 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 }, @@ -2311,6 +2329,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; @@ -2898,6 +2948,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 6945c26f5a..c2cb72ce0e 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" @@ -1111,6 +1112,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) @@ -1310,6 +1349,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 Thu Oct 28 22:33:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 31247 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:a610:0:0:0:0:0 with SMTP id q16csp1025517ioi; Thu, 28 Oct 2021 15:36:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxwOwDoSLpOtEC2dUWojUKIzLduCKq/60VsrBNXUA+jsAQUHAYOSnpvPwwUzWqgNd/5dpAd X-Received: by 2002:a05:6402:40c2:: with SMTP id z2mr9946535edb.41.1635460561915; Thu, 28 Oct 2021 15:36:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635460561; cv=none; d=google.com; s=arc-20160816; b=J0L6RShsVH1+EtXgg4pPx3XZ+csGhU5Rd7Vy5kr4LfCoIthoGbtQ4FdFz0j0xzLzul uOUUUfk3umPyF+suTVDH0OlGg2cVKQ1f75i4K3eVWb3c/GfHDPhlBJPUeEPGNqx9Sleb 0739V0ouuGYttjOTeEoZB97jvwt3nrrkRqFW82KOzk4sNBFDRwzOBwwh1OBe4GDH11gd JqSxc0HDMJ/hR36CzIOyQ8zr34WJY6dD1cetOzTBS984BsJEdNbKARQFXSbTIr9p10+i sw67FFK4ED10lY4PC7U7GtIsw/koubnup1RMK2Da7ybqgejxt7Szmqh+YMlbjDeE6fvM YqOg== 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=wiAekYHtsCCqXEaNDXtj177jZ8n89cDHVLeg3PGzSKg=; b=n5vwznUb0vZRpH25xan3N73oryL3rZhYONaebwi3iSLJxomBnuefLMWmiZc5pud5DX CObIziuf6uGDIbzhNJz0feANRY0q97GruLLoib2sOj3+6+/WWvtu3xa97bxGoMhBHstR br/+oj4EypfDm14lwrZF0l5HO9LYUnLDh1gk0te1FDaddUbSsEQEiEXBfSFvmS9DWqDw S/CgxKQINjOZCeGjZ660eW4zajwp6+6Lua1D3hLH1GaCugfG4FaFoLDRin4S/h37xjM9 0+tUOKaIvZ6H1CZykl2W+i5B7diXUp0hnI8bLMP3XT6ljNF13iUuOUqoVzL10qG4fbb0 vvVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=cQS6hvwm; 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 hq13si7919353ejc.182.2021.10.28.15.36.01; Thu, 28 Oct 2021 15:36:01 -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=cQS6hvwm; 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 E172168AB0D; Fri, 29 Oct 2021 01:35:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9CB8268AA7B for ; Fri, 29 Oct 2021 01:35:23 +0300 (EEST) Received: by mail-wr1-f46.google.com with SMTP id u18so12812584wrg.5 for ; Thu, 28 Oct 2021 15:35:23 -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=iT6ICqZAD+/Bg8KWrmwSbIhVj+NeAAqys7O969lajfM=; b=cQS6hvwmkq3ZzJPVUN0jVK8gamFIX3hJrgKBxFDa4LOTCLd/3BmcUYuCRtz3O/9djk FlwDoHPr/DHA7B39JvjwOIxgfM2JudskR9dJYjKpJD/NHZ9rbCDu0lNEKuENbuQtGS4p Nto4x0uQOkGzQh/4vEAZd5t580CbJLwYC9/6Z+fSVY2bUmH2iEn3STsHTL+IHSfuKaVM r7rSAihDt7YIZidyp0ptRMNhyZBM5R/tBz5DV60erk3SnrunJSWwl+Stk2bsoNKFF+g6 reWBUL5ZuMzHtFjtBEp4pY00Xfcc3YF8mwnrtwCN5+8DaOaxreAhdzT6T23NQy/7EzY3 S2+Q== 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=iT6ICqZAD+/Bg8KWrmwSbIhVj+NeAAqys7O969lajfM=; b=NRFP4cknavK51zttNI7np1z+/yJCHePJOvAVOSL+T/hSbDAHPqj5xmckpn0qnhXvAn YK/Ji7QtI9Hicc7Fw6SP6HFB7/kF8TCl9wt2+LTjog2kOyhLXme1LgF+DJpwcO58m3qg CaGNJCU4N4WMVZWqWCpOWx9Pk4zcHwb/EeNeZtTuc5BNeOpp+YHnL3ALM5lE1esdK48F 4aN9Ot76NOdJyxTQRrSC12SY2M2HJQc8wWGpeMmEDEEJlt+L7UL0fBRGok8/Oj/IFOeA gOYypT/BbDFs1lSlnBT6evfvAgxZutxt59/93Wk8JbBTkqlOXTZyHfnUrVlUmQxErq83 3/bA== X-Gm-Message-State: AOAM5301M14q7sMTuoVgauWtMbXEsLNHsLbjoOXiWQIegY/XtsXiilAT J5oXQh1qmXoFAv/DL5yQF0C2Ou+IaPhCQw== X-Received: by 2002:a5d:4b8e:: with SMTP id b14mr9027830wrt.259.1635460522942; Thu, 28 Oct 2021 15:35:22 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id x7sm6798265wmi.43.2021.10.28.15.35.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Oct 2021 15:35:22 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Oct 2021 00:33:41 +0200 Message-Id: <20211028223342.1169258-4-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211028223342.1169258-1-tcChlisop0@gmail.com> References: <20211028223342.1169258-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 3/4] avformat/mov: Refactor mov_read_dvcc_dvvc 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: JKKgXBd3I7VF To avoid duplicating code. The implementation in dovi_isom is identical. 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 3fcb1dc908..5c393e45ad 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -55,6 +55,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" @@ -7033,58 +7034,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/dvwC 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 int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom) From patchwork Thu Oct 28 22:33:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 31243 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5e:a610:0:0:0:0:0 with SMTP id q16csp1025626ioi; Thu, 28 Oct 2021 15:36:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwa7iSjhvSLl1u39TfimhAc3L2O0bmrbXxl4T5CEWt0mhJGCQnYQn/JmWPeWXel+G0YOpoE X-Received: by 2002:a05:6402:4405:: with SMTP id y5mr9781837eda.339.1635460572727; Thu, 28 Oct 2021 15:36:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635460572; cv=none; d=google.com; s=arc-20160816; b=RLQ+ZK3rtA9/pHphcItw2WyOdiMq0qX2jCiTWww1UV4S5BeXNug8QifJCtOfgbvRle eWK9fcvinJOHDViBvV73NUdPoKdUVo18+rez8zasyxA0A5myloRIhTXO9xKnC30O9mXK WdJ/jWeG3RLe/BD+oz57DFspbk7cQbPOhznTpTDbh0UJFSNOuqDxD3ey8YxVJrALyTUa 1YJ9DT8nIe8GjAc2eZi40jiHoxn6KBjtv5Nq7uOnNwh1igt6iwVefG7DLztNdpENxZkq lI1Acryv386Yf/4E1+r/2tL82t70dkwA0BWuFox0daxUm+SW/W/rDWrQ4mHfr5LuDzrb Z27A== 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=CBItxf9qjFN8mfLiWMPu7j/74b9vdSqt70/DtEadJbA=; b=0ecq1FK3xtX7AoA/YpmtSo5cE8DRekgmfm5Zr5gL9Lwur4BjKBe8jeOKjDjNNGcDT7 jV5Bf9nJ+spDzyrSt4UL0DYidErLhteuDeo83i5vuwdaivAhZX8yToSJ3+HpJsmm2RTM ZEa1ohz3WESTLeo3f2aSWkyYRLBo9nxc+aK58u34chLs25o5uH3AvRq/Hk3WSSw5lJKt ZOJ5TjF+7VjzNAtJPeWGbo6U4AhvZAbJCup7sfbk3zNsZ3wqh5VyStIcl+3DWtj3NAnW XQvqaZXgywujSoeMKcLfyOfBCuorPpPV2gYKjRIBtg26fNtbQY0i7zAgd933dml0npNy 11FA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=mvNKwlOI; 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 b18si5706917ejh.638.2021.10.28.15.36.12; Thu, 28 Oct 2021 15:36:12 -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=mvNKwlOI; 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 F01D768AABE; Fri, 29 Oct 2021 01:35:31 +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 89D2A68AA8E for ; Fri, 29 Oct 2021 01:35:24 +0300 (EEST) Received: by mail-wr1-f51.google.com with SMTP id m22so12886917wrb.0 for ; Thu, 28 Oct 2021 15:35:24 -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=fve8RuuOLzvEThHckGT2smw7fkMpjO+NM+jqLCAkqIo=; b=mvNKwlOIxAIKEEkc70u9R31Em0+BCst+rH0bAfAVziAjsH72/XK7eeiWysFFhmXFMA MsYb+iJD2CBJ8qHBDE7xeNEW5NJw7dlwf/8CNCuwuiLrWMbAfXk+AcFbwlX71TUCYdgW Yon5XAHBttaB7MZk5a8xxpUnyRebsLsqyGQ2giRQBGuBqEtOaMjDpWBuRPfUoBruFibF Ey6tzII7eYMPcVy5zTq9VVbR6+RQDfFYp+Pq5+Ve2fYsSS9UY7IYi/rntDW6qx9LbsJF XZDhULghkTM0ygQHKN6FvtsgADJMSxFJLIGI16BLsmA2842oVXkoV70zzND1EAcjO0SY svOw== 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=fve8RuuOLzvEThHckGT2smw7fkMpjO+NM+jqLCAkqIo=; b=iRhVa++ZwxVI6u2ZAgtEZzcpeTQR+3tXWZDgnZUh4iDHlVr9HmYyEz0CRQS7n3qYF7 s8IxUCMRHHqVjQYLH4zNUVSlm8mkpvBrq18P5K8s645Sn9OvqgCg08HzBVH5Q+VwDIfd euWbH5GxcHL96O1i0gLnGJEIwSd4Q8Drw1OFo+kW4LxJAvpvNF7Io0r+MA0TS3qwJtWJ ArrI1VtGEavHZuIyxdS9psi8PoIqhTW4NSrShl7Uv5MEg4LaEIB725xDMIkRLOR6NHLM HX5t9ryMTjyvVqfYyzWd++EsoWkaMBCt1lqVcC4fekI3k0fHoI35w/MvA9YDmK3wLHOW +mHw== X-Gm-Message-State: AOAM532VIpdYKoyQpYr1HgwkwOsyuSYX3N5e2UhXg9iAVnvR4qpvgRSz KGFlYxrHDqkFfBkssTHha+HVhwFzxZ5Fwg== X-Received: by 2002:a5d:5747:: with SMTP id q7mr9245861wrw.103.1635460523759; Thu, 28 Oct 2021 15:35:23 -0700 (PDT) Received: from localhost.localdomain ([2a01:4f8:162:73cc::2]) by smtp.gmail.com with ESMTPSA id x7sm6798265wmi.43.2021.10.28.15.35.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Oct 2021 15:35:23 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Oct 2021 00:33:42 +0200 Message-Id: <20211028223342.1169258-5-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.1 In-Reply-To: <20211028223342.1169258-1-tcChlisop0@gmail.com> References: <20211028223342.1169258-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v7 4/4] avformat/movenc: Refactor mov_write_dvcc_dvvc_tag to use ff_isom_put_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: f+v+f/2upbqs Improves code legibility by not using bit shifts. Also avoids duplicating the dvcC/dvvC ISOM box writing code. Signed-off-by: quietvoid --- libavformat/movenc.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 37d4403f7a..cd9c4a0b5e 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -27,6 +27,7 @@ #include "movenc.h" #include "avformat.h" #include "avio_internal.h" +#include "dovi_isom.h" #include "riff.h" #include "avio.h" #include "isom.h" @@ -1911,6 +1912,9 @@ static int mov_write_sv3d_tag(AVFormatContext *s, AVIOContext *pb, AVSphericalMa static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDecoderConfigurationRecord *dovi) { + uint8_t buf[ISOM_DVCC_DVVC_SIZE]; + int size; + avio_wb32(pb, 32); /* size = 8 + 24 */ if (dovi->dv_profile > 10) ffio_wfourcc(pb, "dvwC"); @@ -1918,23 +1922,11 @@ static int mov_write_dvcc_dvvc_tag(AVFormatContext *s, AVIOContext *pb, AVDOVIDe ffio_wfourcc(pb, "dvvC"); else ffio_wfourcc(pb, "dvcC"); - avio_w8(pb, dovi->dv_version_major); - avio_w8(pb, dovi->dv_version_minor); - avio_wb16(pb, (dovi->dv_profile << 9) | (dovi->dv_level << 3) | - (dovi->rpu_present_flag << 2) | (dovi->el_present_flag << 1) | - dovi->bl_present_flag); - avio_wb32(pb, (dovi->dv_bl_signal_compatibility_id << 28) | 0); - - ffio_fill(pb, 0, 4 * 4); /* reserved */ - 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 > 10 ? "dvwC" : (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); + + size = ff_isom_put_dvcc_dvvc(s, buf, sizeof(buf), dovi); + + avio_write(pb, buf, size); + return 32; /* 8 + 24 */ }