From patchwork Tue Feb 21 00:25:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 40462 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp2316632pzk; Mon, 20 Feb 2023 16:25:53 -0800 (PST) X-Google-Smtp-Source: AK7set/hQrlwnFoO4v7CnooedsEYLsk7Jpww87Gy74G07zFdhn8CaFiKto7PmS5pGwX3AMTAiNRX X-Received: by 2002:a17:906:fb14:b0:8d4:1e81:f87e with SMTP id lz20-20020a170906fb1400b008d41e81f87emr3776129ejb.57.1676939152935; Mon, 20 Feb 2023 16:25:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676939152; cv=none; d=google.com; s=arc-20160816; b=MfdPBMtopvEHbMiY4kg9zid1XRX8UFpfQjwwBY8+ayXW0DJT9eVcxh83hZfafWDYKE QwVB0ZcZ9Z21Yl+l7YAGjlMWi4Jfl7rV2M5IoD1LG2UHxciTG12MScV0yiK/GvtYOX4Z xuMgnVTPa9kT1ryrPbiOgzd5R3Ke9ZA6r6aHZJM1VyJjsUc28lMB9IKUmfq8GA8+DLpH XSwL1gDzheKPDgsacHzB+ssvWbDxnTeWR+UmAoMs4NPSoCl/s+orhwPaoRpefK0oeK5O xAilwxDzvGMXrCUFW4nAcrdsjxkLcvkJ2z7NbhI2BNtpGV4Jgj0POeftElNJnNTKxcFy nRTA== 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=bfxQayEJCRkleDwsUQDr2VVx3rp4BDXICC8zxkHHWmU=; b=mj/wEbaobMX1HWK+2uoWaaHlEUvXiGITyZQDC9dgE5VRqHVv/MagVjuEO8WnvjtMSV nuJF2rSTSpHbOofLQrovzqzeswJZOZQri75ED4qe8XeckXNhTq+mWX6ksKpOHWG68ogP VrRQiZATZn2GaZNQroMgF4PQMPF5VzljhS+hKR2+5ALw6T2wbynQqrodpoHlK8wkay0H jbfaQnWswZJf7UIxT0Mw9icqiTJuOqEAKXwN0GY8FHRzuSGeGDOiHcuWHKlqI+QtOJuQ r9N7UIpyPjDU1kUhJVEyfsMY/pHmVz/JLBpqOAsTuRoVmgJ8Y0yAxYCbi0Mh44W/RuwL olWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@rcombs.me header.s=google header.b=C3J6acmr; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f12-20020a056402160c00b004ace74aa18esi17269139edv.402.2023.02.20.16.25.52; Mon, 20 Feb 2023 16:25:52 -0800 (PST) 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=@rcombs.me header.s=google header.b=C3J6acmr; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=rcombs.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 34C5A68C0E1; Tue, 21 Feb 2023 02:25:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f175.google.com (mail-il1-f175.google.com [209.85.166.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C753868C0D5 for ; Tue, 21 Feb 2023 02:25:24 +0200 (EET) Received: by mail-il1-f175.google.com with SMTP id e10so1054424ilu.4 for ; Mon, 20 Feb 2023 16:25:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rcombs.me; s=google; 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=rwwb6twgE7rfXU4R/qFk20LHhNt3ye21nzj0bsskT3w=; b=C3J6acmrnU6uJP8N8bzLoI02IWPIsSJnSNr8JUPG1vgwTJkxUQFiBE+RrkckPBBS0d noJ4RgL49zcRcSTrlElWjZIh3+IUxEcJEnyOmp0dh7XGvd0BpqDK/d6kQrbUeoVN8XJb 6qm/HsUPHrwvBQv5rIIhm0DVpwbBJHqFsum0MJbGa0VTuUjAs6Q5/PaE4DTmE19L7YOT A4DI/KSopsS18QWqO5KBFjGZHS+73bQztkW60B1+5EpkEmF+id1tDt+GV70LyTbqs4Zt 4Z8QH0Bef1B0D1SvQgWJpzqNbgqH03O/qqj3/QeTzCi29MlqzHAKjVhqouppNwMIO8+o SWYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=rwwb6twgE7rfXU4R/qFk20LHhNt3ye21nzj0bsskT3w=; b=iiJRyz7MrJAMGC32lxu2Tlh9Zcia4lrpv/Bc7br7U1GUObTD8gxh8Obc/d90CZIqS5 eKb25AxUxULWpm7xtlxKRA/HLcScOD8R/aMEa+CUXmdQUynCd8IUCuAAtT0l3NMmLUc4 31mv3jJy8mrL8twNE0gSwp5P3dJkZ7Zmt6i/f1UkI8Szb16HLY/b21eyTe4mVB07CQXL 0vlLGMl/8HZbMbRIT3BdCfKcme/ixDUEXF2C9u5pfnRfSLrnYffs1y1NoLm9sR5wK77x 7o7HPfSko2GPdmwZTbN7pc3ey4enzOFH8A1gDbuuI98SCgNPK69ODOlZyyoahNqipuAQ ad8g== X-Gm-Message-State: AO0yUKUSKuBhLx+j6ooYpqbgBlVR3HnDZ/35+JXVJJn240Jrtzdy0iEK PBuXmLjWgLGLvlAxnDANvKOhpio4mGNl1vnV8A== X-Received: by 2002:a92:7d13:0:b0:315:413d:c19e with SMTP id y19-20020a927d13000000b00315413dc19emr2935293ilc.16.1676939123159; Mon, 20 Feb 2023 16:25:23 -0800 (PST) Received: from rcombs-mbp.localdomain ([2601:243:2000:5ac:5002:d39e:8443:5cd2]) by smtp.gmail.com with ESMTPSA id h10-20020a02c4ca000000b003a4419ba0c2sm4404575jaj.139.2023.02.20.16.25.22 for (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 20 Feb 2023 16:25:22 -0800 (PST) From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Feb 2023 18:25:16 -0600 Message-Id: <20230221002516.25784-3-rcombs@rcombs.me> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230221002516.25784-1-rcombs@rcombs.me> References: <20230221002516.25784-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] ffmpeg: respect AV_CODEC_CAP_SINGLE_SUB_RECT 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: EAlDzsqUtp8p Fixes ASS output when multiple rects are present. --- fftools/ffmpeg.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 9884e0c6c6..23eac52438 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1021,6 +1021,7 @@ static void do_subtitle_out(OutputFile *of, AVCodecContext *enc; AVPacket *pkt = ost->pkt; int64_t pts; + int single_rect; if (sub->pts == AV_NOPTS_VALUE) { av_log(ost, AV_LOG_ERROR, "Subtitle packets must have a pts\n"); @@ -1031,11 +1032,15 @@ static void do_subtitle_out(OutputFile *of, enc = ost->enc_ctx; + single_rect = !!(enc->codec->capabilities & AV_CODEC_CAP_SINGLE_SUB_RECT); + /* Note: DVB subtitle need one packet to draw them and one other packet to clear them */ /* XXX: signal it in the codec context ? */ if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) nb = 2; + else if (single_rect) + nb = FFMAX(sub->num_rects, 1); else nb = 1; @@ -1044,7 +1049,7 @@ static void do_subtitle_out(OutputFile *of, if (output_files[ost->file_index]->start_time != AV_NOPTS_VALUE) pts -= output_files[ost->file_index]->start_time; for (i = 0; i < nb; i++) { - unsigned save_num_rects = sub->num_rects; + AVSubtitle local_sub = *sub; if (!check_recording_time(ost, pts, AV_TIME_BASE_Q)) return; @@ -1053,19 +1058,22 @@ static void do_subtitle_out(OutputFile *of, if (ret < 0) report_and_exit(AVERROR(ENOMEM)); - sub->pts = pts; + local_sub.pts = pts; // start_display_time is required to be 0 - sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); - sub->end_display_time -= sub->start_display_time; - sub->start_display_time = 0; - if (i == 1) - sub->num_rects = 0; + local_sub.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q); + local_sub.end_display_time -= sub->start_display_time; + local_sub.start_display_time = 0; + + if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE && i == 1) + local_sub.num_rects = 0; + else if (single_rect && sub->num_rects > 0) { + local_sub.num_rects = 1; + local_sub.rects += i; + } ost->frames_encoded++; - subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, sub); - if (i == 1) - sub->num_rects = save_num_rects; + subtitle_out_size = avcodec_encode_subtitle(enc, pkt->data, pkt->size, &local_sub); if (subtitle_out_size < 0) { av_log(ost, AV_LOG_FATAL, "Subtitle encoding failed\n"); exit_program(1);