diff -ub a/ttxtsubs.c b/ttxtsubs.c --- a/ttxtsubs.c 2012-05-06 10:32:56.407162991 +0300 +++ b/ttxtsubs.c 2012-05-08 23:38:08.247246386 +0300 @@ -316,8 +316,6 @@ bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value) { if(!strcasecmp(Name, "Display")) { globals.mDoDisplay = atoi(Value); globals.mRealDoDisplay=globals.mDoDisplay; } - else if(!strcasecmp(Name, "ReplayDelay")) globals.mReplayDelay = atoi(Value); - else if(!strcasecmp(Name, "ReplayTsDelay")) globals.mReplayTsDelay = atoi(Value); else if(!strcasecmp(Name, "MainMenuEntry")) globals.mMainMenuEntry = atoi(Value); else if(!strcasecmp(Name, "FontSize")) globals.mFontSize = atoi(Value); else if(!strcasecmp(Name, "OutlineWidth")) globals.mOutlineWidth = atoi(Value); @@ -519,8 +517,6 @@ } Add(new cMenuEditBoolItem(tr("Display Subtitles"), &mConf.mDoDisplay)); - Add(new cMenuEditIntItem(tr("Replay Delay (PES)"), &mConf.mReplayDelay, 0, 5000)); - Add(new cMenuEditIntItem(tr("Replay Delay (TS)"), &mConf.mReplayTsDelay, 0, 5000)); if(mConf.mMainMenuEntry < 0 || mConf.mMainMenuEntry >= numMainMenuAlts) mConf.mMainMenuEntry = 0; // menu item segfaults if out of range Add(new cMenuEditStraItem(tr("Main Menu Alternative"), &mConf.mMainMenuEntry, @@ -578,8 +574,6 @@ } SetupStore("Display", mConf.mDoDisplay); - SetupStore("ReplayDelay", mConf.mReplayDelay); - SetupStore("ReplayTsDelay", mConf.mReplayTsDelay); SetupStore("MainMenuEntry", mConf.mMainMenuEntry); SetupStore("FontSize", mConf.mFontSize); SetupStore("OutlineWidth", mConf.mOutlineWidth); diff -ub a/ttxtsubsdisplay.c b/ttxtsubsdisplay.c --- a/ttxtsubsdisplay.c 2012-05-06 10:32:56.407162991 +0300 +++ b/ttxtsubsdisplay.c 2012-05-12 00:08:46.483203829 +0300 @@ -31,6 +31,7 @@ #include #include #include +#include #include "ttxtsubsglobals.h" #include "ttxtsubsdisplay.h" @@ -164,7 +165,7 @@ } -void cTtxtSubsDisplay::TtxtData(const uint8_t *Data, uint64_t sched_time) +void cTtxtSubsDisplay::TtxtData(const uint8_t *Data, uint32_t sched_pts) { int mp; int mag; // X in ETSI EN 300 706 @@ -256,9 +257,19 @@ if (_pageState != collecting) { - int diff = sched_time - cTimeMs::Now(); - //printf("Got sched_time %llx, diff %d\n", sched_time, diff); - if (diff > 10) cCondWait::SleepMs(diff); + uint32_t pts = cDevice::PrimaryDevice()->GetSTC(); + int diff = ((int64_t)sched_pts - (int64_t)pts) / 90; + if( diff > 15000 || diff < -15000 ) + { + isyslog( "ttxtsubs: too long delay (%d ms), discarding\n", diff ); + return; + } + while( diff > 10 ) + { + cCondWait::SleepMs(min(diff,250)); + if( !_doDisplay ) return; + diff -= 250; + } } _pageState = collecting; diff -ub a/ttxtsubsdisplayer.c b/ttxtsubsdisplayer.c --- a/ttxtsubsdisplayer.c 2012-05-06 10:32:56.407162991 +0300 +++ b/ttxtsubsdisplayer.c 2012-05-06 11:34:36.287264711 +0300 @@ -31,7 +31,7 @@ mDisp(new cTtxtSubsDisplay()), mGetMutex(), mGetCond(), - mRingBuf(94000, true), + mRingBuf(188000, true), mRun(0) { mDisp->SetPage(textpage); @@ -59,9 +59,7 @@ f = mRingBuf.Get(); if(f) { - uint64_t sched_time; - memcpy(&sched_time, f->Data() + 46, sizeof(sched_time)); - mDisp->TtxtData(f->Data(), sched_time); + mDisp->TtxtData(f->Data(), f->Pts()); mRingBuf.Drop(f); } else { // wait for more data @@ -102,6 +100,7 @@ void cTtxtSubsPlayer::PES_data(uchar *p, int Length, bool IsPesRecording, const struct tTeletextSubtitlePage teletextSubtitlePages[], int pageCount) { int i; + int64_t pts = 0; //printf("cTtxtSubsPlayer: len: %d\n", Length); // XXX @@ -136,14 +135,21 @@ if(mHasFilteredStream && !mFoundLangPage) SearchLanguagePage(p, Length); + if ((p[6] & 0xC0) == 0x80 && (p[7] & 0x80)) { + //Copied from xineliboutput/tools/pes.c + pts = ((int64_t)(p[ 9] & 0x0E)) << 29 ; + pts |= ((int64_t) p[10]) << 22 ; + pts |= ((int64_t)(p[11] & 0xFE)) << 14 ; + pts |= ((int64_t) p[12]) << 7 ; + pts |= ((int64_t)(p[13] & 0xFE)) >> 1 ; + } + // payload_unit_start_indicator for(i = 1; (i*46) < Length ; i++) { if(0xff == p[i*46]) // stuffing data continue; - uint64_t sched_time=cTimeMs::Now() + (IsPesRecording ? globals.replayDelay() : globals.replayTsDelay()); - cFrame *f = new cFrame(p + i*46, 46 + sizeof(sched_time)); - memcpy(f->Data() + 46, &sched_time, sizeof(sched_time)); + cFrame *f = new cFrame(p + i*46, 46, ftUnknown, -1, pts); if (mRingBuf.Put(f)) { mGetCond.Broadcast(); diff -ub a/ttxtsubsdisplay.h b/ttxtsubsdisplay.h --- a/ttxtsubsdisplay.h 2012-05-06 10:32:56.407162991 +0300 +++ b/ttxtsubsdisplay.h 2012-05-06 10:42:33.023662919 +0300 @@ -45,7 +45,7 @@ void SetPage(int Pageno); // Pageno is 0x000 to 0x799 void Hide(void); void Show(void); - void TtxtData(const uint8_t *, uint64_t sched_time = 0); + void TtxtData(const uint8_t *, uint32_t sched_pts = 0); protected: void ShowOSD(); diff -ub a/ttxtsubsglobals.h b/ttxtsubsglobals.h --- a/ttxtsubsglobals.h 2012-05-06 10:32:56.407162991 +0300 +++ b/ttxtsubsglobals.h 2012-05-06 11:36:43.159264874 +0300 @@ -39,9 +39,7 @@ mRealDoDisplay(1), mMainMenuEntry(0), mFontSize(20), - mOutlineWidth(2), - mReplayDelay(0), - mReplayTsDelay(0) + mOutlineWidth(2) { memset(mLanguages, 0, sizeof(mLanguages)); memset(mHearingImpaireds, 0, sizeof(mHearingImpaireds)); @@ -56,8 +54,6 @@ int (*hearingImpaireds(void))[MAXLANGUAGES][2] {return &mHearingImpaireds;} int langChoise(const char *lang, const int HI); - int replayDelay(void) {return mReplayDelay;} - int replayTsDelay(void) {return mReplayTsDelay;} protected: int mDoDisplay; @@ -67,8 +63,6 @@ int mOutlineWidth; char mLanguages[MAXLANGUAGES][2][4]; int mHearingImpaireds[MAXLANGUAGES][2]; - int mReplayDelay; - int mReplayTsDelay; }; extern cTtxtsubsConf globals;