diff options
-rw-r--r-- | ffmpeg.c | 20 | ||||
-rw-r--r-- | ffmpeg.h | 1 |
2 files changed, 18 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) @@ -246,6 +246,7 @@ typedef struct InputStream { struct sub2video { int64_t last_pts; + int64_t end_pts; AVFilterBufferRef *ref; int w, h; } sub2video; |