Fixed a logic bug in RCS2 Handling that would cause the NetworkId in RMT to be always 0 when carried via GSE.
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m36s
Some checks failed
🚀 Pack skyscraper8 / make-zip (push) Failing after 1m36s
This commit is contained in:
parent
61b238a4aa
commit
5d0da389a6
@ -46,7 +46,7 @@ namespace skyscraper8.GS.GSE_BFBS
|
|||||||
Context.Rcs2Output.OnRcs2Nit(gseTableStructure.InteractiveNetworkId, nit);
|
Context.Rcs2Output.OnRcs2Nit(gseTableStructure.InteractiveNetworkId, nit);
|
||||||
return;
|
return;
|
||||||
case 0x41:
|
case 0x41:
|
||||||
Rmt rmt = new Rmt(ms, true);
|
Rmt rmt = new Rmt(ms, true, gseTableStructure.InteractiveNetworkId);
|
||||||
if (!rmt.Valid)
|
if (!rmt.Valid)
|
||||||
{
|
{
|
||||||
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.RmtInvalid);
|
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.RmtInvalid);
|
||||||
|
|||||||
@ -16,7 +16,7 @@ namespace skyscraper5.src.InteractionChannel.Model
|
|||||||
{
|
{
|
||||||
private static TsDescriptorUnpacker tsDescriptorUnpacker;
|
private static TsDescriptorUnpacker tsDescriptorUnpacker;
|
||||||
|
|
||||||
public Rmt(MemoryStream ms, bool gseMode = false)
|
public Rmt(MemoryStream ms, bool gseMode = false, ushort gseNetworkId = 0x0000)
|
||||||
{
|
{
|
||||||
if (tsDescriptorUnpacker == null)
|
if (tsDescriptorUnpacker == null)
|
||||||
tsDescriptorUnpacker = TsDescriptorUnpacker.GetInstance();
|
tsDescriptorUnpacker = TsDescriptorUnpacker.GetInstance();
|
||||||
@ -60,6 +60,10 @@ namespace skyscraper5.src.InteractionChannel.Model
|
|||||||
byte sectionNumber = ms.ReadUInt8();
|
byte sectionNumber = ms.ReadUInt8();
|
||||||
byte lastSectionNumber = ms.ReadUInt8();
|
byte lastSectionNumber = ms.ReadUInt8();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetworkId = gseNetworkId;
|
||||||
|
}
|
||||||
|
|
||||||
byte byteC = ms.ReadUInt8();
|
byte byteC = ms.ReadUInt8();
|
||||||
int reservedFutureUseB = (byteC & 0xf0) >> 4;
|
int reservedFutureUseB = (byteC & 0xf0) >> 4;
|
||||||
|
|||||||
@ -17,6 +17,7 @@ using skyscraper5.Scte35;
|
|||||||
using skyscraper5.Skyscraper.Equipment;
|
using skyscraper5.Skyscraper.Equipment;
|
||||||
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
||||||
using skyscraper5.Skyscraper.Net;
|
using skyscraper5.Skyscraper.Net;
|
||||||
|
using skyscraper5.src.InteractionChannel.Model;
|
||||||
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
|
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
|
||||||
using skyscraper5.T2MI.Packets;
|
using skyscraper5.T2MI.Packets;
|
||||||
using skyscraper5.Teletext.Wss;
|
using skyscraper5.Teletext.Wss;
|
||||||
@ -231,6 +232,6 @@ namespace skyscraper5.Skyscraper.Scraper
|
|||||||
void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer);
|
void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer);
|
||||||
void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer);
|
void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer);
|
||||||
void OnDvbSisTdt(int sourcePid, DateTime? utcTime);
|
void OnDvbSisTdt(int sourcePid, DateTime? utcTime);
|
||||||
|
void OnRcs2Rmt(Rmt rmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2428,26 +2428,18 @@ namespace skyscraper5.Skyscraper.Scraper
|
|||||||
|
|
||||||
public void OnRcsMap(Rmt rmt)
|
public void OnRcsMap(Rmt rmt)
|
||||||
{
|
{
|
||||||
if (rmt.Linkages != null)
|
UiJunction?.EnableUiFeature(SkyscraperUiFeature.RcsAnalysis);
|
||||||
|
UiJunction?.OnRcs2Rmt(rmt);
|
||||||
|
if (!DataStorage.TestForRmt(rmt))
|
||||||
{
|
{
|
||||||
foreach(_0x4a_LinkageDescriptor linkage in rmt.Linkages)
|
DataStorage.InsertRmt(rmt);
|
||||||
{
|
foreach (_0x4a_LinkageDescriptor linkage in rmt.Linkages)
|
||||||
if (!DataStorage.TestForRmtLinkage(linkage))
|
|
||||||
{
|
{
|
||||||
LogEvent(SkyscraperContextEvent.RmtLinkage, String.Format("Interactive Network #{0} -> ONID {1}, TSID {2}", linkage.InteractiveNetworkId, linkage.OriginalNetworkId, linkage.TransportStreamId));
|
LogEvent(SkyscraperContextEvent.RmtLinkage, String.Format("Interactive Network #{0} -> ONID {1}, TSID {2}", linkage.InteractiveNetworkId, linkage.OriginalNetworkId, linkage.TransportStreamId));
|
||||||
DataStorage.InsertRmtLinkage(linkage);
|
|
||||||
}
|
}
|
||||||
}
|
foreach (Rmt.TransportStream transportStream in rmt.TransportStreams)
|
||||||
}
|
|
||||||
if (rmt.TransportStreams != null)
|
|
||||||
{
|
|
||||||
foreach(Rmt.TransportStream transportStream in rmt.TransportStreams)
|
|
||||||
{
|
|
||||||
if (!DataStorage.TestForRmtTransportStream(rmt.NetworkId, transportStream))
|
|
||||||
{
|
{
|
||||||
LogEvent(SkyscraperContextEvent.RmtTransportStream, String.Format("{0} -> {1},{2}", rmt.NetworkId, transportStream.OriginalNetworkId, transportStream.TransportStreamId));
|
LogEvent(SkyscraperContextEvent.RmtTransportStream, String.Format("{0} -> {1},{2}", rmt.NetworkId, transportStream.OriginalNetworkId, transportStream.TransportStreamId));
|
||||||
DataStorage.InsertRmtTransportStream(rmt.NetworkId, transportStream);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ namespace skyscraper8.Skyscraper.Scraper
|
|||||||
BlockstreamAnalysis,
|
BlockstreamAnalysis,
|
||||||
IpTrafficAnalysis,
|
IpTrafficAnalysis,
|
||||||
GseAnalysis,
|
GseAnalysis,
|
||||||
DvbNipAnalyis
|
DvbNipAnalyis,
|
||||||
|
RcsAnalysis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -137,14 +137,16 @@ namespace skyscraper8.Skyscraper.Scraper.Storage
|
|||||||
void StoreTerminalBurstTimePlan(ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp);
|
void StoreTerminalBurstTimePlan(ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp);
|
||||||
bool TestForCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry);
|
bool TestForCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry);
|
||||||
void InsertCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry);
|
void InsertCmtEntry(ushort interactiveNetworkId, Cmt.CmtEntry entry);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Supposed to figure out the Transmission Standard from a stored RMT.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="networkId">The RCS Network ID to figure out the Transmission Standard for</param>
|
||||||
|
/// <returns>0 if the transmission standard is unknown or couldn't be figured out for any reason. Otherwise according to spec</returns>
|
||||||
int GetRmtTransmissionStandard(ushort networkId);
|
int GetRmtTransmissionStandard(ushort networkId);
|
||||||
byte[] GetTmst(ushort interactiveNetworkId);
|
byte[] GetTmst(ushort interactiveNetworkId);
|
||||||
void InsertTmst(ushort interactiveNetworkId, byte[] modes);
|
void InsertTmst(ushort interactiveNetworkId, byte[] modes);
|
||||||
void UpdateTmst(ushort interactiveNetworkId, byte[] modes);
|
void UpdateTmst(ushort interactiveNetworkId, byte[] modes);
|
||||||
bool TestForRmtLinkage(_0x4a_LinkageDescriptor linkage);
|
|
||||||
void InsertRmtLinkage(_0x4a_LinkageDescriptor linkage);
|
|
||||||
bool TestForRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream);
|
|
||||||
void InsertRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream);
|
|
||||||
bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe);
|
bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe);
|
||||||
void StoreSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe);
|
void StoreSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe);
|
||||||
bool TestForFrameComposition(ushort interactiveNetworkId, Fct.Frame frame);
|
bool TestForFrameComposition(ushort interactiveNetworkId, Fct.Frame frame);
|
||||||
@ -224,5 +226,7 @@ namespace skyscraper8.Skyscraper.Scraper.Storage
|
|||||||
void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor);
|
void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor);
|
||||||
bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
|
bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
|
||||||
void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
|
void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
|
||||||
|
bool TestForRmt(Rmt rmt);
|
||||||
|
void InsertRmt(Rmt rmt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1484,26 +1484,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TestForRmtLinkage(_0x4a_LinkageDescriptor linkage)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InsertRmtLinkage(_0x4a_LinkageDescriptor linkage)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TestForRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InsertRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
|
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
@ -2028,5 +2008,15 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem
|
|||||||
FileInfo fi = new FileInfo(saneFilename);
|
FileInfo fi = new FileInfo(saneFilename);
|
||||||
return File.ReadAllBytes(fi.FullName);
|
return File.ReadAllBytes(fi.FullName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool TestForRmt(Rmt rmt)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InsertRmt(Rmt rmt)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1446,20 +1446,21 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
|
|||||||
cmtEntries[interactiveNetworkId].Add(entry);
|
cmtEntries[interactiveNetworkId].Add(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool rmtWasSeen;
|
|
||||||
public int GetRmtTransmissionStandard(ushort networkId)
|
public int GetRmtTransmissionStandard(ushort networkId)
|
||||||
{
|
{
|
||||||
if (!rmtWasSeen)
|
if (rmts == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (_rmtTransportStreams[networkId] == null)
|
if (rmts[networkId] == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
HashSet<Rmt.TransportStream> rmtSet = _rmtTransportStreams[networkId];
|
if (rmts[networkId].TransportStreams == null)
|
||||||
foreach (Rmt.TransportStream transportStream in rmtSet)
|
return 0;
|
||||||
|
|
||||||
|
foreach(Rmt.TransportStream ts in rmts[networkId].TransportStreams)
|
||||||
{
|
{
|
||||||
if (transportStream.SatelliteForwardLink != null)
|
if (ts.SatelliteForwardLink != null)
|
||||||
return (int)transportStream.SatelliteForwardLink.TransmissionStandard;
|
return (int)ts.SatelliteForwardLink.TransmissionStandard;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -1487,46 +1488,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashSet<_0x4a_LinkageDescriptor> _rmtLinkages;
|
|
||||||
public bool TestForRmtLinkage(_0x4a_LinkageDescriptor linkage)
|
|
||||||
{
|
|
||||||
if (_rmtLinkages == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return _rmtLinkages.Contains(linkage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InsertRmtLinkage(_0x4a_LinkageDescriptor linkage)
|
|
||||||
{
|
|
||||||
if (_rmtLinkages == null)
|
|
||||||
_rmtLinkages = new HashSet<_0x4a_LinkageDescriptor>();
|
|
||||||
|
|
||||||
_rmtLinkages.Add(linkage);
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashSet<Rmt.TransportStream>[] _rmtTransportStreams;
|
|
||||||
public bool TestForRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
|
|
||||||
{
|
|
||||||
if (_rmtTransportStreams == null)
|
|
||||||
return false;
|
|
||||||
if (_rmtTransportStreams[networkId] == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return _rmtTransportStreams[networkId].Contains(transportStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void InsertRmtTransportStream(ushort networkId, Rmt.TransportStream transportStream)
|
|
||||||
{
|
|
||||||
if (_rmtTransportStreams == null)
|
|
||||||
_rmtTransportStreams = new HashSet<Rmt.TransportStream>[ushort.MaxValue];
|
|
||||||
if (_rmtTransportStreams[networkId] == null)
|
|
||||||
_rmtTransportStreams[networkId] = new HashSet<Rmt.TransportStream>();
|
|
||||||
|
|
||||||
_rmtTransportStreams[networkId].Add(transportStream);
|
|
||||||
if (transportStream.SatelliteForwardLink != null)
|
|
||||||
rmtWasSeen = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private HashSet<Sct.Superframe>[] _sctSuperframes;
|
private HashSet<Sct.Superframe>[] _sctSuperframes;
|
||||||
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
|
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
|
||||||
{
|
{
|
||||||
@ -2137,5 +2098,20 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
|
|||||||
|
|
||||||
_dvbiServices.Add(service);
|
_dvbiServices.Add(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Rmt[] rmts;
|
||||||
|
public bool TestForRmt(Rmt rmt)
|
||||||
|
{
|
||||||
|
if (rmts == null)
|
||||||
|
return false;
|
||||||
|
return rmts[rmt.NetworkId] != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InsertRmt(Rmt rmt)
|
||||||
|
{
|
||||||
|
if (rmts == null)
|
||||||
|
rmts = new Rmt[ushort.MaxValue];
|
||||||
|
rmts[ushort.MaxValue] = rmt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user