summaryrefslogtreecommitdiff
authorNicolas George <nicolas.george@normalesup.org>2012-11-29 19:25:37 (GMT)
committer Nicolas George <nicolas.george@normalesup.org>2012-12-12 14:05:50 (GMT)
commit0f236345fb4619312281bd2ce736e9327eb9321d (patch)
treee0465fc531e0b01a3a769081c5c10fa378b5bb11
parente69e780cde8d6ab5fc5f3f6eac056793e7988ef4 (diff)
downloadffmpeg-0f236345fb4619312281bd2ce736e9327eb9321d.zip
ffmpeg-0f236345fb4619312281bd2ce736e9327eb9321d.tar.gz
ffmpeg-0f236345fb4619312281bd2ce736e9327eb9321d.tar.bz2
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
-rw-r--r--ffmpeg.c20
-rw-r--r--ffmpeg.h1
2 files changed, 18 insertions, 3 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 4b278a2..956f5b6 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 d260222..afef6fb 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;