[FFmpeg-cvslog] ffmpeg: sub2video: use start and end time.

Nicolas George git at videolan.org
Wed Dec 12 15:07:02 CET 2012


ffmpeg | branch: master | Nicolas George <nicolas.george at normalesup.org> | Thu Nov 29 20:25:37 2012 +0100| [0f236345fb4619312281bd2ce736e9327eb9321d] | committer: Nicolas George

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0f236345fb4619312281bd2ce736e9327eb9321d
---

 ffmpeg.c |   20 +++++++++++++++++---
 ffmpeg.h |    1 +
 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;



More information about the ffmpeg-cvslog mailing list