From patchwork Wed Oct 23 07:50:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gu Song X-Patchwork-Id: 52449 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:aaed:0:b0:48e:c0f8:d0de with SMTP id k13csp308596vqw; Wed, 23 Oct 2024 03:19:06 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVwXEW7CyNTBmy56D/j2Nujr8gw/dKbrzfaAgLLCwoE+rQATmtxLfme4qRo6FNzw8kErlGifdwUPXlOhIASsV/r@gmail.com X-Google-Smtp-Source: AGHT+IHkce1hm4zWVyL+XBtb/OC1Svn+NVei543I1TLvZyUlgg4+ZevSg1SKOM3fU/SGpbiev4nS X-Received: by 2002:a05:6512:2216:b0:539:e12c:bba7 with SMTP id 2adb3069b0e04-53b1a30d336mr1000072e87.12.1729678745707; Wed, 23 Oct 2024 03:19:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1729678745; cv=none; d=google.com; s=arc-20240605; b=ae42W+5gCtHTZQXvAeZiDMH6/vYeaRTZvjeGOslA47ICaYIbB/38DXq2UZ4oCBOeOM zkYM3YQ6J+LBgw1YNKO/S4npbhAcYqKvO0Qt5uaiFbnAmEwb8z9UEmDi7b7ri8/bMm9l dhZutZlxiwHeRjTDGiHG1o4WmnoEEqRU8M1dt7qEVmXPjhjN2lM77GE8QUnm6pWs+njV OO3vBXl2eoRXVoNPHP3VFXTO6x1fMqDu2oeK/2Ey5ThOyw9xgn6kLApDqa9/7s+mKApd kBHbf3rx20PLR+EqepxeThg02/5ec7gOFjtlP9QUdXpDtsL87tKW0+QCJKMRBYNAn0Wz rrhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:to:message-id:date:from:mime-version :dkim-signature:delivered-to; bh=Js6yp+bqyg1dnUAeBLoLhXMupUgCQbbne8dPixwxdLI=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=JlcoBKvD+yL2knU1rPoI29SvTXjoPLvMaGQ9AFFqRG7/cdzM4EB7NWbua2IP+/EkBY c3kyCdVu1zUZyhUusjVm7z0Ng/4vf3ayQ4OPTog2c0iRNETWeNw3b/rj3ySZyaC3iwEx qjgRKk6SAt+2SqmdPeiu2VreTmaPWxBuvwf8lArwpjv2gBCnvnf7JbYDCNgBOzrghvP1 qsAo7YkSHBTD0i0ti5UNKpy9u761CCyvx5Zrb2zpnCUQnm2Iv0wlh4tPcNo9AMZkbU60 3PwAQYdTGHdWSTB89swCBRwuyiHXOpikaoWniEy1lVG5rz4BDiptqmXHQBj/4sDFqo9T jBBA==; 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="Zf6mQ/K9"; 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; dara=fail header.i=@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 2adb3069b0e04-53a2244d3c9si2438417e87.577.2024.10.23.03.19.04; Wed, 23 Oct 2024 03:19:05 -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="Zf6mQ/K9"; 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; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EFA5A68DDEF; Wed, 23 Oct 2024 10:51:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A505768DD79 for ; Wed, 23 Oct 2024 10:51:07 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-539e6c754bdso6230983e87.2 for ; Wed, 23 Oct 2024 00:51:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1729669866; x=1730274666; darn=ffmpeg.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=a+CMGQ4uCFYyaD26oNt4e8b4SixaP+9NmRJEmV+tDMk=; b=Zf6mQ/K980tlKhRiMTFv57hma4BceXw9vrLtUVgUpurqLpwON4kSIbaPdCdwlOd8G8 oAcZDQy+Hw7lRhYQ3/uzYkbu9mmT6j7UZIX6DZL8EocxzuIpLdVyNBMRnbRVw0kP30lv 04LSZQbrsMWgJEU0sJr8clk4Klg1gsqcU61oWMLY+X7GMzxN1SMEPbqysjxXu/3f2Aof PJwEK40gRYPj6NjP9w56x5tHG0pYww0OAn77DktmjI9UeNfCFWT4M3mzAATIySJ/YrWD 0WrX3KQwZjDIm3/qRYLKCS0lu2l6QqPn4y1Z7tW+C1+9/Wg03rLr8SHO1G2P/J5K0JeB iYZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729669866; x=1730274666; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=a+CMGQ4uCFYyaD26oNt4e8b4SixaP+9NmRJEmV+tDMk=; b=mAlY7faTqgDvysdD7I432y8x1Lhp9pKgQMSAQFydX9YpwzEdYr9wpKM7KoDQ4T+T9A fdWB4WTfhJQL9SxwO0+dEkU2xzQ5azy+fsqceraCfW71OHpa3WQayWDKqveBr045XOrd LVeMdLVjLL771wF6hMjiWbeI+edzGZQVWNHP+bQ2Dxrwd2bj7pIU/FDPGIKW18ZmNFYM fZWGIRMXrjGQVXswb002v5irXC5sgqRkyZRYegEoGk5KT+jVMSpuTTA65Igk7Ajod389 10JahkhU8zlfgfwItDs0SDi3X5knB4JZxLjbA/Lc0nuXS8wZeFjRRf61DNZdg2tk11iC GOGg== X-Gm-Message-State: AOJu0YygNDmG8Fkqn0fFPWk311rw394n7TNQgGwl3hAHRKaR5eZNIenj gNyHlyjdOpuD5vueZqkTNfoQFO2spsLTA/+t2EoSA9Wsni2xDTMHadKiiRfykP3zP4EghCAIhHb tznlKk/dvTSog7aK1KhOyiF/4WokNSud3 X-Received: by 2002:a05:6512:3b06:b0:539:e911:d20e with SMTP id 2adb3069b0e04-53b1a391ea9mr747447e87.47.1729669866215; Wed, 23 Oct 2024 00:51:06 -0700 (PDT) MIME-Version: 1.0 From: Lu Renjia Date: Wed, 23 Oct 2024 15:50:54 +0800 Message-ID: To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 1/1] Output .lrc with correct end time 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: RLNdijBY+/l7 When input .sbv or .srt and output .lrc, line end time is incorrect as condition below: $ cat > input.sbv << EOF 0:00:00.000,0:00:03.000 Title 0:00:10.000,0:00:15.000 Line 1 EOF $ ffmpeg -i input.sbv out.lrc $ cat out.lrc [re:Lavf61.7.100] [ve:61.7.100] [00:00.00]Title [00:10.00]Line 1 'Title' should show only 3 seconds, not 10 seconds Expected out.lrc should be: ======== [00:00.00]Title [00:03.00] [00:10.00]Line 1 ======== Fix "Generate .lrc from .sbv or .srt have end time error on some lines" https://trac.ffmpeg.org/ticket/11253 --- libavformat/lrcenc.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) size = next_line - line; @@ -103,6 +115,14 @@ static int lrc_write_packet(AVFormatContext *s, AVPacket *pkt) "Subtitle starts with '[', may cause problems with LRC format.\n"); } + /* Verify whether a blank line is required between the two lines */ + if (te < pkt->pts && pkt->pts - te >= 10) { + avio_printf(s->pb, "[%02"PRIu64":%02"PRIu64".%02"PRIu64"]\n", + (FFABS64U(te) / 6000), + ((FFABS64U(te) / 100) % 60), + (FFABS64U(te) % 100)); + } + /* Offset feature of LRC can easily make pts negative, * we just output it directly and let the player drop it. */ avio_write(s->pb, "[-", 1 + (pkt->pts < 0)); @@ -129,7 +149,7 @@ const FFOutputFormat ff_lrc_muxer = { .p.audio_codec = AV_CODEC_ID_NONE, .p.subtitle_codec = AV_CODEC_ID_SUBRIP, .flags_internal = FF_OFMT_FLAG_MAX_ONE_OF_EACH, - .priv_data_size = 0, + .priv_data_size = sizeof(LrcContext), .write_header = lrc_write_header, .write_packet = lrc_write_packet, }; -- 2.47.0 diff --git a/libavformat/lrcenc.c b/libavformat/lrcenc.c index 7570529..37380cf 100644 --- a/libavformat/lrcenc.c +++ b/libavformat/lrcenc.c @@ -33,10 +33,19 @@ #include "libavutil/log.h" #include "libavutil/macros.h" +typedef struct LrcContext { + /** + * Look ahead timestamp pts + duration + */ + int64_t lookahead_te; +} LrcContext; + static int lrc_write_header(AVFormatContext *s) { const AVDictionaryEntry *metadata_item; + LrcContext *lc = s->priv_data; + lc->lookahead_te = 0; if(s->streams[0]->codecpar->codec_id != AV_CODEC_ID_SUBRIP && s->streams[0]->codecpar->codec_id != AV_CODEC_ID_TEXT) { av_log(s, AV_LOG_ERROR, "Unsupported subtitle codec: %s\n", @@ -77,6 +86,7 @@ static int lrc_write_header(AVFormatContext *s) static int lrc_write_packet(AVFormatContext *s, AVPacket *pkt) { + LrcContext *lc = s->priv_data; if(pkt->pts != AV_NOPTS_VALUE) { const uint8_t *line = pkt->data; const uint8_t *end = pkt->data + pkt->size; @@ -91,6 +101,8 @@ static int lrc_write_packet(AVFormatContext *s, AVPacket *pkt) while(line) { const uint8_t *next_line = memchr(line, '\n', end - line); size_t size = end - line; + const int64_t te = lc->lookahead_te; + lc->lookahead_te = pkt->pts + pkt->duration; if (next_line) {