diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-11-29 23:25:37 +0400 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-12-12 18:05:50 +0400 |
commit | 0f236345fb4619312281bd2ce736e9327eb9321d (patch) | |
tree | e0465fc531e0b01a3a769081c5c10fa378b5bb11 /ffmpeg.c | |
parent | e69e780cde8d6ab5fc5f3f6eac056793e7988ef4 (diff) |
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.
Diffstat (limited to 'ffmpeg.c')
-rw-r--r-- | ffmpeg.c | 20 |
1 files changed, 17 insertions, 3 deletions
@@ -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) |