diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-17 13:08:10 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2006-01-17 13:08:10 +0000 |
| commit | d7010ab56f9b823d56a5a5fa3ba7f7764bbfece4 (patch) | |
| tree | 1cb39d2bea48e3556aa5a1ceca6bf6b4dfbc5547 /lib/dvb/decoder.cpp | |
| parent | 5a00da9dd62f3f51c50287d218374ad18e49761a (diff) | |
| download | enigma2-d7010ab56f9b823d56a5a5fa3ba7f7764bbfece4.tar.gz enigma2-d7010ab56f9b823d56a5a5fa3ba7f7764bbfece4.zip | |
add support for videotext (VBI)
so now the videotext from the TV is useable
(needs new drivers!)
Diffstat (limited to 'lib/dvb/decoder.cpp')
| -rw-r--r-- | lib/dvb/decoder.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index 0f522b2c..bf0014d8 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -301,6 +301,57 @@ eDVBPCR::~eDVBPCR() ::close(m_fd_demux); } +DEFINE_REF(eDVBVText); + +eDVBVText::eDVBVText(eDVBDemux *demux): m_demux(demux) +{ + char filename[128]; +#if HAVE_DVB_API_VERSION < 3 + sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux); +#else + sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); +#endif + m_fd_demux = ::open(filename, O_RDWR); + if (m_fd_demux < 0) + eWarning("%s: %m", filename); +} + +int eDVBVText::startPid(int pid) +{ + if (m_fd_demux < 0) + return -1; + dmx_pes_filter_params pes; + + pes.pid = pid; + pes.input = DMX_IN_FRONTEND; + pes.output = DMX_OUT_DECODER; + pes.pes_type = DMX_PES_TELETEXT; + pes.flags = 0; + if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0) + { + eWarning("video: DMX_SET_PES_FILTER: %m"); + return -errno; + } + if (::ioctl(m_fd_demux, DMX_START) < 0) + { + eWarning("video: DMX_START: %m"); + return -errno; + } + return 0; +} + +void eDVBVText::stop() +{ + if (::ioctl(m_fd_demux, DMX_STOP) < 0) + eWarning("video: DMX_STOP: %m"); +} + +eDVBVText::~eDVBVText() +{ + if (m_fd_demux >= 0) + ::close(m_fd_demux); +} + DEFINE_REF(eTSMPEGDecoder); int eTSMPEGDecoder::setState() @@ -416,6 +467,22 @@ int eTSMPEGDecoder::setState() } m_changed &= ~changeAudio; } + if (m_changed & changeText) + { + if (m_text) + m_text->stop(); + m_text = 0; + if ((m_textpid >= 0) && (m_textpid < 0x1FFF)) + { + m_text = new eDVBVText(m_demux); + if (m_text->startPid(m_textpid)) + { + eWarning("text: startpid failed!"); + res = -1; + } + } + m_changed &= ~changeText; + } #endif return res; } @@ -464,6 +531,16 @@ RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid) return 0; } +RESULT eTSMPEGDecoder::setTextPID(int textpid) +{ + if (m_textpid != textpid) + { + m_changed |= changeText; + m_textpid = textpid; + } + return 0; +} + RESULT eTSMPEGDecoder::setSyncMaster(int who) { return -1; |
