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

This commit is contained in:
feyris-tan 2026-03-18 20:30:13 +01:00
parent 61b238a4aa
commit 5d0da389a6
8 changed files with 65 additions and 97 deletions

View File

@ -46,7 +46,7 @@ namespace skyscraper8.GS.GSE_BFBS
Context.Rcs2Output.OnRcs2Nit(gseTableStructure.InteractiveNetworkId, nit);
return;
case 0x41:
Rmt rmt = new Rmt(ms, true);
Rmt rmt = new Rmt(ms, true, gseTableStructure.InteractiveNetworkId);
if (!rmt.Valid)
{
Context.Rcs2Output.OnInteractionChannelError(InteractionChannelErrorState.RmtInvalid);

View File

@ -16,7 +16,7 @@ namespace skyscraper5.src.InteractionChannel.Model
{
private static TsDescriptorUnpacker tsDescriptorUnpacker;
public Rmt(MemoryStream ms, bool gseMode = false)
public Rmt(MemoryStream ms, bool gseMode = false, ushort gseNetworkId = 0x0000)
{
if (tsDescriptorUnpacker == null)
tsDescriptorUnpacker = TsDescriptorUnpacker.GetInstance();
@ -60,6 +60,10 @@ namespace skyscraper5.src.InteractionChannel.Model
byte sectionNumber = ms.ReadUInt8();
byte lastSectionNumber = ms.ReadUInt8();
}
else
{
NetworkId = gseNetworkId;
}
byte byteC = ms.ReadUInt8();
int reservedFutureUseB = (byteC & 0xf0) >> 4;

View File

@ -17,6 +17,7 @@ using skyscraper5.Scte35;
using skyscraper5.Skyscraper.Equipment;
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Net;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
using skyscraper5.T2MI.Packets;
using skyscraper5.Teletext.Wss;
@ -231,6 +232,6 @@ namespace skyscraper5.Skyscraper.Scraper
void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer);
void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer);
void OnDvbSisTdt(int sourcePid, DateTime? utcTime);
void OnRcs2Rmt(Rmt rmt);
}
}

View File

@ -2428,26 +2428,18 @@ namespace skyscraper5.Skyscraper.Scraper
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)
{
if (!DataStorage.TestForRmtLinkage(linkage))
DataStorage.InsertRmt(rmt);
foreach (_0x4a_LinkageDescriptor linkage in rmt.Linkages)
{
LogEvent(SkyscraperContextEvent.RmtLinkage, String.Format("Interactive Network #{0} -> ONID {1}, TSID {2}", linkage.InteractiveNetworkId, linkage.OriginalNetworkId, linkage.TransportStreamId));
DataStorage.InsertRmtLinkage(linkage);
}
}
}
if (rmt.TransportStreams != null)
{
foreach(Rmt.TransportStream transportStream in rmt.TransportStreams)
{
if (!DataStorage.TestForRmtTransportStream(rmt.NetworkId, transportStream))
foreach (Rmt.TransportStream transportStream in rmt.TransportStreams)
{
LogEvent(SkyscraperContextEvent.RmtTransportStream, String.Format("{0} -> {1},{2}", rmt.NetworkId, transportStream.OriginalNetworkId, transportStream.TransportStreamId));
DataStorage.InsertRmtTransportStream(rmt.NetworkId, transportStream);
}
}
}
}

View File

@ -13,6 +13,7 @@ namespace skyscraper8.Skyscraper.Scraper
BlockstreamAnalysis,
IpTrafficAnalysis,
GseAnalysis,
DvbNipAnalyis
DvbNipAnalyis,
RcsAnalysis
}
}

View File

@ -137,14 +137,16 @@ namespace skyscraper8.Skyscraper.Scraper.Storage
void StoreTerminalBurstTimePlan(ushort interactiveNetworkId, uint gtoupId, uint superframeCount, uint frameNumber, Tbtp.TbtpFrame.BtpEntity btp);
bool TestForCmtEntry(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);
byte[] GetTmst(ushort interactiveNetworkId);
void InsertTmst(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);
void StoreSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe);
bool TestForFrameComposition(ushort interactiveNetworkId, Fct.Frame frame);
@ -224,5 +226,7 @@ namespace skyscraper8.Skyscraper.Scraper.Storage
void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor);
bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath);
bool TestForRmt(Rmt rmt);
void InsertRmt(Rmt rmt);
}
}

View File

@ -1484,26 +1484,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem
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)
{
throw new NotImplementedException();
@ -2028,5 +2008,15 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem
FileInfo fi = new FileInfo(saneFilename);
return File.ReadAllBytes(fi.FullName);
}
public bool TestForRmt(Rmt rmt)
{
throw new NotImplementedException();
}
public void InsertRmt(Rmt rmt)
{
throw new NotImplementedException();
}
}
}

View File

@ -1446,20 +1446,21 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
cmtEntries[interactiveNetworkId].Add(entry);
}
private bool rmtWasSeen;
public int GetRmtTransmissionStandard(ushort networkId)
{
if (!rmtWasSeen)
if (rmts == null)
return 0;
if (_rmtTransportStreams[networkId] == null)
if (rmts[networkId] == null)
return 0;
HashSet<Rmt.TransportStream> rmtSet = _rmtTransportStreams[networkId];
foreach (Rmt.TransportStream transportStream in rmtSet)
if (rmts[networkId].TransportStreams == null)
return 0;
foreach(Rmt.TransportStream ts in rmts[networkId].TransportStreams)
{
if (transportStream.SatelliteForwardLink != null)
return (int)transportStream.SatelliteForwardLink.TransmissionStandard;
if (ts.SatelliteForwardLink != null)
return (int)ts.SatelliteForwardLink.TransmissionStandard;
}
return 0;
@ -1487,46 +1488,6 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
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;
public bool TestForSuperframeComposition(ushort interactiveNetworkId, Sct.Superframe superframe)
{
@ -2137,5 +2098,20 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
_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;
}
}
}