From patchwork Thu Sep 23 00:46:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: quietvoid X-Patchwork-Id: 30464 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1087833iob; Wed, 22 Sep 2021 17:47:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzq8clYEjwldDs6tczhJjXhUrKnSVmMHwPZ/CMet5JPkrPqzsAdtbJBGsg5tnur9qu5971M X-Received: by 2002:a17:906:b80b:: with SMTP id dv11mr2305985ejb.156.1632358020851; Wed, 22 Sep 2021 17:47:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632358020; cv=none; d=google.com; s=arc-20160816; b=GS+V/I4huacKafTsSBDI38q+Su954zJYYVYDBl32I3MEzT63qxbgScdrKYafFgMFqu xgjCkp3k4XjgD3dI7YD6JGvlQjCFR78lXgOMMjLDl2KwO2oNdDM9fRQvglr/Vdm+umf0 rzH0yLT8BMasBCY7ZBQNEZp9kq6jSoAdR5U0uKwFu5VmDJW+tsvnUZnqqPE6mcL2gTNL Ft7ebT1lDxcW12g6CQ+GiXwIfcfP9lH49ke++QzaUxzSXr6X1ck1TAtyFRU6kHAD5SHv pQU6Zo58kAHn8W0be77nnTRWHYTuYVmbmUqTE3UXuyuzArTtnNUXytpCl2o9YB1X0Bn/ Kv0Q== 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=4YTCU8zT1m+L/ZMLm5uywZ5nuwoC9iWR1XhKvnxZzWE=; b=b7UMemvIEOBJk4YghXkAldmlyHuDa/MaYcjSeHxDfQcuPEV0zTQDJ7sPgkYGgg5+ty +rCC5/ptYSELeWwQytt44tIGPFlcYJ1QH7+jODNXBHUGsnUyxDMpQBy7G0SHXxzAlYv0 DENgEWIJ6vnkHF7xSlPQjnn/+/JANWpxXwna5ps9ArEBjLopc3dUID0ZMoPhB7pIwIy6 Q65Go21yw7rXNl+6zk+Xd3cJwqGOfc3UlrU600YP+B+5jdxd9RDrqcIdGoyQ/wSg6oIH XVKJecjfLDK9M5P5NUS8vrXI6BL8czd73723QeoyfpDleAUmIveq/tPqh27TI0rHeKUC e8Uw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=kp8BYOB3; 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 r12si4521985edp.414.2021.09.22.17.47.00; Wed, 22 Sep 2021 17:47:00 -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=kp8BYOB3; 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 C033468AAFE; Thu, 23 Sep 2021 03:46:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f46.google.com (mail-qv1-f46.google.com [209.85.219.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5F34468A9EE for ; Thu, 23 Sep 2021 03:46:29 +0300 (EEST) Received: by mail-qv1-f46.google.com with SMTP id w8so3228834qvu.1 for ; Wed, 22 Sep 2021 17:46:29 -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=C6z4a9Y6zxXOEonX6f5K2NLtYw5726+XGKe9x4u3MnY=; b=kp8BYOB39lvV147u6yNPDYdOSjR4BXhr6yNpn+pIx5Ag9pJCIXWrXlF8Fk+erHly8I xydg/a5SX+geSsFP83d845YMRmL8UcgFp/rF94/68WTsA8NDI1v6fBPdU+8dqpHXK1xV 8FPydnUfFFtL5QTDRr0jyBwTTW3bi2QYePDa88zPztp4ibPb7McBuFL1djX3a6AOrpaY RXVfjCh5BV+VIkBcPyOcGg0X6V270VZTHR+H0s+uuRMwFHyHwzabO80hGgvrEWCJwBfJ 8YWK/e93/kJrbWJHeKRsE2AoxRWvcUbTjqi27mFHLdL5InTQ4ijN512EjmmMZGKVtF9R Scmw== 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=C6z4a9Y6zxXOEonX6f5K2NLtYw5726+XGKe9x4u3MnY=; b=UXV8r+FZ0xC8w584cgymprPQeJ2Ubfi03cGbsTSFNp+u9QmBKT1o1GwEkc+h9ReL3k R8s2/Ef2y+OTBj1HJLjwENwkJ6mKtk+z+K2sBlO1mOGbuXhNCWFNuiY1cf9KJauGKdtx cs+EcGzhOPhnEEn26c1Dg6fNH9hyG57HJWYcZHZVII955pDCBq6qEavQspjIyNz++sYu 7haZ1ALAtMWslDCvcs85+G1LZcvwsXQfnCfAeDtZ3NXx+mn5tuYyybvfErFdt9qbl19+ Lso7/wE/wSykdjIX0JiCFplkvIET6moAzVCHVbgfh+aFnNCF6ImoDq6aO2zXiwzYcUR8 hHfg== X-Gm-Message-State: AOAM530yYLCu63/day7Y+8WylX7D+vDsBmsMMFN0TEv7wnUJKAHKo2b4 M/Ukszw2QtxYH1uA2774X1a+erGpU4Rptg== X-Received: by 2002:ad4:430f:: with SMTP id c15mr713101qvs.21.1632357988116; Wed, 22 Sep 2021 17:46:28 -0700 (PDT) Received: from nark.. (modemcable017.92-130-66.mc.videotron.ca. [66.130.92.17]) by smtp.gmail.com with ESMTPSA id j26sm2511618qtr.53.2021.09.22.17.46.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Sep 2021 17:46:27 -0700 (PDT) From: quietvoid X-Google-Original-From: quietvoid To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Sep 2021 20:46:22 -0400 Message-Id: <20210923004624.476145-3-tcChlisop0@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210923004624.476145-1-tcChlisop0@gmail.com> References: <20210923004624.476145-1-tcChlisop0@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] avformat/matroskaenc: Write dvcC/dvvC block additional mapping X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: quietvoid Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: bm0dW92QhIBW When muxing to Matroska, write the Block Additional Mapping if there is AV_PKT_DATA_DOVI_CONF side data present. Most of the code was implemented by Plex developers. Signed-off-by: quietvoid --- libavformat/isom.c | 42 +++++++++++++++++++++++++++++++++++++++ libavformat/isom.h | 4 ++++ libavformat/matroskaenc.c | 33 ++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/libavformat/isom.c b/libavformat/isom.c index 80a8f4d7b0..a5eb2e0caf 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -481,3 +481,45 @@ int ff_mov_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, GetBitContext *gb) return 0; } + +int ff_mov_put_dvcc_dvvc(AVFormatContext *s, uint8_t *out, int size, uint32_t *type, + AVDOVIDecoderConfigurationRecord *dovi) +{ + PutBitContext pb; + init_put_bits(&pb, out, size); + + if (size < MOV_DVCC_DVVC_SIZE) + return AVERROR(EINVAL); + + if (dovi->dv_profile > 7) + *type = MKBETAG('d', 'v', 'v', 'C'); + else + *type = MKBETAG('d', 'v', 'c', 'C'); + + 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_bits_count(&pb) / 8; +} diff --git a/libavformat/isom.h b/libavformat/isom.h index 44bd839852..6214180c00 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -28,6 +28,7 @@ #include #include "libavcodec/get_bits.h" +#include "libavcodec/put_bits.h" #include "libavutil/dovi_meta.h" #include "libavutil/encryption_info.h" @@ -393,6 +394,9 @@ static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags) #define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p') #define MOV_MP4_TTML_TAG MKTAG('s', 't', 'p', 'p') +#define MOV_DVCC_DVVC_SIZE 24 int ff_mov_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, GetBitContext *gb); +int ff_mov_put_dvcc_dvvc(AVFormatContext *s, uint8_t *out, int size, uint32_t *type, + AVDOVIDecoderConfigurationRecord *dovi); #endif /* AVFORMAT_ISOM_H */ diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 039f20988a..e99bd655cc 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1115,6 +1115,33 @@ 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[MOV_DVCC_DVVC_SIZE]; + uint32_t type; + int size; + + if ((ret = ff_mov_put_dvcc_dvvc(s, buf, sizeof(buf), &type, dovi)) < 0) + return ret; + + size = ret; + + mapping = start_ebml_master(pb, MATROSKA_ID_TRACKBLKADDMAPPING, 0); + put_ebml_string(pb, MATROSKA_ID_BLKADDIDNAME, "Dolby Vision configuration"); + 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) @@ -1380,6 +1407,12 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return AVERROR(EINVAL); } + // After video track, before private data + if (par->codec_type == AVMEDIA_TYPE_VIDEO) { + if ((ret = mkv_write_dovi(s, pb, st)) < 0) + return ret; + } + if (mkv->mode != MODE_WEBM || par->codec_id != AV_CODEC_ID_WEBVTT) { track->codecpriv_offset = avio_tell(pb); ret = mkv_write_codecprivate(s, pb, par, native_id, qt_id);