diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:36:42 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:36:42 +0000 |
| commit | d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5 (patch) | |
| tree | 84d0cacfd0b6c1241c236c7860f7cbd7f26901bb /lib/dvb/demux.cpp | |
| download | enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.tar.gz enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.zip | |
import of enigma2
Diffstat (limited to 'lib/dvb/demux.cpp')
| -rw-r--r-- | lib/dvb/demux.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp new file mode 100644 index 00000000..e1d8bbaf --- /dev/null +++ b/lib/dvb/demux.cpp @@ -0,0 +1,131 @@ +#include <stdio.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <errno.h> +#include <unistd.h> + +#include <linux/dvb/dmx.h> +#include "crc32.h" + +#include <lib/base/eerror.h> +#include <lib/dvb/idvb.h> +#include <lib/dvb/demux.h> +#include <lib/dvb/esection.h> +#include <lib/dvb/decoder.h> + +eDVBDemux::eDVBDemux(int adapter, int demux): adapter(adapter), demux(demux), ref(0) +{ +} + +eDVBDemux::~eDVBDemux() +{ +} + +DEFINE_REF(eDVBDemux) + +RESULT eDVBDemux::createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader) +{ + RESULT res; + reader = new eDVBSectionReader(this, context, res); + if (res) + reader = 0; + return res; +} + +RESULT eDVBDemux::getMPEGDecoder(ePtr<iTSMPEGDecoder> &decoder) +{ + decoder = new eTSMPEGDecoder(this, 0); + return 0; +} + +void eDVBSectionReader::data(int) +{ + __u8 data[4096]; // max. section size + int r; + r = ::read(fd, data, 4096); + if(r < 0) + { + eWarning("ERROR reading section - %m\n"); + return; + } + if (checkcrc) + { + // this check should never happen unless the driver is crappy! + unsigned int c; + if ((c = crc32((unsigned)-1, data, r))) + eFatal("crc32 failed! is %x\n", c); + } + read(data); +} + +eDVBSectionReader::eDVBSectionReader(eDVBDemux *demux, eMainloop *context, RESULT &res): ref(0), demux(demux) +{ + char filename[128]; + sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux); + fd = ::open(filename, O_RDWR); + + if (fd >= 0) + { + notifier=new eSocketNotifier(context, fd, eSocketNotifier::Read); + CONNECT(notifier->activated, eDVBSectionReader::data); + res = 0; + } else + { + perror(filename); + res = errno; + } +} + +DEFINE_REF(eDVBSectionReader) + +eDVBSectionReader::~eDVBSectionReader() +{ + if (notifier) + delete notifier; + if (fd >= 0) + ::close(fd); +} + +RESULT eDVBSectionReader::start(const eDVBSectionFilterMask &mask) +{ + RESULT res; + if (fd < 0) + return -ENODEV; + + dmx_sct_filter_params sct; + + sct.pid = mask.pid; + sct.timeout = 0; + sct.flags = DMX_IMMEDIATE_START; + if (mask.flags & eDVBSectionFilterMask::rfCRC) + { + sct.flags |= DMX_CHECK_CRC; + checkcrc = 1; + } else + checkcrc = 0; + + memcpy(sct.filter.filter, mask.data, DMX_FILTER_SIZE); + memcpy(sct.filter.mask, mask.mask, DMX_FILTER_SIZE); + memcpy(sct.filter.mode, mask.mode, DMX_FILTER_SIZE); + + res = ::ioctl(fd, DMX_SET_FILTER, &sct); + if (!res) + active = 1; + return res; +} + +RESULT eDVBSectionReader::stop() +{ + if (!active) + return -1; + + ::ioctl(fd, DMX_STOP); + + return 0; +} + +RESULT eDVBSectionReader::connectRead(const Slot1<void,const __u8*> &r, ePtr<eConnection> &conn) +{ + conn = new eConnection(read.connect(r)); + return 0; +} |
