From ae0864cccb9adf697a9f9a947fef21538c01978a Mon Sep 17 00:00:00 2001 From: koivo Date: Mon, 22 Apr 2024 18:57:36 +0200 Subject: [PATCH] [streamserver] just a try --- lib/dvb/streamserver.cpp | 112 +++++++++++++++++++++++++++++++++++---- lib/dvb/streamserver.h | 5 +- 2 files changed, 106 insertions(+), 11 deletions(-) diff --git a/lib/dvb/streamserver.cpp b/lib/dvb/streamserver.cpp index 1c7a97ccca..b72860ede5 100644 --- a/lib/dvb/streamserver.cpp +++ b/lib/dvb/streamserver.cpp @@ -19,6 +19,7 @@ #include #include +#include eStreamClient::eStreamClient(eStreamServer *handler, int socket, const std::string remotehost) : parent(handler), encoderFd(-1), streamFd(socket), streamThread(NULL), m_remotehost(remotehost), m_timeout(eTimer::create(eApp)) @@ -52,13 +53,13 @@ void eStreamClient::start() void eStreamClient::set_socket_option(int fd, int optid, int option) { if(::setsockopt(fd, SOL_SOCKET, optid, &option, sizeof(option))) - eDebug("Failed to set socket option: %m"); + eDebug("[eStreamClient] Failed to set socket option: %m"); } void eStreamClient::set_tcp_option(int fd, int optid, int option) { if(::setsockopt(fd, SOL_TCP, optid, &option, sizeof(option))) - eDebug("Failed to set TCP parameter: %m"); + eDebug("[eStreamClient] Failed to set TCP parameter: %m"); } void eStreamClient::notifier(int what) @@ -160,8 +161,16 @@ void eStreamClient::notifier(int what) set_tcp_option(streamFd, TCP_USER_TIMEOUT, 10 * 1000); if (serviceref.substr(0, 10) == "file?file=") /* convert openwebif stream reqeust back to serviceref */ - serviceref = std::string("1:0:1:0:0:0:0:0:0:0:") + serviceref.substr(10); - + serviceref = "1:0:1:0:0:0:0:0:0:0:" + serviceref.substr(10); + /* Strip session ID from URL if it exists, PLi streaming can not handle it */ + pos = serviceref.find("&sessionid="); + if (pos != std::string::npos) { + serviceref.erase(pos, std::string::npos); + } + pos = serviceref.find("?sessionid="); + if (pos != std::string::npos) { + serviceref.erase(pos, std::string::npos); + } pos = serviceref.find('?'); if (pos == std::string::npos) { @@ -211,7 +220,8 @@ void eStreamClient::notifier(int what) int interlaced = 0; int aspectratio = 0; int buffersize; - std::string vcodec, acodec; + std::string vcodec = "h264"; + std::string acodec = "aac"; sscanf(request.substr(pos).c_str(), "&bitrate=%d", &bitrate); pos = request.find("&width="); @@ -249,14 +259,13 @@ void eStreamClient::notifier(int what) acodec = acodec.substr(0, pos); } } - encoderFd = -1; - if(eEncoder::getInstance()) + if (eEncoder::getInstance()) encoderFd = eEncoder::getInstance()->allocateEncoder(serviceref, buffersize, bitrate, width, height, framerate, !!interlaced, aspectratio, vcodec, acodec); - if(encoderFd >= 0) + if (encoderFd >= 0) { m_serviceref = serviceref; m_useencoder = true; @@ -370,6 +379,89 @@ bool eStreamServer::stopStreamClient(const std::string remotehost, const std::st return false; } +PyObject *eStreamServer::getConnectedClientDetails(int index) +{ + ePyObject ret; + + eUsePtr stream_channel; + eServiceReferenceDVB dvbservice; + + int idx = 0; + for (eSmartPtrList::iterator it = clients.begin(); it != clients.end(); ++it) + { + if(idx == index) + { + dvbservice = it->getDVBService(); + break; + } + } + + if(dvbservice) + { + std::list list; + ePtr res_mgr; + if ( !eDVBResourceManager::getInstance( res_mgr ) ) + { + res_mgr->getActiveChannels(list); + } + + if(list.size()) { + + eDVBChannelID channel; + dvbservice.getChannelID(channel); + + for (std::list::iterator i(list.begin()); i != list.end(); ++i) + { + std::string channelid = i->m_channel_id.toString(); + if (channelid == channel.toString().c_str()) + { + stream_channel = i->m_channel; + break; + } + } + + } + + } + + ret = PyDict_New(); + + if(stream_channel) + { + + ePtr fe; + if(!stream_channel->getFrontend(fe)) + { + + ePtr fdata; + fe->getFrontendData(fdata); + if (fdata) + { + ePyObject fret = PyDict_New();; + frontendDataToDict(fret, fdata); + PutToDict(ret, "frontend", fret); + } + + + ePtr tdata; + fe->getTransponderData(tdata, true); + if (tdata) + { + ePyObject tret = PyDict_New();; + transponderDataToDict(tret, tdata); + PutToDict(ret, "transponder", tret); + } + + } + + } + + return ret; + +} + + + PyObject *eStreamServer::getConnectedClients() { ePyObject ret; @@ -379,8 +471,8 @@ PyObject *eStreamServer::getConnectedClients() for (eSmartPtrList::iterator it = clients.begin(); it != clients.end(); ++it) { ePyObject tuple = PyTuple_New(3); - PyTuple_SET_ITEM(tuple, 0, PyUnicode_FromString((char *)it->getRemoteHost().c_str())); - PyTuple_SET_ITEM(tuple, 1, PyUnicode_FromString((char *)it->getServiceref().c_str())); + PyTuple_SET_ITEM(tuple, 0, PyString_FromString((char *)it->getRemoteHost().c_str())); + PyTuple_SET_ITEM(tuple, 1, PyString_FromString((char *)it->getServiceref().c_str())); PyTuple_SET_ITEM(tuple, 2, PyLong_FromLong(it->isUsingEncoder())); PyList_SET_ITEM(ret, idx++, tuple); } diff --git a/lib/dvb/streamserver.h b/lib/dvb/streamserver.h index 7cc6cb804d..adcd85daf7 100644 --- a/lib/dvb/streamserver.h +++ b/lib/dvb/streamserver.h @@ -10,7 +10,7 @@ class eStreamServer; class eStreamClient: public eDVBServiceStream { - private: +private: static void set_socket_option(int fd, int optid, int option); static void set_tcp_option(int fd, int optid, int option); @@ -43,6 +43,7 @@ class eStreamClient: public eDVBServiceStream void start(); std::string getRemoteHost(); std::string getServiceref(); + eServiceReferenceDVB getDVBService() { return m_ref; } bool isUsingEncoder(); }; #endif @@ -72,6 +73,8 @@ class eStreamServer: public eServerSocket void stopStream(); bool stopStreamClient(const std::string remotehost, const std::string serviceref); PyObject *getConnectedClients(); + PyObject *getConnectedClientDetails(int index); + }; #endif /* __DVB_STREAMSERVER_H_ */