Added initial support for x_ci parameter.

This commit is contained in:
Rolf Ahrenberg 2015-01-09 15:42:03 +02:00
parent 5fef77518e
commit 695dd53bfc
10 changed files with 31 additions and 12 deletions

10
README
View File

@ -67,8 +67,14 @@ S19.2E 3 Astra 1KR/1L/1M/2C
=> Signal source = 3
A channel can be assigned into a specific SAT>IP frontend by giving the
identifier number in RID field of a channels.conf entry.
Valid range: 1 ... 8
identifier number in RID field of a channels.conf entry:
FE = RID % 100
Valid range: 1 ... 99
A channel can be assigned into a specific integrated CI slot by giving
the identifier number in RID field of a channels.conf entry:
CI# = (RID / 100) % 10
Valid range: 1 ... 9
Setup menu:

View File

@ -331,8 +331,8 @@ bool cSatipDevice::SetChannelDevice(const cChannel *channelP, bool liveViewP)
}
cSatipDiscover::GetInstance()->SetTransponder(server, channelP->Transponder());
if (pTunerM && pTunerM->SetSource(server, *params, deviceIndexM)) {
deviceNameM = cString::sprintf("%s %d %s", *DeviceType(), deviceIndexM, *cSatipDiscover::GetInstance()->GetServerString(server));
channelM = *channelP;
deviceNameM = cString::sprintf("%s %d %s", *DeviceType(), deviceIndexM, *cSatipDiscover::GetInstance()->GetServerString(server));
return true;
}
}
@ -438,6 +438,13 @@ int cSatipDevice::GetPmtPid(void)
return pid;
}
int cSatipDevice::GetCISlot(void)
{
int slot = channelM.Ca() ? (channelM.Rid() / 100) % 10 : 0;
debug11("%s slot=%d name=%s [device %u]", __PRETTY_FUNCTION__, slot, channelM.Name(), deviceIndexM);
return slot;
}
uchar *cSatipDevice::GetData(int *availableP)
{
debug16("%s [device %u]", __PRETTY_FUNCTION__, deviceIndexM);

View File

@ -109,6 +109,7 @@ public:
virtual void WriteData(u_char *bufferP, int lengthP);
virtual int GetId(void);
virtual int GetPmtPid(void);
virtual int GetCISlot(void);
};
#endif // __SATIP_DEVICE_H

View File

@ -15,6 +15,7 @@ public:
virtual void WriteData(u_char *bufferP, int lengthP) = 0;
virtual int GetId(void) = 0;
virtual int GetPmtPid(void) = 0;
virtual int GetCISlot(void) = 0;
private:
cSatipDeviceIf(const cSatipDeviceIf&);

2
log.h
View File

@ -32,7 +32,7 @@
#define debug9(x...) void( SatipConfig.IsTraceMode(cSatipConfig::eTraceModeDebug9) ? dsyslog("SATIP9: " x) : void() )
// 0x0200: RTCP packets
#define debug10(x...) void( SatipConfig.IsTraceMode(cSatipConfig::eTraceModeDebug10) ? dsyslog("SATIP10: " x) : void() )
// 0x0400: PMT
// 0x0400: CI
#define debug11(x...) void( SatipConfig.IsTraceMode(cSatipConfig::eTraceModeDebug11) ? dsyslog("SATIP11: " x) : void() )
// 0x0800: TBD
#define debug12(x...) void( SatipConfig.IsTraceMode(cSatipConfig::eTraceModeDebug12) ? dsyslog("SATIP12: " x) : void() )

View File

@ -191,8 +191,8 @@ cString GetTransponderUrlParameters(const cChannel *channelP)
ST("C *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesCable);
ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesTerrestrial);
ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Transmission(), SatipTransmissionValues);
if (channelP->Rid() > 0)
q += snprintf(q, STBUFLEFT, "&fe=%d", channelP->Rid());
if ((channelP->Rid() % 100) > 0)
q += snprintf(q, STBUFLEFT, "&fe=%d", channelP->Rid() % 100);
#undef ST
return buffer;
}

