static eServiceReferenceDVB getServiceByID(const char *id) { eTransponderList *tl=eDVB::getInstance()->settings->getTransponders(); if (!tl) return eServiceReferenceDVB(); int dvb_namespace, original_network_id, transport_stream_id, service_id, service_type; if (sscanf(id, "S:%x:%x:%x:%x:%x", &dvb_namespace, &original_network_id, &transport_stream_id, &service_id, &service_type)!=4) if (sscanf(id, "E:%x:%x:%x:%x:%x", &dvb_namespace, &original_network_id, &transport_stream_id, &service_id, &service_type)!=4) return eServiceReferenceDVB(); return eServiceReferenceDVB(eDVBNamespace(dvb_namespace), eTransportStreamID(transport_stream_id), eOriginalNetworkID(original_network_id), eServiceID(service_id), service_type); }
eDVBNamespace eDVBScan::buildNamespace(eOriginalNetworkID onid, eTransportStreamID tsid, unsigned long hash) { int orb_pos = (hash >> 16) & 0xFFFF; if (orb_pos == 0xFFFF) // cable { if (eConfigManager::getConfigBoolValue("config.usage.subnetwork_cable", true)) hash &= ~0xFFFF; } else if (orb_pos == 0xEEEE) // terrestrial { if (eConfigManager::getConfigBoolValue("config.usage.subnetwork_terrestrial", true)) hash &= ~0xFFFF; } else if (eConfigManager::getConfigBoolValue("config.usage.subnetwork", true) && isValidONIDTSID(orb_pos, onid, tsid)) // on valid ONIDs, ignore frequency ("sub network") part hash &= ~0xFFFF; return eDVBNamespace(hash); }
RESULT eServiceTS::start() { ePtr<eDVBResourceManager> rmgr; eDVBResourceManager::getInstance(rmgr); // FIXMEE hardcoded chid... this only works for one eServiceWebTS eDVBChannelID chid; chid.dvbnamespace = eDVBNamespace(0); chid.transport_stream_id = eTransportStreamID(0); chid.original_network_id = eOriginalNetworkID(0); chid.pvr_source = "/eServiceTS"; if (rmgr->allocateChannel(chid, m_channel)) { eDebug("Cannot allocate pvr channel"); return -1; } if (m_channel->getDemux(m_decodedemux, iDVBChannel::capDecode) != 0) { eDebug("Cannot allocate decode-demux"); return -1; } if (m_decodedemux->getMPEGDecoder(m_decoder, 1) != 0) { eDebug("Cannot allocate MPEGDecoder"); return -1; } if (m_destfd == -1) { m_destfd = m_decodedemux->openDVR(O_WRONLY); if (m_destfd < 0) { eDebug("openDVR failed"); return -1; } } m_decoder->setVideoPID(m_vpid, eDVBVideo::MPEG2); m_decoder->setAudioPID(m_apid, eDVBAudio::aMPEG); m_streamthread = new eStreamThread(); CONNECT(m_streamthread->m_event, eServiceTS::recv_event); m_decoder->pause(); if (unpause() != 0) return -1; m_event(this, evStart); return 0; }
eBitrateCalc::eBitrateCalc(int pid, int dvbnamespace, int tsid, int onid, int refreshintervall, int buffer_size): m_size(0), m_refresh_intervall(refreshintervall) { m_send_data_timer = eTimer::create(eApp); CONNECT(m_send_data_timer->timeout, eBitrateCalc::sendDataTimerTimeoutCB); eDVBChannelID chid; //(eDVBNamespace(dvbnamespace), eTransportStreamID(tsid), eOriginalNetworkID(onid)); <-- weird, that does not work chid.dvbnamespace = eDVBNamespace(dvbnamespace); chid.transport_stream_id = eTransportStreamID(tsid); chid.original_network_id = eOriginalNetworkID(onid); ePtr<eDVBResourceManager> res_mgr; eDVBResourceManager::getInstance(res_mgr); eUsePtr<iDVBChannel> channel; int success = 0; m_reader = NULL; if (!res_mgr->allocateChannel(chid, channel, false)) { ePtr<iDVBDemux> demux; if (!channel->getDemux(demux)) { if (!demux->createPESReader(eApp, m_reader)) { if (!m_reader->connectRead(slot(*this, &eBitrateCalc::dataReady), m_pes_connection)) { channel->connectStateChange(slot(*this, &eBitrateCalc::stateChange), m_channel_connection); success = 1; } else eDebug("[eBitrateCalc] connect pes reader failed..."); } else eDebug("[eBitrateCalc] create PES reader failed..."); } else eDebug("[eBitrateCalc] getDemux failed..."); } else { eDebug("[eBitrateCalc] allocate channel failed...trying pvr_allocate_demux"); ePtr<eDVBAllocatedDemux> pvr_allocated_demux; int i = 0; if (!res_mgr->allocateDemux(NULL,pvr_allocated_demux,i)) { eDVBDemux &demux = pvr_allocated_demux->get(); if (!demux.createPESReader(eApp, m_reader)) { if (!m_reader->connectRead(slot(*this, &eBitrateCalc::dataReady), m_pes_connection)) success = 1; else eDebug("[eBitrateCalc] connect pes reader failed..."); } else eDebug("[eBitrateCalc] create PES reader failed..."); } else eDebug("[eBitrateCalc] allocate pvr_allocated_demux failed..."); } if (m_reader && success) { clock_gettime(CLOCK_MONOTONIC, &m_start); m_reader->setBufferSize(buffer_size); m_reader->start(pid); m_send_data_timer->start(m_refresh_intervall, true); } else sendData(-1,0); }