diff options
| author | Carl Hetherington <cth@carlh.net> | 2016-03-01 01:00:16 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2016-03-01 01:00:16 +0000 |
| commit | 0914bfdbfc498d99821c2cd0ca3a4f9a184d07b5 (patch) | |
| tree | c47583043a15279e0933f6697deefb7768ba352c /src/lib | |
| parent | 8b7080da3ff8b6df0df7f1858c144c163cbaf4c6 (diff) | |
Stop erroneous addition of text subtitles to the lists (when
an image subtitle is completed with a rect count of zero) which
subsequently cause hangs while the decoder looks for these
phantom text subtitles. Fixes #812.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/ffmpeg.cc | 3 | ||||
| -rw-r--r-- | src/lib/ffmpeg.h | 4 | ||||
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 10 |
3 files changed, 9 insertions, 8 deletions
diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index 29dda1b9e..9d6921dcf 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -288,8 +288,9 @@ FFmpeg::subtitle_id (AVSubtitle const & sub) return digester.get (); } +/** @return true if sub starts a new image subtitle */ bool -FFmpeg::subtitle_is_image (AVSubtitle const & sub) +FFmpeg::subtitle_starts_image (AVSubtitle const & sub) { bool image = false; bool text = false; diff --git a/src/lib/ffmpeg.h b/src/lib/ffmpeg.h index 9795b2229..43efcf74f 100644 --- a/src/lib/ffmpeg.h +++ b/src/lib/ffmpeg.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,7 +58,7 @@ protected: static FFmpegSubtitlePeriod subtitle_period (AVSubtitle const & sub); static std::string subtitle_id (AVSubtitle const & sub); - static bool subtitle_is_image (AVSubtitle const & sub); + static bool subtitle_starts_image (AVSubtitle const & sub); boost::shared_ptr<const FFmpegContent> _ffmpeg_content; diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 850b8ba5f..abca5fee7 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -217,13 +217,13 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti if (avcodec_decode_subtitle2 (context, &sub, &frame_finished, &_packet) >= 0 && frame_finished) { string id = subtitle_id (sub); FFmpegSubtitlePeriod const period = subtitle_period (sub); - bool const image = subtitle_is_image (sub); + bool const starts_image = subtitle_starts_image (sub); LastSubtitleMap::iterator last = _last_subtitle_start.find (stream); if (last != _last_subtitle_start.end() && last->second) { /* We have seen the start of a subtitle but not yet the end. Whatever this is finishes the previous subtitle, so add it */ - if (image) { + if (last->second->image) { stream->add_image_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from)); } else { stream->add_text_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from)); @@ -233,17 +233,17 @@ FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubti _last_subtitle_start[stream] = optional<SubtitleStart> (); } else { /* This is just another subtitle, so we start again */ - _last_subtitle_start[stream] = SubtitleStart (id, image, period.from); + _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from); } } else if (sub.num_rects == 1) { if (period.to) { - if (image) { + if (starts_image) { stream->add_image_subtitle (id, ContentTimePeriod (period.from, period.to.get ())); } else { stream->add_text_subtitle (id, ContentTimePeriod (period.from, period.to.get ())); } } else { - _last_subtitle_start[stream] = SubtitleStart (id, image, period.from); + _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from); } } |
