diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2010-02-07 12:08:13 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2010-02-07 12:08:13 +0100 |
commit | 978807e4d1873e878f3c23c4dda889c50a753a35 (patch) | |
tree | 040a9352ee61f97632fe53c1a4d37bf4dbbe4687 | |
parent | 184db9ec8a9a5f14876a0049aa2dc36cb2e7a83b (diff) | |
download | vdr-978807e4d1873e878f3c23c4dda889c50a753a35.tar.gz vdr-978807e4d1873e878f3c23c4dda889c50a753a35.tar.bz2 |
Keeping subtitles visible when pausing replay
-rw-r--r-- | CONTRIBUTORS | 1 | ||||
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | device.c | 6 | ||||
-rw-r--r-- | dvbsubtitle.c | 74 | ||||
-rw-r--r-- | dvbsubtitle.h | 4 |
5 files changed, 50 insertions, 38 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d2eb7d32..0455528d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1091,6 +1091,7 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi> for a patch that was used to implement handling the "component descriptor" ("genre") for a patch that was used to implement handling the "parental rating descriptor" suggesting to add plain text error messages to log entries from cOsd::SetAreas() + for keeping subtitles visible when pausing replay Ralf Klueber <ralf.klueber@vodafone.com> for reporting a bug in cutting a recording if there is only a single editing mark @@ -6309,7 +6309,7 @@ Video Disk Recorder Revision History - The files "commands.conf" and "reccmd.conf" can now contain nested lists of commands. See vdr.5 for information about the new file format. -2010-02-06: Version 1.7.13 +2010-02-07: Version 1.7.13 - Updated the Italian OSD texts (thanks to Diego Pierotto). - Changed the position of Sirius 4 to S4.8E in sources.conf (thanks to Alexander Gross). @@ -6352,3 +6352,4 @@ Video Disk Recorder Revision History ------------------------------------------------------------ - Added device definitions to the diseqc.conf file format, so that certain satellite positions can be limited to a given list of devices. +- Keeping subtitles visible when pausing replay (thanks to Rolf Ahrenberg). @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 2.34 2010/02/06 14:34:18 kls Exp $ + * $Id: device.c 2.35 2010/02/07 11:54:42 kls Exp $ */ #include "device.h" @@ -1053,11 +1053,15 @@ void cDevice::Clear(void) void cDevice::Play(void) { Audios.MuteAudio(mute); + if (dvbSubtitleConverter) + dvbSubtitleConverter->Freeze(false); } void cDevice::Freeze(void) { Audios.MuteAudio(true); + if (dvbSubtitleConverter) + dvbSubtitleConverter->Freeze(true); } void cDevice::Mute(void) diff --git a/dvbsubtitle.c b/dvbsubtitle.c index 221523fd..a02a01f3 100644 --- a/dvbsubtitle.c +++ b/dvbsubtitle.c @@ -7,7 +7,7 @@ * Original author: Marco Schlüßler <marco@lordzodiac.de> * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi> * - * $Id: dvbsubtitle.c 2.3 2009/12/05 16:11:54 kls Exp $ + * $Id: dvbsubtitle.c 2.4 2010/02/07 12:08:13 kls Exp $ */ #include "dvbsubtitle.h" @@ -658,6 +658,7 @@ cDvbSubtitleConverter::cDvbSubtitleConverter(void) { dvbSubtitleAssembler = new cDvbSubtitleAssembler; osd = NULL; + frozen = false; pages = new cList<cDvbSubtitlePage>; bitmaps = new cList<cDvbSubtitleBitmaps>; Start(); @@ -685,6 +686,7 @@ void cDvbSubtitleConverter::Reset(void) pages->Clear(); bitmaps->Clear(); DELETENULL(osd); + frozen = false; Unlock(); } @@ -776,46 +778,48 @@ void cDvbSubtitleConverter::Action(void) int LastSetupLevel = setupLevel; cTimeMs Timeout; while (Running()) { - if (osd) { - int NewSetupLevel = setupLevel; - if (Timeout.TimedOut() || LastSetupLevel != NewSetupLevel) { - DELETENULL(osd); - } - LastSetupLevel = NewSetupLevel; - } int WaitMs = 100; - Lock(); - if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { - int64_t STC = cDevice::PrimaryDevice()->GetSTC(); - int64_t Delta = 0; - if (STC >= 0) { - Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC); // some devices only deliver 32 bits - if (Delta > (int64_t(1) << 31)) - Delta -= (int64_t(1) << 32); - else if (Delta < -((int64_t(1) << 31) - 1)) - Delta += (int64_t(1) << 32); - } - else { - //TODO sync on PTS? are there actually devices that don't deliver an STC? + if (!frozen) { + if (osd) { + int NewSetupLevel = setupLevel; + if (Timeout.TimedOut() || LastSetupLevel != NewSetupLevel) { + DELETENULL(osd); + } + LastSetupLevel = NewSetupLevel; } - Delta /= 90; // STC and PTS are in 1/90000s - if (Delta <= MAXDELTA) { - if (Delta <= 0) { - dbgconverter("Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); - if (AssertOsd()) { - sb->Draw(osd); - Timeout.Set(sb->Timeout() * 1000); - dbgconverter("PTS: %lld STC: %lld (%lld) timeout: %d\n", sb->Pts(), cDevice::PrimaryDevice()->GetSTC(), Delta, sb->Timeout()); + Lock(); + if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { + int64_t STC = cDevice::PrimaryDevice()->GetSTC(); + int64_t Delta = 0; + if (STC >= 0) { + Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC); // some devices only deliver 32 bits + if (Delta > (int64_t(1) << 31)) + Delta -= (int64_t(1) << 32); + else if (Delta < -((int64_t(1) << 31) - 1)) + Delta += (int64_t(1) << 32); + } + else { + //TODO sync on PTS? are there actually devices that don't deliver an STC? + } + Delta /= 90; // STC and PTS are in 1/90000s + if (Delta <= MAXDELTA) { + if (Delta <= 0) { + dbgconverter("Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); + if (AssertOsd()) { + sb->Draw(osd); + Timeout.Set(sb->Timeout() * 1000); + dbgconverter("PTS: %lld STC: %lld (%lld) timeout: %d\n", sb->Pts(), cDevice::PrimaryDevice()->GetSTC(), Delta, sb->Timeout()); + } + bitmaps->Del(sb); } - bitmaps->Del(sb); + else if (Delta < WaitMs) + WaitMs = Delta; } - else if (Delta < WaitMs) - WaitMs = Delta; + else + bitmaps->Del(sb); } - else - bitmaps->Del(sb); + Unlock(); } - Unlock(); cCondWait::SleepMs(WaitMs); } } diff --git a/dvbsubtitle.h b/dvbsubtitle.h index 06bdea4d..c6775a9e 100644 --- a/dvbsubtitle.h +++ b/dvbsubtitle.h @@ -6,7 +6,7 @@ * * Original author: Marco Schlüßler <marco@lordzodiac.de> * - * $Id: dvbsubtitle.h 2.1 2008/05/25 14:36:52 kls Exp $ + * $Id: dvbsubtitle.h 2.2 2010/02/07 11:55:14 kls Exp $ */ #ifndef __DVBSUBTITLE_H @@ -25,6 +25,7 @@ private: static int setupLevel; cDvbSubtitleAssembler *dvbSubtitleAssembler; cOsd *osd; + bool frozen; cList<cDvbSubtitlePage> *pages; cList<cDvbSubtitleBitmaps> *bitmaps; tColor yuv2rgb(int Y, int Cb, int Cr); @@ -36,6 +37,7 @@ public: virtual ~cDvbSubtitleConverter(); void Action(void); void Reset(void); + void Freeze(bool Status) { frozen = Status; } int ConvertFragments(const uchar *Data, int Length); // for legacy PES recordings int Convert(const uchar *Data, int Length); static void SetupChanged(void); |