diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2009-08-11 19:28:32 +0200 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2009-08-11 19:28:32 +0200 |
| commit | 5d70fb1fa8db9464b4721f1beeb9f7e421b8308d (patch) | |
| tree | d107f8d75ce104121b51856a63af1ee6cdafaef7 /lib/dvb | |
| parent | 5a5f61e17be833c2b460bb8bc6acc3aa9c21010e (diff) | |
| download | enigma2-5d70fb1fa8db9464b4721f1beeb9f7e421b8308d.tar.gz enigma2-5d70fb1fa8db9464b4721f1beeb9f7e421b8308d.zip | |
add support for rds data on own pids (i.e. hitradio ffh, harmony fm)
Diffstat (limited to 'lib/dvb')
| -rw-r--r-- | lib/dvb/pmt.cpp | 19 | ||||
| -rw-r--r-- | lib/dvb/pmt.h | 4 | ||||
| -rw-r--r-- | lib/dvb/radiotext.cpp | 29 | ||||
| -rw-r--r-- | lib/dvb/radiotext.h | 7 |
4 files changed, 44 insertions, 15 deletions
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index fb81fa4c..a4fa212d 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -184,6 +184,8 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) int first_ac3 = -1; program.defaultAudioStream = 0; + int rdsPid = -1; + audioStream *prev_audio = 0; if ( m_service && !m_service->cacheEmpty() ) { @@ -215,13 +217,15 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) for (es = pmt.getEsInfo()->begin(); es != pmt.getEsInfo()->end(); ++es) { int isaudio = 0, isvideo = 0, issubtitle = 0, forced_video = 0, forced_audio = 0, isteletext = 0; + int streamtype = (*es)->getType(); videoStream video; audioStream audio; audio.component_tag=video.component_tag=-1; video.type = videoStream::vtMPEG2; audio.type = audioStream::atMPEG; + audio.rdsPid = -1; - switch ((*es)->getType()) + switch (streamtype) { case 0x1b: // AVC Video Stream (MPEG4 H264) video.type = videoStream::vtMPEG4_H264; @@ -285,11 +289,14 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) } case 0x06: // PES Private case 0xEA: // TS_PSI_ST_SMPTE_VC1 + { + int num_descriptors = 0; for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin(); desc != (*es)->getDescriptors()->end(); ++desc) { uint8_t tag = (*desc)->getTag(); /* check descriptors to get the exakt stream type. */ + ++num_descriptors; if (!forced_video && !forced_audio) { switch (tag) @@ -458,6 +465,13 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) break; } } + if (!num_descriptors && streamtype == 0x06 && prev_audio) + { + prev_audio->rdsPid = (*es)->getPid(); + eDebug("Rds PID %04x detected ? ! ?", prev_audio->rdsPid); + } + prev_audio = 0; + } default: break; } @@ -496,6 +510,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) first_ac3 = program.audioStreams.size(); program.audioStreams.push_back(audio); + prev_audio = &program.audioStreams.back(); } else continue; @@ -548,6 +563,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) audioStream s; s.type = audioStream::atAC3; s.pid = cached_apid_ac3; + s.rdsPid = -1; program.audioStreams.push_back(s); ++cnt; } @@ -556,6 +572,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program) audioStream s; s.type = audioStream::atMPEG; s.pid = cached_apid_mpeg; + s.rdsPid = -1; program.audioStreams.push_back(s); ++cnt; } diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h index e27135e3..a9ca23f2 100644 --- a/lib/dvb/pmt.h +++ b/lib/dvb/pmt.h @@ -141,7 +141,8 @@ public: struct audioStream { - int pid; + int pid, + rdsPid; // hack for some radio services which transmit radiotext on different pid (i.e. harmony fm, HIT RADIO FFH, ...) enum { atMPEG, atAC3, atDTS, atAAC, atAACHE, atLPCM }; int type; // mpeg2, ac3, dts, ... @@ -188,7 +189,6 @@ public: int pmtPid; int textPid; bool isCrypted() { return !caids.empty(); } - PyObject *createPythonObject(); }; diff --git a/lib/dvb/radiotext.cpp b/lib/dvb/radiotext.cpp index 9f8cf5f0..e9bdd63a 100644 --- a/lib/dvb/radiotext.cpp +++ b/lib/dvb/radiotext.cpp @@ -5,9 +5,9 @@ DEFINE_REF(eDVBRdsDecoder); -eDVBRdsDecoder::eDVBRdsDecoder(iDVBDemux *demux) +eDVBRdsDecoder::eDVBRdsDecoder(iDVBDemux *demux, int type) :msgPtr(0), bsflag(0), qdar_pos(0), t_ptr(0), qdarmvi_show(0), state(0) - ,m_abortTimer(eTimer::create(eApp)) + ,m_type(type), m_pid(-1), m_abortTimer(eTimer::create(eApp)) { setStreamID(0xC0, 0xC0); @@ -16,8 +16,10 @@ eDVBRdsDecoder::eDVBRdsDecoder(iDVBDemux *demux) if (demux->createPESReader(eApp, m_pes_reader)) eDebug("failed to create PES reader!"); - else + else if (type == 0) m_pes_reader->connectRead(slot(*this, &eDVBRdsDecoder::processData), m_read_connection); + else + m_pes_reader->connectRead(slot(*this, &eDVBRdsDecoder::gotAncillaryData), m_read_connection); CONNECT(m_abortTimer->timeout, eDVBRdsDecoder::abortNonAvail); } @@ -196,7 +198,7 @@ void eDVBRdsDecoder::processPESPacket(__u8 *data, int len) m_abortTimer->stop(); int ancillary_len = 1 + data[offs - 1]; offs -= ancillary_len; - gotAncillaryData(data+offs, ancillary_len); + gotAncillaryData(data+offs, ancillary_len-1); } } } @@ -310,13 +312,19 @@ void eDVBRdsDecoder::process_qdar(unsigned char *buf) } } -inline void eDVBRdsDecoder::gotAncillaryData(__u8 *buf, int len) +void eDVBRdsDecoder::gotAncillaryData(const __u8 *buf, int len) { - int cnt=buf[--len]; - while ( cnt-- > 0 ) + if (len <= 0) + return; + int pos = m_type ? 0 : len-1; + while ( len ) { - unsigned char c = buf[--len]; - + unsigned char c = buf[pos]; + + pos += m_type ? 1 : -1; + + --len; + if (bsflag == 1) // byte stuffing { bsflag=2; @@ -638,8 +646,9 @@ std::string eDVBRdsDecoder::getRassPicture(int page, int subpage) int eDVBRdsDecoder::start(int pid) { int ret = -1; - if (m_pes_reader && !(ret = m_pes_reader->start(pid))) + if (m_pes_reader && !(ret = m_pes_reader->start(pid)) && m_type == 0) m_abortTimer->startLongTimer(20); + m_pid = pid; return ret; } diff --git a/lib/dvb/radiotext.h b/lib/dvb/radiotext.h index ace7b6ec..7a73eea3 100644 --- a/lib/dvb/radiotext.h +++ b/lib/dvb/radiotext.h @@ -18,9 +18,11 @@ class eDVBRdsDecoder: public iObject, public ePESParser, public Object unsigned char rass_picture_mask[5]; // 40 bits... (10 * 4 pictures) void addToPictureMask(int id); void removeFromPictureMask(int id); + int m_type; + int m_pid; public: enum { RadioTextChanged, RtpTextChanged, RassInteractivePicMaskChanged, RecvRassSlidePic }; - eDVBRdsDecoder(iDVBDemux *demux); + eDVBRdsDecoder(iDVBDemux *demux, int type); ~eDVBRdsDecoder(); int start(int pid); void connectEvent(const Slot1<void, int> &slot, ePtr<eConnection> &connection); @@ -29,10 +31,11 @@ public: ePyObject getRassPictureMask(); std::string getRassPicture(int page, int subpage); std::string getRassSlideshowPicture() { return "/tmp/RassLast.mvi"; } + int getPid() { return m_pid; } private: void abortNonAvail(); void processPESPacket(__u8 *pkt, int len); - inline void gotAncillaryData(__u8 *data, int len); + void gotAncillaryData(const __u8 *data, int len); void process_qdar(unsigned char*); ePtr<iDVBPESReader> m_pes_reader; ePtr<eConnection> m_read_connection; |
