From 0914bfdbfc498d99821c2cd0ca3a4f9a184d07b5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 1 Mar 2016 01:00:16 +0000 Subject: [PATCH] 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. --- ChangeLog | 5 +++++ src/lib/ffmpeg.cc | 3 ++- src/lib/ffmpeg.h | 4 ++-- src/lib/ffmpeg_examiner.cc | 10 +++++----- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8bea6f63b..fbe438a44 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-03-01 Carl Hetherington + + * Fix hang / slowdown when previewing subtitles in some + cases (#812). + 2016-02-29 Carl Hetherington * Updated fr_FR translation from Thierry Journet. 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 + Copyright (C) 2013-2016 Carl Hetherington 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 _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= 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 (); } 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); } } -- 2.30.2