From patchwork Sat Apr 20 11:48:34 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Sabatini X-Patchwork-Id: 48183 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c906:b0:1a9:af23:56c1 with SMTP id gx6csp1201891pzb; Sat, 20 Apr 2024 04:49:16 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCUOKVD7z+uxjTs/2rHtxtbThJx0IS9cQqT+VOThePR16HoYJh9U4sDvX1RWAE/hxs/eZ060j774HXbQ9ePt5AucT1FYvey5gL4OBg== X-Google-Smtp-Source: AGHT+IHguAxy9zb8cW2sMgLXQQlpgtoUxuky3SAnp0k+oc4dAuaLXBO9UJsitPLwpeM85f9JIrBZ X-Received: by 2002:a2e:9ccf:0:b0:2d6:e2aa:6801 with SMTP id g15-20020a2e9ccf000000b002d6e2aa6801mr3004735ljj.46.1713613755708; Sat, 20 Apr 2024 04:49:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1713613755; cv=none; d=google.com; s=arc-20160816; b=uEipujdX6Kd4Vyfd+uZEAs1X6Cksi4UhNyB1SXkInDNbOIdnFm8QeaddEECT33XG6Z GXr3pdklwPrg/d1UYdondp6Cp+Ue4wkqyA3sBpL/TTdeI/ewhcbL1QQgNvaUm8H9ptbG kG3N4yDq6Ycw2TaTy2I7FIPqXtkrnzHfl1DbsKHtKXlAOfW9/Fu1q9bPsPYJgQUwdXJi OazHLr0bB0+7e56abJ5uIPKdXmtXEToHOgnyBkoxbvRjM04Bj9mSUByZW1yO7coMvZy1 brb1YkjwleFq9+MEnJd682IDBiAqw+77ALhFgj4d/yXUKmLOQB3sVGfa5Lt7D3yeooz2 9wXQ== 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=601IgQbbcadq/ru0J+LMqnfOIYw6Zs4ln2EcRuiyRrI=; fh=QdWxt2OToL83TTnLQn0lGhLakV7i1QyAJdC8te7qN0E=; b=hUmkE1lo2/+qJi3qGPA0nbWfCdkscbBnpkFSe5sdZN7J5BSu0+euMOJMgYr1Zv0cZm sAI8qtUhzyNiFDAdEr3pw4/xoYyt0m6g0CHH5AWzdGbVGUmE6mkH8KGtYgIXhL/2sVsN dF//CDm/lT+K+ZAtvhffwKAqGh33g18//2/GKZtMHyoL7DtaOy/2zFEDfFiCMXThJI3r VZvHPyvisrouEASWLFHj+YgGEFx/ofHOtNXr9w9+uPtlt8xBnD4Lv4+sRPXiZ7UV5iTY IQsr2g5Lw/We65ecfENkt2xzccAv5ECMoJhwxvelKt7IYqUZhegFBjrlCHRS2r9OjnJR KhhA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=E69+Jz1b; 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 e13-20020a2e984d000000b002d472865b32si1652116ljj.584.2024.04.20.04.49.15; Sat, 20 Apr 2024 04:49: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=20230601 header.b=E69+Jz1b; 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 2133A68D230; Sat, 20 Apr 2024 14:49:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f42.google.com (mail-ed1-f42.google.com [209.85.208.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0630668C768 for ; Sat, 20 Apr 2024 14:48:54 +0300 (EEST) Received: by mail-ed1-f42.google.com with SMTP id 4fb4d7f45d1cf-571c22d9de4so3432060a12.3 for ; Sat, 20 Apr 2024 04:48:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713613732; x=1714218532; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VbV+PLUt9QTUbYrAyjkoJIru5k2Z+YjP+DQ0XwkYcr8=; b=E69+Jz1b9/Ch48639pBTdpjXGJ1ChMSTCCqJZTJD4yOD/t3W7cks4+VBkH8XoJMwHj F+Jr8Rlv8yK9oqFaGsdkKqSP+134+nyjqsUgBMXMe60u8yB4Q9bjGoZiZmITWM5SNVNX G8YG8OG9byTs7CccouEjMWAgMI0hdGyTCDDeuF+/TfhY7zl3MXHSrYViqeoy1eAI4ILt jl2NOVdUfDccqSTh2bdWljXvFDFxT2cNkWKLpnuie+J4cj/x297F+szNLZCXL2GTBnZV B2qW3lwetqmgcl6RPQZfLHQy6b/ULxxLZmI3pNDEzPR5oWkeI4+PCDvVCIftB/Ql3lCE u59g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713613732; x=1714218532; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VbV+PLUt9QTUbYrAyjkoJIru5k2Z+YjP+DQ0XwkYcr8=; b=anhUCDDAa6Y5zcpRuAfQ1hhnRvi/pKSaIHm+3tgaI7p2mEETkwJxL5rhQrBHNAJk/G Y+8aRriNI3my0u197xGJ/jN8FGl/+uiwacu4uWVYNJFYY6CTH5xBhe1GuQdySbZIGPCh lnGaFJS1VyCCTAB4dTTI2HRoTOTJaqxIQBTobgrXxCeCj4zv9gG8Q80myZkNViVTgaO+ wYSidl3PeHi/2WcOPETq7N0gRPY5UrYGEC0LxIfQTuzbn6hZH+q2vkf28aonOzEqKnDT 3igR2IZiKdorRQ+s5pm38kOJmoUlf6+q8x5z1dPfzi99jLnNT2eegAnUTc3AWgN517b5 aWSg== X-Gm-Message-State: AOJu0YyTsYcUveyN5Ky+w9tXfeuh+VHvgsiELRmeqACVe2ptw/EsmD8/ KOPPls1K67FYCtxkJZIewDoxrTc+8U3BLCgCvg9aVI6xtmX4u1GaRzDowg== X-Received: by 2002:a17:906:d0d8:b0:a52:1b7e:b019 with SMTP id bq24-20020a170906d0d800b00a521b7eb019mr3110898ejb.40.1713613732028; Sat, 20 Apr 2024 04:48:52 -0700 (PDT) Received: from mariano (host-87-17-49-61.retail.telecomitalia.it. [87.17.49.61]) by smtp.gmail.com with ESMTPSA id kj21-20020a170907765500b00a5575f6a897sm3040254ejc.173.2024.04.20.04.48.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 20 Apr 2024 04:48:51 -0700 (PDT) Received: by mariano (Postfix, from userid 1000) id 5E8EDBFCEE; Sat, 20 Apr 2024 13:48:49 +0200 (CEST) From: Stefano Sabatini To: FFmpeg development discussions and patches Date: Sat, 20 Apr 2024 13:48:34 +0200 Message-Id: <20240420114835.35645-3-stefasab@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240420114835.35645-1-stefasab@gmail.com> References: <20240420114835.35645-1-stefasab@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] lavf/mkvtimestamp_v2: review implementation to match mkvextract behavior 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: Stefano Sabatini Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4J1BgWLCpf+F Harmonize internal implementation with the mkvextract behavior: - print PTS in place of DTS values - ignore NOPTS values - sort PTS values --- libavformat/mkvtimestamp_v2.c | 69 +++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/libavformat/mkvtimestamp_v2.c b/libavformat/mkvtimestamp_v2.c index 1eb2daf10a..c6446ed489 100644 --- a/libavformat/mkvtimestamp_v2.c +++ b/libavformat/mkvtimestamp_v2.c @@ -22,30 +22,91 @@ #include "avformat.h" #include "internal.h" #include "mux.h" +#include "libavutil/qsort.h" + +#define PTSS_MAX_SIZE 128 +#define PTSS_HALF_SIZE (PTSS_MAX_SIZE >> 1) + +struct MkvTimestampContext { + int64_t ptss[PTSS_MAX_SIZE]; + size_t ptss_size; +}; static int write_header(AVFormatContext *s) { - static const char *header = "# timecode format v2\n"; + static const char *header = "# timestamp format v2\n"; avio_write(s->pb, header, strlen(header)); avpriv_set_pts_info(s->streams[0], 64, 1, 1000); + return 0; } +static int cmp_int64(const void *p1, const void *p2) +{ + int64_t left = *(const int64_t *)p1; + int64_t right = *(const int64_t *)p2; + return FFDIFFSIGN(left, right); +} + static int write_packet(AVFormatContext *s, AVPacket *pkt) { char buf[256]; + int i; + struct MkvTimestampContext *m = s->priv_data; + if (pkt->stream_index) av_log(s, AV_LOG_WARNING, "More than one stream unsupported\n"); - snprintf(buf, sizeof(buf), "%" PRId64 "\n", pkt->dts); - avio_write(s->pb, buf, strlen(buf)); + + if (pkt->pts == AV_NOPTS_VALUE) { + av_log(s, AV_LOG_WARNING, "Found PTS with no value, ignored\n"); + return 0; + } + + if (m->ptss_size > PTSS_MAX_SIZE) { + // sort all PTSs + AV_QSORT(m->ptss, PTSS_MAX_SIZE, int64_t, cmp_int64); + + // write only the first half and copy the second half to the + // beginning of the array + for (i = 0; i < PTSS_HALF_SIZE; i++) { + snprintf(buf, sizeof(buf), "%" PRId64 "\n", m->ptss[i]); + avio_write(s->pb, buf, strlen(buf)); + m->ptss[i] = m->ptss[i + PTSS_HALF_SIZE]; + } + + m->ptss_size = PTSS_HALF_SIZE; + } else { + m->ptss[m->ptss_size++] = pkt->pts; + } + + return 0; +} + +static int write_trailer(struct AVFormatContext *s) +{ + struct MkvTimestampContext *m = s->priv_data; + char buf[256]; + int i; + + // sort all PTSs + AV_QSORT(m->ptss, m->ptss_size, int64_t, cmp_int64); + + /* flush remaining timestamps */ + for (i = 0; i < m->ptss_size; i++) { + snprintf(buf, sizeof(buf), "%" PRId64 "\n", m->ptss[i]); + avio_write(s->pb, buf, strlen(buf)); + } + return 0; } const FFOutputFormat ff_mkvtimestamp_v2_muxer = { .p.name = "mkvtimestamp_v2", - .p.long_name = NULL_IF_CONFIG_SMALL("mkvtoolnix v2 timecode format"), + .p.long_name = NULL_IF_CONFIG_SMALL("mkvtoolnix v2 timestamp format"), .p.audio_codec = AV_CODEC_ID_NONE, .p.video_codec = AV_CODEC_ID_RAWVIDEO, .write_header = write_header, .write_packet = write_packet, + .write_trailer = write_trailer, + .priv_data_size = sizeof(struct MkvTimestampContext), };