diff options
author | Marton Balint <cus@passwd.hu> | 2013-11-23 17:48:49 +0100 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2013-11-28 21:30:03 +0100 |
commit | 31bb172be26aa7531a0917994d79ea5dc3709a0b (patch) | |
tree | dce78aa08e0aff93874605de2ec4ed4f1639d612 /ffmpeg.c | |
parent | 4d6f2ff524afc01f2af30677ca271a6387cf8657 (diff) | |
download | ffmpeg-31bb172be26aa7531a0917994d79ea5dc3709a0b.tar.gz |
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@passwd.hu>
Reviewed-by: Nicolas George <george@nsup.org>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r-- | ffmpeg.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -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) |