From 0f236345fb4619312281bd2ce736e9327eb9321d Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Thu, 29 Nov 2012 20:25:37 +0100 Subject: [PATCH] ffmpeg: sub2video: use start and end time. Until now, the end_display_time was ignored, making single packets subtitles (like dvdsub) stay indefinitely. start_display_time was also ignored, but is it almost always 0. --- ffmpeg.c | 20 +++++++++++++++++--- ffmpeg.h | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 4b278a25f5..956f5b6b49 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -209,17 +209,29 @@ static void sub2video_update(InputStream *ist, AVSubtitle *sub) AVFilterBufferRef *ref = ist->sub2video.ref; int8_t *dst; int dst_linesize; - int i; - int64_t pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ist->st->time_base); + int num_rects, i; + int64_t pts, end_pts; if (!ref) return; + if (sub) { + pts = av_rescale_q(sub->pts + sub->start_display_time * 1000, + AV_TIME_BASE_Q, ist->st->time_base); + end_pts = av_rescale_q(sub->pts + sub->end_display_time * 1000, + AV_TIME_BASE_Q, ist->st->time_base); + num_rects = sub->num_rects; + } else { + pts = ist->sub2video.end_pts; + end_pts = INT64_MAX; + num_rects = 0; + } dst = ref->data [0]; dst_linesize = ref->linesize[0]; memset(dst, 0, h * dst_linesize); - for (i = 0; i < sub->num_rects; i++) + for (i = 0; i < num_rects; i++) sub2video_copy_rect(dst, dst_linesize, w, h, sub->rects[i]); sub2video_push_ref(ist, pts); + ist->sub2video.end_pts = end_pts; } static void sub2video_heartbeat(InputStream *ist, int64_t pts) @@ -242,6 +254,8 @@ static void sub2video_heartbeat(InputStream *ist, int64_t pts) /* do not send the heartbeat frame if the subtitle is already ahead */ if (pts2 <= ist2->sub2video.last_pts) continue; + if (pts2 >= ist2->sub2video.end_pts) + sub2video_update(ist2, 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) diff --git a/ffmpeg.h b/ffmpeg.h index d260222c55..afef6fb98b 100644 --- a/ffmpeg.h +++ b/ffmpeg.h @@ -246,6 +246,7 @@ typedef struct InputStream { struct sub2video { int64_t last_pts; + int64_t end_pts; AVFilterBufferRef *ref; int w, h; } sub2video; -- 2.11.0