From d4a3610bf6cc725b724d6ca2677ae086387f0c76 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Mon, 15 Jan 2007 22:59:25 +0000 Subject: [PATCH] abort radiotext parser when 20 seconds no ancillary data is received --- lib/dvb/radiotext.cpp | 17 +++++++++++++---- lib/dvb/radiotext.h | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/dvb/radiotext.cpp b/lib/dvb/radiotext.cpp index c165907c..34a5acd6 100644 --- a/lib/dvb/radiotext.cpp +++ b/lib/dvb/radiotext.cpp @@ -7,6 +7,7 @@ DEFINE_REF(eDVBRadioTextParser); eDVBRadioTextParser::eDVBRadioTextParser(iDVBDemux *demux) :bytesread(0), ptr(0), p1(-1), p2(-1), msgPtr(0), state(0) + ,m_abortTimer(eApp) { setStreamID(0xC0, 0xC0); @@ -14,6 +15,7 @@ eDVBRadioTextParser::eDVBRadioTextParser(iDVBDemux *demux) eDebug("failed to create PES reader!"); else m_pes_reader->connectRead(slot(*this, &eDVBRadioTextParser::processData), m_read_connection); + CONNECT(m_abortTimer.timeout, eDVBRadioTextParser::abortNonAvail); } #define SWAP(x) ((x<<8)|(x>>8)) @@ -125,6 +127,7 @@ void eDVBRadioTextParser::processPESPacket(__u8 *data, int len) if (data[offs] == 0xFD) { + m_abortTimer.stop(); int ancillary_len = 1 + data[offs - 1]; offs -= ancillary_len; while(offs < pos) @@ -259,9 +262,15 @@ void eDVBRadioTextParser::gotAncillaryByte(__u8 data) int eDVBRadioTextParser::start(int pid) { - if (m_pes_reader) - return m_pes_reader->start(pid); - else - return -1; + int ret = -1; + if (m_pes_reader && !(ret = m_pes_reader->start(pid))) + m_abortTimer.startLongTimer(20); + return ret; } +void eDVBRadioTextParser::abortNonAvail() +{ + eDebug("no ancillary data in audio stream... abort radiotext pes parser"); + if (m_pes_reader) + m_pes_reader->stop(); +} diff --git a/lib/dvb/radiotext.h b/lib/dvb/radiotext.h index ba42ded1..11fa7e48 100644 --- a/lib/dvb/radiotext.h +++ b/lib/dvb/radiotext.h @@ -18,11 +18,13 @@ public: void connectUpdatedRadiotext(const Slot0 &slot, ePtr &connection); const char *getCurrentText() { return msgPtr ? (const char*)message : ""; } private: + void abortNonAvail(); void processPESPacket(__u8 *pkt, int len); void gotAncillaryByte(__u8 data); ePtr m_pes_reader; ePtr m_read_connection; Signal0 m_updated_radiotext; + eTimer m_abortTimer; }; #endif -- 2.30.2