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 */