#include #include #include #include #include #include #include DEFINE_REF(eServiceFactoryDVB) eServiceFactoryDVB::eServiceFactoryDVB(): ref(0) { ePtr sc; eServiceCenter::getInstance(sc); if (sc) sc->addServiceFactory(eServiceFactoryDVB::id, this); } eServiceFactoryDVB::~eServiceFactoryDVB() { ePtr sc; eServiceCenter::getInstance(sc); if (sc) sc->removeServiceFactory(eServiceFactoryDVB::id); } RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr &ptr) { RESULT res; // check resources... ptr = new eDVBServicePlay(ref); res = ptr->start(); if (res) { ptr = 0; return res; } return 0; } RESULT eServiceFactoryDVB::record(const eServiceReference &, ePtr &ptr) { ptr = 0; return -1; } RESULT eServiceFactoryDVB::list(const eServiceReference &, ePtr &ptr) { ptr = 0; return -1; } eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): ref(0), m_reference(ref) { CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent); eDebug("DVB start (play)"); } eDVBServicePlay::~eDVBServicePlay() { eDebug("DVB stop (play)"); } void eDVBServicePlay::serviceEvent(int event) { eDebug("service event %d", event); switch (event) { case eDVBServicePMTHandler::eventNewProgramInfo: { int vpid = -1, apid = -1, pcrpid = -1; eDVBServicePMTHandler::program program; if (m_serviceHandler.getProgramInfo(program)) eDebug("getting program info failed."); else { eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size()); if (!program.videoStreams.empty()) { eDebugNoNewLine(" ("); for (std::vector::const_iterator i(program.videoStreams.begin()); i != program.videoStreams.end(); ++i) { if (vpid == -1) vpid = i->pid; if (i != program.videoStreams.begin()) eDebugNoNewLine(", "); eDebugNoNewLine("%04x", i->pid); } eDebugNoNewLine(")"); } eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size()); if (!program.audioStreams.empty()) { eDebugNoNewLine(" ("); for (std::vector::const_iterator i(program.audioStreams.begin()); i != program.audioStreams.end(); ++i) { if (apid == -1) apid = i->pid; if (i != program.audioStreams.begin()) eDebugNoNewLine(", "); eDebugNoNewLine("%04x", i->pid); } eDebugNoNewLine(")"); } eDebug(", and the pcr pid is %04x", program.pcrPid); if (program.pcrPid != 0x1fff) pcrpid = program.pcrPid; } if (!m_decoder) { ePtr demux; m_serviceHandler.getDemux(demux); if (demux) demux->getMPEGDecoder(m_decoder); } if (m_decoder) { m_decoder->setVideoPID(vpid); m_decoder->setAudioPID(apid, 0); m_decoder->setSyncPCR(pcrpid); m_decoder->start(); } break; } } } RESULT eDVBServicePlay::start() { eDebug("starting DVB service"); m_serviceHandler.tune((eServiceReferenceDVB&)m_reference); return 0; } RESULT eDVBServicePlay::getIPausableService(ePtr &ptr) { // not yet possible, maybe later... ptr = 0; return -1; } DEFINE_REF(eDVBServicePlay) eAutoInitP0 init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");