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);
|
||||
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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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))
|
||||
{
|
||||
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));
|
||||
DataStorage.InsertRmtLinkage(linkage);
|
||||
}
|
||||
}
|
||||
}
|
||||
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));
|
||||
DataStorage.InsertRmtTransportStream(rmt.NetworkId, transportStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ namespace skyscraper8.Skyscraper.Scraper
|
||||
BlockstreamAnalysis,
|
||||
IpTrafficAnalysis,
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user