make code inline
[enigma2.git] / lib / dvb / radiotext.cpp
index 6ab2fdd..87498da 100644 (file)
@@ -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))
@@ -113,9 +115,19 @@ void eDVBRadioTextParser::processPESPacket(__u8 *data, int len)
 
                pos += frame_size;
 
-               int offs = protection_bit ? pos - 1 : pos - 3;
+#if 0
+//             eDebug("protection_bit ? %d", protection_bit);
+//             int offs = protection_bit ? pos - 1 : pos - 3;
+//             if (data[offs] != 0xFD)
+//                     offs += 2;
+//             eDebug("%02x %02x %02x %02x %02x", data[offs-2], data[offs-1], data[offs], data[offs+1], data[offs+2]);
+#else
+               int offs = pos - 1;
+#endif
+
                if (data[offs] == 0xFD)
                {
+                       m_abortTimer.stop();
                        int ancillary_len = 1 + data[offs - 1];
                        offs -= ancillary_len;
                        while(offs < pos)
@@ -124,7 +136,7 @@ void eDVBRadioTextParser::processPESPacket(__u8 *data, int len)
        }
 }
 
-void eDVBRadioTextParser::gotAncillaryByte(__u8 data)
+inline void eDVBRadioTextParser::gotAncillaryByte(__u8 data)
 {
        buf[bytesread]=data;
        bytesread+=1;
@@ -250,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();
+}