Stop erroneous addition of text subtitles to the lists (when
authorCarl Hetherington <cth@carlh.net>
Tue, 1 Mar 2016 01:00:16 +0000 (01:00 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 1 Mar 2016 01:00:16 +0000 (01:00 +0000)
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
src/lib/ffmpeg.cc
src/lib/ffmpeg.h
src/lib/ffmpeg_examiner.cc

index 8bea6f63b4293526e314ad95497d53b9bab8fc46..fbe438a44b8349ae05f1a80a72cd094e56fee859 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-01  Carl Hetherington  <cth@carlh.net>
+
+       * Fix hang / slowdown when previewing subtitles in some
+       cases (#812).
+
 2016-02-29  Carl Hetherington  <cth@carlh.net>
 
        * Updated fr_FR translation from Thierry Journet.
index 29dda1b9eaa0bbab513bd110d2dfe41c402ae43a..9d6921dcfbf33e2fab4f3ade9887ca66ad4bf6e7 100644 (file)
@@ -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;
index 9795b2229769468414fb8562278eed148dca55a5..43efcf74f456fd031cb900aab1ae3c5d58c65238 100644 (file)
@@ -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;
 
index 850b8ba5facb2dae7d400d1c8a53c0584ea38b3d..abca5fee7936cedbc14e9a30de28fa8db82ac378 100644 (file)
@@ -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);
                        }
                }