From f6d62e0c4feb176b73bdf4b3b10785e1b29f58f2 Mon Sep 17 00:00:00 2001
From: Richard <peper03@yahoo.com>
Date: Tue, 19 Mar 2013 12:36:21 +0100
Subject: [PATCH] Ensure that DVD subpictures that don't explicitly set the
 'end' time are still shown, and that sufficient buffering
 is available for full-speed animation in subpictures. Also,
 handle 'CHG_COLCON' command by skipping over the data. 
 This should prevent any issues caused by incorrectly
 interpreting the data as subpicture commands.

---
 mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp |   14 ++++++++++----
 mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp |    1 +
 mythtv/libs/libmythtv/subtitlereader.cpp    |    4 ++--
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
index a7ef500..7ffcad6 100644
--- a/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
+++ b/mythtv/libs/libmythtv/DVD/dvdringbuffer.cpp
@@ -1331,8 +1331,8 @@ bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
     bool force_subtitle_display = false;
     sub->rects = NULL;
     sub->num_rects = 0;
-    sub->start_display_time = 0;
-    sub->end_display_time = 0;
+    sub->start_display_time = startTime;
+    sub->end_display_time = startTime;
 
     cmd_pos = GETBE16(spu_pkt + 2);
     while ((cmd_pos + 4) < buf_size)
@@ -1350,8 +1350,6 @@ bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
             {
                 case 0x00:
                     force_subtitle_display = true;
-                    sub->start_display_time = startTime;
-                    sub->end_display_time   = 0xFFFFFFFF;
                 break;
                 case 0x01:
                     sub->start_display_time = ((date << 10) / 90) + startTime;
@@ -1402,6 +1400,14 @@ bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles,
                     pos +=4;
                 }
                 break;
+                case 0x07:
+                {
+                    if ((buf_size - pos) < 2)
+                        goto fail;
+
+                    pos += GETBE16(spu_pkt + pos);
+                }
+                break;
                 case 0xff:
                 default:
                 goto the_end;
diff --git a/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp b/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
index 2faf2dd..11a0add 100644
--- a/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
+++ b/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
@@ -529,6 +529,7 @@ void MythDVDPlayer::DisplayDVDButton(void)
     }
 
     if (dvdSubtitle &&
+        (dvdSubtitle->end_display_time > dvdSubtitle->start_display_time) &&
         (dvdSubtitle->end_display_time < currentFrame->timecode))
     {
         expired = true;
diff --git a/mythtv/libs/libmythtv/subtitlereader.cpp b/mythtv/libs/libmythtv/subtitlereader.cpp
index ba43df5..ef820b7 100644
--- a/mythtv/libs/libmythtv/subtitlereader.cpp
+++ b/mythtv/libs/libmythtv/subtitlereader.cpp
@@ -60,10 +60,10 @@ bool SubtitleReader::AddAVSubtitle(const AVSubtitle &subtitle,
     m_AVSubtitles.buffers.push_back(subtitle);
     // in case forced subtitles aren't displayed, avoid leaking by
     // manually clearing the subtitles
-    if (m_AVSubtitles.buffers.size() > 20)
+    if (m_AVSubtitles.buffers.size() > 40)
     {
         LOG(VB_GENERAL, LOG_ERR,
-            "SubtitleReader: >20 AVSubtitles queued - clearing.");
+            "SubtitleReader: >40 AVSubtitles queued - clearing.");
         clearsubs = true;
     }
     m_AVSubtitles.lock.unlock();
-- 
1.7.9.5

