From patchwork Fri Feb 22 23:57:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 12145 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6DF8C448D88 for ; Sat, 23 Feb 2019 01:57:32 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4A229689D1A; Sat, 23 Feb 2019 01:57:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f66.google.com (mail-lf1-f66.google.com [209.85.167.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9645868977D for ; Sat, 23 Feb 2019 01:57:25 +0200 (EET) Received: by mail-lf1-f66.google.com with SMTP id p1so2973116lfk.9 for ; Fri, 22 Feb 2019 15:57:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=FFmZeJ8b+ZOXIOUpsLxGNhWnEHxIPcItK7N0sGMpZZA=; b=QtSQMMeWIlkZBFMUpWsEmGT0a5D3GfITbHg0VuoGVTLUiL9c+B96Y7FSn1eml0/DCy 31XCZEo8Dexz8TeAhXXi1XLvKjFi00G6y+YvCJ8WQTnSkj3dBKeGhPn70mXI0MkAz3US FTGdPLFXWVZ33xV+7q6VUx2ySzoqai3IwY8zTPLkHrDPVizs3mb6L7i3VnOzSKF1RXDt GUXX+aEcsNUcY/SPKsZUATtbKpoXhPTZxCK8owJ9rl1HZYFqIpAsKW0BMA09sSakdXzc J33v6OVvIxCB05pDVKMHS4OsyOyZX94osm2W38x5Kh5BDyYXjJBWbAoNfXG7R2pOT+tt Kt8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=FFmZeJ8b+ZOXIOUpsLxGNhWnEHxIPcItK7N0sGMpZZA=; b=RMu2qiw7NI8zET3v86QL7RiMXr/N5bBIJZtnfS/12XabfHkh+DmeaIecLXsWdi94E3 4qnNC+OWJlBJi0hWkaC1NcP7M1HGzcVfCEItW30VVCOsBurJ4UWoXMMo45S5yjXmhz5W LOEeeggPXnLTZsjxKwzRsakyKhoFUhdynVWOeIvFiCz9bB/4EbtIDwGpvdLIltSOdDNK 61rzB90GQF3/u2DkWKwuTUT8q2dEC3laSC+vnyEDnjebtg6TEmbUsGCwUJrqkeqoFYHr 59qb24altzUSmQJHiuTxqWon91PEtz+SJ/8oesWgTfFjYhJ48qRoUp/eXRIBzu/ULmbP TdyA== X-Gm-Message-State: AHQUAuavrm5TR4ekAAySwpmQ32G/R7pKmCEzRqAkf+b2gmxE72pOMF4p lRTwvQodEi+VyWn2QjNV6NaGVxaC X-Google-Smtp-Source: AHgI3IZRblYC1nsiktqgyC+TxDK4J9XwfEV2yfu/i5MAd9qdZR1Q8AFxj84KPR3OFOV87j6gd95a5w== X-Received: by 2002:a19:5611:: with SMTP id k17mr3867870lfb.168.1550879844436; Fri, 22 Feb 2019 15:57:24 -0800 (PST) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id d23sm885787lfc.11.2019.02.22.15.57.23 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 22 Feb 2019 15:57:23 -0800 (PST) From: =?UTF-8?q?Jan=20Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Sat, 23 Feb 2019 01:57:22 +0200 Message-Id: <20190222235722.21864-1-jeebjp@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [RFC PATCH] ffmpeg: explicitly handle timestamp re-initialization X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Now each time as the sub2video structure is initialized, the current time is updated to the first received heartbeat's PTS. --- Sending this out as an alternative to the other patch, showing how the sub2video time can be synchronized to the heartbeat explicitly when the structure is (re-)initialized. Jan fftools/ffmpeg.c | 12 +++++++----- fftools/ffmpeg.h | 3 ++- fftools/ffmpeg_filter.c | 8 +++++++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 544f1a1cef..4cba08e9b8 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -237,7 +237,7 @@ static void sub2video_push_ref(InputStream *ist, int64_t pts) } } -void sub2video_update(InputStream *ist, AVSubtitle *sub) +void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub) { AVFrame *frame = ist->sub2video.frame; int8_t *dst; @@ -254,7 +254,8 @@ void sub2video_update(InputStream *ist, AVSubtitle *sub) AV_TIME_BASE_Q, ist->st->time_base); num_rects = sub->num_rects; } else { - pts = ist->sub2video.end_pts; + pts = ist->sub2video.init_timestamps ? + heartbeat_pts : ist->sub2video.end_pts; end_pts = INT64_MAX; num_rects = 0; } @@ -269,6 +270,7 @@ void sub2video_update(InputStream *ist, AVSubtitle *sub) sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, sub->rects[i]); sub2video_push_ref(ist, pts); ist->sub2video.end_pts = end_pts; + ist->sub2video.init_timestamps = 0; } static void sub2video_heartbeat(InputStream *ist, int64_t pts) @@ -293,7 +295,7 @@ static void sub2video_heartbeat(InputStream *ist, int64_t pts) continue; if (pts2 >= ist2->sub2video.end_pts || (!ist2->sub2video.frame->data[0] && ist2->sub2video.end_pts < INT64_MAX)) - sub2video_update(ist2, NULL); + sub2video_update(ist2, pts2 + 1, NULL); for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++) nb_reqs += av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter); if (nb_reqs) @@ -307,7 +309,7 @@ static void sub2video_flush(InputStream *ist) int ret; if (ist->sub2video.end_pts < INT64_MAX) - sub2video_update(ist, NULL); + sub2video_update(ist, INT64_MAX, NULL); for (i = 0; i < ist->nb_filters; i++) { ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL); if (ret != AVERROR_EOF && ret < 0) @@ -2514,7 +2516,7 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output, return ret; if (ist->sub2video.frame) { - sub2video_update(ist, &subtitle); + sub2video_update(ist, INT64_MIN, &subtitle); } else if (ist->nb_filters) { if (!ist->sub2video.sub_queue) ist->sub2video.sub_queue = av_fifo_alloc(8 * sizeof(AVSubtitle)); diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index eb1eaf6363..58b52984c3 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -349,6 +349,7 @@ typedef struct InputStream { AVFifoBuffer *sub_queue; ///< queue of AVSubtitle* before filter init AVFrame *frame; int w, h; + unsigned int init_timestamps; ///< marks if sub2video_update should re-init timestamps } sub2video; int dr1; @@ -646,7 +647,7 @@ int filtergraph_is_simple(FilterGraph *fg); int init_simple_filtergraph(InputStream *ist, OutputStream *ost); int init_complex_filtergraph(FilterGraph *fg); -void sub2video_update(InputStream *ist, AVSubtitle *sub); +void sub2video_update(InputStream *ist, int64_t heartbeat_pts, AVSubtitle *sub); int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame); diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 72838de1e2..c0119a4676 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -740,6 +740,12 @@ static int sub2video_prepare(InputStream *ist, InputFilter *ifilter) return AVERROR(ENOMEM); ist->sub2video.last_pts = INT64_MIN; ist->sub2video.end_pts = INT64_MIN; + + /* sub2video structure has been (re-)initialized. + Mark it as such so that the current time + can be initialized with the first heartbeat. */ + ist->sub2video.init_timestamps = 1; + return 0; } @@ -1169,7 +1175,7 @@ int configure_filtergraph(FilterGraph *fg) while (av_fifo_size(ist->sub2video.sub_queue)) { AVSubtitle tmp; av_fifo_generic_read(ist->sub2video.sub_queue, &tmp, sizeof(tmp), NULL); - sub2video_update(ist, &tmp); + sub2video_update(ist, INT64_MIN, &tmp); avsubtitle_free(&tmp); } }