X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Fpmt.cpp;h=03e400522599c980f5707c153ed11cc089827d4c;hp=5b19ebda71ac82715f7b553c3617fd6cff795ab4;hb=ba5ec76317a3bd96895506159b0d5bc1a1a6eecc;hpb=0da688aba6cca5cc5b0b4406e384fa9e3345859c diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp index 5b19ebd..03e4005 100644 --- a/lib/dvb/pmt.cpp +++ b/lib/dvb/pmt.cpp @@ -223,13 +223,23 @@ void saveData(int orgid, unsigned char* data, int sectionLength) close(fd); } +#include +#include +#include +#define PACK_VERSION(major,minor,micro) (((major) << 16) + ((minor) << 8) + (micro)) +#define UNPACK_VERSION(version,major,minor,micro) { \ + major = (version)&0xff; \ + minor = (version>>8)&0xff; \ + micro = (version>>16)&0xff; \ +} void eDVBServicePMTHandler::AITready(int error) { eDebug("AITready"); ePtr > ptr; if (!m_AIT.getCurrent(ptr)) { - int orgid = 0, appid = 0; + short profilecode = 0; + int orgid = 0, appid = 0, profileVersion = 0; m_ApplicationName = m_HBBTVUrl = ""; eraseHbbTVApplications(&m_HbbTVApplications); @@ -245,9 +255,11 @@ void eDVBServicePMTHandler::AITready(int error) for (; i != (*it)->getApplicationInformation()->end(); ++i) { std::string hbbtvUrl = "", applicaionName = ""; - + std::string boundaryExtension = ""; + int controlCode = (*i)->getApplicationControlCode(); ApplicationIdentifier * applicationIdentifier = (*i)->getApplicationIdentifier(); + profilecode = 0; orgid = applicationIdentifier->getOrganisationId(); appid = applicationIdentifier->getApplicationId(); eDebug("found applicaions ids >> pid : %x, orgid : %d, appid : %d", m_ait_pid, orgid, appid); @@ -259,7 +271,21 @@ void eDVBServicePMTHandler::AITready(int error) switch ((*desc)->getTag()) { case APPLICATION_DESCRIPTOR: + { + ApplicationDescriptor* applicationDescriptor = (ApplicationDescriptor*)(*desc); + ApplicationProfileList* applicationProfiles = applicationDescriptor->getApplicationProfiles(); + ApplicationProfileConstIterator interactionit = applicationProfiles->begin(); + for(; interactionit != applicationProfiles->end(); ++interactionit) + { + profilecode = (*interactionit)->getApplicationProfile(); + profileVersion = PACK_VERSION( + (*interactionit)->getVersionMajor(), + (*interactionit)->getVersionMinor(), + (*interactionit)->getVersionMicro() + ); + } break; + } case APPLICATION_NAME_DESCRIPTOR: { ApplicationNameDescriptor *nameDescriptor = (ApplicationNameDescriptor*)(*desc); @@ -291,7 +317,6 @@ void eDVBServicePMTHandler::AITready(int error) for(; interactionit != transport->getInteractionTransports()->end(); ++interactionit) { hbbtvUrl = (*interactionit)->getUrlBase()->getUrl(); - if(controlCode == 1) m_HBBTVUrl = hbbtvUrl; break; } break; @@ -314,7 +339,45 @@ void eDVBServicePMTHandler::AITready(int error) } } } - m_HbbTVApplications.push_back(new HbbTVApplicationInfo(controlCode, orgid, appid, hbbtvUrl, applicaionName)); + if(!hbbtvUrl.empty()) + { + char* uu = hbbtvUrl.c_str(); + if(!strncmp(uu, "http://", 7) || !strncmp(uu, "dvb://", 6) || !strncmp(uu, "https://", 8)) + { + if(controlCode == 1) m_HBBTVUrl = hbbtvUrl; + switch(profileVersion) + { + case 65793: + case 66049: + m_HbbTVApplications.push_back(new HbbTVApplicationInfo(controlCode, orgid, appid, hbbtvUrl, applicaionName, profilecode)); + break; + case 1280: + case 65538: + default: + m_HbbTVApplications.push_back(new HbbTVApplicationInfo((-1)*controlCode, orgid, appid, hbbtvUrl, applicaionName, profilecode)); + break; + } + } + else if (!boundaryExtension.empty()) { + if(boundaryExtension.at(boundaryExtension.length()-1) != '/') { + boundaryExtension += "/"; + } + boundaryExtension += hbbtvUrl; + if(controlCode == 1) m_HBBTVUrl = boundaryExtension; + switch(profileVersion) + { + case 65793: + case 66049: + m_HbbTVApplications.push_back(new HbbTVApplicationInfo(controlCode, orgid, appid, boundaryExtension, applicaionName, profilecode)); + break; + case 1280: + case 65538: + default: + m_HbbTVApplications.push_back(new HbbTVApplicationInfo((-1)*controlCode, orgid, appid, boundaryExtension, applicaionName, profilecode)); + break; + } + } + } } } @@ -392,12 +455,13 @@ PyObject *eDVBServicePMTHandler::getHbbTVApplications(void) { for(HbbTVApplicationInfoListConstIterator infoiter = m_HbbTVApplications.begin() ; infoiter != m_HbbTVApplications.end() ; ++infoiter) { - ePyObject tuple = PyTuple_New(5); + ePyObject tuple = PyTuple_New(6); PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong((*infoiter)->m_ControlCode)); PyTuple_SET_ITEM(tuple, 1, PyString_FromString((*infoiter)->m_ApplicationName.c_str())); PyTuple_SET_ITEM(tuple, 2, PyString_FromString((*infoiter)->m_HbbTVUrl.c_str())); PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong((*infoiter)->m_OrgId)); PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong((*infoiter)->m_AppId)); + PyTuple_SET_ITEM(tuple, 5, PyInt_FromLong((*infoiter)->m_ProfileCode)); PyList_Append(ret, tuple); Py_DECREF(tuple); }