View File

@ -47,7 +47,7 @@ cSatipServer::cSatipServer(const char *addressP, const char *modelP, const char
info("Malfunctioning '%s' server detected! Please, fix the firmware.", *descriptionM);
// These devices support the X_PMT protocol extension
if (strstr(*descriptionM, "OctopusNet")) // Digital Devices OctopusNet
quirkM |= eSatipQuirkUseXPMT;
quirkM |= eSatipQuirkUseXCI;
}
char *s, *p = strdup(*modelM);
char *r = strtok_r(p, ",", &s);

View File

@ -37,7 +37,7 @@ public:
eSatipQuirkSessionId = 0x01,
eSatipQuirkPlayPids = 0x02,
eSatipQuirkForceLock = 0x04,
eSatipQuirkUseXPMT = 0x08,
eSatipQuirkUseXCI = 0x08,
eSatipQuirkMask = 0x0F
};
enum eSatipModelType {

View File

@ -104,7 +104,7 @@ cSatipServerInfo::cSatipServerInfo(cSatipServer *serverP)
addressM(serverP ? serverP->Address() : "---"),
modelM(serverP ? serverP->Model() : "---"),
descriptionM(serverP ? serverP->Description() : "---"),
ciExtensionM(serverP && serverP->Quirk(cSatipServer::eSatipQuirkUseXPMT) ? trVDR("yes") : trVDR("no")),
ciExtensionM(serverP && serverP->Quirk(cSatipServer::eSatipQuirkUseXCI) ? trVDR("yes") : trVDR("no")),
createdM(serverP ? serverP->Created() : 0)
{
SetMenuCategory(mcSetupPlugins);

10
tuner.c
View File

@ -391,7 +391,7 @@ bool cSatipTuner::UpdatePids(bool forceP)
if (((forceP && pidsM.Size()) || (pidUpdateCacheM.TimedOut() && (addPidsM.Size() || delPidsM.Size()))) &&
!isempty(*streamAddrM) && (streamIdM > 0)) {
cString uri = cString::sprintf("rtsp://%s/stream=%d", *streamAddrM, streamIdM);
bool usexpmt = (SatipConfig.GetCIExtension() && !!(currentServerM && currentServerM->Quirk(cSatipServer::eSatipQuirkUseXPMT)));
bool useci = (SatipConfig.GetCIExtension() && !!(currentServerM && currentServerM->Quirk(cSatipServer::eSatipQuirkUseXCI)));
bool usedummy = !!(currentServerM && currentServerM->Quirk(cSatipServer::eSatipQuirkPlayPids));
if (forceP || usedummy) {
if (pidsM.Size())
@ -405,7 +405,7 @@ bool cSatipTuner::UpdatePids(bool forceP)
if (delPidsM.Size())
uri = cString::sprintf("%s%sdelpids=%s", *uri, addPidsM.Size() ? "&" : "?", *delPidsM.ListPids());
}
if (usexpmt) {
if (useci) {
// CI extension parameters:
// - x_pmt : specifies the PMT of the service you want the CI to decode
// - x_ci : specfies which CI slot (1..n) to use
@ -413,8 +413,12 @@ bool cSatipTuner::UpdatePids(bool forceP)
// CI slot released automatically if the stream is released,
// but not when used retuning to another channel
int pid = deviceM->GetPmtPid();
if ((pid > 0) && (pid != pmtPidM))
if ((pid > 0) && (pid != pmtPidM)) {
int slot = deviceM->GetCISlot();
uri = cString::sprintf("%s&x_pmt=%d", *uri, pid);
if (slot > 0)
uri = cString::sprintf("%s&x_ci=%d", *uri, slot);
}
pmtPidM = pid;
}
if (!rtspM.Play(*uri))