[FFmpeg-cvslog] ffmpeg: ensure that -fix_sub_duration doesnt create subtitles with zero duration

Marton Balint git at videolan.org
Sat Nov 30 05:14:02 CET 2013


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sat Nov 23 17:48:49 2013 +0100| [31bb172be26aa7531a0917994d79ea5dc3709a0b] | committer: Marton Balint

ffmpeg: ensure that -fix_sub_duration doesnt create subtitles with zero duration

When fix_sub_duration is used, and the duration fixing code is generating 0
duration, that is definitely zero, and not undefined or infinite (which may be
the case for decoded AVSubtitles depending on the codec), so it is safe to drop
it.

It fixes teletext subtitle sources, when the subtitles are transmitted twice
after each other for some reason.

Signed-off-by: Marton Balint <cus at passwd.hu>
Reviewed-by: Nicolas George <george at nsup.org>

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

 ffmpeg.c |   12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 105efbc..6411ce3 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1807,19 +1807,23 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
     }
 
     if (ist->fix_sub_duration) {
+        int end = 1;
         if (ist->prev_sub.got_output) {
-            int end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
-                                 1000, AV_TIME_BASE);
+            end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
+                             1000, AV_TIME_BASE);
             if (end < ist->prev_sub.subtitle.end_display_time) {
                 av_log(ist->st->codec, AV_LOG_DEBUG,
-                       "Subtitle duration reduced from %d to %d\n",
-                       ist->prev_sub.subtitle.end_display_time, end);
+                       "Subtitle duration reduced from %d to %d%s\n",
+                       ist->prev_sub.subtitle.end_display_time, end,
+                       end <= 0 ? ", dropping it" : "");
                 ist->prev_sub.subtitle.end_display_time = end;
             }
         }
         FFSWAP(int,        *got_output, ist->prev_sub.got_output);
         FFSWAP(int,        ret,         ist->prev_sub.ret);
         FFSWAP(AVSubtitle, subtitle,    ist->prev_sub.subtitle);
+        if (end <= 0)
+            goto out;
     }
 
     if (!*got_output)



More information about the ffmpeg-cvslog mailing list