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
|
b
|
bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles, |
1331 | 1331 | bool force_subtitle_display = false; |
1332 | 1332 | sub->rects = NULL; |
1333 | 1333 | sub->num_rects = 0; |
1334 | | sub->start_display_time = 0; |
1335 | | sub->end_display_time = 0; |
| 1334 | sub->start_display_time = startTime; |
| 1335 | sub->end_display_time = startTime; |
1336 | 1336 | |
1337 | 1337 | cmd_pos = GETBE16(spu_pkt + 2); |
1338 | 1338 | while ((cmd_pos + 4) < buf_size) |
… |
… |
bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles, |
1350 | 1350 | { |
1351 | 1351 | case 0x00: |
1352 | 1352 | force_subtitle_display = true; |
1353 | | sub->start_display_time = startTime; |
1354 | | sub->end_display_time = 0xFFFFFFFF; |
1355 | 1353 | break; |
1356 | 1354 | case 0x01: |
1357 | 1355 | sub->start_display_time = ((date << 10) / 90) + startTime; |
… |
… |
bool DVDRingBuffer::DecodeSubtitles(AVSubtitle *sub, int *gotSubtitles, |
1402 | 1400 | pos +=4; |
1403 | 1401 | } |
1404 | 1402 | break; |
| 1403 | case 0x07: |
| 1404 | { |
| 1405 | if ((buf_size - pos) < 2) |
| 1406 | goto fail; |
| 1407 | |
| 1408 | pos += GETBE16(spu_pkt + pos); |
| 1409 | } |
| 1410 | break; |
1405 | 1411 | case 0xff: |
1406 | 1412 | default: |
1407 | 1413 | goto the_end; |
diff --git a/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp b/mythtv/libs/libmythtv/DVD/mythdvdplayer.cpp
index 2faf2dd..11a0add 100644
a
|
b
|
void MythDVDPlayer::DisplayDVDButton(void) |
529 | 529 | } |
530 | 530 | |
531 | 531 | if (dvdSubtitle && |
| 532 | (dvdSubtitle->end_display_time > dvdSubtitle->start_display_time) && |
532 | 533 | (dvdSubtitle->end_display_time < currentFrame->timecode)) |
533 | 534 | { |
534 | 535 | expired = true; |
diff --git a/mythtv/libs/libmythtv/subtitlereader.cpp b/mythtv/libs/libmythtv/subtitlereader.cpp
index ba43df5..ef820b7 100644
a
|
b
|
bool SubtitleReader::AddAVSubtitle(const AVSubtitle &subtitle, |
60 | 60 | m_AVSubtitles.buffers.push_back(subtitle); |
61 | 61 | // in case forced subtitles aren't displayed, avoid leaking by |
62 | 62 | // manually clearing the subtitles |
63 | | if (m_AVSubtitles.buffers.size() > 20) |
| 63 | if (m_AVSubtitles.buffers.size() > 40) |
64 | 64 | { |
65 | 65 | LOG(VB_GENERAL, LOG_ERR, |
66 | | "SubtitleReader: >20 AVSubtitles queued - clearing."); |
| 66 | "SubtitleReader: >40 AVSubtitles queued - clearing."); |
67 | 67 | clearsubs = true; |
68 | 68 | } |
69 | 69 | m_AVSubtitles.lock.unlock(); |