+#if HAVE_DVB_API_VERSION < 3
+ if (m_fd_video >= 0)
+ ::close(m_fd_video);
+#endif
+}
+
+void eDVBVideo::video_event(int)
+{
+#if HAVE_DVB_API_VERSION >= 3
+ struct video_event evt;
+ eDebugNoNewLine("VIDEO_GET_EVENT - ");
+ if (::ioctl(m_fd, VIDEO_GET_EVENT, &evt) < 0)
+ eDebug("failed (%m)");
+ else
+ {
+ eDebug("ok");
+ if (evt.type == VIDEO_EVENT_SIZE_CHANGED)
+ {
+ struct iTSMPEGDecoder::videoEvent event;
+ event.type = iTSMPEGDecoder::videoEvent::eventSizeChanged;
+ event.aspect = evt.u.size.aspect_ratio;
+ event.height = evt.u.size.h;
+ event.width = evt.u.size.w;
+ /* emit */ m_event(event);
+ }
+ else if (evt.type == VIDEO_EVENT_FRAME_RATE_CHANGED)
+ {
+ struct iTSMPEGDecoder::videoEvent event;
+ event.type = iTSMPEGDecoder::videoEvent::eventFrameRateChanged;
+ event.framerate = evt.u.frame_rate;
+ /* emit */ m_event(event);
+ }
+ else if (evt.type == 16 /*VIDEO_EVENT_PROGRESSIVE_CHANGED*/)
+ {
+ struct iTSMPEGDecoder::videoEvent event;
+ event.type = iTSMPEGDecoder::videoEvent::eventProgressiveChanged;
+ event.progressive = evt.u.frame_rate;
+ /* emit */ m_event(event);
+ }
+ else
+ eDebug("unhandled DVBAPI Video Event %d", evt.type);
+ }
+#else
+#warning "FIXMEE!! Video Events not implemented for old api"
+#endif
+}
+
+RESULT eDVBVideo::connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn)
+{
+ conn = new eConnection(this, m_event.connect(event));
+ return 0;
+}
+
+DEFINE_REF(eDVBPCR);
+
+eDVBPCR::eDVBPCR(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);
+}
+
+#if HAVE_DVB_API_VERSION < 3
+int eDVBPCR::setPid(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_PCR;
+ pes.flags = 0;
+
+ eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid);
+ if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
+ {
+ eDebug("failed (%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ return 0;
+}
+
+int eDVBPCR::startPid()
+{
+ if (m_fd_demux < 0)
+ return -1;
+ eDebugNoNewLine("DEMUX_START - pcr - ");
+ if (::ioctl(m_fd_demux, DMX_START) < 0)
+ {
+ eDebug("failed (%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ return 0;
+}
+#else
+int eDVBPCR::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_PCR;
+ pes.flags = 0;
+ eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - pcr - ", pid);
+ if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
+ {
+ eDebug("failed (%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ eDebugNoNewLine("DEMUX_START - pcr - ");
+ if (::ioctl(m_fd_demux, DMX_START) < 0)
+ {
+ eDebug("failed (%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ return 0;
+}
+#endif
+
+void eDVBPCR::stop()
+{
+ eDebugNoNewLine("DEMUX_STOP - pcr - ");
+ if (::ioctl(m_fd_demux, DMX_STOP) < 0)
+ eDebug("failed(%m)");
+ else
+ eDebug("ok");
+}
+
+eDVBPCR::~eDVBPCR()
+{
+ if (m_fd_demux >= 0)
+ ::close(m_fd_demux);
+}
+
+DEFINE_REF(eDVBTText);
+
+eDVBTText::eDVBTText(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 eDVBTText::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;
+
+ eDebugNoNewLine("DMX_SET_PES_FILTER(0x%02x) - ttx - ", pid);
+ if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
+ {
+ eDebug("failed(%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ eDebugNoNewLine("DEMUX_START - pcr - ");
+ if (::ioctl(m_fd_demux, DMX_START) < 0)
+ {
+ eDebug("failed(%m)");
+ return -errno;
+ }
+ eDebug("ok");
+ return 0;
+}
+
+void eDVBTText::stop()
+{
+ eDebugNoNewLine("DEMUX_STOP - ttx - ");
+ if (::ioctl(m_fd_demux, DMX_STOP) < 0)
+ eDebug("failed(%m)");
+ else
+ eDebug("ok");
+}
+
+eDVBTText::~eDVBTText()
+{
+ if (m_fd_demux >= 0)
+ ::close(m_fd_demux);