aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2013-11-23 17:48:49 +0100
committerMarton Balint <cus@passwd.hu>2013-11-28 21:30:03 +0100
commit31bb172be26aa7531a0917994d79ea5dc3709a0b (patch)
treedce78aa08e0aff93874605de2ec4ed4f1639d612
parent4d6f2ff524afc01f2af30677ca271a6387cf8657 (diff)
downloadffmpeg-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>
-rw-r--r--ffmpeg.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 105efbcb22..6411ce3039 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)