|
|
|
@@ -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) |
|
|
|
|