From patchwork Tue Mar 21 17:06:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 40767 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2759232pzb; Tue, 21 Mar 2023 10:07:47 -0700 (PDT) X-Google-Smtp-Source: AK7set/s2GsjhRJkWaGFr/SWtIrzG8mPlhswnz4z+cdXaivvcjWImekRMnlr/cgDEa8KDk82rb+D X-Received: by 2002:a17:906:2a19:b0:92e:efa:b9be with SMTP id j25-20020a1709062a1900b0092e0efab9bemr3660447eje.18.1679418467540; Tue, 21 Mar 2023 10:07:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679418467; cv=none; d=google.com; s=arc-20160816; b=TV7HOiMmg98mMI6vNjWaS+9qk0hCckiSrBm0q3c4eov3iUR3F5E7FD9YuuyMvo9t9v cc/U+EsW9DgS/GAnV5+O+ZiQI9uqMQAgP50qs0BmV48YO2FSYXHSToOXD0LCBSw+VfeU J73QHXq88TRKxkpPoX492VzgFZraVuLoaia/M8P2SWeNVkMgkhWMsZ7s5GRKHSISPZad 5aPWNtvYlqKGS9cIhpc7wYpDKYlVbdh+UKb09CIVVc/KeOOJBKD8dRpseJVUcDtFkU3R psjz+jg34hCVV4TNETTMA7jdr/AGdgWcXmWZJVYoodZNibzlhMteI64z7VID6sbzXo1F 9/iA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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=IKI3MW031LagLOzTyt7bOq/J+39KPZ1HCsxFh+oijIo=; b=ibhjwdRyyn2DDpl/hDqxU9abdCs4hpRl+dOUIFgGa2paO9xYdRS4G3ikrY1G80wuce dirY5mfIySShQkiEEuHJn9n5KSM0FzSjklBaRp1HcQFNBV3eZlT/+w68N7yOEC5Q+YUB JfFxtp7cOWvemoNhgCA5XRdq0XINrSvChyzSr1ZEEd8QHZH+DKmjnprb32cJnC9+IPxF bfsoZvfMMYbWrKdRTss9BYWRMjtUnlZiIrh6yDD0N/jE1SuJMkNPFqDb7V9rzinOlj1U fO+nn6QkN91q3T1yEegRcQ81oyuXwegyJt0BeBHBz+TBVzb2cyWkTXPJmnjWzDAYK4VA NhXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=kpPb5ywc; 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 hr12-20020a1709073f8c00b009333f8775a1si11298458ejc.182.2023.03.21.10.07.46; Tue, 21 Mar 2023 10:07:47 -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=kpPb5ywc; 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 9428F68C23C; Tue, 21 Mar 2023 19:07:05 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f174.google.com (mail-oi1-f174.google.com [209.85.167.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C36FD68C248 for ; Tue, 21 Mar 2023 19:06:57 +0200 (EET) Received: by mail-oi1-f174.google.com with SMTP id bm2so2725418oib.4 for ; Tue, 21 Mar 2023 10:06:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1679418416; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=C2UdzBHi+E9ILEegRNfYTMy0dKh21dlTjKLEbJ3e0Vs=; b=kpPb5ywcG0xH04wYBCLKLfCF/cvaINjZV352ba9BUDge0TpwfB1QIsHVcgRQa6qYgl MHYsHmM61FWRsIDzYd1ea7JgMK2tpTPdZYejBFL/D+B2yqiCN7b0fJS9VySkfA5ew6/2 HPs+7LXLz1E8FM0EnnuXkKoDihwgu+j3x0YCrq6LuAQEFox5dE1/NRjXpc7ps30UGf+v vu8UpFY0DW2nvaq7gnlwc0FjzhDCKBH73+jWpRIvXFSR2hkiB5JsSh05vaLzY0AFGTvB EVbP+xP/ImZC/lfG6P/ibnuee6LkL8z4PtWx6P4lxAhewr+eM1As0i9AlVDBBoK73hx+ 26xw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679418416; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C2UdzBHi+E9ILEegRNfYTMy0dKh21dlTjKLEbJ3e0Vs=; b=LSDnF5+QISjN9/FNyJ9L8OXSWIVa8+Ap971EzE1e019LVH73L2IANCJaC2n+4uiB4s vm+bSuRaK4EYpXX2K1NhDv/XqBw/DsmUC9+t0GrTuhzVRHRIuaqfTuI4HeGZp2Bv+7qa BhSK46DqWwJpTNlyNkkDVgSjMlOL+aaQUflqrf6AJbymoNucxnuVqw6JPbFlV2zgAbuP kqPFEEfjOoLdZFZ0XYjh8rEK6HoplWkTQQOSeg7cl0c+kn1pEKs8FPoC5sxvc3pEm3B5 X5mjgnAXIHTU5nlg10ArZ7JlNzk6fG7gRkqvc1StlKejSt1BESaORJLwlo95mbvHsnT1 lAPA== X-Gm-Message-State: AO0yUKWVHRS1z0FAwtyxG2OldZDHcXsSBjvB/At1poQTBRpqDMeV0Nca JhY/fUfq6bYE8OrAEk+De+FGHFIV0mw= X-Received: by 2002:aca:1012:0:b0:386:e5ba:4585 with SMTP id 18-20020aca1012000000b00386e5ba4585mr1521864oiq.9.1679418416231; Tue, 21 Mar 2023 10:06:56 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id b11-20020aca1b0b000000b003872148d322sm845876oib.22.2023.03.21.10.06.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Mar 2023 10:06:55 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Mar 2023 14:06:35 -0300 Message-Id: <20230321170637.10907-5-jamrial@gmail.com> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230321170637.10907-1-jamrial@gmail.com> References: <20230321170637.10907-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/7] avformat/matroskaenc: write a MaxBlockAdditionID element 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NXhZnLcmoBvm A non zero value is mandatory for Matroska if the track has blocks with BlockAdditions. Signed-off-by: James Almer --- libavformat/matroskaenc.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 46f4331a18..0687d9c32e 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -188,6 +188,8 @@ typedef struct mkv_track { int64_t last_timestamp; int64_t duration; int64_t duration_offset; + uint64_t max_blockaddid; + int64_t blockadditionmapping_offset; int codecpriv_offset; unsigned codecpriv_size; ///< size reserved for CodecPrivate excluding header+length field int64_t ts_offset; @@ -1597,12 +1599,21 @@ static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer, return 0; } -static void mkv_write_dovi(AVFormatContext *s, AVIOContext *pb, AVStream *st) +static void mkv_write_blockadditionmapping(AVFormatContext *s, MatroskaMuxContext *mkv, + AVIOContext *pb, mkv_track *track, AVStream *st) { #if CONFIG_MATROSKA_MUXER AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *) av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL); + if (IS_SEEKABLE(s->pb, mkv)) { + track->blockadditionmapping_offset = avio_tell(pb); + // We can't know at this point if there will be a block with BlockAdditions, so + // we either write the default value here, or a void element. Either of them will + // be overwritten when finishing the track. + put_ebml_uint(mkv->track.bc, MATROSKA_ID_TRACKMAXBLKADDID, 0); + } + if (dovi && dovi->dv_profile <= 10) { ebml_master mapping; uint8_t buf[ISOM_DVCC_DVVC_SIZE]; @@ -1846,9 +1857,6 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, if (ret < 0) return ret; - if (!IS_WEBM(mkv)) - mkv_write_dovi(s, pb, st); - break; case AVMEDIA_TYPE_AUDIO: @@ -1924,6 +1932,9 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, return AVERROR(EINVAL); } + if (!IS_WEBM(mkv)) + mkv_write_blockadditionmapping(s, mkv, pb, track, st); + if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) { uint8_t *codecpriv; int codecpriv_size, max_payload_size; @@ -2667,6 +2678,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, side_data + 8, side_data_size - 8); ebml_writer_close_master(&writer); ebml_writer_close_master(&writer); + track->max_blockaddid = additional_id; } if (!force_blockgroup && writer.nb_elements == 2) { @@ -3070,6 +3082,22 @@ after_cues: if (mkv->track.bc) { // write Tracks master + int64_t end = avio_tell(mkv->track.bc); + + for (int i = 0; i < s->nb_streams; i++) { + const mkv_track *track = &mkv->tracks[i]; + + if (IS_WEBM(mkv)) + break; + if (!track->max_blockaddid) + continue; + + avio_seek(mkv->track.bc, track->blockadditionmapping_offset, SEEK_SET); + + put_ebml_uint(mkv->track.bc, MATROSKA_ID_TRACKMAXBLKADDID, track->max_blockaddid); + } + + avio_seek(mkv->track.bc, end, SEEK_SET); avio_seek(pb, mkv->track.pos, SEEK_SET); ret = end_ebml_master_crc32(pb, &mkv->track.bc, mkv, MATROSKA_ID_TRACKS, 0, 0, 0);