Compare commits
No commits in common. "master" and "sauerland" have entirely different histories.
8
.gitignore
vendored
8
.gitignore
vendored
@ -132,11 +132,3 @@ imgui.ini
|
||||
/.vs/skyscraper8/CopilotIndices/17.14.1231.31060
|
||||
/.vs/skyscraper8/CopilotIndices/17.14.1290.42047
|
||||
/Documentation/TSDuck-Samples/experiment2/*.ts
|
||||
/.vs/skyscraper8/CopilotIndices/17.14.1431.25910
|
||||
/.vs
|
||||
/skyscraper8/bin/Debug/satip
|
||||
/skyscraper8.Tests.NUnit/bin/Debug/net8.0
|
||||
/skyscraper8.Tests.NUnit/obj/Debug/net8.0
|
||||
/skyscraper8.Tests.NUnit/obj
|
||||
.idea/.idea.skyscraper8/.idea
|
||||
/skyscraper8/bin/Release/net8.0/linux-x64
|
||||
|
||||
@ -514,33 +514,6 @@ namespace skyscraper5.Data
|
||||
string filename = String.Format("/SSDP/{0}.xml", ssdpDevice.UniqueServiceName.SanitizeFileName());
|
||||
byte[] bytes = GetObject(filename);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public bool TestForSisDsaci(int value1, int value2, ushort groupId, int versionNumber)
|
||||
{
|
||||
string filename = String.Format("DVB-SIS/{0}/{1}/Group{2}_Version{3}.xml");
|
||||
return FileExists(filename);
|
||||
}
|
||||
|
||||
public void StoreSisDsaci(int value1, int value2, ushort currentDsaGroupId, int versionNumber, Stream dsaci)
|
||||
{
|
||||
string filename = String.Format("DVB-SIS/{0}/{1}/Group{2}_Version{3}.xml");
|
||||
WriteObject(filename, dsaci);
|
||||
}
|
||||
|
||||
public bool TestForObjectCarouselFileArrival(string vfsFile, int transportStreamId, int pid, int networkId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public byte[] GetObjectCarouselFileArrival(string vfsFile, int transportStreamId, int pid, int networkId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public byte[] DvbNipGetFile(string path)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,13 +18,9 @@ using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.Utilities;
|
||||
using skyscraper5.src.InteractionChannel.Model.Descriptors;
|
||||
using skyscraper5.src.InteractionChannel.Model;
|
||||
using skyscraper5.src.InteractionChannel.Model2;
|
||||
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
|
||||
using skyscraper5.src.Skyscraper.Scraper.Dns;
|
||||
using skyscraper5.Teletext;
|
||||
using skyscraper8.InteractionChannel.Model;
|
||||
using skyscraper8.InteractionChannel.Model2;
|
||||
using skyscraper8.InteractionChannel.Model2.Descriptors;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
|
||||
namespace skyscraper5.Data.MySql
|
||||
@ -107,12 +103,12 @@ namespace skyscraper5.Data.MySql
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void UiSatellitesAdd(SatellitePositionEntity newPosition)
|
||||
public void UiSatellitesAdd(SatellitePosition newPosition)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void UiSatellitesDelete(SatellitePositionEntity satellitePosition)
|
||||
public void UiSatellitesDelete(SatellitePosition satellitePosition)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@ -233,22 +229,22 @@ namespace skyscraper5.Data.MySql
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public List<LnbEntity> UiLnbTypesListAll()
|
||||
public List<LnbType> UiLnbTypesListAll()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void UiLnbTypesAdd(LnbEntity defaultLnbType)
|
||||
public void UiLnbTypesAdd(LnbType defaultLnbType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public List<DishEntity> UiDishTypesListAll()
|
||||
public List<DishType> UiDishTypesListAll()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void UiDishTypesAdd(DishEntity defaultDishType)
|
||||
public void UiDishTypesAdd(DishType defaultDishType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@ -263,152 +259,6 @@ namespace skyscraper5.Data.MySql
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForRcs2Nit(RcsNit nit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertRcs2Nit(RcsNit nit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress,
|
||||
_0xb1_CorrectionMessageExtensionDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimControlAssignment(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForLowerLayerService(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimLogonResponse(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForRmt(Rmt rmt)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public void InsertRmt(Rmt rmt)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public IEnumerable<Tuple<int, int, ProgramMapping>> SelectAllPmt()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
|
||||
@ -50,9 +50,9 @@ namespace skyscraper5.Data.MySql
|
||||
}
|
||||
|
||||
|
||||
public List<SatellitePositionEntity> UiSatellitesListAll()
|
||||
public List<SatellitePosition> UiSatellitesListAll()
|
||||
{
|
||||
List<SatellitePositionEntity> result = new List<SatellitePositionEntity>();
|
||||
List<SatellitePosition> result = new List<SatellitePosition>();
|
||||
using (MySqlConnection connection = new MySqlConnection(_mcsb.ToString()))
|
||||
{
|
||||
connection.Open();
|
||||
@ -62,9 +62,9 @@ namespace skyscraper5.Data.MySql
|
||||
MySqlDataReader dataReader = command.ExecuteReader();
|
||||
while (dataReader.Read())
|
||||
{
|
||||
SatellitePositionEntity satellitePosition = new SatellitePositionEntity();
|
||||
SatellitePosition satellitePosition = new SatellitePosition();
|
||||
satellitePosition.angle = dataReader.GetFloat(2);
|
||||
//satellitePosition.cardinalDirection = dataReader.GetBoolean(3) ? 0 : 1;
|
||||
satellitePosition.cardinalDirection = dataReader.GetBoolean(3) ? 0 : 1;
|
||||
satellitePosition.name = dataReader.GetString(4);
|
||||
result.Add(satellitePosition);
|
||||
}
|
||||
|
||||
@ -328,7 +328,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
string note = null;
|
||||
if (!dataReader.IsDBNull(15))
|
||||
note = dataReader.GetString(15);
|
||||
result = new DbBlindscanJob(uuid, tuner_mac, (STD_TYPE)tuner_std, diseqc_index, new DummyGpsReceiver(true,(float)gps_lat,(float)gps_lon), SatellitePositionEntity.FromChecksum(sat_position));
|
||||
result = new DbBlindscanJob(uuid, tuner_mac, (STD_TYPE)tuner_std, diseqc_index, new DummyGpsReceiver(true,(float)gps_lat,(float)gps_lon), SatellitePosition.FromChecksum(sat_position));
|
||||
result.DateAdded = date_added;
|
||||
result.HorizontalHighState = (DbBlindscanJobPolarizationStatus)horizontal_high;
|
||||
result.HorizontalLowState = (DbBlindscanJobPolarizationStatus)horizontal_low;
|
||||
@ -546,11 +546,11 @@ namespace skyscraper5.Data.PostgreSql
|
||||
dgr = new DummyGpsReceiver(true, gpsLat, gpsLon);
|
||||
}
|
||||
|
||||
SatellitePositionEntity satPositionObj = null;
|
||||
SatellitePosition satPositionObj = null;
|
||||
if (!dataReader.IsDBNull("sat_position"))
|
||||
{
|
||||
int satPosition = dataReader.GetInt32("sat_position");
|
||||
satPositionObj = SatellitePositionEntity.FromChecksum(satPosition);
|
||||
satPositionObj = SatellitePosition.FromChecksum(satPosition);
|
||||
}
|
||||
int diseqcIndex = dataReader.GetInt32("diseqc_index");
|
||||
int version = dataReader.GetInt32("version");
|
||||
|
||||
@ -18,7 +18,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
if (_knownInts == null)
|
||||
_knownInts = new HashSet<DatabaseKeyInt>();
|
||||
|
||||
DatabaseKeyInt key = new DatabaseKeyInt(notification.Platform.PlatformId, notification.Target.GenerateId());
|
||||
DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
|
||||
if (_knownInts.Contains(key))
|
||||
return true;
|
||||
|
||||
@ -28,7 +28,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
conn.Open();
|
||||
NpgsqlCommand cmd = conn.CreateCommand();
|
||||
cmd.CommandText = "SELECT dateadded FROM dvb_int WHERE platform_id = @id";
|
||||
cmd.Parameters.AddWithValue("@id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.Platform.PlatformId);
|
||||
cmd.Parameters.AddWithValue("@id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
|
||||
NpgsqlDataReader reader = cmd.ExecuteReader();
|
||||
result = reader.Read();
|
||||
reader.Close();
|
||||
@ -43,7 +43,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
public void StoreIpMacNotification(IpMacNotification notification)
|
||||
{
|
||||
EnqueueTask(x => WriteIpMacNotification(x, notification));
|
||||
DatabaseKeyInt key = new DatabaseKeyInt(notification.Platform.PlatformId, notification.Target.GenerateId());
|
||||
DatabaseKeyInt key = new DatabaseKeyInt(notification.PlatformId);
|
||||
_knownInts.Add(key);
|
||||
}
|
||||
|
||||
@ -53,28 +53,28 @@ namespace skyscraper5.Data.PostgreSql
|
||||
cmd.CommandText = "insert into dvb_int (platform_id, platform_name, platform_provider_name,\r\n platform_provider_name_language_code, platform_action_type, platform_name_language_code,\r\n platform_processing_order, target_type, target_name, operational_network_id,\r\n operational_mpe_fec_algorithm, operational_component_tag, operational_transport_stream_id,\r\n operational_time_slice_fec_id, operational_time_slicing, operational_onid, operational_sid,\r\n operational_time_slice_frame_size, operational_time_slice_max_average_rate,\r\n operational_time_slice_max_bust_duration) " +
|
||||
"values " +
|
||||
"(@platform_id,@platform_name,@platform_provider_name,@platform_provider_name_language_code,@platform_action_type,@platform_name_language_code,@platform_processing_order,@target_type,@target_name,@operational_network_id,@operational_mpe_fec_algorithm, @operational_component_tag, @operational_transport_stream_id,\r\n @operational_time_slice_fec_id, @operational_time_slicing, @operational_onid, @operational_sid,\r\n @operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
|
||||
cmd.Parameters.AddWithValue("@platform_id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.Platform.PlatformId);
|
||||
cmd.Parameters.AddWithValue("@platform_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Platform.Name);
|
||||
cmd.Parameters.AddWithValue("@platform_provider_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Platform.ProviderName);
|
||||
cmd.Parameters.AddWithValue("@platform_provider_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.Platform.ProviderNameLanguageCode);
|
||||
cmd.Parameters.AddWithValue("@platform_action_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.Platform.ActionType);
|
||||
cmd.Parameters.AddWithValue("@platform_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.Platform.NameLanguageCode);
|
||||
cmd.Parameters.AddWithValue("@platform_processing_order", NpgsqlTypes.NpgsqlDbType.Integer, notification.Platform.ProcessingOrder);
|
||||
cmd.Parameters.AddWithValue("@target_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.Target.GenerateId());
|
||||
cmd.Parameters.AddWithValue("@target_name", NpgsqlTypes.NpgsqlDbType.Text, notification.Target.GenerateName());
|
||||
cmd.Parameters.AddWithValue("@platform_id", NpgsqlTypes.NpgsqlDbType.Bigint, (long)notification.PlatformId);
|
||||
cmd.Parameters.AddWithValue("@platform_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformName);
|
||||
cmd.Parameters.AddWithValue("@platform_provider_name", NpgsqlTypes.NpgsqlDbType.Text, notification.PlatformProviderName);
|
||||
cmd.Parameters.AddWithValue("@platform_provider_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformProviderNameLanguageCode);
|
||||
cmd.Parameters.AddWithValue("@platform_action_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformActionType);
|
||||
cmd.Parameters.AddWithValue("@platform_name_language_code", NpgsqlTypes.NpgsqlDbType.Varchar, notification.PlatformNameLanguageCode);
|
||||
cmd.Parameters.AddWithValue("@platform_processing_order", NpgsqlTypes.NpgsqlDbType.Integer, notification.PlatformProcessingOrder);
|
||||
cmd.Parameters.AddWithValue("@target_type", NpgsqlTypes.NpgsqlDbType.Integer, notification.TargetType);
|
||||
cmd.Parameters.AddWithValue("@target_name", NpgsqlTypes.NpgsqlDbType.Text, notification.TargetName);
|
||||
//@operational_network_id,@operational_mpe_fec_algorithm,@operational_component_tag,@operational_transport_stream_id,@operational_time_slice_fec_id,@operational_time_slicing,@operational_onid,@operational_sid,@operational_time_slice_frame_size, @operational_time_slice_max_average_rate,\r\n @operational_time_slice_max_bust_duration\r\n\r\n )";
|
||||
cmd.Parameters.AddWithValue("@operational_network_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.NetworkId);
|
||||
cmd.Parameters.AddWithValue("@operational_mpe_fec_algorithm", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.MpeFecAlgorithm);
|
||||
cmd.Parameters.AddWithValue("@operational_component_tag", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.ComponentTag);
|
||||
cmd.Parameters.AddWithValue("@operational_transport_stream_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TransportStreamId);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_fec_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceFecId);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slicing", NpgsqlTypes.NpgsqlDbType.Boolean, (bool?)notification.Operational.TimeSlicing);
|
||||
cmd.Parameters.AddWithValue("@operational_onid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.OriginalNetworkId);
|
||||
cmd.Parameters.AddWithValue("@operational_sid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.ServiceId);
|
||||
cmd.Parameters.AddWithValue("@operational_network_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalNetworkId);
|
||||
cmd.Parameters.AddWithValue("@operational_mpe_fec_algorithm", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalMpeFecAlgorithm);
|
||||
cmd.Parameters.AddWithValue("@operational_component_tag", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalComponentTag);
|
||||
cmd.Parameters.AddWithValue("@operational_transport_stream_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTransportStreamId);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_fec_id", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFecId);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slicing", NpgsqlTypes.NpgsqlDbType.Boolean, (bool?)notification.OperationalTimeSlicing);
|
||||
cmd.Parameters.AddWithValue("@operational_onid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalOriginalNetworkId);
|
||||
cmd.Parameters.AddWithValue("@operational_sid", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalServiceId);
|
||||
//@operational_time_slice_frame_size,@operational_time_slice_max_average_rate,@operational_time_slice_max_bust_duration
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_frame_size", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceFrameSize);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_max_average_rate", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceMaxAverageRate);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_max_bust_duration", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.Operational.TimeSliceMaxBurstDuration);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_frame_size", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceFrameSize);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_max_average_rate", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxAverageRate);
|
||||
cmd.Parameters.AddWithValue("@operational_time_slice_max_bust_duration", NpgsqlTypes.NpgsqlDbType.Integer, (int?)notification.OperationalTimeSliceMaxBurstDuration);
|
||||
cmd.Parameters.CheckNulls();
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
@ -11,8 +11,6 @@ using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Security.Cryptography;
|
||||
using skyscraper8.InteractionChannel.Model;
|
||||
using skyscraper8.InteractionChannel.Model2.Descriptors;
|
||||
|
||||
namespace skyscraper5.Data.PostgreSql
|
||||
{
|
||||
@ -951,112 +949,6 @@ namespace skyscraper5.Data.PostgreSql
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool TestForRcs2Nit(RcsNit nit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertRcs2Nit(RcsNit nit)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool UpdateRcs2Tdt(ushort interactiveNetworkId, DateTime tdtTimestamp)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTmst2(ushort interactiveNetworkId, Tmst2.TransmissionMode mode)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimFramePayloadFormat(ushort networkId, _0xb7_FramePayloadFormatDescriptor.TransmissionContext transmissionContext)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimCorrectionMessageExtension(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimCorrectionMessageExtension(PhysicalAddress macAddress,
|
||||
_0xb1_CorrectionMessageExtensionDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimControlAssignment(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimControlAssignment(PhysicalAddress macAddress, _0xa4_SyncAssignDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimSatelliteReturnLink(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimSatelliteReturnLink(PhysicalAddress macAddress, _0xa9_SatelliteReturnLinkDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForLowerLayerService(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimLowerLayerService(PhysicalAddress macAddress, _0xbb_LowerLayerServiceDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertHigherLayerServiceInitalization(PhysicalAddress macAddress, _0xc4_HigherLayersInitializeDescriptor.Layer2Interface layer2Interface)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimLogonResponse(PhysicalAddress macAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimLogonResponse(PhysicalAddress macAddress, _0xb9_LogonResponseDescriptor descriptor)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertTimForwardInteractionPath(PhysicalAddress macAddress, _0xad_ForwardInteractionPathDescriptor.ForwardInteractionPath forwardInteractionPath)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private bool AreArraysEqual(byte[] l, byte[] r)
|
||||
{
|
||||
if (l.Length != r.Length)
|
||||
@ -1080,6 +972,29 @@ namespace skyscraper5.Data.PostgreSql
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,10 +6,7 @@ using NpgsqlTypes;
|
||||
using skyscraper5.Dvb.Psi.Model;
|
||||
using skyscraper5.Dvb.TvAnytime;
|
||||
using skyscraper5.Skyscraper.Headless;
|
||||
using skyscraper5.src.InteractionChannel.Model;
|
||||
using skyscraper5.src.InteractionChannel.Model2;
|
||||
using skyscraper8.DvbNip;
|
||||
using skyscraper8.InteractionChannel.Model2;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
|
||||
namespace skyscraper5.Data.PostgreSql
|
||||
@ -227,46 +224,6 @@ namespace skyscraper5.Data.PostgreSql
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool TestForRmt(Rmt rmt)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public void InsertRmt(Rmt rmt)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -19,9 +19,9 @@ namespace skyscraper5.Data.PostgreSql
|
||||
this.uiVersion = version;
|
||||
}
|
||||
|
||||
public List<LnbEntity> UiLnbTypesListAll()
|
||||
public List<LnbType> UiLnbTypesListAll()
|
||||
{
|
||||
List<LnbEntity> lnbTypes = new List<LnbEntity>();
|
||||
List<LnbType> lnbTypes = new List<LnbType>();
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
conn.Open();
|
||||
@ -38,7 +38,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
int lofSw = dataReader.GetInt32(5);
|
||||
int minFreq = dataReader.GetInt32(6);
|
||||
int maxFreq = dataReader.GetInt32(7);
|
||||
lnbTypes.Add(new LnbEntity("", name, lof1, lof2, lofSw, minFreq, maxFreq) { DateAdded = added, Id = id });
|
||||
lnbTypes.Add(new LnbType(name, lof1, lof2, lofSw, minFreq, maxFreq) { DateAdded = added, Id = id });
|
||||
}
|
||||
|
||||
dataReader.Close();
|
||||
@ -49,7 +49,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
return lnbTypes;
|
||||
}
|
||||
|
||||
public void UiLnbTypesAdd(LnbEntity defaultLnbType)
|
||||
public void UiLnbTypesAdd(LnbType defaultLnbType)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
@ -69,9 +69,9 @@ namespace skyscraper5.Data.PostgreSql
|
||||
}
|
||||
}
|
||||
|
||||
public List<DishEntity> UiDishTypesListAll()
|
||||
public List<DishType> UiDishTypesListAll()
|
||||
{
|
||||
List<DishEntity> result = new List<DishEntity>();
|
||||
List<DishType> result = new List<DishType>();
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
conn.Open();
|
||||
@ -85,14 +85,14 @@ namespace skyscraper5.Data.PostgreSql
|
||||
string name = dataReader.GetString(2);
|
||||
int diameter = dataReader.GetInt32(3);
|
||||
DishShape shape = (DishShape)dataReader.GetInt32(4);
|
||||
result.Add(new DishEntity("", name, diameter, shape) { DateAdded = added, Id = id });
|
||||
result.Add(new DishType(name, diameter, shape) { DateAdded = added, Id = id });
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void UiDishTypesAdd(DishEntity defaultDishType)
|
||||
public void UiDishTypesAdd(DishType defaultDishType)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
@ -109,9 +109,9 @@ namespace skyscraper5.Data.PostgreSql
|
||||
}
|
||||
|
||||
|
||||
public List<SatellitePositionEntity> UiSatellitesListAll()
|
||||
public List<SatellitePosition> UiSatellitesListAll()
|
||||
{
|
||||
List<SatellitePositionEntity> positions = new List<SatellitePositionEntity>();
|
||||
List<SatellitePosition> positions = new List<SatellitePosition>();
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
conn.Open();
|
||||
@ -123,7 +123,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
float angle = (float)reader.GetDouble(0);
|
||||
int cardinal = reader.GetInt32(1);
|
||||
string name = reader.GetString(2);
|
||||
SatellitePositionEntity child = new SatellitePositionEntity(angle, name);
|
||||
SatellitePosition child = new SatellitePosition(angle, cardinal, name);
|
||||
positions.Add(child);
|
||||
}
|
||||
|
||||
@ -135,7 +135,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
return positions;
|
||||
}
|
||||
|
||||
public void UiSatellitesAdd(SatellitePositionEntity newPosition)
|
||||
public void UiSatellitesAdd(SatellitePosition newPosition)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
@ -145,7 +145,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
"insert into skyscraper5_satellite_positions (angle, cardinal, name, keyversion, key) " +
|
||||
"values (@angle, @cardinal, @name, @keyversion, @key)";
|
||||
cmd.Parameters.AddWithValue("@angle", NpgsqlDbType.Real, newPosition.angle);
|
||||
cmd.Parameters.AddWithValue("@cardinal", NpgsqlDbType.Integer, newPosition.GetCardinalDirectionAsInt());
|
||||
cmd.Parameters.AddWithValue("@cardinal", NpgsqlDbType.Integer, newPosition.cardinalDirection);
|
||||
cmd.Parameters.AddWithValue("@name", NpgsqlDbType.Text, newPosition.name);
|
||||
cmd.Parameters.AddWithValue("@keyversion", NpgsqlDbType.Integer, uiVersion);
|
||||
cmd.Parameters.AddWithValue("@key", NpgsqlDbType.Text, newPosition.Checksum.ToString());
|
||||
@ -155,7 +155,7 @@ namespace skyscraper5.Data.PostgreSql
|
||||
}
|
||||
}
|
||||
|
||||
public void UiSatellitesDelete(SatellitePositionEntity satellitePosition)
|
||||
public void UiSatellitesDelete(SatellitePosition satellitePosition)
|
||||
{
|
||||
using (NpgsqlConnection conn = new NpgsqlConnection(connectionStringBuilder.ToString()))
|
||||
{
|
||||
|
||||
@ -6,8 +6,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="Npgsql" Version="10.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -1,18 +0,0 @@
|
||||
I'm trying to parse the subtitles from a Brazilian live ISDB-T Capture.
|
||||
I parsed the PMT, and it had a Data Component Descriptor present for the corresponding PID.
|
||||
The Data Component Descriptor said 0x0012 for it's data_component_id.
|
||||
According to Annex J in ARIB STD-B10, Part 3 this means "Subtitle coding for digital terrestrial broadcasting (C profile)" and points to ARIB STD-B24, Part 3, Volume 1.
|
||||
So I checked ARIB STD-B24 Version 6.4 Fascicle 1, Part 3, Chapter 9.
|
||||
This states that the captions are transmitted in PES packets, so I coded my program to attach a PES listener to the corresponding PID.
|
||||
As expected, I get valid PES packets from it.
|
||||
But the structure from the payload does not match what I find in ARIB STD-B24 Version 6.4 Fascicle 1, Part 3, Clause 9.2
|
||||
The first bytes I got are 0x80 0xFF 0xF0 0x04 0x00 0x00 0x00 0x87
|
||||
Bytes 1 & 2 in the standard say that they're data_group_link_number and last_data_group_link_number.
|
||||
But that doesn't fit. 0x0F0 would be the last data group link number, but it's smaller than 0xFF.
|
||||
I think I am looking in the wrong spot. Could you give me a small push in the right direction?
|
||||
|
||||
-
|
||||
|
||||
Okay, I think I got a few bytes.
|
||||
The first three bytes 0x80, 0xFF, 0xF0 can be explained using ARIB TR-B14 Fascicle 3, clause 6.2.2 and ARIB STD-B37, clause 2.2.3.6
|
||||
These are indeed a data_identifier, private_stream_id, reserved bits, and pes_data_packet_header_length, but now I still need to figure out the next four bytes: 0x00, 0x00, 0x00, 0x87. The 0x87 seems to indeed be the length of the packet.
|
||||
@ -1,86 +0,0 @@
|
||||
byte1 in Hex;unkn1 in hex;unkn1 in Binary;byte2 in Hex;Times occurred;smallest seen packet;largest seen packet
|
||||
0x01;0x10;0b00010000;0x00;1941;18;18
|
||||
0x01;0x18;0b00011000;0x00;2898;24;24
|
||||
0x01;0xC8;0b11001000;0x00;268;200;200
|
||||
0x01;0xD4;0b11010100;0x00;286;212;212
|
||||
0x01;0x38;0b00111000;0x01;24;312;312
|
||||
0x01;0x3A;0b00111010;0x01;84;314;314
|
||||
0x01;0x42;0b01000010;0x01;9;322;322
|
||||
0x01;0x44;0b01000100;0x01;163;324;324
|
||||
0x01;0x46;0b01000110;0x01;295;326;326
|
||||
0x01;0x48;0b01001000;0x01;480;328;328
|
||||
0x01;0x4A;0b01001010;0x01;143;330;330
|
||||
0x01;0x4C;0b01001100;0x01;129;332;332
|
||||
0x01;0x4E;0b01001110;0x01;86;334;334
|
||||
0x01;0x50;0b01010000;0x01;102;336;336
|
||||
0x01;0x52;0b01010010;0x01;145;338;338
|
||||
0x01;0x54;0b01010100;0x01;149;340;340
|
||||
0x01;0x56;0b01010110;0x01;444;342;342
|
||||
0x01;0x58;0b01011000;0x01;93;344;344
|
||||
0x01;0x5A;0b01011010;0x01;5;346;346
|
||||
0x01;0x5C;0b01011100;0x01;69;348;348
|
||||
0x01;0x5E;0b01011110;0x01;238;350;350
|
||||
0x01;0x60;0b01100000;0x01;191;352;352
|
||||
0x01;0x62;0b01100010;0x01;395;354;354
|
||||
0x01;0x64;0b01100100;0x01;145;356;356
|
||||
0x01;0x66;0b01100110;0x01;170;358;358
|
||||
0x01;0x68;0b01101000;0x01;308;360;360
|
||||
0x01;0x6A;0b01101010;0x01;262;362;362
|
||||
0x01;0x6C;0b01101100;0x01;81;364;364
|
||||
0x01;0x6E;0b01101110;0x01;153;366;366
|
||||
0x01;0x70;0b01110000;0x01;177;368;368
|
||||
0x01;0x72;0b01110010;0x01;207;370;370
|
||||
0x01;0x74;0b01110100;0x01;158;372;372
|
||||
0x01;0x76;0b01110110;0x01;285;374;374
|
||||
0x01;0x78;0b01111000;0x01;421;376;376
|
||||
0x01;0x7A;0b01111010;0x01;107;378;378
|
||||
0x01;0x7C;0b01111100;0x01;59;380;380
|
||||
0x01;0x7E;0b01111110;0x01;54;382;382
|
||||
0x01;0x80;0b10000000;0x01;33;384;384
|
||||
0x01;0x82;0b10000010;0x01;45;386;386
|
||||
0x01;0x84;0b10000100;0x01;5;388;388
|
||||
0x01;0x86;0b10000110;0x01;10;390;390
|
||||
0x01;0x88;0b10001000;0x01;15;392;392
|
||||
0x01;0x8A;0b10001010;0x01;15;394;394
|
||||
0x01;0x8E;0b10001110;0x01;10;398;398
|
||||
0x01;0x90;0b10010000;0x01;10;400;400
|
||||
0x01;0x92;0b10010010;0x01;5;402;402
|
||||
0x01;0x96;0b10010110;0x01;5;406;406
|
||||
0x01;0x9A;0b10011010;0x01;10;410;410
|
||||
0x01;0x9C;0b10011100;0x01;10;412;412
|
||||
0x01;0x9E;0b10011110;0x01;5;414;414
|
||||
0x01;0xA2;0b10100010;0x01;10;418;418
|
||||
0x01;0xAE;0b10101110;0x01;10;430;430
|
||||
0x01;0xB6;0b10110110;0x01;5;438;438
|
||||
0x01;0x90;0b10010000;0x05;17020001;1424;1424
|
||||
0x01;0xA0;0b10100000;0x05;257300;1440;1440
|
||||
0x03;0x42;0b01000010;0x00;789;66;66
|
||||
0x03;0x3E;0b00111110;0x01;2494;318;318
|
||||
0x03;0x40;0b01000000;0x01;6732;320;320
|
||||
0x03;0x42;0b01000010;0x01;674;322;322
|
||||
0x03;0x44;0b01000100;0x01;654;324;324
|
||||
0x03;0x46;0b01000110;0x01;1182;326;326
|
||||
0x03;0x48;0b01001000;0x01;696;328;328
|
||||
0x03;0x4A;0b01001010;0x01;2046;330;330
|
||||
0x03;0x4C;0b01001100;0x01;843;332;332
|
||||
0x03;0x4E;0b01001110;0x01;4130;334;334
|
||||
0x03;0x50;0b01010000;0x01;2032;336;336
|
||||
0x03;0x54;0b01010100;0x01;1121;340;340
|
||||
0x03;0x56;0b01010110;0x01;2686;342;342
|
||||
0x03;0x58;0b01011000;0x01;6191;344;344
|
||||
0x03;0x5A;0b01011010;0x01;533;346;346
|
||||
0x03;0x5C;0b01011100;0x01;1102;348;348
|
||||
0x03;0x5E;0b01011110;0x01;2777;350;350
|
||||
0x03;0x60;0b01100000;0x01;3290;352;352
|
||||
0x03;0x62;0b01100010;0x01;4831;354;354
|
||||
0x03;0x64;0b01100100;0x01;140;356;356
|
||||
0x03;0x66;0b01100110;0x01;2485;358;358
|
||||
0x03;0x68;0b01101000;0x01;4622;360;360
|
||||
0x03;0x6A;0b01101010;0x01;3865;362;362
|
||||
0x03;0x6C;0b01101100;0x01;5000;364;364
|
||||
0x03;0x70;0b01110000;0x01;305;368;368
|
||||
0x03;0x72;0b01110010;0x01;372;370;370
|
||||
0x03;0x74;0b01110100;0x01;1106;372;372
|
||||
0x03;0x78;0b01111000;0x01;1969;376;376
|
||||
0x03;0xBA;0b10111010;0x05;4037;1466;1466
|
||||
0xFF;0x08;0b00001000;0x00;421;18;18
|
||||
|
@ -1,24 +0,0 @@
|
||||
0000 00 01 80 01 e1 91 85 92 eb 7c 00 00 00 20 71 01 ・・・・・・・・ ・|・・・ q・
|
||||
0010 00 03 70 01 a9 96 24 a7 68 01 00 00 58 01 00 00 ・・p・・・$・ h・・・X・・・
|
||||
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0030 97 12 0a 00 00 00 00 00 02 00 00 00 44 01 00 00 ・・・・・・・・ ・・・・D・・・
|
||||
0040 17 00 00 00 00 00 00 00 80 05 00 00 8b 47 d9 69 ・・・・・・・・ ・・・・・G・i
|
||||
0050 24 00 00 00 00 00 00 00 24 00 00 00 00 00 00 00 $・・・・・・・ $・・・・・・・
|
||||
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
|
||||
0070 38 35 31 32 35 5a 5f 33 5f 52 57 31 35 34 38 31 85125Z_3 _RW15481
|
||||
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 4d 41 0042026R P1_RTRMA
|
||||
0090 44 43 5f 30 5f 48 55 4e 47 41 52 59 2d 45 4c 45 DC_0_HUN GARY-ELE
|
||||
00A0 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e CTION-OP POSITION
|
||||
00B0 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e 58 4d -CONCERT -MORE.XM
|
||||
00C0 4c 00 83 01 00 00 00 c1 10 65 79 84 53 b5 87 72 L・・・・・・・ ・ey・S・・r
|
||||
00D0 48 9a c0 a7 5d 0b 6d 6a 58 a7 00 00 00 00 00 00 H・・・]・mj X・・・・・・・
|
||||
00E0 00 0c 00 00 00 24 00 00 00 00 00 00 00 02 00 00 ・・・・・$・・ ・・・・・・・・
|
||||
00F0 00 d2 46 d9 69 00 00 00 00 11 ba 00 00 00 00 00 ・・F・i・・・ ・・・・・・・・
|
||||
0100 00 00 c6 00 00 00 00 00 00 5c 52 56 4e 2d 53 43 ・・・・・・・・ ・\RVN-SC
|
||||
0110 52 49 50 54 53 5c 32 30 32 36 2d 30 34 2d 31 30 RIPTS\20 26-04-10
|
||||
0120 54 31 38 35 31 32 35 5a 5f 33 5f 52 57 31 35 34 T185125Z _3_RW154
|
||||
0130 38 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 81004202 6RP1_RTR
|
||||
0140 4d 41 44 43 5f 30 5f 48 55 4e 47 41 52 59 2d 45 MADC_0_H UNGARY-E
|
||||
0150 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 LECTION- OPPOSITI
|
||||
0160 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e ON-CONCE RT-MORE.
|
||||
0170 58 4d 4c 00 01 00 00 00 01 00 04 00 22 24 00 80 XML・・・・・ ・・・・"$・・
|
||||
@ -1,24 +0,0 @@
|
||||
0000 00 01 7e 01 e1 91 85 92 f1 7c 00 04 00 00 6f 01 ・・~・・・・・ ・|・・・・o・
|
||||
0010 00 03 6e 01 3f 0e c2 9e 66 01 00 00 56 01 00 00 ・・n・?・・・ f・・・V・・・
|
||||
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0030 97 12 0a 00 00 00 00 00 02 00 00 00 42 01 00 00 ・・・・・・・・ ・・・・B・・・
|
||||
0040 17 00 00 00 00 00 00 00 80 05 00 00 8b 47 d9 69 ・・・・・・・・ ・・・・・G・i
|
||||
0050 11 00 00 00 00 00 00 00 11 00 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
|
||||
0070 38 35 31 32 35 5a 5f 33 5f 57 44 31 35 34 38 31 85125Z_3 _WD15481
|
||||
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 4e 0042026R P1_RTRWN
|
||||
0090 45 43 5f 30 5f 31 35 34 38 2d 48 55 4e 47 41 52 EC_0_154 8-HUNGAR
|
||||
00A0 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 Y-ELECTI ON-OPPOS
|
||||
00B0 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f ITION-CO NCERT-MO
|
||||
00C0 52 45 2e 58 4d 4c 00 83 01 00 00 00 c1 10 3d 83 RE.XML・・ ・・・・・・=・
|
||||
00D0 f8 ba dc 14 a1 48 80 25 a3 05 be a5 b1 ab a0 00 ・・・・・H・% ・・・・・・・・
|
||||
00E0 00 00 00 00 00 00 0c 00 00 00 11 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
00F0 00 00 02 00 00 00 d2 46 d9 69 00 00 00 00 64 53 ・・・・・・・F ・i・・・・dS
|
||||
0100 00 00 00 00 00 00 80 5d 00 00 00 00 00 00 5c 32 ・・・・・・・] ・・・・・・\2
|
||||
0110 30 32 36 2d 30 34 2d 31 30 54 31 38 35 31 32 35 026-04-1 0T185125
|
||||
0120 5a 5f 33 5f 57 44 31 35 34 38 31 30 30 34 32 30 Z_3_WD15 48100420
|
||||
0130 32 36 52 50 31 5f 52 54 52 57 4e 45 43 5f 30 5f 26RP1_RT RWNEC_0_
|
||||
0140 31 35 34 38 2d 48 55 4e 47 41 52 59 2d 45 4c 45 1548-HUN GARY-ELE
|
||||
0150 43 54 49 4f 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e CTION-OP POSITION
|
||||
0160 2d 43 4f 4e 43 45 52 54 2d 4d 4f 52 45 2e 58 4d -CONCERT -MORE.XM
|
||||
0170 4c 00 01 00 00 00 01 00 04 00 10 11 00 80 L・・・・・・・ ・・・・・・
|
||||
@ -1,25 +0,0 @@
|
||||
0000 00 01 8a 01 e1 91 85 92 fa 7c 00 00 00 21 7b 01 ・・・・・・・・ ・|・・・!{・
|
||||
0010 00 03 7a 01 d5 85 5f 96 72 01 00 00 62 01 00 00 ・・z・・・_・ r・・・b・・・
|
||||
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0030 97 12 0a 00 00 00 00 00 02 00 00 00 4e 01 00 00 ・・・・・・・・ ・・・・N・・・
|
||||
0040 17 00 00 00 00 00 00 00 80 05 00 00 c7 47 d9 69 ・・・・・・・・ ・・・・・G・i
|
||||
0050 0b 00 00 00 00 00 00 00 0b 00 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
0060 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
|
||||
0070 38 35 31 32 35 5a 5f 31 5f 57 44 31 35 34 38 31 85125Z_1 _WD15481
|
||||
0080 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 4e 0042026R P1_RTRWN
|
||||
0090 45 43 5f 30 5f 31 35 34 38 2d 48 55 4e 47 41 52 EC_0_154 8-HUNGAR
|
||||
00A0 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f 53 Y-ELECTI ON-OPPOS
|
||||
00B0 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d 4f ITION-CO NCERT-MO
|
||||
00C0 52 45 2e 63 61 73 00 83 01 00 00 00 c1 10 a5 7c RE.cas・・ ・・・・・・・|
|
||||
00D0 ce b3 91 90 a1 47 81 54 96 43 55 36 a2 b1 ac 00 ・・・・・G・T ・CU6・・・・
|
||||
00E0 00 00 00 00 00 00 0c 00 00 00 0b 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
00F0 00 00 02 00 00 00 0e 47 d9 69 00 00 00 00 7a 36 ・・・・・・・G ・i・・・・z6
|
||||
0100 00 00 00 00 00 00 80 3c 00 00 00 00 00 00 5c 52 ・・・・・・・< ・・・・・・\R
|
||||
0110 56 4e 2d 53 43 52 49 50 54 53 5c 32 30 32 36 2d VN-SCRIP TS\2026-
|
||||
0120 30 34 2d 31 30 54 31 38 35 31 32 35 5a 5f 31 5f 04-10T18 5125Z_1_
|
||||
0130 57 44 31 35 34 38 31 30 30 34 32 30 32 36 52 50 WD154810 042026RP
|
||||
0140 31 5f 52 54 52 57 4e 45 43 5f 30 5f 31 35 34 38 1_RTRWNE C_0_1548
|
||||
0150 2d 48 55 4e 47 41 52 59 2d 45 4c 45 43 54 49 4f -HUNGARY -ELECTIO
|
||||
0160 4e 2d 4f 50 50 4f 53 49 54 49 4f 4e 2d 43 4f 4e N-OPPOSI TION-CON
|
||||
0170 43 45 52 54 2d 4d 4f 52 45 2e 63 61 73 00 01 00 CERT-MOR E.cas・・・
|
||||
0180 00 00 01 00 04 00 0a 0b 00 80 ・・・・・・・・ ・・
|
||||
@ -1,24 +0,0 @@
|
||||
0000 00 03 78 01 cc 30 69 01 70 01 00 00 60 01 00 00 ・・x・・0i・ p・・・`・・・
|
||||
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0020 97 12 0a 00 00 00 00 00 02 00 00 00 4c 01 00 00 ・・・・・・・・ ・・・・L・・・
|
||||
0030 17 00 00 00 00 00 00 00 80 05 00 00 db 47 d9 69 ・・・・・・・・ ・・・・・G・i
|
||||
0040 00 90 02 00 00 00 00 00 00 90 02 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
0050 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
|
||||
0060 38 34 34 31 34 5a 5f 31 5f 4c 57 44 31 35 34 38 84414Z_1 _LWD1548
|
||||
0070 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
|
||||
0080 4e 45 56 5f 42 5f 31 35 34 38 2d 48 55 4e 47 41 NEV_B_15 48-HUNGA
|
||||
0090 52 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f RY-ELECT ION-OPPO
|
||||
00A0 53 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d SITION-C ONCERT-M
|
||||
00B0 4f 52 45 2e 4d 50 47 2e 65 6e 63 00 83 01 00 00 ORE.MPG. enc・・・・・
|
||||
00C0 00 c1 10 de b4 12 f2 c5 cb d8 47 a7 10 17 e4 bb ・・・・・・・・ ・・G・・・・・
|
||||
00D0 7e 62 1c a5 00 00 00 00 00 00 00 0c 00 00 00 00 ~b・・・・・・ ・・・・・・・・
|
||||
00E0 90 02 00 00 00 00 00 02 00 00 00 13 47 d9 69 00 ・・・・・・・・ ・・・・G・i・
|
||||
00F0 00 00 00 00 40 5c 0d 00 00 00 00 00 00 18 0e 00 ・・・・@\・・ ・・・・・・・・
|
||||
0100 00 00 00 5c 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・\2026 -04-10T1
|
||||
0110 38 34 34 31 34 5a 5f 31 5f 4c 57 44 31 35 34 38 84414Z_1 _LWD1548
|
||||
0120 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
|
||||
0130 4e 45 56 5f 42 5f 31 35 34 38 2d 48 55 4e 47 41 NEV_B_15 48-HUNGA
|
||||
0140 52 59 2d 45 4c 45 43 54 49 4f 4e 2d 4f 50 50 4f RY-ELECT ION-OPPO
|
||||
0150 53 49 54 49 4f 4e 2d 43 4f 4e 43 45 52 54 2d 4d SITION-C ONCERT-M
|
||||
0160 4f 52 45 2e 4d 50 47 2e 65 6e 63 00 01 00 00 00 ORE.MPG. enc・・・・・
|
||||
0170 01 00 04 00 f3 00 00 80 ・・・・・・・・
|
||||
@ -1,22 +0,0 @@
|
||||
0000 00 03 54 01 12 65 f2 b5 4c 01 00 00 3c 01 00 00 ・・T・・e・・ L・・・<・・・
|
||||
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0020 97 12 0a 00 00 00 00 00 02 00 00 00 28 01 00 00 ・・・・・・・・ ・・・・(・・・
|
||||
0030 17 00 00 00 00 00 00 00 80 05 00 00 b4 48 d9 69 ・・・・・・・・ ・・・・・H・i
|
||||
0040 d8 13 00 00 00 00 00 00 d8 13 00 00 00 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
0050 01 00 00 00 32 30 31 32 2d 31 32 2d 30 36 54 31 ・・・・2012 -12-06T1
|
||||
0060 37 32 34 34 31 5a 5f 37 36 5f 4c 57 44 30 30 30 72441Z_7 6_LWD000
|
||||
0070 52 54 54 49 4f 4f 44 5f 52 54 52 57 4e 45 56 5f RTTIOOD_ RTRWNEV_
|
||||
0080 42 5f 54 39 39 39 2d 50 4c 45 41 53 45 2d 49 47 B_T999-P LEASE-IG
|
||||
0090 4e 4f 52 45 2d 32 36 30 34 31 30 30 30 30 37 35 NORE-260 41000075
|
||||
00A0 33 2e 4d 50 47 2e 65 6e 63 00 83 01 00 00 00 c1 3.MPG.en c・・・・・・・
|
||||
00B0 10 eb d9 18 9c ea 9a af 48 8b 2c 06 c4 25 6a 2c ・・・・・・・・ H・,・・%j,
|
||||
00C0 bf 93 00 00 00 00 00 00 00 0c 00 00 00 d8 13 00 ・・・・・・・・ ・・・・・・・・
|
||||
00D0 00 00 00 00 00 02 00 00 00 85 47 d9 69 00 00 00 ・・・・・・・・ ・・G・i・・・
|
||||
00E0 00 00 20 67 00 00 00 00 00 00 24 6d 00 00 00 00 ・・ g・・・・ ・・$m・・・・
|
||||
00F0 00 5c 32 30 31 32 2d 31 32 2d 30 36 54 31 37 32 ・\2012-1 2-06T172
|
||||
0100 34 34 31 5a 5f 37 36 5f 4c 57 44 30 30 30 52 54 441Z_76_ LWD000RT
|
||||
0110 54 49 4f 4f 44 5f 52 54 52 57 4e 45 56 5f 42 5f TIOOD_RT RWNEV_B_
|
||||
0120 54 39 39 39 2d 50 4c 45 41 53 45 2d 49 47 4e 4f T999-PLE ASE-IGNO
|
||||
0130 52 45 2d 32 36 30 34 31 30 30 30 30 37 35 33 2e RE-26041 0000753.
|
||||
0140 4d 50 47 2e 65 6e 63 00 01 00 00 00 01 00 04 00 MPG.enc・ ・・・・・・・・
|
||||
0150 f1 fe 00 80 ・・・・
|
||||
@ -1,21 +0,0 @@
|
||||
0000 00 03 4c 01 11 ab 5d bc 44 01 00 00 34 01 00 00 ・・L・・・]・ D・・・4・・・
|
||||
0010 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0020 97 12 0a 00 00 00 00 00 02 00 00 00 20 01 00 00 ・・・・・・・・ ・・・・ ・・・
|
||||
0030 17 00 00 00 00 00 00 00 80 05 00 00 af 49 d9 69 ・・・・・・・・ ・・・・・I・i
|
||||
0040 00 4f 01 00 00 00 00 00 00 4f 01 00 00 00 00 00 ・O・・・・・・ ・O・・・・・・
|
||||
0050 01 00 00 00 32 30 32 36 2d 30 34 2d 31 30 54 31 ・・・・2026 -04-10T1
|
||||
0060 38 35 34 34 31 5a 5f 31 5f 4c 57 44 31 35 32 30 85441Z_1 _LWD1520
|
||||
0070 31 30 30 34 32 30 32 36 52 50 31 5f 52 54 52 57 10042026 RP1_RTRW
|
||||
0080 4e 45 56 5f 42 5f 31 35 32 30 2d 53 50 41 43 45 NEV_B_15 20-SPACE
|
||||
0090 2d 4d 4f 4f 4e 2d 41 52 54 45 4d 49 53 2e 4d 50 -MOON-AR TEMIS.MP
|
||||
00A0 47 2e 65 6e 63 00 83 01 00 00 00 c1 10 e5 8c 5f G.enc・・・ ・・・・・・・_
|
||||
00B0 e0 01 87 38 48 bf be 18 db b0 93 27 d7 8f 00 00 ・・・8H・・・ ・・・'・・・・
|
||||
00C0 00 00 00 00 00 0c 00 00 00 00 4f 01 00 00 00 00 ・・・・・・・・ ・・O・・・・・
|
||||
00D0 00 02 00 00 00 f0 48 d9 69 00 00 00 00 00 c8 d0 ・・・・・・H・ i・・・・・・・
|
||||
00E0 06 00 00 00 00 00 80 32 07 00 00 00 00 5c 32 30 ・・・・・・・2 ・・・・・\20
|
||||
00F0 32 36 2d 30 34 2d 31 30 54 31 38 35 34 34 31 5a 26-04-10 T185441Z
|
||||
0100 5f 31 5f 4c 57 44 31 35 32 30 31 30 30 34 32 30 _1_LWD15 20100420
|
||||
0110 32 36 52 50 31 5f 52 54 52 57 4e 45 56 5f 42 5f 26RP1_RT RWNEV_B_
|
||||
0120 31 35 32 30 2d 53 50 41 43 45 2d 4d 4f 4f 4e 2d 1520-SPA CE-MOON-
|
||||
0130 41 52 54 45 4d 49 53 2e 4d 50 47 2e 65 6e 63 00 ARTEMIS. MPG.enc・
|
||||
0140 01 00 00 00 01 00 04 00 f3 00 00 80 ・・・・・・・・ ・・・・
|
||||
@ -1,13 +0,0 @@
|
||||
0000 00 01 c8 00 e1 91 85 92 f9 7d 00 02 00 00 b9 00 ・・・・・・・・ ・}・・・・・・
|
||||
0010 00 03 b8 00 2b f0 ab 81 b0 00 00 00 a0 00 00 00 ・・・・+・・・ ・・・・・・・・
|
||||
0020 00 00 00 00 01 00 00 00 02 00 00 70 00 00 00 00 ・・・・・・・・ ・・・p・・・・
|
||||
0030 97 12 0a 00 00 00 00 00 02 00 00 00 8c 00 00 00 ・・・・・・・・ ・・・・・・・・
|
||||
0040 17 00 00 00 00 00 00 00 80 05 00 00 5c 4a d9 69 ・・・・・・・・ ・・・・\J・i
|
||||
0050 61 02 00 00 00 00 00 00 61 02 00 00 00 00 00 00 a・・・・・・・ a・・・・・・・
|
||||
0060 01 00 00 00 77 6e 65 2e 64 61 74 00 83 01 00 00 ・・・・wne. dat・・・・・
|
||||
0070 00 c1 10 97 70 db bc 3e 3a 9e 45 9f 03 8d 2a fb ・・・・p・・> :・E・・・*・
|
||||
0080 ea eb ce 45 00 00 00 00 00 00 00 0c 00 00 00 61 ・・・E・・・・ ・・・・・・・a
|
||||
0090 02 00 00 00 00 00 00 02 00 00 00 a2 49 d9 69 00 ・・・・・・・・ ・・・・I・i・
|
||||
00A0 00 00 00 6b 5e 0c 00 00 00 00 00 80 15 0d 00 00 ・・・k^・・・ ・・・・・・・・
|
||||
00B0 00 00 00 5c 77 6e 65 2e 64 61 74 00 01 00 00 00 ・・・\wne. dat・・・・・
|
||||
00C0 01 00 04 00 c0 cb 00 80 ・・・・・・・・
|
||||
@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema
|
||||
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
||||
xmlns:rrt="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
|
||||
targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/" elementFormDefault="qualified">
|
||||
<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="W3C/xml.xsd"/>
|
||||
<xs:element name="RatingRegionTables" type="rrt:RRsType"/>
|
||||
<xs:complexType name="RRsType">
|
||||
<xs:sequence>
|
||||
<xs:element name="RatingRegionTable" type="rrt:RatingRegionTableType" maxOccurs="2"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="RatingRegionTableType">
|
||||
<xs:sequence>
|
||||
<xs:element name="RegionIdText" type="rrt:TextType" maxOccurs="unbounded"/>
|
||||
<xs:element name="Dimension" type="rrt:DimensionType" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="regionIdentifier" type="rrt:RIType" use="required"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="RIType">
|
||||
<xs:restriction base="xs:unsignedByte">
|
||||
<xs:minInclusive value="1"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="DimensionType">
|
||||
<xs:sequence>
|
||||
<xs:element name="DimensionTitle" type="rrt:TextType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="Rating" type="rrt:RatingType" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="dimensionLevels" type="rrt:DimLevelType" use="required"/>
|
||||
<xs:attribute name="dimensionGraduated" type="xs:boolean" default="false"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="DimLevelType">
|
||||
<xs:restriction base="xs:unsignedByte">
|
||||
<xs:minInclusive value="1"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:complexType name="RatingType">
|
||||
<xs:sequence>
|
||||
<xs:element name="RatingValueAbbrev" type="rrt:TextType" maxOccurs="unbounded"/>
|
||||
<xs:element name="RatingValueString" type="rrt:TextType" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="ratingValue" type="xs:unsignedByte" use="required"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="TextType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute ref="xml:lang" default="EN"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@ -1,225 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sa="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/"
|
||||
xmlns:rrt="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
|
||||
targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/"
|
||||
elementFormDefault="qualified">
|
||||
<xs:import namespace="http://www.w3.org/XML/1998/namespace"
|
||||
schemaLocation="W3C/xml.xsd"/>
|
||||
<xs:import namespace="tag:atsc.org,2016:XMLSchemas/ATSC3/RRT/1.0/"
|
||||
schemaLocation="RRT-1.0-20170209.xsd"/>
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
The definition of this schema can also be found in an XML schema file, SA-1.0-20170921.xsd at the ATSC website.The XML schema file RRT-1.0-20170209.xsd can also be found at the ATSC website.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
<xs:element name="Capabilities" type="sa:CapabilitiesType" />
|
||||
<xs:simpleType name="CapabilitiesType"><xs:restriction base="xs:string"/></xs:simpleType>
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
Name and Description elements in Service and Content Fragments of OMA BCAST service guide will be replaced with following extended elements
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
|
||||
<xs:element name="Name" type="sa:NameDescriptionType" />
|
||||
<xs:element name="Description" type="sa:NameDescriptionType" />
|
||||
|
||||
<xs:complexType name="NameDescriptionType">
|
||||
<xs:sequence>
|
||||
<xs:element name="SpeechInfoURI" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="content-type" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="content-enc" type="xs:string" use="optional"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="SpeechInfo" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute name="content-type" type="xs:string" use="optional"/>
|
||||
<xs:attribute name="content-enc" type="xs:string" use="optional"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="text" type="xs:string" use="required" />
|
||||
<xs:attribute ref="xml:lang" use="optional"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="ContentAdvisoryRatings" type="sa:CARatingType"/>
|
||||
<xs:complexType name="CARatingType">
|
||||
<xs:sequence>
|
||||
<xs:element name="RegionIdentifier" type="xs:unsignedByte"
|
||||
minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="RatingDescription" maxOccurs="1">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute ref="xml:lang" use="optional"
|
||||
default="en"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="RatedDimensions" type="xs:unsignedByte"
|
||||
minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="RatingDimVal" type="sa:RatingDimValType"
|
||||
minOccurs="1" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="RatingDimValType">
|
||||
<xs:sequence>
|
||||
<xs:element name="RatingDimension" type="xs:unsignedByte"
|
||||
minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="RatingValueString" type="xs:string"
|
||||
minOccurs="1"/>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="OtherRatings" type="sa:OtherRatingType"/>
|
||||
<xs:complexType name="OtherRatingType">
|
||||
<xs:sequence>
|
||||
<xs:choice>
|
||||
<xs:element name="RatingInformationString" type="xs:string" minOccurs="1"/>
|
||||
<xs:element name="RatingInformationData" type="sa:RatingContainerType" minOccurs="1"/>
|
||||
</xs:choice>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="ratingScheme" type="xs:anyURI" use="required" />
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="RatingContainerType">
|
||||
<xs:sequence>
|
||||
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="ATSC3ServiceExtension" type="sa:ATSC3ServiceExtensionType" >
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
This element is a wrapper for ATSC service extensions to OMA BCAST SG Service fragments. It shall only be used inside a PrivateExt element within a Service fragment.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
|
||||
<xs:complexType name="ATSC3ServiceExtensionType">
|
||||
<xs:sequence>
|
||||
<xs:element name="Icon" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
|
||||
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="MajorChannelNum" type="sa:LangString" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="MinorChannelNum" type="sa:LangString" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:element name="RatingRegionTables" type="rrt:RRsType" minOccurs="0" maxOccurs="1"/>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="Components" type="sa:ComponentsType" >
|
||||
<xs:annotation>
|
||||
<xs:documentation>
|
||||
This element is a wrapper for ATSC media extensions to OMA BCAST SG Content fragments. It shall only be used inside a PrivateExt element within a Content fragment.
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
|
||||
<xs:complexType name="ComponentsType">
|
||||
<xs:sequence>
|
||||
<xs:element name="VideoComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="AudioComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="CCComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="AppComponent" type="sa:IndividualComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="IndividualComponentType">
|
||||
<xs:complexContent>
|
||||
<xs:extension base="sa:LangString">
|
||||
<xs:attribute name="language" type="xs:string" use="optional" default="en"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:complexContent>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="LangString">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:string">
|
||||
<xs:attribute ref="xml:lang" use="optional" default="en"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:element name="ContentIcon" >
|
||||
<xs:annotation><xs:documentation>This element is only used inside a PrivateExt element within a Content fragment as defined in Table 5.7 and its cardinality is defined in Table 5.9. </xs:documentation></xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
|
||||
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="Preview" type="sa:PreviewType" />
|
||||
<xs:complexType name="PreviewType">
|
||||
<xs:sequence>
|
||||
<xs:element name="PreviewIcon" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
|
||||
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="Description" type="sa:NameDescriptionType" minOccurs="1" maxOccurs="unbounded"/>
|
||||
<xs:element name="PreviewContent" minOccurs="0" maxOccurs="unbounded">
|
||||
<xs:complexType>
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="MIMEType" type="xs:string" use="optional" />
|
||||
<xs:attribute name="width" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="height" type="xs:unsignedInt" use="optional" />
|
||||
<xs:attribute name="dataSize" type="xs:unsignedInt" use="optional" />
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:any namespace="##other" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="usage" type="xs:string" use="optional" default="promo"/>
|
||||
<xs:anyAttribute processContents="skip"/>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@ -1,91 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:slt="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SLT/1.0/" xmlns:sa="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/" targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SLT/1.0/" elementFormDefault="qualified">
|
||||
<xs:import namespace="tag:atsc.org,2016:XMLSchemas/ATSC3/SA/1.0/" schemaLocation="SA-1.0-20170921.xsd"/>
|
||||
<xs:element name="SLT" type="slt:sltType"/>
|
||||
<xs:complexType name="sltType">
|
||||
<xs:sequence>
|
||||
<xs:element name="SLTCapabilities" type="sa:CapabilitiesType" minOccurs="0"/>
|
||||
<xs:element name="SLTInetUrl" type="slt:URLType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="Service" type="slt:serviceType" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="bsid" type="slt:listOfUnsignedShortType" use="required"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="serviceType">
|
||||
<xs:sequence>
|
||||
<xs:element name="SimulcastTSID" type="slt:SimulcastTSIDType" minOccurs="0"/>
|
||||
<xs:element name="SvcCapabilities" type="sa:CapabilitiesType" minOccurs="0"/>
|
||||
<xs:element name="BroadcastSvcSignaling" type="slt:broadcastSigType" minOccurs="0"/>
|
||||
<xs:element name="SvcInetUrl" type="slt:URLType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:element name="OtherBsid" type="slt:OtherBsidType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xs:any namespace="##other" processContents="strict" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="serviceId" type="xs:unsignedShort" use="required"/>
|
||||
<xs:attribute name="globalServiceID" type="xs:anyURI"/>
|
||||
<xs:attribute name="sltSvcSeqNum" type="xs:unsignedByte" use="required"/>
|
||||
<xs:attribute name="protected" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="majorChannelNo" type="slt:ChannelNumType"/>
|
||||
<xs:attribute name="minorChannelNo" type="slt:ChannelNumType"/>
|
||||
<xs:attribute name="serviceCategory" type="xs:unsignedByte" use="required"/>
|
||||
<xs:attribute name="shortServiceName" type="xs:string"/>
|
||||
<xs:attribute name="hidden" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="broadbandAccessRequired" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="essential" type="xs:boolean"/>
|
||||
<xs:attribute name="drmSystemID" type="xs:anyURI"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="SimulcastTSIDType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:unsignedShort">
|
||||
<xs:attribute name="simulcastMajorChannelNo" type="slt:ChannelNumType"/>
|
||||
<xs:attribute name="simulcastMinorChannelNo" type="slt:ChannelNumType"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="broadcastSigType">
|
||||
<xs:attribute name="slsProtocol" type="xs:unsignedByte" use="required"/>
|
||||
<xs:attribute name="slsMajorProtocolVersion" type="xs:unsignedByte" default="1"/>
|
||||
<xs:attribute name="slsMinorProtocolVersion" type="xs:unsignedByte" default="0"/>
|
||||
<xs:attribute name="slsDestinationIpAddress" type="slt:IPv4addressType" use="required"/>
|
||||
<xs:attribute name="slsDestinationUdpPort" type="slt:PortType" use="required"/>
|
||||
<xs:attribute name="slsSourceIpAddress" type="slt:IPv4addressType"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="URLType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="urlType" type="xs:unsignedByte" use="required"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:complexType name="OtherBsidType">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="slt:listOfUnsignedShortType">
|
||||
<xs:attribute name="type" type="xs:unsignedByte" use="required"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="ChannelNumType">
|
||||
<xs:restriction base="xs:unsignedShort">
|
||||
<xs:minInclusive value="1"/>
|
||||
<xs:maxInclusive value="999"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="IPv4addressType">
|
||||
<xs:restriction base="xs:token">
|
||||
<xs:pattern value="(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="PortType">
|
||||
<xs:restriction base="xs:unsignedShort">
|
||||
<xs:minInclusive value="1"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="listOfUnsignedShortType">
|
||||
<xs:list itemType="xs:unsignedShort"/>
|
||||
</xs:simpleType>
|
||||
</xs:schema>
|
||||
@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:time="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SYSTIME/1.0/" targetNamespace="tag:atsc.org,2016:XMLSchemas/ATSC3/Delivery/SYSTIME/1.0/" elementFormDefault="qualified">
|
||||
<xs:element name="SystemTime" type="time:SysTimeType"/>
|
||||
<xs:complexType name="SysTimeType">
|
||||
<xs:attribute name="currentUtcOffset" type="xs:short" use="required"/>
|
||||
<xs:attribute name="ptpPrepend" type="xs:unsignedShort" default="0"/>
|
||||
<xs:attribute name="leap59" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="leap61" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="utcLocalOffset" type="xs:duration" use="required"/>
|
||||
<xs:attribute name="dsStatus" type="xs:boolean" default="false"/>
|
||||
<xs:attribute name="dsDayOfMonth" type="time:dayType"/>
|
||||
<xs:attribute name="dsHour" type="time:hourType"/>
|
||||
<xs:anyAttribute processContents="strict"/>
|
||||
</xs:complexType>
|
||||
<xs:simpleType name="dayType">
|
||||
<xs:restriction base="xs:unsignedByte">
|
||||
<xs:minInclusive value="1"/>
|
||||
<xs:maxInclusive value="31"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="hourType">
|
||||
<xs:restriction base="xs:unsignedByte">
|
||||
<xs:maxInclusive value="24"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:schema>
|
||||
@ -1,3 +0,0 @@
|
||||
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes SLT-1.0-20180228.xsd SA-1.0-20170921.xsd RRT-1.0-20170209.xsd /out:. /namespace:skyscraper8.Atsc.A331.Schema
|
||||
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes SYSTIME-1.0-20170921.xsd /out:. /namespace:skyscraper8.Atsc.A331.Schema
|
||||
pause
|
||||
@ -1,319 +0,0 @@
|
||||
# Das namen- und staatenlose Dorf
|
||||
* Das Dorf um das es geht ist rein fiktiv!
|
||||
* Ort: relativ genau auf dem Dreiländereck zwischen der Schweiz, Frankreich und Italien.
|
||||
* Genre: Mischung aus Sci-Fi und weichgespülter Fantasy
|
||||
* Zeitgeist: Etwa 2025-2027
|
||||
|
||||
---
|
||||
|
||||
## Charaktere
|
||||
### Hauptcharaktere
|
||||
#### Alpha Aoki
|
||||
- **Name:** Alpha Aoki
|
||||
- **Alter:** 34 Jahre
|
||||
- **Beziehungen:** Sie ist die ältere zweieiige Zwillingsschwester von Sophia Aoki. Ihre Mutter ist Alexandra.
|
||||
- **Wohnort:** Zusammen mit Sophia In einer viel zu kleinen Wohnung über der Metzgerei des Dorfes. Später in der Aoki-Villa
|
||||
- **Rasse:** Menschenbrut
|
||||
- **Fähigkeit als Menschenbrut:** Sie kann instinktiv den Fluss von Finanzen spüren. Dieses Gespür kommt in Form eines zusätzlichen Sinnesorgans. Wenn sie die Augen schließt und sich transportiert, gaukelt ihr dieses Sinnesorgan ihren anderen Sinnen einen Ozean vor, dessen Wasserströmungen die Finanzströme sind. Der Ozean ist auch nicht wirklich aus Wasser, sondern aus Zahlen und Daten, die sich in ihrem Verstand verhalten wie Wasser.
|
||||
- **Arbeit:** Sie ist Junior Analystin bei einer kleinen Schweizer Bank. Mithilfe ihrer Fähigkeit hat sie schon mehrere Kunden dieser Bank zu Reichtum verholfen.
|
||||
- **Bildung:** Da es im Dorf kein richtiges Bildungssystem gibt, hat Alexandra Alpha & Sophia von recht teuren Privatlehren homeschoolen lassen.
|
||||
|
||||
#### Sophia Aoki
|
||||
- **Name:** Sophia Aoki
|
||||
- **Alter:** 34 Jahre
|
||||
- **Beziehungen:** Sie ist die jüngere zweieiige Zwillingsschwester von Alpha Aoki. Ihr Chef ist Herr Moreau. Ihre Mutter ist Alexandra.
|
||||
- **Wohnort:** Zusammen mit Alpha In einer viel zu kleinen Wohnung über der Metzgerei des Dorfes. Später in der Aoki-Villa.
|
||||
- **Arbeit:** Sie arbeitet im Laden von Herrn Moreau. Hauptsächlich kümmert sie sich um die Reperatur von allen möglichen, was Kunden so abgeben.
|
||||
- **Rasse:** Menschenbrut
|
||||
- **Fähigkeit als Menschenbrut:** Sie verfügt über eine übermenschliche Intelligenz
|
||||
- **Hobbies:** Sie hat sich von kleinauf für Technik begeistert. Bereits mit sieben Jahren konnte sie flüssig in Assemblersprache programmieren, und sie geht mit einem Lötkolben so sicher um, wie ein Herzchirug mit seinen Instrumenten.
|
||||
- **Bildung:** Da es im Dorf kein richtiges Bildungssystem gibt, hat Alexandra Alpha & Sophia von recht teuren Privatlehren homeschoolen lassen.
|
||||
|
||||
#### Alexandra Aoki:
|
||||
- **Name:** Alexandra Aoki (oder unter Hexen einfach nur "Alexandra")
|
||||
- **Alter:** 835 Jahre
|
||||
- **Beziehungen:** Sie ist die Mutter von Alpha und Sophia. Als die beiden volljährig geworden sind, hat Alexandra sie alleine im Dorf zurückgelassen. Nicht weil sie ihre Töchter hasst, nein, ganz im Gegenteil. Sie liebt ihre Töchter, und wollte dass diese schnell lernen auf eigenen Füßen zu stehen.
|
||||
- **Wohnort:** irgendwo in Florenz, Italien - später in der Aoki-Villo
|
||||
- **Arbeit:** unbekannt
|
||||
- **Rasse:** Hexe
|
||||
- **Bildung:** Im Hexenwald hat sie die übliche Grundausbildung erhalten, die alle Hexen bekommen. Später hat sie Italienisch gelernt, um den Hexenwald verlassen zu können.
|
||||
- Auch wenn sie eine Hexe ist, und über starke Magie verfügt, hat sie vor etwa 150 Jahren beschlossen, keinerlei Magie mehr einzusetzen, und ihr Leben so menschlich wie möglich zu führen.
|
||||
|
||||
#### Chloe Lindberg
|
||||
- **Name:** Chloe Lindberg
|
||||
- **Alter:** 34 Jahre
|
||||
- **Beziehungen:** Sie war vor vielen Jahren mal mit Sophia zusammen. Nun lebt Chloe in Finnland und pflegt dort gute Beziehungen zu ihren Schüler*innnen.
|
||||
- **Wohnort:** Helsinki, Finnland
|
||||
- **Arbeit:** Sie arbeitet in einer Sprachschule in Helsinki und unterrichtet Finnisch für Einwanderer.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Chloe hat das Gemeinschaftslernzentrum des Dorfes besucht. Einen formellen Schulabschluss hat sie deshalb nicht, kann aber vom Bildungsgrad etwa mit jemanden mithalten, der ein Schweizer Matura hat.
|
||||
- Als Chloe volljährig wurde, hat sie das Dorf verlassen um in Paris ihre Glück zu suchen.
|
||||
- In Paris hat sie mehrere Indie-Games entwickelt, die alle sehr gute Kritiken erhalten haben, aber ein Kassenschlager wurden diese nicht.
|
||||
- In Paris hat sie sich in einen Mann verliebt, mit dem sie eine kleine Tochter hat, die ihr zum Verwechseln ähnlich sieht.
|
||||
- Da sich der gewünschte Erfolg in Paris nicht gezeigt hat, hat sie beschlossen noch einmal von vorne anzufangen und zwar in Finnland.
|
||||
- Das Einwanderungsverfahren empfand sie als sehr schwierig. Sobald sie fließend in Finnisch ist, entschließt sie sich dazu, Sprachlehrerin zu werden, um anderen Einwanderern bei ähnlichen Problemen zu helfen.
|
||||
|
||||
#### Valérie Beaumont
|
||||
- **Name:** Valérie Beaumont
|
||||
- **Alter:** 32 Jahre
|
||||
- **Beziehungen:** Im Laufe der Story sind Valérie und Sophia zusammengekommen. Auch wenn sie adoptiert ist, schätzt sie ihre "Maman" und ihren "Papa" sehr, und pflegt auch ein gutes Verhältnis zu ihrer älteren Schwester, die nicht adoptiert, sondern ein leibliches Kind von Madame Beaumont ist.
|
||||
- **Wohnort:** Auf einem großen Bauernhof in Frankreich, wenige Minuten Fahrradweg von der Grenze zum Dorf entfernt.
|
||||
- **Arbeit:** Sie arbeitet auf dem Bauernhof ihrer ihrer Adoptiveltern und ist gleichzeitig auch Eventplannerin in einer erfolgreichen Eventagentur. Ihre Chefin dort sagt, dass Valérie die beste Eventplannerin ist, die sie hat.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Valérie verfügt über ein allgemeines französisches Lycée.
|
||||
|
||||
#### Tennie:
|
||||
- **Tennie:** Tennie
|
||||
- **Alter:** Da sie eine streunende Katze ist, hat man sich nicht die Mühe gemacht, wie alt sie ist.
|
||||
- **Beziehungen:**
|
||||
- Alexandra ist Tennies Lieblingszweibeinerin.
|
||||
- Tennie hasst Alpha aus nicht näher bekannten Gründen. Wahrscheinlich irgendsoein Katzending.
|
||||
- Tennie mag Sophia (oder eher ihren Schoß) weil bequem.
|
||||
- Tennie mag Espresso, weil diese am ehesten Futter spendet.
|
||||
- Tennie findet die Geräusche lustig, wenn Jade wegen ihrer Katzenhaarallergie niesen muss.
|
||||
- **Wohnort:** Adoptiert in der Aoki-Villa
|
||||
- **Arbeit:** Hält die Villa und die Umgebung von Mäusen und anderen Schädlingen frei
|
||||
- **Rasse:** Hauskatze (Felis domestica)
|
||||
- **Bildung:** Was man als streunende Straßenkatze im Dorf eben so lernt.
|
||||
- Tennie ist eine getigerte, europäisch-Kurzhaar Braun-Tabby.
|
||||
- Als sie noch eine Streunerin war, hat ihr der Winter stark zugesetzt. Als sie nicht mehr weiter wusste, hat sie sich im Brennpunkt der großen Satellitenschüssel im Garten der Aoki-Villa versteckt, um dort Zuflucht vor dem Schnee zu suchen.
|
||||
- Sie wurde Tennie genannt, weil die Antenne aus der Sophia sie gerettet hat auf Eutelsat 10 (Ten) ausgerichtet ist.
|
||||
|
||||
### Die Maids in der Aoki-Villa
|
||||
|
||||
### Espresso
|
||||
- **Name:** Lina "Espresso" Müller
|
||||
- **Alter:** 22 Jahre
|
||||
- **Beziehungen:** Laut Kaede ist Espresso die zuverlässigste, wenn auch die chaotischte aller Maids.
|
||||
- **Wohnort:** In einer kleinen Wohnung nahe des Dorf-Plazas
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Espresso gilt als gebildet. Sie hat ein österreichisches Matura und ein großes Latinum.
|
||||
- Espresso nennt sich selbst "fleischgewordener Unfug" und dies äußert sich darin, dass sie immer Unfug oder Schabernack parat hat. Sie weiß auch immer, wie sie Leuten wieder ein Lächeln auf die Lippen zaubern kann.
|
||||
- Espresso kommt ursprünglich aus Österreich. Sie ist Tochter eines Staranwaltes und einer Chefärztin.
|
||||
- Espresso färbt sich die Haare immer und grundsätzlich grün. Sie benutzt das selbe grün wie Fawn, und erklärt sie deshalb automatisch zur guten Freundin.
|
||||
|
||||
### Mistral
|
||||
- **Name:** ? "Mistral" ?
|
||||
- **Alter:** 27 Jahre
|
||||
- **Beziehungen:** Der wichtigste Mensch in ihrem Leben ist ihre jüngere Schwester, Camille. Mistral möchte Camille um jeden Preis beschützen.
|
||||
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Mistral hat ein französisches "Lycée professionnel" und ist ausgebildete Elektrikerin.
|
||||
|
||||
### Mireille
|
||||
- **Name:** ? "Mireille" ?
|
||||
- **Alter:** 64 Jahre
|
||||
- **Beziehungen:** Wenige. Mireille lebt recht abgeschieden im Dorf. Sie geht ihrer Arbeit als Maid in der Villa aber gerne und mit Eifer nach. Ansonsten hat sie einen Ex-Mann, von dem sie nicht weiß, wo er abgebildet ist, und einen Sohn, der in Amerika in einem Großkonzern arbeitet.
|
||||
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa. Sie arbeitet ausschließlich in der Nachtschicht, niemals tagsüber.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Da sie ein Kind des Dorfes ist, hat sie lediglich das Gemeinschaftslernzentrum des Dorfes besucht. Von daher kann sie keinen formellen Bildungsabschluss vorweisen.
|
||||
|
||||
### Ryouku
|
||||
- **Name:** ? "Ryouku" ?
|
||||
- **Alter:** 25 Jahre
|
||||
- **Beziehungen:** Wenige. Ihre praktisch einzigen Bezugspersonen sind Kaede als Chefin, und Mireille als Kollegin.
|
||||
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa. Sie arbeitet ausschließlich in der Nachtschicht, niemals tagsüber.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Sie hat eine Oberschule in Japan besucht und abgeschlossen. Sie hatte auch die Chance auf eine gute Universität zu gelangen, hat diese aber nicht genutzt.
|
||||
- Sie hat einen "Deutsch-Tick". In ihrer Schulzeit während der Oberschule war sie im Deutsch-Club, weil sie die D-A-CH Region schon immer fasziniert hat. Im Deutsch-Club hat sie mit ihren Mitschüler*innen deutsche Literatur gelesen, deutsche Musik gehört, deutsche Filme/Serien geschaut. Am liebsten mochte sie Stromberg. Deshalb ist sie auch nicht zur Uni gegangen, da sich für sie durch Zufall die Chance geboten hat, in der D-A-CH Region zu arbeiten. Diese Chance hat sie ergriffen, und so ist sie in der Villa gelandet.
|
||||
|
||||
### Jade
|
||||
- **Name:** ? "Jade" ?
|
||||
- **Alter:** 31 Jahre
|
||||
- **Beziehungen:** Viele. Sie ist extrem kontaktfreudig, und das nicht nur verbal.
|
||||
- **Wohnort:** In einer kleinen Wohnung irgendwo im Dorf.
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa, und bietet im Keller unter ihrer Wohnung Domina-Dienstleistungen an.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Sie hat ein allgemeins französisches "Lycée" und ist ausgebildete Hotelfachfrau.
|
||||
- Bevor sie in die Aoki-Villa kam, hat Jade in der Luxus-Hotellerie gearbeitet. Hauptsächlich war sie dort für die Kinderbetreuung zuständig, und hat sich auch mal für besondere VIPs des Hotels um Dienstleistungen gekümmert, die nicht zwangsläufig auf der Hotelrechnung standen.
|
||||
- Da sie bisher nur das Großstadt-Leben kennt, ist die Tatsache, dass das Dorf komplett Off-Grid ist zunächst eine Qual. Netflix, Spotify, Uber Eats und ähnliche Dienste nicht zur Verfügung zuhaben empfand sie zunächst als unheimlich unangenehm, aber je länger sie im Dorf lebt, um so mehr lernt sie das zu schätzen.
|
||||
- Sie ist eine PoC mit asiatischen Gesichtszügen. Das liegt daran, dass ihr Vater aus Ghana kommt, und ihre Mutter aus China.
|
||||
|
||||
### Fawn
|
||||
- **Name:** Quintana Fawn
|
||||
- **Alter:** 29 Jahre
|
||||
- **Beziehungen:** Sie schätzt die Aokis und die anderen Maids sehr. Ansonsten hält sie Kontakt zu einer Studienfreundin in den USA und ihrer Babička.
|
||||
- **Wohnort:** In einer eher größeren Wohnung irgendwo im Dorf.
|
||||
- **Arbeit:** Sie ist Maid in der Aoki-Villa.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Sie ist gebürtige Tschechin und hat in Tschechien Buchwissenschaften studiert.
|
||||
- Bevor sie zur Aoki-Villa gekommen ist, hat sie auf einem Weingut in Frankreich gearbeitet. Deshalb versteht sie was Service.
|
||||
- Auffällig an ihr ist ihr fast unnatürlich großer Busen, weshalb sich die anderen Maids zuerst wundern, ob sie damit überhaupt schwere Dinge heben kann.
|
||||
- In ihrer Freizeit ist Fawn ein Bücherwurm. Sie ist sehr gut belesen, und kann bei Diskussionen zu eigentlich jeder klassichen Literatur mitmischen, egal ob Dante, Homer, Orwell, Machiavelli, Thomas Mann, oder ähnliches.
|
||||
- Sie hat ein ausgeprägtes Nachtleben. Selbst bezeichnet sie sich als "Party-Luder", und ist auch oft in Discotheken und ähnlichen Etablissements anzutreffen.
|
||||
- Fawn mag es, sich die Haare grün zu färben. Dabei benutzt sie die selben Mittel wie Espresso.
|
||||
|
||||
### Nebencharaktere
|
||||
|
||||
#### Kaede
|
||||
- **Name:** Kaede Teien
|
||||
- **Alter:** 50 Jahre
|
||||
- **Beziehungen:** Sie ist zwar nach wie vor verheiratet mit Alexandra Aoki, hatte aber eine Affäre mit Leena, wobei ein Kind entstanden ist. Kaede hat beschlossen, für dieses Kind Verantwortung zu übernehmen, weshalb sie nach Finnland ausgewandert ist.
|
||||
- **Wohnort:** Helsinki, Finnland
|
||||
- **Arbeit:** Sie war früher die Ober-Maid in der Aoki-Villa. Nun ist sie in Finnland, aktuell arbeitslos, aber bemüht sich die Sprache zu lernen.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Kaede hat (damals noch als Tsukasa) in Japan eine spezielle Schule für Archivare besucht, und dort einen guten Abschluss erzielt.
|
||||
- In der Verwaltung des Dorfes galt Kaede früher als "der Hausdrache" der Villa. Sie schaut definitiv streng drin, und ist auch streng zu den anderen Maids, aber ebenso hat sie "ein Herz aus Gold"
|
||||
- Kaede ist transsexuell - sie ist als Mann zur Welt gekommen. Früher hieß sie "Tsukasa Teien" und ist ein Japan aufgewachsen.
|
||||
- Als Kaede eine Schulung in Grönland besucht hatte, hatte sie dort eine Affäre mit einer Finnin namens Leena.
|
||||
|
||||
### Leena
|
||||
- **Name:** Leena ?
|
||||
- **Alter:** 28 Jahre
|
||||
- **Beziehungen:** Sie hatte eine sexuelle Affäre mit Kaede wobei ein Kind entstanden ist.
|
||||
- **Wohnort:** Helsinki, Finnland
|
||||
- **Arbeit:** Sie arbeitet im Archiv einer Universität in Helsinki wird aber bald in Mutterschutz gehen.
|
||||
- **Rasse:** Mensch
|
||||
- **Bildung:** Sie hat ein finnisches Ylioppilastutkinto, hat aber nicht weiter studiert, bevor sie angefangen hat zu arbeiten.
|
||||
- Leena ist eher ruhig.
|
||||
- Leena spricht nur finnisch und englisch, letzteres aber auch nur ungerne, weshalb sie Kaede tatkräftig beim lernen unterstützt.
|
||||
|
||||
#### Herr Moreau
|
||||
- **Name:** Vorname unbekannt, alle nennen ihn nur Herr Moreau.
|
||||
- **Alter:** Unbekannt, aber definitiv über 60.
|
||||
- **Beziehungen:** Er ist der Chef von Sophia, und nennt sie "das Mädchen mit den goldenen Händen." Er ist mehr als zufrieden mit ihrer Mitarbeit im Laden.
|
||||
- **Wohnort:** Irgendwo an der französischen Grenze des Dorfes
|
||||
- **Arbeit:** Er führt den einzigen Elektroladen des Dorfes, wo er allerlei verkauft. Von obskuren Ersatzteilen, alte Schreibmaschinen, moderne Flachbildfernseher, Kühlschränke, oder die neusten Videospiele - wenn es elektronisch ist, hat er es in seinem Laden oder kann es besorgen. Da es der einzige Elektroladen im Dorf ist, nimmt er auch Reperaturaufträge an.
|
||||
- **Rasse:** Mensch
|
||||
|
||||
#### Benoît
|
||||
- **Name:** Vorname unbekannt, alle nennen ihn nur Benoít.
|
||||
- **Alter:** Ende 20.
|
||||
- **Beziehungen:** Er ist ein Arbeitskollege von Alpha Aoki bei einer kleinen Schweizer Bank. Er hat ein sexuelles, aber kein romantisches Interesse an Alpha Aoki. (was sie im laufe der Handlung zu ihrem Vorteil nutzen wird.)
|
||||
- **Wohnort:** In einer luxoriösen Penthouse-Wohnung irgendwo im Schweizer Kanton Wallis.
|
||||
- **Arbeit:** Er ist ein Investmentbanker in der selben kleinen Schweizer Bank, in der auch Alpha arbeitet.
|
||||
- **Rasse:** Mensch
|
||||
|
||||
## Das Dorf
|
||||
- **Name:** Das Dorf hat keinen Namen. Alle Bewohner nennen es nur "unser Dorf"
|
||||
- Das Dorf ist staatenlos. Es gehört nicht zur Schweiz, nicht zu Italien, und auch nicht zu Frankreich.
|
||||
- Die Bewohner sehen sich nicht als Schweizer, nicht als Italiener, und auch nicht als Franzosen, auch wenn viele der Bewohner aus diesen Ländern kommen.
|
||||
- Das Dorf besteht lange genug, dass es Bewohner gibt, die keine Einwanderer sind, sondern Dorfbewohner in dritter oder vierter Generation sind.
|
||||
- Das Dorf hat einen kleinen Bahnhof, über den es per ÖPNV gut an die Nachbarländer angebunden ist.
|
||||
- Das Dorf hat kein formelles Schulsystem. Stattdessen gibt es ein Gemeinschaftslernzentrum, in dem Kinder und Jungendlichen aller Altersklassen gemeinsam lernen.
|
||||
- Strom und Wasserversorung gibt es, mit einer Mischung aus Solar, Dieselgeneratoren und ein paar Goodwill-Verträgen mit den Nachbarländern.
|
||||
- Das Dorf hat keine Internetverbindung, da sich Swisscom, TIM und Orange nicht einig darüber sind, wer für das Dorf zuständig ist.
|
||||
- Folglich gibt es auch kein Telefon- oder Handynetz, außer ein internes, über das sich die Dorfbewohner nur gegenseitig anrufen können.
|
||||
- Das Dorf verfügt über eine hohe Population an Katzen und Bergziegen. Hunde sind eher die Ausnahme.
|
||||
- Um trotzdem nicht den modernen digitalen Medien hinherherzuhinken, haben sich die Dorfbewohner selbst eine Infrastruktur geschaffen, welche sie "Alpenlink" nennen.
|
||||
- Das Dorf führt über eine Bibliothek, die alle "das Archiv" nennen. Ein Gesetz des Dorfes besagt, dass alle Medien die in das Dorf ein- oder ausgeführt werden vom Archiv gesichtet werden müssen, was in der Praxis heißt, dass das Archiv Kopien anfertigt.
|
||||
- Unter den älteren Dorfbewohnern gibt es ein Sprichwort: "Man kann das Dorf zwar verlassen, aber das Dorf selber wird einen niemals verlassen."
|
||||
|
||||
## Alpenlink
|
||||
- Alpenlink ist die digitale Infrastruktur des Dorfes.
|
||||
- Dienste im Alpenlink:
|
||||
- PBX - ein internes Telefonsystem, damit die Dorfbewohner sich gegenseitig anrufen können.
|
||||
- Mastodon: eine interne Instanz, damit es im Dorf Social Media gibt. Da es im Dorf keine Internetverbindung gibt, förderiert diese Instanz nicht mit anderen.
|
||||
- Peertube: Auch eine Interne Instanz, damit es im Dorf einen Ersatz für YouTube gibt. Da es im Dorf keine Internetverbindung gibt, förderiert diese Instanz nicht mit anderen.
|
||||
- Forum: Ähnelt einem Internetforum, auf dem sich die Dorfbewohner über allerlei austauschen.
|
||||
- Landing Page: Eine Startseite auf der die Dorfverwaltung über Neuigkeiten informiert.
|
||||
- Wiki: Eine Dokumentation über alles, was es über das Dorf zu wissen gibt. Von einer Seite über die Öffnungszeiten der Bäckerei am Plaza, bis zur Dokumentation der Anschlüsse der Stromtransformatoren ist hier alles drin.
|
||||
- DVB-NIP: Der TV Service des Dorfes. Hier gibt es neben den Programmen der Nachbarländer auch das Lokalprogramm des Dorfes, über das das Archiv des Dorfes auch Zugang zu vielen seiner gesichteten Medien gibt.
|
||||
- App-Store: Für Smartphones gibt es einen Alpenlink-spezifischen App-Store in dem es dorfspezifische Apps (z.B. einen Abfallkalender, oder eine App für Ziegenpartenschaften)
|
||||
- Da es keine Telefonleitungen im Boden gibt, funktioniert Alpenlink technisch so, dass Netzwerkkabel von Dach-zu-Dach gelegt wurden.
|
||||
- An manchen Häusern sind auch Outdoor-Access-Points befestigt.
|
||||
- Sophia hat im Alter von 14 Jahren mit ihrer damaligen Ex-Freundin den Proof-of-Concept für das Alpenlink aufgebaut, und dafür haben die beiden von der Dorfverwaltung einen Preis für digitale Souveränität aufgebaut.
|
||||
|
||||
## Die verschiedenen Rassen
|
||||
### Menschen
|
||||
- Ganz gewöhnliche Menschen, hier gibt es nichts besonderes was für ein Fantasy-Setting beachtet werden muss.
|
||||
### Hexen
|
||||
- menschlich anmutende, ausschließlich weibliche Wesen mit magischen Fähigkeiten.
|
||||
- Bis zum Teenageralter altern Hexen ganz normal, wie Menschenkinder. Irgendwann zwischen dem 20. und 30. Lebensjahr hören die Körper von Hexen jedoch auf zu altern.
|
||||
- Deshalb sehen Hexen immer aus wie junge, attraktive Frauen.
|
||||
- Die genaue Lebenserwartung ist unbekannt.
|
||||
- Hexen sind sesshaft, und leben fast ausschließlich im Hexenwald, außer sie beschließen aktiv, diesen zu verlassen.
|
||||
### Menschenbruten
|
||||
- Menschenbruten verfügen über eigene Magie, die jedoch anders funktioniert als die der Hexen.
|
||||
- Während Hexen aktiv Magie anwenden müssen, haben die Menschenbruten eine für sie individuelle Fähigkeit, die sie passiv ihr ganzes Leben über begleitet.
|
||||
- Menschenbruten haben exakt die selbe Lebenserwartung wie gewöhnliche Menschen.
|
||||
- Beispiele für Fähigkeiten von Menschenbruten:
|
||||
- Mit Tieren sprechen
|
||||
- Farben riechen
|
||||
- Das Alter eines Baumes erkennen, ohne ihn abzusägen.
|
||||
- Den Fluss von Finanzen spüren (wie Alpha)
|
||||
- etc.
|
||||
### Hexenmeister
|
||||
- menschlich anmutende, ausschließlich männliche Wesen mit magischen Fähigkeiten.
|
||||
- Bis zum Teenageralter altern Hexen ganz normal, wie Menschenkinder. Irgendwann zwischen dem 20. und 30. Lebensjahr hören die Körper von Hexenmeistern jedoch auf zu altern.
|
||||
- Deshalb sehen Hexen immer aus wie junge, attraktive Männer.
|
||||
- Die genaue Lebenserwartung ist unbekannt.
|
||||
- Die Hexenmeister sind ein wandernes Volk, sie bleiben selten für zwei Tage am selben Ort.
|
||||
- Wenn eine Hexe einen Hexenmeister zur Welt bringt, geht dieser normalerweise mit der nächsten Gruppe Hexenmeistern mit, sobald er sicher selbstständig laufen kann.
|
||||
|
||||
## Hexenbiologie
|
||||
- Lässt sich eine Hexe mit einem menschlichen Mann (oder ein Hexenmeister mit einer menschlichen Frau) statt mit einem Hexenmeister ein, und beschließt ein Kind zu bekommen, so entsteht eine Menschenbrut.
|
||||
- Eine Hexe oder ein Hexenmeister kann nur dann geboren werden, wenn sich eine Hexe und ein Hexenmeister aufeinander einlassen.
|
||||
- Da Hexen sesshaft, Hexenmeister aber wandernd sind, ist es für Hexen völlig normal, polyamourös zu sein. Aus diesem Grund nimmt Alexandra es auch leicht, als Kaede ihr gesteht, dass sie eine Affäre und dabei ein Kind gezeugt hatte.
|
||||
|
||||
## Was Alexandra so in ihrem Leben erlebt hat
|
||||
- Alexandra ist im Jahre 1190 im Hexenwald, als Tochter einer hoch angesehenen Hexe namens Helena zur Welt gekommen.
|
||||
- Damit hat sie die Zeit miterlebt, in der der Buchdruck, das elektrische Licht, und die Dampfmaschine erfunden wurden.
|
||||
- Sie hat auch beide Weltkriege miterlebt, hat sich dabei jedoch in ein Land zurückgezogen, welches als sicher galt.
|
||||
- Ihr absolutes Lieblingszeitalter sind die 1980er Jahre. Zu dieser Zeit war sie unter den Menschen so eine Art B-Promi, da in diversen Clubs und Diskotheken in Mitteleuropa als DJane aufgelegt hat. Sie war sehr gefragt und wurde sehr oft gebucht.
|
||||
- 1990 hat sie festgestellt, dass sie von einem One-Night-Stand mit einem gewöhnlichen Menschen schwanger war. Deshalb hat sie angefangen nach einem Ort zu suchen, an dem sie ihre ungeborenen Zwillinge (Alpha und Sophia) sicher zur Welt bringen konnte. So kam sie ins Dorf.
|
||||
|
||||
---
|
||||
|
||||
## Was bisher geschah
|
||||
- An einem Arbeitstag in der Bank hatte Alpha eine Eingebung. Ihr zusätzliches Sinnesorgan hat ihr eine unglaublich gute Investitionsmöglichkeit gezeigt.
|
||||
- Alpha hat dies durchgerechnet. Sollten diese Investionen von Erfolg gekrönt sein, sind die Rendite in sehr kurzer Zeit unglaublich hoch. Falls nicht, würde man alles verlieren. Aber ihr zusätzlicher Sinn irrt sich absolut nie - also würden sie erfolgreich sein.
|
||||
- Alpha bittet ihren Chef, einen Teil dort hinein zu investieren. Doch damit bekommt sie das allererste Mal so richtig Ärger mit ihm - die Bank wäre schließlich keine Zockerbude.
|
||||
- Es gibt einen Kollegen bei der Bank, Benoît, von dem Alpha weiß, dass er auf sie steht, und dass er Zugriff auf die entsprechenden Systeme bei der Bank hat. Also beschließt sie, einmal in ihrem Leben ihre Würde als Frau über den Haufen zu schmeißen, und schläft mit ihm, um Zugriff zu bekommen.
|
||||
- Wie immer, lag Alphas zusätzlicher Sinn absolut richtig. Die kleine Bank wurde über Nacht zu einem Global Player.
|
||||
- Benoît erhält darauf hin eine sehr großzügige Bonuszahlung. Auch wenn er ein Playboy ist, auf der Arbeit ist er ähnlich, und tritt einen großen Teil davon an Alpha ab.
|
||||
- Dieses Geld bringt Alpha zu einem Privatbankier, und lässt diesen weiter investieren. Durch ihren zusätzlichen Sinn schafft sie es so, dieses Geld schnell zu mehren.
|
||||
- Ihre ersten Ausgaben sind: Ein teures Qipao (damit sie professionell aussieht), zwei MacBooks (eins für sich selber, eins für Sophia) und etwas gutes zu Essen von einem Imbiss. (Die erste erfüllende Mahlzeit, die Alpha und Sophia seit langem haben.)
|
||||
- Nach mehreren Wochen hat Alpha genug Geld angehäuft, um die seit mehreren Jahren leerstehende Villa im Dorf zu kaufen. Dies wird fortan die Aoki-Villa sein.
|
||||
- Die leerstehende Villa wurde bislang von Kaede, Espresso, Mireille und Ryouku gefplegt. Von nun an sind die vier die Maids der Zwillinge.
|
||||
- Zu dem lässt Alpha in Finnland eine Briefkastenfirma gründen, über die sie dann in Zukunft all ihre Geschäfte/Investments tätigen wird. So entsteht "Aoki Holdings Oy"
|
||||
- Ihr erstes Geschäft als "Aoki Holdings Oy" ist es, bei einem Satellitenbetrieber einen breitbandingen Transponder zur Exklusivnutzung durch Internet-Traffic der "Aoki Holdings Oy" anzumieten. Dies tut sie um in Zukunft möglichst unabhängig von ihrem alten Arbeitgeber und dem Privatbankier zu sein. Dass dies mehrere zehntausende Euros im Monat kostet, interessiert sie herzlich wenig.
|
||||
- Da Alpha nur wenig von Technik versteht, überredet sie Sophia zum Hardware-Abverkauf des CERN mitzukommen. Dort erwerben sie eine beachtliche Menge an Netzwerkhardware, um die Villa komplett zu vernetzen.
|
||||
- Schließlich wird eine große Satellitenanlage auf dem Gelände der Villa installiert. Damit sind die Aoki-Zwillinge (und die Maids) die einzigen Dorfbewohner die einen Internetzugang haben.
|
||||
- Alpha nutzt diesen Internetzugang um nun komplett unabhängig weiter ihre Finanzgeschäfte durchzuführen. Doch das reicht ihr nicht.
|
||||
- Also lässt Alpha Sophia eine Software entwickeln, die Daten aus dem Intenet scraped, und ihr zusätzliches Sinnesorgan visuell stimuliert.
|
||||
- In einem leeren Raum der Villa wird ein Fernseher, der auf einem Rollwagen montiert ist, gestellt. Davor führt Alpha nun regelmäßig "Finanz-Meditationen" durch.
|
||||
- Sophia sehnt sich danach, Alexandra zurück ins Dorf zu holen.
|
||||
- Durch einen Kontakt bei der Bank, findet Alpha Alexandras neue Nummer raus. Gemeinsam rufen die Zwillinge sie an. Dank des Satelliteninternets können sie nun schließlich auch im Dorf nach draußen telefonieren.
|
||||
- Wenige Wochen später zieht Alexandra mit in die Villa ein.
|
||||
- Es ist sehr schnell klar, dass Alexandra und Kaede sich bestens verstehen.
|
||||
- Kurz darauf beschlißen Alexandra und Kaede zu heiraten.
|
||||
- So kommt es zur ersten queeren Hochzeit im Dorf.
|
||||
- Da nun wieder Leben im Haus ist, und Kaede, Espresso und Mistral kaum hinterherkommen, bittet Kaede um Verstärkung für das Maid-Team.
|
||||
- Alpha stimmt zu, und stellt daraufhin Fawn und Jade ein.
|
||||
- Sophia äußert den Wunsch mal auf eine Anime-Convention zu gehen. Da früher immer das Geld dafür gefehlt hat, konnte sie das bisher nie. Aber jetzt da sie reich sind schon. Da Deutsch Sophias Muttersprache ist, würde sie als erste Con am liebsten eine deutschssprachige nehmen. Bis zur nächsten dauert es aber ein wenig.
|
||||
- Die Maids nähen Sophia ein wunderbares Rei Ayanami Cosplay.
|
||||
- Sie probiert es zum ersten mal zum jährlichen Dorffestival an.
|
||||
- Auf dem Dorffestival lernt Sophia Valérie Beaumont kennen. Sie ist ebenfalls dort, als Asuka Langley Soryu verkleidet.
|
||||
- Sophia und Valérie führen Impro auf der Bühne in ihrer jeweilgen Rolle auf.
|
||||
- Dabei funkt es zwischen den beiden, und sie werden ein Paar.
|
||||
- Sophia und Valérie verbringen eine Nacht auf dem Hof von Valéries Adoptiveltern.
|
||||
- Wenig später bekommt Sophia eine Einladung von einem elitären Mädcheninternat, um dort für ein paar Wochen den Töchtern aus besseren Kreisen das progammieren beizubringen.
|
||||
- Sophia stimmt zu. Valérie kommt mit und wird undercover als neue Schülerin eingeschleust, damit Sophia nicht alleine dort hin muss.
|
||||
- Während der Freizeit der Schülerinnen, zieht Valérie unbeabsichtigt Aufmerksamkeit auf sich, da sich herausstellt, dass sie dadurch, dass sie auf einem Hof aufgewachsen ist, einen exzellenten Umgang mit Pferden beherrscht. In einem Polo-Spiel gewinnt sie praktisch im Alleingang. Nun steht Valérie vor dem Problem, zu verbergen, dass sie in Wirklichkeit nicht reich ist, sondern eine Bauerntochter ist.
|
||||
- Sophia bringt ihren Schülerinnen währenddessen Ruby bei.
|
||||
- Als Sophia wieder zuhause ist, äußert Kaede den Wunsch ein Seminar in Grönland zu besuchen. Alle sind damit einverstanden.
|
||||
- Während der Schulung verbringt Kaede viel Zeit mit der Finnin Leena. Dabei kommen sie sich auch körperlich näher.
|
||||
- Kaede hat Schuldgefühle, Alexandra betrogen zu haben.
|
||||
- Zuhause beichtet Kaede Alexandra alles, aber aufgrund ihrer hexischen Natur hat Alexandra überhaupt kein Problem damit.
|
||||
- Es wird Winter im Dorf
|
||||
- Ein paar Tage später hätte Alpha einen wichtigen Geschäftstermin, diesen kann sie jedoch nicht wahrnehmen, da die Internetverbindung streikt.
|
||||
- Das Problem ist schnell gefunden: Eine Katze hat im Brennpunkt der Antenne für das Sattelliteninternet Zuflucht vor dem Schnee gesucht.
|
||||
- Die Aoki-Familie adoptiert die Katze und nennt sie Tennie.
|
||||
- Wenige wochen später: Leena kontaktiert Kaede und teilt mit, dass sie schwanger ist.
|
||||
- Kaede beichtet Alexadra erneut. Zu Kaedes Überraschung ist Alexandra auch hier völlig entspannt.
|
||||
- Also erklärt Alexandra Kaede wie das mit den Hexen und Hexenmeistern funktioniert.
|
||||
- In Alphas Meeting-Zimmer kommt es zu einer Telefonkonferenz zwischen Alexandra, Kaede und Leena.
|
||||
- Die drei entscheiden gemeinsam, dass Kaede Verantwortung für das Kind übernehmen wird. Sie wird zu Leena nach Finnland ziehen.
|
||||
- Alpha lässt über Aoki Holdings Oy ein Haus in Helsinki kaufen, in das Kaede und Leena einziehen, sobald Kaede in Finnland ist.
|
||||
- Um sich besser mit Leena verständigen zu können, und auch aus Liebe zu dem noch ungeborenen Kind beschließt Kaede Finnisch zu lernen. Dafür wird sie eine Sprachschule für Einwanderer besuchen.
|
||||
- In der ersten Unterrichtsstunde ist Kaede überrascht, dass Chloe vor ihr als Dozentin steht.
|
||||
- Chloe und Kaede erkennen sich wieder, schließlich waren sie beide sehr lange im staatenlosen Dorf.
|
||||
- Die beiden freunden sich an, und Chloe sucht sie auch öfters privat auf.
|
||||
- Durch Zufall kommt ein Telefongespräch zwischen Kaede und Sophia zustande. Kaede stellt auf frei sprechen, und Chloe kommt dazu. Sie und Sophia haben sich vermisst.
|
||||
- Sophia möchte Chloe besuchen kommen. Aber Chloe hat eine bessere Idee. Chloe will ins Dorf kommen. Das ist logistisch auch für sie sinnvoller. So kann sie einen Zwischenstopp in Paris einlegen, und dort ihren Freund und ihre Tochter zu besuchen.
|
||||
- (Ab hier geht's weiter)
|
||||
@ -1,28 +0,0 @@
|
||||
#pragma endian big
|
||||
|
||||
bitfield thirdByte
|
||||
{
|
||||
reserved : 4;
|
||||
pes_data_packet_header_length : 4;
|
||||
};
|
||||
|
||||
bitfield DataGroupHeader
|
||||
{
|
||||
data_group_id : 6;
|
||||
data_group_version : 2;
|
||||
data_group_link_number : 8;
|
||||
last_data_group_link_number : 8;
|
||||
};
|
||||
|
||||
struct DataGroup
|
||||
{
|
||||
u8 data_identifier;
|
||||
u8 private_stream_id;
|
||||
thirdByte thirdbyte;
|
||||
DataGroupHeader header_bitfield;
|
||||
u16 data_group_size;
|
||||
u8 data_group_byte[data_group_size];
|
||||
u16 crc16;
|
||||
};
|
||||
|
||||
DataGroup header_bitfield @ 0x0000;
|
||||
@ -1,203 +0,0 @@
|
||||
# Reuters WNE Packet Format
|
||||
|
||||
Format is little endian.
|
||||
|
||||
Common bytes:
|
||||
|
||||
- Byte 0: always 0x00
|
||||
- Byte 1: "Packet family", always 0x01, 0x03 or 0xff
|
||||
- Bytes 2-3: Packet length
|
||||
- Bytes 4-7: Session ID. This changes for every news story.
|
||||
|
||||
This format looks suspciously like it's TLV based, but I couldn't figure out how exactly the T's and L's are laid out. (Perhaps they use 2 bytes?)
|
||||
All multi-byte integers are little endian.
|
||||
|
||||
## About byte 1
|
||||
Byte 1 determines what kind of packet we're dealing with.
|
||||
|
||||
| Byte 1 | Packet Type |
|
||||
|--------|-----------------------------------------|
|
||||
| 0x01 | Object transfer |
|
||||
| 0x03 | Object announcement |
|
||||
| 0xfe | Unknown, but seems to be related to ECC |
|
||||
| 0xff | Object end marker |
|
||||
|
||||
## Packet familly 0x01 (Object transfer)
|
||||
A packet of this type contains a single block of data.
|
||||
|
||||
| Byte Index | Description |
|
||||
|------------|------------------------------|
|
||||
| 0 | always 0x00 |
|
||||
| 1 | always 0x01 |
|
||||
| 2-3 | Packet length |
|
||||
| 4-7 | Session ID |
|
||||
| 8-11 | dependent on value of 12-15 |
|
||||
| 12-13 | Payload description |
|
||||
| 14-15 | Payload description argument |
|
||||
| 16-end | Payload |
|
||||
|
||||
* When bytes 12-15 are all zeroes, the payload is raw data. In this case bytes 8-11 are the Block ID. To reconstruct the object, concatenate all bytes of Block ID 0, then Block ID 1, and so on...
|
||||
* When byte 12 is 0x05, and byte 14 is 0x09, then the payload is prefixed with an additional 16-byte header. It's purpose is not yet known. The actual payload starts at byte 32 then.
|
||||
* When the payload description argument equals the total packet length minus 15, then the payload is another encapsulated WNE packet. Start reading from byte 16 all over again. If this is the case, the following ECC rules apply:
|
||||
|
||||
### ECC rules
|
||||
| Byte Index | Description |
|
||||
|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 8 | ECC group ID |
|
||||
| 9 | ? |
|
||||
| 10 | always 0x00 ? |
|
||||
| 11 | ECC block counter, incremented by one each packet. If this is 0x07, the ECC group is finished, and the group ID will be incremented by one during the next packet. |
|
||||
| 12 | When an ECC group is finished with byte 11 being 0x07, this contains the number of blocks that are supposed to be in this just finished ECC group. |
|
||||
| 13 | usually 0x00, sometimes 0x20, purpose not known |
|
||||
| 14-15 | If byte 12 is 0, then Packet length minus 15, If byte 12 is 0x07, then ?
|
||||
| 16-end | If ecc flags is 0x07, then this is an ECC payload, if ECC flags is 0x00, continue reading. |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Packet family 0x03 (Object announcement)
|
||||
A packet of this type contains information about the file/object which is about to be transferred, or is transferred at this time in 0x01 packets.
|
||||
|
||||
| Byte Index | Description |
|
||||
|------------|---------------------------------------------------------------|
|
||||
| 0 | always 0x00 |
|
||||
| 1 | always 0x03 |
|
||||
| 2-3 | Packet length |
|
||||
| 4-7 | Session ID |
|
||||
| 8-11 | Packet length - 8 |
|
||||
| 12-15 | Packet length - 12 |
|
||||
| 16-19 | always seems to be 0x00000000 |
|
||||
| 20-23 | always seems to be 0x10000000 |
|
||||
| 24-27 | always seems to be 0x02000070 |
|
||||
| 28-31 | always seems to be 0x00000000 |
|
||||
| 32-35 | always seems to be 0x97120a00 |
|
||||
| 36-39 | always seems to be 0x00000000 |
|
||||
| 40 | specifies a subformat. Observed values here are 0x02 and 0x09 |
|
||||
|
||||
### When byte 40 is 0x09
|
||||
This indicates that the following object transfer does not contain a file, but a series of further encapsulated WNE packets. Those can be read using the same technique/structure.
|
||||
|
||||
### When byte 40 is 0x02
|
||||
This indicates that the following object transfer contains a file.
|
||||
|
||||
| Byte Index | Description |
|
||||
|-------------|---------------------------------------------------|
|
||||
| 44-45 | Packet length - 44 |
|
||||
| 46-55 | unknown |
|
||||
| 55-56 | size of each block (usually 1408, but may differ) |
|
||||
| 57-63 | unknown |
|
||||
| 64-67 | number of blocks in this object |
|
||||
| 68-71 | unknown |
|
||||
| 72-75 | also number of blocks in this object |
|
||||
| 76-84 | unknown |
|
||||
| 85-n | UTF-8 null terminated source file name |
|
||||
| n+0 - n+54 | unknown |
|
||||
| n+55 - n+59 | file length in bytes |
|
||||
| n+60 - n+71 | unknown |
|
||||
| n+72 - m | UTF-8 null terminated destination file name |
|
||||
| m - end | unknown |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## Packet family 0xff (Object end marker)
|
||||
When a packet of this type is encountered, the object transfer is complete, and the packets can be assembled.
|
||||
These packets may appear multiple times,
|
||||
Sometimes these packets are stuffed with multiple 0x00 bytes.
|
||||
@ -1 +0,0 @@
|
||||
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64\xsd.exe" /classes sis.xsd /namespace:Voile.Patchouli.Dvb.Sis.Model
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,388 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
<xs:element name="DSACI">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:element name="global_configuration" type="type_global_configuration" />
|
||||
<xs:element name="input_configuration" type="type_input_configuration" />
|
||||
<xs:element name="remultiplexing" type="type_remultiplexing"/>
|
||||
<xs:element name="output_processing" type="type_output_processing"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<!-- type_global_configuration -->
|
||||
<xs:complexType name="type_global_configuration">
|
||||
<xs:sequence>
|
||||
<xs:element name="current_DSA_group_id" type="xs:int"/>
|
||||
<xs:element name="global_version_number" type="type_version_number"/>
|
||||
<xs:element name="global_application_time" type="xs:int"/>
|
||||
<xs:element name="SIS_edition" type="type_SIS_edition"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_SIS_edition -->
|
||||
<xs:complexType name="type_SIS_edition">
|
||||
<xs:sequence>
|
||||
<xs:element name="major" type="xs:int"/>
|
||||
<xs:element name="middle" type="xs:int"/>
|
||||
<xs:element name="minor" type="xs:int"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_input_configuration -->
|
||||
<xs:complexType name="type_input_configuration">
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="1" name="input" type="type_input_parent" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_input_parent: number of instances equals number of defined inputs -->
|
||||
<xs:complexType name="type_input_parent">
|
||||
<xs:sequence>
|
||||
<xs:element name="input_TS_id" type="xs:int"/>
|
||||
<xs:element name="input_ON_id" type="xs:int"/>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
<xs:element name="PMT_PID_SIS_service" type="type_pid"/>
|
||||
<xs:element name="Primary_SIS_Service_Flag" type="xs:boolean"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_remultiplexing -->
|
||||
<xs:complexType name="type_remultiplexing">
|
||||
<xs:sequence>
|
||||
<xs:element name="output_TS" type= "type_output_TS" minOccurs="1" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_output_TS: number of instances equals number of defined output TS -->
|
||||
<xs:complexType name="type_output_TS">
|
||||
<xs:sequence>
|
||||
<xs:element name="PLP_id" minOccurs="0" maxOccurs="1" type="xs:int"/>
|
||||
<xs:element name="output_TS_id" type="xs:int"/>
|
||||
<xs:element name="output_ON_id" type="xs:int"/>
|
||||
<xs:element name="pid_processing" type= "type_pid_processing"/>
|
||||
<xs:element name="service_pmt_processing" type="type_service_pmt_processing"/>
|
||||
<xs:element name="psisi_processing" type="type_psisi_processing_mode"/>
|
||||
<xs:element name="Nsteps_to_live" type="xs:int"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_pid_processing -->
|
||||
<xs:complexType name="type_pid_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="pid" type="type_pid_proc" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_pid_proc: number of instances equals number of defined output pid -->
|
||||
<xs:complexType name="type_pid_proc">
|
||||
<xs:sequence>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
<xs:element name="input_PID" type="type_pid"/>
|
||||
<xs:element name="output_PID" type="type_pid"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_service_pmt_processing -->
|
||||
<xs:complexType name="type_service_pmt_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="service" type="type_service" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_service: number of instances equals number of defined service in an output TS -->
|
||||
<xs:complexType name="type_service">
|
||||
<xs:sequence>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
<xs:element name="input_service_id" type="xs:int"/>
|
||||
<xs:element name="output_service_id" type="xs:int"/>
|
||||
<xs:element name="output_service_name" type="xs:string"/>
|
||||
<xs:element name="output_provider_name" type="xs:string"/>
|
||||
<xs:element name="eit_schedule_flag" type="xs:boolean"/>
|
||||
<xs:element name="eit_present_following_flag" type="xs:boolean"/>
|
||||
<xs:element name="running_status" type="xs:int"/>
|
||||
<xs:element name="free_ca_mode" type="xs:int"/>
|
||||
<xs:element name="output_PMT_PID" type="type_pid"/>
|
||||
<xs:element name="pmt_processing_mode" type="type_pmt_processing_mode"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_pmt_processing_mode -->
|
||||
<xs:complexType name="type_pmt_processing_mode">
|
||||
<xs:choice>
|
||||
<xs:element name="pmt_passthrough" type="pmt_passthrough_processing"/>
|
||||
<xs:element name="pmt_patching" type="pmt_patching_processing"/>
|
||||
<xs:element name="pmt_regeneration" type="pmt_regeneration_processing"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- pmt_passthrough_processing -->
|
||||
<xs:simpleType name="pmt_passthrough_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- pmt_patching_processing -->
|
||||
<xs:complexType name="pmt_patching_processing">
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="ECM" type="type_ECM"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- pmt_regeneration_processing -->
|
||||
<xs:complexType name="pmt_regeneration_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="table_repetition_period" type="xs:int"/>
|
||||
<xs:element name="offset" type="xs:int"/>
|
||||
<xs:element name="PCR_PID" type="type_pid"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="output_pid" type="type_pid"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="ECM" type="type_ECM"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_ECM -->
|
||||
<xs:complexType name="type_ECM">
|
||||
<xs:sequence>
|
||||
<xs:element name="CAS_id" type="xs:int"/>
|
||||
<xs:element name="output_ECM_PID" type="type_pid"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_psisi_processing_mode -->
|
||||
<xs:complexType name="type_psisi_processing_mode">
|
||||
<xs:sequence>
|
||||
<xs:element name="pat" type="type_pat_processing_mode"/>
|
||||
<xs:element name="cat" type="type_cat_processing_mode"/>
|
||||
<xs:element name="sdt_bat" type="type_sdt_bat_processing_mode"/>
|
||||
<xs:element name="eit" type="type_eit_processing_mode"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_pat_processing_mode -->
|
||||
<xs:complexType name="type_pat_processing_mode">
|
||||
<xs:choice>
|
||||
<xs:element name="pat_passthrough" type="pat_passthrough_processing"/>
|
||||
<xs:element name="pat_patching" type="pat_patching_processing"/>
|
||||
<xs:element name="pat_regeneration" type="pat_regeneration_processing"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- pat_passthrough_processing -->
|
||||
<xs:simpleType name="pat_passthrough_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- pat_patching_processing -->
|
||||
<xs:simpleType name="pat_patching_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- pat_regeneration_processing -->
|
||||
<xs:complexType name="pat_regeneration_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="table_repetition_period" type="xs:int"/>
|
||||
<xs:element name="offset" type="xs:int"/>
|
||||
<xs:element name="PAT_version_number" type="type_version_number"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_cat_processing_mode -->
|
||||
<xs:complexType name="type_cat_processing_mode">
|
||||
<xs:choice>
|
||||
<xs:element name="cat_stopping" type="cat_stopping_processing"/>
|
||||
<xs:element name="cat_passthrough" type="cat_passthrough_processing"/>
|
||||
<xs:element name="cat_patching" type="cat_patching_processing"/>
|
||||
<xs:element name="cat_regeneration" type="cat_regeneration_processing"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- cat_stopping_processing -->
|
||||
<xs:simpleType name="cat_stopping_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- cat_passthrough_processing -->
|
||||
<xs:simpleType name="cat_passthrough_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- cat_patching_processing -->
|
||||
<xs:complexType name="cat_patching_processing">
|
||||
<xs:sequence>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="ca_provider" type="type_ca_provider"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- cat_regeneration_processing -->
|
||||
<xs:complexType name="cat_regeneration_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="table_repetition_period" type="xs:int"/>
|
||||
<xs:element name="offset" type="xs:int"/>
|
||||
<xs:element name="CAT_version_number" type="type_version_number"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="ca_provider" type="type_ca_provider"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- ca_provider: number of instances equals number of output EMM_PID’s -->
|
||||
<xs:complexType name="type_ca_provider">
|
||||
<xs:sequence>
|
||||
<xs:element name="CAS_id" type="xs:int"/>
|
||||
<xs:element name="output_EMM_PID" type="type_pid"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_sdt_processing_mode -->
|
||||
<xs:complexType name="type_sdt_bat_processing_mode">
|
||||
<xs:choice>
|
||||
<xs:element name="sdt_passthrough" type="sdt_passthrough_processing"/>
|
||||
<xs:element name="sdt_patching" type="sdt_patching_processing"/>
|
||||
<xs:element name="sdt_regeneration" type="sdt_regeneration_processing"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- sdt_passthrough_processing -->
|
||||
<xs:simpleType name="sdt_passthrough_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- sdt_patching_processing -->
|
||||
<xs:complexType name="sdt_patching_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="sdt_crossreferencing_flag" type="xs:boolean"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="bouquet" type="type_bouquet"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- sdt_regeneration_processing -->
|
||||
<xs:complexType name="sdt_regeneration_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="sdt_actual_period" type="xs:int"/>
|
||||
<xs:element name="M_actual" type="xs:int"/>
|
||||
<xs:element name="offset" type="xs:int"/>
|
||||
<xs:element name="sdt_actual_version_number" type="xs:int"/>
|
||||
<xs:element name="sdt_crossreferencing_flag" type="xs:boolean"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="bouquet" type="type_bouquet"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- other_mux: number of instances equals number of defined other muxes -->
|
||||
<xs:complexType name="type_other_mux">
|
||||
<xs:sequence>
|
||||
<xs:element name="other_DSA_group_id" type="xs:int"/>
|
||||
<xs:element name="DSACI_PID" type="type_pid"/>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_bouquet -->
|
||||
<xs:complexType name="type_bouquet">
|
||||
<xs:sequence>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
<xs:element name="input_bouquet_id" type="xs:int"/>
|
||||
<xs:element name="terrestrial_bouquet_id" type="xs:int"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- type_eit_processing_mode -->
|
||||
<xs:complexType name="type_eit_processing_mode">
|
||||
<xs:choice>
|
||||
<xs:element name="eit_passthrough" type="eit_passthrough_processing"/>
|
||||
<xs:element name="eit_patching" type="eit_patching_processing"/>
|
||||
<xs:element name="eit_regeneration" type="eit_regeneration_processing"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- eit_passthrough_processing -->
|
||||
<xs:simpleType name="eit_passthrough_processing">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<!-- eit_patching_processing -->
|
||||
<xs:complexType name="eit_patching_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="eit_crossreferencing_flag" type="xs:boolean"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- eit_regeneration_processing -->
|
||||
<xs:complexType name="eit_regeneration_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="eit_pf_actual_period" type="xs:int"/>
|
||||
<xs:element name="eit_pf_other_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_1stday_actual_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_1stday_other_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_2nd_8th_actual_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_2nd_8th_other_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_sup_8th_actual_period" type="xs:int"/>
|
||||
<xs:element name="eit_sch_sup_8th_other_period" type="xs:int"/>
|
||||
<xs:element name="eit_insertion_window_duration" type="xs:int"/>
|
||||
<xs:element name="eit_cross_referencing_flag" type="xs:boolean"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="other_mux" type="type_other_mux"/>
|
||||
<xs:element maxOccurs="unbounded" minOccurs="0" name="DTT_only_service"
|
||||
type="type_DTT_only_service"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- DTT_only_service: number of instances equals number of defined DTT only service -->
|
||||
<xs:complexType name="type_DTT_only_service">
|
||||
<xs:sequence>
|
||||
<xs:element name="DTT_only_service_id" type="xs:int"/>
|
||||
<xs:element name="input_EIT_PID" type="type_pid"/>
|
||||
<xs:element name="source_id" type="xs:int"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- type_output_processing -->
|
||||
<xs:complexType name="type_output_processing">
|
||||
<xs:sequence>
|
||||
<xs:element name="terrestrial_standard_generation"
|
||||
type="type_terrestrial_standard_generation" />
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- type_terrestrial_standard -->
|
||||
<xs:complexType name="type_terrestrial_standard_generation">
|
||||
<xs:choice>
|
||||
<xs:element name="dvb_t" type="dvb_t_standard"/>
|
||||
<xs:element name="dvb_t2" type="dvb_t2_standard"/>
|
||||
</xs:choice>
|
||||
</xs:complexType>
|
||||
<!-- dvb_t_standard -->
|
||||
<xs:simpleType name="dvb_t_standard">
|
||||
<xs:restriction base="xs:string"/>
|
||||
</xs:simpleType>
|
||||
<!-- dvb_t2_standard -->
|
||||
<xs:complexType name="dvb_t2_standard">
|
||||
<xs:sequence>
|
||||
<xs:element name="output_T2_MI_PID" type="type_pid"/>
|
||||
<xs:element name="output_T2_MI_stream_id" type="xs:int"/>
|
||||
<xs:element name="output_rate" type="xs:int"/>
|
||||
<xs:element maxOccurs="1" minOccurs="0" name="L2_signalling" type="type_L2_signalling"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- L2_signalling -->
|
||||
<xs:complexType name="type_L2_signalling">
|
||||
<xs:sequence>
|
||||
<xs:element name="output_TS_id" type="xs:int"/>
|
||||
<xs:element name="output_ON_id" type="xs:int"/>
|
||||
<xs:element name="output_L2_service_id" type="xs:int"/>
|
||||
<xs:element name="output_L2_service_provider_name" type="xs:string"/>
|
||||
<xs:element name="output_L2_service_name" type="xs:string"/>
|
||||
|
||||
<xs:element name="output_L2_PCR_PID" type="type_pid"/>
|
||||
<xs:element name="output_L2_PMT_PID" type="type_pid"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
<!-- Other types -->
|
||||
<xs:simpleType name="type_version_number">
|
||||
<xs:restriction base="xs:int">
|
||||
<xs:minInclusive value="0"/>
|
||||
<xs:maxInclusive value="31"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
<xs:simpleType name="type_pid">
|
||||
<xs:restriction base="xs:int">
|
||||
<xs:minInclusive value="0"/>
|
||||
<xs:maxInclusive value="8191"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
</xs:schema>
|
||||
@ -1,11 +0,0 @@
|
||||
tsp -b 3248000 -v ^
|
||||
-I file astra1_11604v_wdr_b.ts ^
|
||||
-P filter --pid 0x1fff --set-label 2 ^
|
||||
-P filter --only-label 2 --every 100 --set-label 1 ^
|
||||
-P craft --only-label 1 --pid 101 --no-payload --pcr 0 ^
|
||||
-P continuity --pid 101 ^
|
||||
-P pcradjust --pid 101 ^
|
||||
-P pat -c -a 1/100 ^
|
||||
-P pmt -p 100 -c -i 1 -a 0x0bb8/0xd --set-data-broadcast-id 0x0bb8/5 -a 101/0x82 ^
|
||||
-P history ^
|
||||
-O file astra1_11604v_wdr_b_patched.ts
|
||||
@ -7,16 +7,12 @@ the following Signalling applies:
|
||||
|
||||
|Stream Type|Interpretation |
|
||||
|-----------|-----------------------------------|
|
||||
|0x80 |STiD135 GS/GSE Packets |
|
||||
|0x80 |TBS 6903-X GSE Packets |
|
||||
|0x81 |AC-3 Audio |
|
||||
|0x82 |PID only used for PCR, no payloads |
|
||||
|0x82 |PID only used for PCR |
|
||||
|0x83 |AC-3 True HD Audio |
|
||||
|0x84 |AC-3+ Audio |
|
||||
|0x85 |DTS Audio |
|
||||
|0x86 |SCTE 35 Splice Info |
|
||||
|0x87 |ATSC Enhanced-AC-3 Audio |
|
||||
|0x88 |ULE (RFC 4326) |
|
||||
|0x91 |A52b/AC-3 Audio |
|
||||
|0x85 |ULE (RFC 4326) |
|
||||
|
||||
## Descriptors:
|
||||
|
||||
|
||||
@ -18,15 +18,4 @@ These will have IP packets forwarded to.
|
||||
|ID|Type |
|
||||
|--|-----------|
|
||||
| 1|PCAP Writer|
|
||||
| 2|Discard |
|
||||
| 3|Blackhole |
|
||||
|
||||
#Network Types
|
||||
These identify sources from which a network packet may come from.
|
||||
|ID|Type |
|
||||
|--|----------|
|
||||
| 0|Reserved |
|
||||
| 1|ATSC3 PLP |
|
||||
| 2|MPEG-2 PID|
|
||||
| 3|DVB MIS |
|
||||
| 4|AAL5 |
|
||||
| 2|Discard |
|
||||
@ -17,21 +17,10 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using skyscraper5.Dvb.DataBroadcasting.IntModel;
|
||||
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
|
||||
using skyscraper5.Skyscraper.Equipment;
|
||||
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
||||
using skyscraper8.GSE;
|
||||
using skyscraper8.Skyscraper.Drawing;
|
||||
using skyscraper8.Skyscraper.FrequencyListGenerator;
|
||||
using skyscraper8.Skyscraper.Scraper;
|
||||
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
|
||||
using skyscraper8.GSE.GSE;
|
||||
using skyscraper8.DvbNip.UiIntegration;
|
||||
using skyscraper8.DvbNip;
|
||||
using moe.yo3explorer.skyscraper8.DVBI.Model;
|
||||
using skyscraper8.Ietf.FLUTE;
|
||||
using skyscraper8.Ses;
|
||||
|
||||
namespace skyscraper5.UI.Overrides
|
||||
{
|
||||
@ -138,7 +127,7 @@ namespace skyscraper5.UI.Overrides
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbEntity lnbType)
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbType lnbType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@ -218,43 +207,8 @@ namespace skyscraper5.UI.Overrides
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyNit(NitNetwork nitNetwork)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnBbframe(BBHeader bbHeader, byte[] payload)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public TaskQueue Tasks { get; set; }
|
||||
|
||||
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyAit(AitApplication aitApplication)
|
||||
{
|
||||
SkyscraperUiNode applicationNode = form1.EnsureNodeExists("AIT", aitApplication.TryGetName());
|
||||
@ -619,81 +573,6 @@ namespace skyscraper5.UI.Overrides
|
||||
return "T2-MI";
|
||||
|
||||
return String.Format("??? (Type 0x{0:X2})", (int)stream.StreamType);
|
||||
}
|
||||
|
||||
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipFileArrival(FluteUiHandle fuh)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier, MulticastGatewayConfigurationType multicastGatewayConfiguration)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation, ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation, NetworkInformationFileType networkInformationFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation, ServiceInformationFileType serviceInformationFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnAstraSgtList(SgtList list)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnAstraSgtService(SgtService child)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyTransportStreamId(int tsid, int nid)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@ -6,7 +6,6 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@ -28,8 +27,4 @@
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -21,9 +21,9 @@ namespace skyscraper8.UI.MonoGame
|
||||
public DataStorage DataStorage { get; set; }
|
||||
public ObjectStorage ObjectStorage { get; set; }
|
||||
public IGpsReceiver Gps { get; set; }
|
||||
public List<SatellitePositionEntity> SatellitePositions { get; set; }
|
||||
public List<LnbEntity> LnbTypes { get; set; }
|
||||
public List<DishEntity> DishTypes { get; set; }
|
||||
public List<SatellitePosition> SatellitePositions { get; set; }
|
||||
public List<LnbType> LnbTypes { get; set; }
|
||||
public List<DishType> DishTypes { get; set; }
|
||||
public ReadOnlyCollection<KeyValuePair<TunerFactoryIdAttribute, ITunerFactory>> AllTunerFactories { get; set; }
|
||||
public IStreamReader StreamReader { get; set; }
|
||||
public List<TunerMetadata> Tuners { get; set; }
|
||||
|
||||
@ -14,14 +14,13 @@ namespace SDL2Demo.Forms
|
||||
internal class ConfigureDishTypes : IRenderable
|
||||
{
|
||||
private readonly DataStorage _scraperStroage;
|
||||
private List<DishEntity> dishTypes;
|
||||
private List<DishType> dishTypes;
|
||||
private string tableUuid;
|
||||
|
||||
private string manufacturer;
|
||||
private string name;
|
||||
private int diameter;
|
||||
private DishShape shape;
|
||||
public ConfigureDishTypes(DataStorage scraperStroage, List<DishEntity> dishTypes)
|
||||
public ConfigureDishTypes(DataStorage scraperStroage, List<DishType> dishTypes)
|
||||
{
|
||||
_scraperStroage = scraperStroage;
|
||||
this.dishTypes = dishTypes;
|
||||
@ -38,14 +37,12 @@ namespace SDL2Demo.Forms
|
||||
if (justSaved)
|
||||
{
|
||||
name = "";
|
||||
manufacturer = "";
|
||||
diameter = 0;
|
||||
shape = DishShape.Offset;
|
||||
justSaved = false;
|
||||
}
|
||||
if (ImGui.TreeNode("Add Dish Type"))
|
||||
{
|
||||
ImGui.InputText("Manufacturer", ref manufacturer, 255);
|
||||
ImGui.InputText("Name", ref name, 255);
|
||||
ImGui.InputInt("Diameter", ref diameter, 5, 10);
|
||||
|
||||
@ -66,7 +63,7 @@ namespace SDL2Demo.Forms
|
||||
ImGui.BeginDisabled(!SaveButtonEnabled());
|
||||
if (ImGui.Button("Add"))
|
||||
{
|
||||
DishEntity newDish = new DishEntity(manufacturer, name, diameter, shape);
|
||||
DishType newDish = new DishType(name, diameter, shape);
|
||||
dishTypes.Add(newDish);
|
||||
_scraperStroage.UiDishTypesAdd(newDish);
|
||||
justSaved = true;
|
||||
@ -87,7 +84,7 @@ namespace SDL2Demo.Forms
|
||||
ImGui.TableSetColumnIndex(2);
|
||||
ImGui.Text("Type");
|
||||
|
||||
foreach (DishEntity dishType in dishTypes)
|
||||
foreach (DishType dishType in dishTypes)
|
||||
{
|
||||
ImGui.TableNextRow();
|
||||
ImGui.TableSetColumnIndex(0);
|
||||
@ -123,7 +120,7 @@ namespace SDL2Demo.Forms
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (DishEntity dishType in dishTypes)
|
||||
foreach (DishType dishType in dishTypes)
|
||||
{
|
||||
if (dishType.Name.Equals(name))
|
||||
return false;
|
||||
|
||||
@ -16,21 +16,19 @@ namespace SDL2Demo.Forms
|
||||
internal class ConfigureLnbTypes : IRenderable
|
||||
{
|
||||
private readonly DataStorage _scraperStroage;
|
||||
private List<LnbEntity> lnbTypes;
|
||||
private List<LnbType> lnbTypes;
|
||||
private string tableUuid;
|
||||
private string lnbPopupUuid;
|
||||
|
||||
private string manufacturer;
|
||||
private string name;
|
||||
private int lof1, lof2, lofSw, minFreq, maxFreq;
|
||||
|
||||
public ConfigureLnbTypes(DataStorage scraperStroage, List<LnbEntity> lnbTypes)
|
||||
public ConfigureLnbTypes(DataStorage scraperStroage, List<LnbType> lnbTypes)
|
||||
{
|
||||
_scraperStroage = scraperStroage;
|
||||
this.lnbTypes = lnbTypes;
|
||||
this.tableUuid = Guid.NewGuid().ToString();
|
||||
this.name = "";
|
||||
this.manufacturer = "";
|
||||
this.lnbPopupUuid = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
@ -41,8 +39,6 @@ namespace SDL2Demo.Forms
|
||||
ImGui.Begin("Configure LNB Types", ref pOpen, windowFlags);
|
||||
if (ImGui.TreeNode("Add LNB Type"))
|
||||
{
|
||||
ImGui.InputText("Manufacturer", ref this.manufacturer, 64);
|
||||
ImGui.SameLine();
|
||||
ImGui.InputText("Name", ref name, 255);
|
||||
|
||||
ImGui.InputInt("LOF1", ref lof1, 50, 100);
|
||||
@ -59,7 +55,7 @@ namespace SDL2Demo.Forms
|
||||
ImGui.BeginDisabled(!SaveButtonEnabled());
|
||||
if (ImGui.Button("Add"))
|
||||
{
|
||||
LnbEntity newLnb = new LnbEntity(manufacturer, name, lof1, lof2, lofSw, minFreq, maxFreq);
|
||||
LnbType newLnb = new LnbType(name, lof1, lof2, lofSw, minFreq, maxFreq);
|
||||
lnbTypes.Add(newLnb);
|
||||
_scraperStroage.UiLnbTypesAdd(newLnb);
|
||||
}
|
||||
@ -102,7 +98,7 @@ namespace SDL2Demo.Forms
|
||||
|
||||
ImGui.TableSetColumnIndex(2);
|
||||
ImGui.Text("Frequency Range");
|
||||
foreach (LnbEntity lnbType in lnbTypes)
|
||||
foreach (LnbType lnbType in lnbTypes)
|
||||
{
|
||||
ImGui.TableNextRow();
|
||||
ImGui.TableSetColumnIndex(0);
|
||||
@ -140,7 +136,7 @@ namespace SDL2Demo.Forms
|
||||
if (lof1 == 0)
|
||||
return false;
|
||||
|
||||
foreach (LnbEntity lnbType in lnbTypes)
|
||||
foreach (LnbType lnbType in lnbTypes)
|
||||
{
|
||||
if (lnbType.MinimumFrequency == minFreq &&
|
||||
lnbType.MaximumFrequency == maxFreq &&
|
||||
|
||||
@ -10,9 +10,9 @@ namespace SDL2Demo.Forms
|
||||
internal class ConfigureTunersWindow : IRenderable
|
||||
{
|
||||
private readonly DataStorage _scraperStroage;
|
||||
private List<SatellitePositionEntity> satPositions;
|
||||
private List<LnbEntity> lnbTypes;
|
||||
private List<DishEntity> dishTypes;
|
||||
private List<SatellitePosition> satPositions;
|
||||
private List<LnbType> lnbTypes;
|
||||
private List<DishType> dishTypes;
|
||||
|
||||
public ConfigureTunersWindow(List<TunerMetadata> tuners, DataStorage scraperStroage)
|
||||
{
|
||||
|
||||
@ -8,14 +8,11 @@ using System.Reflection.Metadata.Ecma335;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using ImGuiNET;
|
||||
using moe.yo3explorer.skyscraper8.DVBI.Model;
|
||||
using SDL2Demo.Net;
|
||||
using skyscraper5.Docsis;
|
||||
using skyscraper5.Dvb.DataBroadcasting.IntModel;
|
||||
using skyscraper5.Dvb.DataBroadcasting.SkyscraperVfs;
|
||||
using skyscraper5.Dvb.Descriptors;
|
||||
using skyscraper5.Dvb.Psi.Model;
|
||||
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
|
||||
using skyscraper5.Mhp;
|
||||
using skyscraper5.Mhp.Descriptors;
|
||||
using skyscraper5.Mhp.Si;
|
||||
@ -28,23 +25,11 @@ using skyscraper5.Skyscraper.Equipment;
|
||||
using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
|
||||
using skyscraper5.Skyscraper.Net;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5.src.InteractionChannel.Model;
|
||||
using skyscraper5.src.Skyscraper.FrequencyListGenerator;
|
||||
using skyscraper5.T2MI.Packets;
|
||||
using skyscraper5.Teletext.Wss;
|
||||
using skyscraper8.DvbNip;
|
||||
using skyscraper8.DvbNip.UiIntegration;
|
||||
using skyscraper8.DvbSis;
|
||||
using skyscraper8.GSE;
|
||||
using skyscraper8.GSE.GSE;
|
||||
using skyscraper8.Ietf.FLUTE;
|
||||
using skyscraper8.Ses;
|
||||
using skyscraper8.Skyscraper.Drawing;
|
||||
using skyscraper8.Skyscraper.FrequencyListGenerator;
|
||||
using skyscraper8.Skyscraper.Scraper;
|
||||
using skyscraper8.T2MI.Packets;
|
||||
using testdrid.SdlWrapper;
|
||||
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
|
||||
|
||||
namespace SDL2Demo.Forms
|
||||
{
|
||||
@ -565,12 +550,7 @@ namespace SDL2Demo.Forms
|
||||
|
||||
patEntry.pmt = result;
|
||||
}
|
||||
|
||||
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
private string pmtTabBarUuid;
|
||||
public void RenderPmt()
|
||||
{
|
||||
@ -1171,12 +1151,7 @@ namespace SDL2Demo.Forms
|
||||
dsmCcDisplay.Remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
private void RenderDataCarousels()
|
||||
{
|
||||
if (dsmCcDisplay == null)
|
||||
@ -2127,7 +2102,7 @@ namespace SDL2Demo.Forms
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult,LnbEntity lnbType)
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult,LnbType lnbType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@ -2207,107 +2182,7 @@ namespace SDL2Demo.Forms
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyNit(NitNetwork nitNetwork)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnBbframe(BBHeader bbHeader, byte[] payload)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipFileArrival(FluteUiHandle fuh)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier,
|
||||
MulticastGatewayConfigurationType multicastGatewayConfiguration)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation,
|
||||
ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1,
|
||||
string serviceListId2)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation,
|
||||
NetworkInformationFileType networkInformationFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation,
|
||||
ServiceInformationFileType serviceInformationFile)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnAstraSgtList(SgtList list)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnAstraSgtService(SgtService child)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public TaskQueue Tasks { get; set; }
|
||||
public TaskQueue Tasks { get; set; }
|
||||
|
||||
private ushort? ResolveCaId(ProgramMapping patValuePmt, SdtCoordinate sdt)
|
||||
{
|
||||
@ -2330,72 +2205,7 @@ namespace SDL2Demo.Forms
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void NotifyTransportStreamId(int tsid, int nid)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisCat(int sourcePid, SisCatContainer catContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisEit(int sourcePid, SisEitContainer eitContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisFti(int relatedPid, _0xF0_FramingTimingInformation fti)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisPat(int sourcePid, SisPatContainer patContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisSdt(int sourcePid, SisSdtContainer sdtContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber,
|
||||
Stream dsaci)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisTdt(int sourcePid, DateTime? utcTime)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnRcs2Rmt(Rmt rmt)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ namespace SDL2Demo.Forms
|
||||
|
||||
private string lnbPopupUuid;
|
||||
private string memoryTableUuid;
|
||||
private List<SatellitePositionEntity> allPositions;
|
||||
private List<SatellitePosition> allPositions;
|
||||
private readonly DataStorage _storage;
|
||||
|
||||
|
||||
@ -50,8 +50,8 @@ namespace SDL2Demo.Forms
|
||||
if (allPositions.Count == 0)
|
||||
return true;
|
||||
|
||||
int currentChecksum = SatellitePositionEntity.GetChecksum(degrees);
|
||||
foreach (SatellitePositionEntity satellitePosition in allPositions)
|
||||
int currentChecksum = SatellitePosition.GetChecksum(degrees, cardinalDirection);
|
||||
foreach (SatellitePosition satellitePosition in allPositions)
|
||||
{
|
||||
if (currentChecksum == satellitePosition.Checksum)
|
||||
return false;
|
||||
@ -68,6 +68,9 @@ namespace SDL2Demo.Forms
|
||||
{
|
||||
ImGui.InputText("Name", ref name, 255);
|
||||
ImGui.InputFloat("Position", ref degrees, 0.1f);
|
||||
ImGui.RadioButton("East", ref cardinalDirection, 0);
|
||||
ImGui.SameLine();
|
||||
ImGui.RadioButton("West", ref cardinalDirection, 1);
|
||||
|
||||
CheckBounds();
|
||||
|
||||
@ -75,7 +78,7 @@ namespace SDL2Demo.Forms
|
||||
ImGui.BeginDisabled(!SaveButtonEnabled());
|
||||
if (ImGui.Button("Add"))
|
||||
{
|
||||
SatellitePositionEntity newPosition = new SatellitePositionEntity(degrees, name);
|
||||
SatellitePosition newPosition = new SatellitePosition(degrees, cardinalDirection, name);
|
||||
allPositions.Add(newPosition);
|
||||
_storage.UiSatellitesAdd(newPosition);
|
||||
}
|
||||
@ -86,13 +89,13 @@ namespace SDL2Demo.Forms
|
||||
ImGui.Separator();
|
||||
|
||||
ImGui.BeginTable(memoryTableUuid, 4);
|
||||
foreach (SatellitePositionEntity satellitePosition in allPositions)
|
||||
foreach (SatellitePosition satellitePosition in allPositions)
|
||||
{
|
||||
ImGui.TableNextRow();
|
||||
ImGui.TableSetColumnIndex(0);
|
||||
ImGui.Text(satellitePosition.name);
|
||||
ImGui.TableSetColumnIndex(1);
|
||||
ImGui.Text(String.Format("{0:0.0}° {1}", satellitePosition.angle, satellitePosition.GetCardinalDirectionAsChar()));
|
||||
ImGui.Text(String.Format("{0:0.0}° {1}", satellitePosition.angle, satellitePosition.cardinalDirection == 0 ? "E" : "W"));
|
||||
ImGui.TableSetColumnIndex(2);
|
||||
ImGui.Text("");
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ namespace SDL2Demo.Jobs
|
||||
public class BlindscanTarget
|
||||
{
|
||||
public BlindscanTarget(string name, int tunerIndex, STD_TYPE tunerStandard, int diseqcType,
|
||||
SatellitePositionEntity satPosition, int satIndex, LnbEntity lnbType, PhysicalAddress tunerMetadataMacAddress)
|
||||
SatellitePosition satPosition, int satIndex, LnbType lnbType, PhysicalAddress tunerMetadataMacAddress)
|
||||
{
|
||||
this.name = name;
|
||||
this.tunerIndex = tunerIndex;
|
||||
@ -50,10 +50,10 @@ namespace SDL2Demo.Jobs
|
||||
public int tunerIndex;
|
||||
public STD_TYPE tunerStandard;
|
||||
public int diseqcType;
|
||||
public SatellitePositionEntity satPosition;
|
||||
public SatellitePosition satPosition;
|
||||
public int satIndex;
|
||||
public string buttonUuid;
|
||||
public LnbEntity lnbType;
|
||||
public LnbType lnbType;
|
||||
public readonly PhysicalAddress macAddress;
|
||||
|
||||
public bool IsTorC()
|
||||
@ -84,7 +84,7 @@ namespace SDL2Demo.Jobs
|
||||
private DbBlindscanJob jobInDb;
|
||||
private IDbBlindscanJobStorage jobStorage;
|
||||
|
||||
public Blindscan(List<TunerMetadata> tuners, List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, DataStorage dataStorage)
|
||||
public Blindscan(List<TunerMetadata> tuners, List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, DataStorage dataStorage)
|
||||
{
|
||||
this.jobStorage = dataStorage;
|
||||
continuationDataExists = jobStorage.TestForIncompleteJob();
|
||||
@ -98,8 +98,8 @@ namespace SDL2Demo.Jobs
|
||||
int numSatsFromDiseqcType = tunerMetadata.GetNumSatsFromDiseqcType();
|
||||
for (int i = 0; i < numSatsFromDiseqcType; i++)
|
||||
{
|
||||
SatellitePositionEntity satellitePosition = satellitePositions.Find(x => x.Checksum == tunerMetadata.Satellites[i]);
|
||||
LnbEntity lnbType = lnbTypes.Find(x => x.Id == tunerMetadata.Lnbs[i]);
|
||||
SatellitePosition satellitePosition = satellitePositions.Find(x => x.Checksum == tunerMetadata.Satellites[i]);
|
||||
LnbType lnbType = lnbTypes.Find(x => x.Id == tunerMetadata.Lnbs[i]);
|
||||
if (satellitePosition == null)
|
||||
continue;
|
||||
if (lnbType == null)
|
||||
@ -835,7 +835,7 @@ namespace SDL2Demo.Jobs
|
||||
now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000,
|
||||
blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000,
|
||||
(int)(SelectedBlindscanTarget.satPosition.angle * 10),
|
||||
SelectedBlindscanTarget.satPosition.GetCardinalDirectionAsChar());
|
||||
SelectedBlindscanTarget.satPosition.cardinalDirection == 0 ? "E" : "W");
|
||||
break;
|
||||
case STD_TYPE.STD_DVBC:
|
||||
JobContext.Puppets[1].AutoMoveTo(blindscanResult.Position);
|
||||
|
||||
@ -31,10 +31,10 @@ namespace SDL2Demo.Jobs
|
||||
private IDbBlindscanJobStorage jobStorage;
|
||||
private List<TunerMetadata> tunerMetadataList;
|
||||
private JobContext jobContext;
|
||||
private List<SatellitePositionEntity> satellites;
|
||||
private List<LnbEntity> lnbs;
|
||||
private List<SatellitePosition> satellites;
|
||||
private List<LnbType> lnbs;
|
||||
|
||||
public CoopBlindscan(List<TunerMetadata> tuners, List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, IDbBlindscanJobStorage jobStorage)
|
||||
public CoopBlindscan(List<TunerMetadata> tuners, List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, IDbBlindscanJobStorage jobStorage)
|
||||
{
|
||||
this.jobStorage = jobStorage;
|
||||
this.tunerMetadataList = tuners.Where(x => x.Type == STD_TYPE.STD_DVBS || x.Type == STD_TYPE.STD_DVBS2).ToList();
|
||||
@ -166,8 +166,8 @@ namespace SDL2Demo.Jobs
|
||||
{
|
||||
settingsWindowOpen = false;
|
||||
int lnbIndex = tunerMetadataList[settingsWindowTunerAselection].Lnbs[settingsWindowDiseqc - 1];
|
||||
LnbEntity lnb = lnbs.Find(x => x.Id == lnbIndex);
|
||||
Configuration = new CoopBlindscanConfiguration(tunerMetadataList[settingsWindowTunerAselection], tunerMetadataList[settingsWindowTunerBselection], settingsWindowScanHorizontalLow, settingsWindowScanHorizontalHigh, settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh, settingsWindowDiseqc, settingsWindowSatellite, SatellitePositionEntity.FromChecksum(satellites[settingsWindowSatellite].Checksum), lnb, settingsWindowCaptureFile);
|
||||
LnbType lnb = lnbs.Find(x => x.Id == lnbIndex);
|
||||
Configuration = new CoopBlindscanConfiguration(tunerMetadataList[settingsWindowTunerAselection], tunerMetadataList[settingsWindowTunerBselection], settingsWindowScanHorizontalLow, settingsWindowScanHorizontalHigh, settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh, settingsWindowDiseqc, settingsWindowSatellite, SatellitePosition.FromChecksum(satellites[settingsWindowSatellite].Checksum), lnb, settingsWindowCaptureFile);
|
||||
}
|
||||
ImGui.SameLine();
|
||||
|
||||
@ -185,7 +185,7 @@ namespace SDL2Demo.Jobs
|
||||
|
||||
public class CoopBlindscanConfiguration
|
||||
{
|
||||
public CoopBlindscanConfiguration(TunerMetadata tunerA, TunerMetadata tunerB, bool doHorizontalLow, bool doHorizontalHigh, bool doVerticalLow, bool doVerticalHigh, int diseqc, int satelliteId, SatellitePositionEntity direction, LnbEntity lnbType, bool recordingEnabled)
|
||||
public CoopBlindscanConfiguration(TunerMetadata tunerA, TunerMetadata tunerB, bool doHorizontalLow, bool doHorizontalHigh, bool doVerticalLow, bool doVerticalHigh, int diseqc, int satelliteId, SatellitePosition direction, LnbType lnbType, bool recordingEnabled)
|
||||
{
|
||||
TunerA = tunerA;
|
||||
TunerB = tunerB;
|
||||
@ -208,8 +208,8 @@ namespace SDL2Demo.Jobs
|
||||
public bool DoVerticalHigh { get; }
|
||||
public int Diseqc { get; }
|
||||
public int SatelliteId { get; }
|
||||
public SatellitePositionEntity Direction { get; }
|
||||
public LnbEntity LnbType { get; }
|
||||
public SatellitePosition Direction { get; }
|
||||
public LnbType LnbType { get; }
|
||||
public bool RecordingEnabled { get; }
|
||||
}
|
||||
#endregion
|
||||
@ -689,7 +689,7 @@ namespace SDL2Demo.Jobs
|
||||
now.Year, now.Month, now.Day, now.Hour, now.Minute, blindscanResult.sr1.Freq / 1000,
|
||||
blindscanResult.sr1.Pol == 0 ? "H" : "V", blindscanResult.sr1.SR / 1000,
|
||||
(int)(Configuration.Direction.angle * 10),
|
||||
Configuration.Direction.GetCardinalDirectionAsChar());
|
||||
Configuration.Direction.cardinalDirection == 0 ? "E" : "W");
|
||||
|
||||
|
||||
RunSkyscraper(blindscanResult);
|
||||
|
||||
@ -13,9 +13,9 @@ namespace SDL2Demo.Jobs
|
||||
{
|
||||
private bool windowOpen;
|
||||
private List<TunerMetadata> tuners;
|
||||
private List<SatellitePositionEntity> satellites;
|
||||
private List<LnbEntity> lnbs;
|
||||
private List<DishEntity> dishes;
|
||||
private List<SatellitePosition> satellites;
|
||||
private List<LnbType> lnbs;
|
||||
private List<DishType> dishes;
|
||||
private readonly TaskQueue _taskQueue;
|
||||
|
||||
public int settingsWindowBLScanTunerSelection;
|
||||
@ -52,7 +52,7 @@ namespace SDL2Demo.Jobs
|
||||
settingsWindowScanVerticalLow, settingsWindowScanVerticalHigh);
|
||||
}
|
||||
public InheritedBlindscanConfigWindow(List<TunerMetadata> tunerMetadatas,
|
||||
List<SatellitePositionEntity> satellitePositions, List<LnbEntity> lnbTypes, List<DishEntity> dishTypes,
|
||||
List<SatellitePosition> satellitePositions, List<LnbType> lnbTypes, List<DishType> dishTypes,
|
||||
DataStorage dataStorage, ObjectStorage objectStorage, IGpsReceiver gps, Ini ini, IStreamReader streamReader,
|
||||
TaskQueue taskQueue)
|
||||
{
|
||||
@ -131,7 +131,7 @@ namespace SDL2Demo.Jobs
|
||||
|
||||
bjc.TunerMetadata = tuners[settingsWindowBLScanTunerSelection];
|
||||
bjc.Ui = new InheritedBlindscanUiJunction();
|
||||
//bjc.Ui.Tasks = _taskQueue;
|
||||
bjc.Ui.Tasks = _taskQueue;
|
||||
return bjc;
|
||||
}
|
||||
|
||||
|
||||
@ -33,23 +33,8 @@ using System.Numerics;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Serialization;
|
||||
using moe.yo3explorer.skyscraper8.DVBI.Model;
|
||||
using skyscraper5.Dvb.DataBroadcasting.IntModel;
|
||||
using skyscraper5.Dvb.SystemSoftwareUpdate.Model;
|
||||
using skyscraper5.src.InteractionChannel.Model;
|
||||
using skyscraper5.T2MI.Packets;
|
||||
using skyscraper8.DvbNip;
|
||||
using skyscraper8.DvbNip.UiIntegration;
|
||||
using skyscraper8.DvbSis;
|
||||
using skyscraper8.GSE;
|
||||
using skyscraper8.GSE.GSE;
|
||||
using skyscraper8.Ietf.FLUTE;
|
||||
using skyscraper8.Ses;
|
||||
using skyscraper8.Skyscraper.Scraper;
|
||||
using skyscraper8.T2MI.Packets;
|
||||
using testdrid.SdlWrapper;
|
||||
using static SDL2Demo.Jobs.Blindscan;
|
||||
using Platform = skyscraper5.Dvb.DataBroadcasting.IntModel.Platform;
|
||||
|
||||
namespace SDL2Demo.Jobs
|
||||
{
|
||||
@ -467,11 +452,6 @@ namespace SDL2Demo.Jobs
|
||||
patEntry.pmt = result;
|
||||
}
|
||||
|
||||
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
private string pmtTabBarUuid;
|
||||
public void RenderPmt()
|
||||
@ -1016,11 +996,6 @@ namespace SDL2Demo.Jobs
|
||||
}
|
||||
}
|
||||
|
||||
public void NotifyWss(ushort programNumber, WssDataBlock wssDataBlock, int pid)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
private void RenderDataCarousels()
|
||||
{
|
||||
@ -1682,7 +1657,7 @@ namespace SDL2Demo.Jobs
|
||||
return position;
|
||||
}
|
||||
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbEntity lnb)
|
||||
public void OnBlindscanBeforeSetChannel(BlindscanSearchResult blindscanResult, LnbType lnb)
|
||||
{
|
||||
Point point = GetFrequencyPosition(blindscanResult.SearchResult, lnb.MinimumFrequency, lnb.MaximumFrequency);
|
||||
jobContext.Puppets[2 + blindscanResult.SearchResult.Pol].AutoMoveTo(point);
|
||||
@ -1825,173 +1800,7 @@ namespace SDL2Demo.Jobs
|
||||
return !foundFrequenciesWindow.doNotAutoZap;
|
||||
}
|
||||
|
||||
public void NotifyNit(NitNetwork nitNetwork)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void EnableUiFeature(SkyscraperUiFeature bbframeAnalysis)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnIpMacNotification(int sourcePid, Platform platform, Target target, Operational operational)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnSsuNotification(UpdateNotificationGroup common, UpdateNotificationTarget target, ushort programNumber)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnBbframe(BBHeader bbHeader, byte[] payload)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDetectionOfInnerTs(SkyscraperContext child, object identifier)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void NotifyGsePacket(ushort value, byte[] gseDataBytes, GseLabel label)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipFileArrival(FluteUiHandle fuh)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipMulticastGatewayConfiguration(NipActualCarrierInformation carrier,
|
||||
MulticastGatewayConfigurationType multicastGatewayConfiguration)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipCarrierDetected(NipActualCarrierInformation currentCarrierInformation)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipPrivateDataSignallingManifest(PrivateDataSignallingManifestType privateDataSignallingManifest)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceListEntryPoints(NipActualCarrierInformation currentCarrierInformation,
|
||||
ServiceListEntryPoints serviceListEntryPoints, DateTime dvbNipTime)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1,
|
||||
string serviceListId2)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipTimeOffsetFile(NipActualCarrierInformation currentCarrierInformation, TimeOffsetFileType timeOffsetFile)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipNetworkInformationFile(NipActualCarrierInformation currentCarrierInformation,
|
||||
NetworkInformationFileType networkInformationFile)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void DvbNipServiceInformation(NipActualCarrierInformation currentCarrierInformation,
|
||||
ServiceInformationFileType serviceInformationFile)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipFileAnnouncement(FDTInstanceType flute)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnAstraSgtList(SgtList list)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnAstraSgtService(SgtService child)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbNipServiceList(NipActualCarrierInformation currentCarrierInformation, string serviceListId1, ServiceListType serviceListId2)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void NotifyTransportStreamId(int tsid, int nid)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisCat(int sourcePid, SisCatContainer catContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisEit(int sourcePid, SisEitContainer eitContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisFti(int relatedPid, _0xF0_FramingTimingInformation fti)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisPat(int sourcePid, SisPatContainer patContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisSdt(int sourcePid, SisSdtContainer sdtContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber,
|
||||
Stream dsaci)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisPmt(int sourcePid, SisPmtContainer pmtContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisNit(int sourcePid, SisNitContainer nitContainer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnDvbSisTdt(int sourcePid, DateTime? utcTime)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void OnRcs2Rmt(Rmt rmt)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TaskQueue Tasks { get; set; }
|
||||
public TaskQueue Tasks { get; set; }
|
||||
|
||||
internal JobContext jobContext;
|
||||
#endregion
|
||||
|
||||
@ -211,9 +211,9 @@ namespace SkyscraperUI
|
||||
private ConfigureDataStorageWindow configureDataStorageWindow;
|
||||
private ConfigureObjectStorageWindow configureObjectStorageWindow;
|
||||
private SatellitesConfigurationWindow satellitesConfigurationWindow;
|
||||
private List<SatellitePositionEntity> satellitePositions;
|
||||
private List<LnbEntity> lnbTypes;
|
||||
private List<DishEntity> dishTypes;
|
||||
private List<SatellitePosition> satellitePositions;
|
||||
private List<LnbType> lnbTypes;
|
||||
private List<DishType> dishTypes;
|
||||
//private LogWindow logWindow;
|
||||
private ScrapeFromTcp scrapeFromTcpWindow;
|
||||
private JobContext jobContext;
|
||||
|
||||
@ -9,7 +9,6 @@ using skyscraper5.LyngsatMapsScraper.Model;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage;
|
||||
using skyscraper8.Skyscraper.Plugins;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
using TimeSpan = System.TimeSpan;
|
||||
|
||||
namespace skyscraper5.LyngsatMapsScraper
|
||||
{
|
||||
@ -168,20 +167,5 @@ namespace skyscraper5.LyngsatMapsScraper
|
||||
{
|
||||
return File.ReadAllText(fileInfo.FullName);
|
||||
}
|
||||
|
||||
public static TimeSpan GetAge(this FileInfo fileInfo)
|
||||
{
|
||||
DateTime lastWriteTime = fileInfo.LastWriteTime;
|
||||
DateTime now = DateTime.Now;
|
||||
TimeSpan diff = now - lastWriteTime;
|
||||
return diff;
|
||||
}
|
||||
|
||||
public static int GetAgeInSeconds(this FileInfo fileInfo)
|
||||
{
|
||||
TimeSpan timeSpan = fileInfo.GetAge();
|
||||
int result = (int)timeSpan.TotalSeconds;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -8,7 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="SharpKml.Core" Version="6.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Npgsql" Version="10.0.2" />
|
||||
<PackageReference Include="Npgsql" Version="9.0.3" />
|
||||
<PackageReference Include="SharpGIS.NmeaParser" Version="3.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
1
skyscraper8.Tests/AssemblySettings.cs
Normal file
1
skyscraper8.Tests/AssemblySettings.cs
Normal file
@ -0,0 +1 @@
|
||||
[assembly: CollectionBehavior(DisableTestParallelization = true)]
|
||||
102
skyscraper8.Tests/AstraBarkerTransponderTests.cs
Normal file
102
skyscraper8.Tests/AstraBarkerTransponderTests.cs
Normal file
@ -0,0 +1,102 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants;
|
||||
using skyscraper8.Ses;
|
||||
using skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
public class AstraBarkerTransponderTests
|
||||
{
|
||||
private const string BARKER_TRANSPONDER_FILE_PATH = "C:\\Temp\\Astra1_12604_v_SGT-000000.ts";
|
||||
private Stream GetBarkerTransponder()
|
||||
{
|
||||
FileInfo fi = new FileInfo(BARKER_TRANSPONDER_FILE_PATH);
|
||||
if (!fi.Exists)
|
||||
{
|
||||
Debug.WriteLine(String.Format("Could not find file: {0}", BARKER_TRANSPONDER_FILE_PATH));
|
||||
return null;
|
||||
}
|
||||
return fi.OpenRead();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestAstraSdt()
|
||||
{
|
||||
Stream stream = GetBarkerTransponder();
|
||||
if (stream == null)
|
||||
return;
|
||||
|
||||
SdtContestant contestant = new SdtContestant(0x002d);
|
||||
|
||||
TsDescriptorUnpacker descriptorUnpacker = TsDescriptorUnpacker.GetInstance();
|
||||
for (byte i = 0x80; i < 0xfe; i++)
|
||||
{
|
||||
descriptorUnpacker.SetUserDefined(i, true);
|
||||
}
|
||||
descriptorUnpacker.SetUserDefined(0xfe, true);
|
||||
|
||||
TsContext tsContext = new TsContext();
|
||||
tsContext.FilterChain = new List<skyscraper5.src.Mpeg2.PacketFilter.IPacketFilter>();
|
||||
tsContext.FilterChain.Add(new DummyFilter());
|
||||
tsContext.RegisterPacketProcessor(0x002d, contestant.PacketProcessor);
|
||||
|
||||
byte[] buffer = new byte[188];
|
||||
while (stream.GetAvailableBytes() >= 188)
|
||||
{
|
||||
stream.Read(buffer, 0, 188);
|
||||
tsContext.PushPacket(buffer);
|
||||
if (contestant.Score >= 10)
|
||||
break;
|
||||
}
|
||||
stream.Close();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestAstraLcn()
|
||||
{
|
||||
Stream stream = GetBarkerTransponder();
|
||||
if (stream == null)
|
||||
return;
|
||||
|
||||
SgtCandidate contestant = new SgtCandidate(0x0777);
|
||||
SgtCandidate contestant2 = new SgtCandidate(0x0776);
|
||||
|
||||
TsDescriptorUnpacker descriptorUnpacker = TsDescriptorUnpacker.GetInstance();
|
||||
for (byte i = 0x80; i < 0xfe; i++)
|
||||
{
|
||||
descriptorUnpacker.SetUserDefined(i, true);
|
||||
}
|
||||
descriptorUnpacker.SetUserDefined(0xfe, true);
|
||||
|
||||
TsContext tsContext = new TsContext();
|
||||
tsContext.FilterChain = new List<skyscraper5.src.Mpeg2.PacketFilter.IPacketFilter>();
|
||||
tsContext.FilterChain.Add(new DummyFilter());
|
||||
tsContext.RegisterPacketProcessor(0x0777, contestant.PacketProcessor);
|
||||
tsContext.RegisterPacketProcessor(0x0776, contestant2.PacketProcessor);
|
||||
|
||||
byte[] buffer = new byte[188];
|
||||
while (stream.GetAvailableBytes() >= 188)
|
||||
{
|
||||
stream.Read(buffer, 0, 188);
|
||||
tsContext.PushPacket(buffer);
|
||||
bool winnerA = contestant.Score >= 10;
|
||||
bool winnerB = contestant2.Score >= 10;
|
||||
if (winnerA)
|
||||
{
|
||||
if (winnerB)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
stream.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,18 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.src.Mpeg2.PacketFilter;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests
|
||||
{
|
||||
internal class DummyFilter : IPacketFilter
|
||||
{
|
||||
public bool PassPacket(TsPacket packet)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
using skyscraper5.Docsis;
|
||||
using skyscraper5.Docsis.MacManagement;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Tests.ClassDependencies.DocsisTests
|
||||
{
|
||||
internal class DocsisEventHandlerImpl : IDocsisEventHandler
|
||||
{
|
||||
public void OnCmtsTimestamp(PhysicalAddress source, uint timing)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnDownstreamChannel(PhysicalAddress physicalAddress, MacDomainDescriptor.DownstreamActiveChannel downstreamActiveChannel)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnLearnedIpFromMac(PhysicalAddress arpHeaderSenderHardwareAddress, IPAddress arpHeaderSenderProtocolAddress)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnParticipantDetected(PhysicalAddress pa)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void OnUpstreamChannel(UpstreamChannelDescriptor mmm)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,22 +1,38 @@
|
||||
using System.Net.NetworkInformation;
|
||||
using skyscraper5;
|
||||
using skyscraper5.Docsis;
|
||||
using skyscraper5.Docsis.AnnexC;
|
||||
using skyscraper5.Docsis.MacManagement;
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.Plugins;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.Filesystem;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
||||
using skyscraper8.Skyscraper.IO;
|
||||
using skyscraper8.Tests.ClassDependencies.DocsisTests;
|
||||
using skyscraper8.Tests.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Xunit.Sdk;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class DocsisResourceTests : SkyscrapersTestingFramework
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
[Test]
|
||||
public void ModemCapabilitiesEncoding()
|
||||
{
|
||||
byte[] buffer = Properties.Resources.ModemCapabilitiesEncodingTest;
|
||||
ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer);
|
||||
Assert.IsTrue(modemCapabilitiesEncoding.Valid);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public class DocsisTests
|
||||
{
|
||||
[Fact]
|
||||
public void ModemCapabilitiesEncoding()
|
||||
{
|
||||
byte[] buffer = Resources.ModemCapabilitiesEncodingTest;
|
||||
ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer);
|
||||
Assert.True(modemCapabilitiesEncoding.Valid);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MultipartRegistrationResponse()
|
||||
{
|
||||
Random rng = new Random();
|
||||
@ -29,18 +45,18 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
|
||||
rng.NextBytes(targetBuffer);
|
||||
PhysicalAddress target = new PhysicalAddress(targetBuffer);
|
||||
|
||||
byte[] buffer = Properties.Resources.T45_V4_MultipartRegistrationResponseTest;
|
||||
byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest;
|
||||
T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer);
|
||||
Assert.IsTrue(test.Valid);
|
||||
Assert.True(test.Valid);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Fact]
|
||||
public void MacManagement_4_45()
|
||||
{
|
||||
NullDocsisEventHandler docsisEventHandler = new NullDocsisEventHandler();
|
||||
DocsisEventHandlerImpl docsisEventHandler = new DocsisEventHandlerImpl();
|
||||
DocsisEnvironment environment = new DocsisEnvironment(docsisEventHandler);
|
||||
|
||||
byte[] testPayload = Properties.Resources.PushMacManagementMessage_Version4_Type45;
|
||||
byte[] testPayload = Resources.PushMacManagementMessage_Version4_Type45;
|
||||
|
||||
Random rng = new Random();
|
||||
byte[] sourceBuffer = new byte[6];
|
||||
@ -54,10 +70,10 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
|
||||
environment.PushMacManagementMessage(testPayload, 4, 45, source, target, testPayload);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Fact]
|
||||
public void InvalidUpstreamChannelDescriptorTest()
|
||||
{
|
||||
byte[] testPayload = Properties.Resources.UpstreamChannelDescriptorTest;
|
||||
byte[] testPayload = Resources.UpstreamChannelDescriptorTest;
|
||||
|
||||
Random rng = new Random();
|
||||
byte[] sourceBuffer = new byte[6];
|
||||
@ -69,19 +85,19 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
|
||||
PhysicalAddress target = new PhysicalAddress(targetBuffer);
|
||||
|
||||
UpstreamChannelDescriptor ucd = new UpstreamChannelDescriptor(source, target, testPayload);
|
||||
Assert.IsFalse(ucd.Valid);
|
||||
Assert.False(ucd.Valid);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Fact]
|
||||
public void TransmitChannelConfigurationObjectTest()
|
||||
{
|
||||
byte[] testPayload = Properties.Resources.TransmitChannelConfigurationObject;
|
||||
byte[] testPayload = Resources.TransmitChannelConfigurationObject;
|
||||
|
||||
CommonTlvEncodingObject.TransmitChannelConfigurationObject child = new CommonTlvEncodingObject.TransmitChannelConfigurationObject(testPayload);
|
||||
Assert.IsTrue(child.Valid);
|
||||
Assert.True(child.Valid);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Fact]
|
||||
public void MultipartRegistrationResponse2()
|
||||
{
|
||||
Random rng = new Random();
|
||||
@ -94,26 +110,9 @@ public class DocsisResourceTests : SkyscrapersTestingFramework
|
||||
rng.NextBytes(targetBuffer);
|
||||
PhysicalAddress target = new PhysicalAddress(targetBuffer);
|
||||
|
||||
byte[] buffer = Properties.Resources.T45_V4_MultipartRegistrationResponseTest2;
|
||||
byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest2;
|
||||
T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer);
|
||||
Assert.IsTrue(test.Valid);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OffsetBreakerTest()
|
||||
{
|
||||
byte[] blob = Properties.Resources.ranging_response_test;
|
||||
Random rng = new Random();
|
||||
|
||||
byte[] sourceMacBuffer = new byte[6];
|
||||
rng.NextBytes(sourceMacBuffer);
|
||||
PhysicalAddress sourceAddress = new PhysicalAddress(sourceMacBuffer);
|
||||
|
||||
byte[] targetMacBuffer = new byte[6];
|
||||
rng.NextBytes(targetMacBuffer);
|
||||
PhysicalAddress targetAddress = new PhysicalAddress(targetMacBuffer);
|
||||
|
||||
RangingResponse rangingResponse = new RangingResponse(sourceAddress, targetAddress, blob);
|
||||
Assert.IsTrue(rangingResponse.Valid);
|
||||
Assert.True(test.Valid);
|
||||
}
|
||||
}
|
||||
}
|
||||
69
skyscraper8.Tests/DocsisTestsLong.cs
Normal file
69
skyscraper8.Tests/DocsisTestsLong.cs
Normal file
@ -0,0 +1,69 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.Filesystem;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5;
|
||||
using skyscraper8.Skyscraper.IO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
public class DocsisTestsLong
|
||||
{
|
||||
[Fact]
|
||||
public void TestLongBoiSingleStreams()
|
||||
{
|
||||
DirectoryInfo di = new DirectoryInfo("D:\\DocsisDemo");
|
||||
if (!di.Exists)
|
||||
{
|
||||
Debug.WriteLine("Files not available!");
|
||||
return;
|
||||
}
|
||||
|
||||
FilesystemScraperStorageFactory storageFactory = new FilesystemScraperStorageFactory();
|
||||
storageFactory.Directory = "docsis_longboi";
|
||||
|
||||
Passing passing = new Passing();
|
||||
passing.DataStorage = storageFactory.CreateDataStorage();
|
||||
passing.MassImportDirectory(di);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestM3u8Stream()
|
||||
{
|
||||
FileInfo docsisM3u8 = new FileInfo("D:\\DocsisDemo\\docsis.m3u8");
|
||||
if (!docsisM3u8.Exists)
|
||||
{
|
||||
Debug.WriteLine("File not available!");
|
||||
return;
|
||||
}
|
||||
|
||||
FileInfo alreadyTested = new FileInfo("docsis_m3u8_test.complete");
|
||||
if (alreadyTested.Exists)
|
||||
{
|
||||
Debug.WriteLine("Hello!");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
M3U8Stream m3u8 = new M3U8Stream(docsisM3u8.FullName);
|
||||
|
||||
TsContext tsContext = new TsContext();
|
||||
InMemoryScraperStorageFactory storageFactory = new InMemoryScraperStorageFactory();
|
||||
DataStorage scraperStorage = storageFactory.CreateDataStorage();
|
||||
SkyscraperContext skyscraperContext = new SkyscraperContext(tsContext, scraperStorage, null);
|
||||
skyscraperContext.InitalizeFilterChain();
|
||||
skyscraperContext.IngestFromStream(m3u8);
|
||||
|
||||
File.WriteAllText("docsis_m3u8_test.complete", "1");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,3 +0,0 @@
|
||||
global using NUnit.Framework;
|
||||
|
||||
[assembly: LevelOfParallelism(1)]
|
||||
147
skyscraper8.Tests/Properties/Resources.Designer.cs
generated
147
skyscraper8.Tests/Properties/Resources.Designer.cs
generated
@ -1,42 +1,57 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Dieser Code wurde von einem Tool generiert.
|
||||
// Laufzeitversion:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||
// der Code erneut generiert wird.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Properties {
|
||||
namespace skyscraper8.Tests.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
/// <summary>
|
||||
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
|
||||
/// </summary>
|
||||
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
|
||||
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
|
||||
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
|
||||
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static System.Resources.ResourceManager resourceMan;
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static System.Globalization.CultureInfo resourceCulture;
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static System.Resources.ResourceManager ResourceManager {
|
||||
/// <summary>
|
||||
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.Equals(null, resourceMan)) {
|
||||
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("skyscraper8.Tests.NUnit.Properties.Resources", typeof(Resources).Assembly);
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("skyscraper8.Tests.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static System.Globalization.CultureInfo Culture {
|
||||
/// <summary>
|
||||
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
|
||||
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
@ -45,34 +60,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] Frame00000008_TSGS1_MIS000_SYNC001 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Frame00000008_TSGS1_MIS000_SYNC001", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] Frame00000012_TSGS1_MIS000_SYNC001 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Frame00000012_TSGS1_MIS000_SYNC001", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] Frame00000357_TSGS1_MIS000_SYNC184 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Frame00000357_TSGS1_MIS000_SYNC184", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] Frame00001343_TSGS1_MIS000_SYNC001 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("Frame00001343_TSGS1_MIS000_SYNC001", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] ModemCapabilitiesEncodingTest {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ModemCapabilitiesEncodingTest", resourceCulture);
|
||||
@ -80,6 +70,29 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] MultipartRegistrationResponseTest {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] MultipartRegistrationResponseTest2 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest2", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] PushMacManagementMessage_Version4_Type45 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("PushMacManagementMessage_Version4_Type45", resourceCulture);
|
||||
@ -87,6 +100,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] ranging_response_test {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ranging_response_test", resourceCulture);
|
||||
@ -94,27 +110,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] sdpTest {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("sdpTest", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] T45_V4_MultipartRegistrationResponseTest {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] T45_V4_MultipartRegistrationResponseTest2 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest2", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] test_1packet_01 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("test-1packet-01", resourceCulture);
|
||||
@ -122,6 +120,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] test_2packets_02_03 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("test-2packets-02-03", resourceCulture);
|
||||
@ -129,6 +130,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] test_3packets_04_05_06 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("test-3packets-04-05-06", resourceCulture);
|
||||
@ -136,6 +140,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] TransmitChannelConfigurationObject {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("TransmitChannelConfigurationObject", resourceCulture);
|
||||
@ -143,18 +150,14 @@ namespace skyscraper8.Tests.NUnit.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sucht eine lokalisierte Ressource vom Typ System.Byte[].
|
||||
/// </summary>
|
||||
internal static byte[] UpstreamChannelDescriptorTest {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("UpstreamChannelDescriptorTest", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static byte[] ExampleVoileOnlinePost {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ExampleVoileOnlinePost", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,34 +118,19 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="Frame00000008_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Frame00000008_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="Frame00000012_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Frame00000012_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="Frame00000357_TSGS1_MIS000_SYNC184" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Frame00000357_TSGS1_MIS000_SYNC184.bbframe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="Frame00001343_TSGS1_MIS000_SYNC001" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Frame00001343_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="ModemCapabilitiesEncodingTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ModemCapabilitiesEncodingTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="MultipartRegistrationResponseTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="PushMacManagementMessage_Version4_Type45" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\PushMacManagementMessage_Version4_Type45.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="ranging_response_test" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ranging_response_test.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="sdpTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\sdpTest.sdp;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="T45_V4_MultipartRegistrationResponseTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="T45_V4_MultipartRegistrationResponseTest2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<data name="MultipartRegistrationResponseTest2" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\T45_V4_MultipartRegistrationResponseTest2.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="test-1packet-01" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
@ -163,7 +148,4 @@
|
||||
<data name="UpstreamChannelDescriptorTest" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\UpstreamChannelDescriptorTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="ExampleVoileOnlinePost" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ExampleVoileOnlinePost.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
||||
28
skyscraper8.Tests/RangingResponseTest.cs
Normal file
28
skyscraper8.Tests/RangingResponseTest.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using skyscraper5.Docsis.MacManagement;
|
||||
using System.Net.NetworkInformation;
|
||||
using skyscraper8.Tests.Properties;
|
||||
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
public class RangingResponseTest
|
||||
{
|
||||
[Fact]
|
||||
public void OffsetBreakerTest()
|
||||
{
|
||||
|
||||
byte[] blob = Resources.ranging_response_test;
|
||||
Random rng = new Random();
|
||||
|
||||
byte[] sourceMacBuffer = new byte[6];
|
||||
rng.NextBytes(sourceMacBuffer);
|
||||
PhysicalAddress sourceAddress = new PhysicalAddress(sourceMacBuffer);
|
||||
|
||||
byte[] targetMacBuffer = new byte[6];
|
||||
rng.NextBytes(targetMacBuffer);
|
||||
PhysicalAddress targetAddress = new PhysicalAddress(targetMacBuffer);
|
||||
|
||||
RangingResponse rangingResponse = new RangingResponse(sourceAddress, targetAddress, blob);
|
||||
Assert.True(rangingResponse.Valid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,20 +0,0 @@
|
||||
{
|
||||
"SessionMetadata" : {
|
||||
"OS" : "Unix 6.8.0.124",
|
||||
"Guid" : "ad50ca18-0401-4f73-b2bc-60a3cf9437fb",
|
||||
"MachineName" : "meiko",
|
||||
"StartTime" : "2026-06-20T16:03:27.5038363+02:00",
|
||||
"ProductName" : "skyscraper8.Tests"
|
||||
},
|
||||
"TestResult" : {
|
||||
"ClassName" : "skyscraper8.Tests.NUnit.Tests.CoverageTests.DocsisCoverageTests",
|
||||
"MethodName" : "BurstDescriptorTests",
|
||||
"TimeTaken" : 116,
|
||||
"LogOutput" : "",
|
||||
"AssertionCount" : 28,
|
||||
"TestId" : 1051,
|
||||
"OutcomeLabel" : "",
|
||||
"OutcomeSite" : 0,
|
||||
"OutcomeStatus" : 2
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,10 +0,0 @@
|
||||
v=0
|
||||
o=enensys Announcement-BM-SC 3962468565 IN IP4 10.10.10.20
|
||||
s=Announcement delivery session
|
||||
t=0 0
|
||||
a=mbms-mode:broadcast-mbsfn 61712
|
||||
a=source-filter: incl IN IP4 * 10.10.10.20
|
||||
a=flute-tsi:9
|
||||
m=application 50001 FLUTE/UDP 0
|
||||
c=IN IP4 224.0.2.20/10
|
||||
b=AS:200
|
||||
28
skyscraper8.Tests/SanityTests.cs
Normal file
28
skyscraper8.Tests/SanityTests.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
public class SanityTests
|
||||
{
|
||||
[Fact]
|
||||
public void Test15bits()
|
||||
{
|
||||
byte[] bcd = new byte[] { 0xa9, 0x23 };
|
||||
MemoryStream ms = new MemoryStream(bcd);
|
||||
byte readUInt8 = ms.ReadUInt8();
|
||||
|
||||
bool msbSet = (readUInt8 & 0x80) != 0;
|
||||
Assert.True(msbSet);
|
||||
|
||||
int result = ms.ReadUInt8();
|
||||
result <<= 8;
|
||||
result += readUInt8;
|
||||
Assert.Equal(9001, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
using System.Runtime.Serialization;
|
||||
using skyscraper5;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class SkyscraperTestException : SkyscraperException
|
||||
{
|
||||
public SkyscraperTestException()
|
||||
{
|
||||
}
|
||||
|
||||
public SkyscraperTestException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public SkyscraperTestException(string message, Exception inner) : base(message, inner)
|
||||
{
|
||||
}
|
||||
|
||||
protected SkyscraperTestException(SerializationInfo info, StreamingContext context) : base(info, context)
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -1,224 +0,0 @@
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using log4net.Core;
|
||||
using log4net.Repository.Hierarchy;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
[NonParallelizable]
|
||||
public class SkyscrapersTestingFramework
|
||||
{
|
||||
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
|
||||
private Dictionary<string, DateTime> _testTimes;
|
||||
|
||||
private VoileOnlineTestSessionMetadata _voileOnlineTestSessionMetadata;
|
||||
|
||||
private VoileOnlineTestSessionMetadata GetVoileOnlineTestSessionMetadata()
|
||||
{
|
||||
if (_voileOnlineTestSessionMetadata == null)
|
||||
{
|
||||
_voileOnlineTestSessionMetadata = new VoileOnlineTestSessionMetadata();
|
||||
_voileOnlineTestSessionMetadata.Guid = Guid.NewGuid();
|
||||
_voileOnlineTestSessionMetadata.MachineName = Environment.MachineName;
|
||||
_voileOnlineTestSessionMetadata.StartTime = DateTime.Now;
|
||||
_voileOnlineTestSessionMetadata.OS = Environment.OSVersion.ToString();
|
||||
_voileOnlineTestSessionMetadata.ProductName = Assembly.GetExecutingAssembly().GetName().Name;
|
||||
}
|
||||
return _voileOnlineTestSessionMetadata;
|
||||
}
|
||||
|
||||
private HashSet<long> testIds;
|
||||
private long ResolveTestId()
|
||||
{
|
||||
string testId = TestContext.CurrentContext.Test.ID;
|
||||
if (testIds == null)
|
||||
testIds = new HashSet<long>();
|
||||
|
||||
long decodedTestId = 0;
|
||||
for (int i = 0; i < testId.Length; i++)
|
||||
{
|
||||
char current = testId[i];
|
||||
if (!char.IsDigit(current))
|
||||
continue;
|
||||
int currentDigit = current - '0';
|
||||
if (i != 0)
|
||||
decodedTestId *= 10;
|
||||
decodedTestId += currentDigit;
|
||||
}
|
||||
if (testIds.Contains(decodedTestId))
|
||||
throw new SkyscraperTestException("Test ID already used");
|
||||
testIds.Add(decodedTestId);
|
||||
return decodedTestId;
|
||||
}
|
||||
private long GetTestDuration()
|
||||
{
|
||||
if (_testTimes == null)
|
||||
return -1;
|
||||
|
||||
string key = TestContext.CurrentContext.Test.FullName;
|
||||
if (!_testTimes.ContainsKey(key))
|
||||
return -2;
|
||||
|
||||
return DateTime.Now.Subtract(_testTimes[key]).Milliseconds;
|
||||
}
|
||||
|
||||
private DirectoryInfo _samplesDirectory;
|
||||
private DirectoryInfo GetSamplesDirectory()
|
||||
{
|
||||
if (_samplesDirectory == null)
|
||||
{
|
||||
//Zuerst die sample_path.txt versuchen zu lesen
|
||||
FileInfo fi = new FileInfo("sample_path.txt");
|
||||
if (!fi.Exists)
|
||||
{
|
||||
logger.WarnFormat("Could not find {0}", fi.FullName);
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.InfoFormat("Reading samples path from: {0}", fi.FullName);
|
||||
string readAllText = File.ReadAllText(fi.FullName).Trim();
|
||||
_samplesDirectory = new DirectoryInfo(readAllText);
|
||||
return _samplesDirectory;
|
||||
}
|
||||
|
||||
string userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
||||
DirectoryInfo di = new DirectoryInfo(userProfile);
|
||||
if (di.Exists)
|
||||
{
|
||||
userProfile = Path.Combine(di.FullName, "Dependencies");
|
||||
di = new DirectoryInfo(userProfile);
|
||||
if (di.Exists)
|
||||
{
|
||||
userProfile = Path.Combine(userProfile, "skyscraper-testsuite");
|
||||
di = new DirectoryInfo(userProfile);
|
||||
if (di.Exists)
|
||||
{
|
||||
_samplesDirectory = di;
|
||||
return _samplesDirectory;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_samplesDirectory == null)
|
||||
{
|
||||
Assert.Inconclusive("Could not find samples directory");
|
||||
}
|
||||
|
||||
return _samplesDirectory;
|
||||
}
|
||||
|
||||
protected FileStream GetStreamSample(string filename)
|
||||
{
|
||||
DirectoryInfo samplesDirectory = GetSamplesDirectory();
|
||||
FileInfo file = new FileInfo(Path.Combine(samplesDirectory.FullName, filename));
|
||||
if (!file.Exists)
|
||||
{
|
||||
Assert.Inconclusive(String.Format("Could not find sample file: {0}", file.FullName));
|
||||
}
|
||||
return file.OpenRead();
|
||||
}
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
if (_testTimes == null)
|
||||
_testTimes = new Dictionary<string, DateTime>();
|
||||
|
||||
SetUpLogCapture();
|
||||
|
||||
string key = TestContext.CurrentContext.Test.FullName;
|
||||
DateTime value = DateTime.Now;
|
||||
_testTimes[key] = value;
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void TearDown()
|
||||
{
|
||||
TestContext currentContext = TestContext.CurrentContext;
|
||||
|
||||
VoileOnlineTestResult voileOnlineTestResult = new VoileOnlineTestResult();
|
||||
voileOnlineTestResult.ClassName = currentContext.Test.ClassName;
|
||||
voileOnlineTestResult.MethodName = currentContext.Test.MethodName;
|
||||
voileOnlineTestResult.OutcomeLabel = currentContext.Result.Outcome.Label;
|
||||
voileOnlineTestResult.OutcomeSite = (int)currentContext.Result.Outcome.Site;
|
||||
voileOnlineTestResult.OutcomeStatus = (int)currentContext.Result.Outcome.Status;
|
||||
voileOnlineTestResult.TimeTaken = GetTestDuration();
|
||||
voileOnlineTestResult.LogOutput = TearDownLogCapture();
|
||||
voileOnlineTestResult.AssertionCount = currentContext.AssertCount;
|
||||
voileOnlineTestResult.TestId = ResolveTestId();
|
||||
|
||||
|
||||
|
||||
|
||||
VoileOnlineTestPost voileOnlinePost = new VoileOnlineTestPost();
|
||||
voileOnlinePost.SessionMetadata = GetVoileOnlineTestSessionMetadata();
|
||||
voileOnlinePost.TestResult = voileOnlineTestResult;
|
||||
VoileOnlineUploader.Upload(voileOnlinePost);
|
||||
}
|
||||
|
||||
public TException AssertTargetInvocation<TException>(TestDelegate action)
|
||||
where TException : Exception
|
||||
{
|
||||
TargetInvocationException exeption = Assert.Throws<TargetInvocationException>(action);
|
||||
|
||||
Assert.That(exeption.InnerException, Is.TypeOf<TException>());
|
||||
|
||||
return (TException)exeption.InnerException;
|
||||
}
|
||||
|
||||
private TestLog4NetAppender? _testLogAppender;
|
||||
|
||||
protected TestLog4NetAppender TestLogAppender =>
|
||||
_testLogAppender ?? throw new InvalidOperationException("Test log appender is not initialized.");
|
||||
|
||||
private void SetUpLogCapture()
|
||||
{
|
||||
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
|
||||
|
||||
_testLogAppender = new TestLog4NetAppender
|
||||
{
|
||||
Name = $"TestLogAppender-{TestContext.CurrentContext.Test.ID}"
|
||||
};
|
||||
|
||||
_testLogAppender.ActivateOptions();
|
||||
|
||||
hierarchy.Root.AddAppender(_testLogAppender);
|
||||
|
||||
if (hierarchy.Root.Level == null)
|
||||
{
|
||||
hierarchy.Root.Level = log4net.Core.Level.Debug;
|
||||
}
|
||||
|
||||
hierarchy.Configured = true;
|
||||
}
|
||||
|
||||
private string TearDownLogCapture()
|
||||
{
|
||||
string logText = _testLogAppender?.GetText() ?? string.Empty;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(logText))
|
||||
{
|
||||
TestContext.WriteLine("Captured log4net output:");
|
||||
TestContext.WriteLine(logText);
|
||||
}
|
||||
|
||||
if (_testLogAppender is not null)
|
||||
{
|
||||
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
|
||||
hierarchy.Root.RemoveAppender(_testLogAppender);
|
||||
_testLogAppender.Close();
|
||||
_testLogAppender = null;
|
||||
}
|
||||
|
||||
return logText;
|
||||
}
|
||||
|
||||
protected IReadOnlyList<LoggingEvent> GetCapturedLogEvents()
|
||||
{
|
||||
if (_testLogAppender == null)
|
||||
return new List<LoggingEvent>();
|
||||
return _testLogAppender.Events;
|
||||
}
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
using log4net.Core;
|
||||
using skyscraper8.Skyscraper.Net;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class SkyscrapersTestingHarness
|
||||
{
|
||||
public DataStorage DataStorage { get; set; }
|
||||
public ObjectStorage ObjectStorage { get; set; }
|
||||
public IReadOnlyList<LoggingEvent> Events { get; set; }
|
||||
public BlackholeIpTrafficHandler IpTrafficHandler { get; set; }
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
using log4net.Appender;
|
||||
using log4net.Core;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class TestLog4NetAppender : AppenderSkeleton
|
||||
{
|
||||
private List<LoggingEvent> _events;
|
||||
|
||||
public IReadOnlyList<LoggingEvent> Events
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_events == null)
|
||||
return new List<LoggingEvent>();
|
||||
return _events.AsReadOnly();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Append(LoggingEvent loggingEvent)
|
||||
{
|
||||
loggingEvent.Fix = FixFlags.All;
|
||||
if (_events == null)
|
||||
_events = new List<LoggingEvent>();
|
||||
_events.Add(loggingEvent);
|
||||
}
|
||||
|
||||
public string GetText()
|
||||
{
|
||||
return String.Join("\n", Events.Select(e => String.Format("[{0}] {1}", e.LoggerName, e.RenderedMessage)));
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,19 +0,0 @@
|
||||
using skyscraper8.Skyscraper.Math;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.CoverageTests;
|
||||
|
||||
[TestFixture]
|
||||
public class MathTests
|
||||
{
|
||||
[Test]
|
||||
public void TestPlsConversions()
|
||||
{
|
||||
int originalGoldCode = 131070;
|
||||
|
||||
int calculatedRootCode = PlsCodeConverter.GoldToRoot(originalGoldCode);
|
||||
Assert.That(calculatedRootCode, Is.EqualTo(16416));
|
||||
|
||||
int calculatedGoldCode = PlsCodeConverter.RootToGold(calculatedRootCode);
|
||||
Assert.That(calculatedGoldCode, Is.EqualTo(originalGoldCode));
|
||||
}
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.CoverageTests;
|
||||
|
||||
[TestFixture]
|
||||
public class Mpeg2CoverageTests : SkyscrapersTestingFramework
|
||||
{
|
||||
[Test]
|
||||
public void PsiSectionTest()
|
||||
{
|
||||
PsiSection section = new PsiSection();
|
||||
section.Append(new byte[] { 3 });
|
||||
}
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
using skyscraper5.Skyscraper;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage.Tar;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.IntegrationTests;
|
||||
|
||||
[TestFixture]
|
||||
public class SkyscraperIntegrationTests : SkyscrapersTestingFramework
|
||||
{
|
||||
[Test]
|
||||
public void CreateTarArchive()
|
||||
{
|
||||
string filename = String.Format("{0}.tar", DateTime.Now.ToUnixTime());
|
||||
FileInfo fi = new FileInfo(filename);
|
||||
FileStream fileStream = fi.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
|
||||
fi.Refresh();
|
||||
Assert.IsTrue(fi.Exists);
|
||||
|
||||
Random rng = new Random();
|
||||
|
||||
TarArchive tar = new TarArchive(fileStream);
|
||||
for (int i = 0; i < 42; i++)
|
||||
{
|
||||
filename = String.Format("{0}.bin", i);
|
||||
|
||||
int randomSize = rng.Next(4096);
|
||||
byte[] buffer = new byte[randomSize];
|
||||
rng.NextBytes(buffer);
|
||||
|
||||
tar.WriteEntry(filename, buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,296 +0,0 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
||||
using skyscraper8.Skyscraper.Net;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
using skyscraper8.Tests.NUnit;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests;
|
||||
|
||||
[TestFixture]
|
||||
public class RecordedSamplesTests : SkyscrapersTestingFramework
|
||||
{
|
||||
[Test]
|
||||
public void RussianT2Mi()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("express_3928L_t2mi.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//42931 uncovered
|
||||
Assert.True(result.DataStorage.TestForCaSystem(1, 1, 1453));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Simmin()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("thor_11049v_simmin-radiomidun.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//36611 uncovered
|
||||
Assert.True(result.DataStorage.TestForTerminalBurstTimePlan2(1326, 1, 0));
|
||||
Assert.True(result.DataStorage.TestForBroadcastConfiguration(1326, 2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GseDab()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("thor_10717v_gse-dab.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("192.168.1.4", "239.199.2.4", 1234, 1234));
|
||||
//36446 uncovered
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EarlyBrazilianNip()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("brazilian-dvb-nip-000000.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//35222
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_9/HLS_OUT/NIP_9-mp4a_140800=20000-begin=3403218160093331-dur=40106667-seq=85080456.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://usd.xxxoperatorxxx.com/fragments/envelope.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-mp4a_140800=20000-begin=3403218170199998-dur=39893334-seq=85080456.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("envelope.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499940_cid274499942.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_6/HLS_OUT/NIP_6-hvc1_1761664=10000-p=335204011000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499949_cid274499951.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_9/HLS_OUT/NIP_9-hvc1_1761664=10000-p=330114634000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499913_cid274499915.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_1/HLS_OUT/NIP_1-hvc1_1761664=10000-p=330114493000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499968_cid274499970.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-hvc1_1761664=10000-p=330030655000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499922_cid274499924.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_2/HLS_OUT/NIP_2-hvc1_1761664=10000-p=330114509000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid244303386_cid244303388.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_0/HLS_OUT/NIP_0-hvc1_1761664=10000-p=330114463000000-init.mp4"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid274499958_cid274499960.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_6/HLS_OUT/NIP_6-mp4a_140800=20000-begin=3403218200093333-dur=40106667-seq=85080457.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:NetworkInformationFile"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_4/HLS_OUT/NIP_4-mp4a_140800=20000-begin=3403218210093332-dur=40106667-seq=85080457.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.22:80/1/images.tar"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_2/HLS_OUT/NIP_2-mp4a_140800=20000-begin=3403218240093332-dur=40106667-seq=85080458.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.22:80/pages.tar"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://10.10.10.24:8888/live/diskb/NIP_0/HLS_OUT/NIP_0-hvc1_1761664=10000-begin=3403218250000000-dur=40000000-seq=85080458.m4s"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GseNip()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("astra1_12441v_gse-nip.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sgc/tva_schedule_20251123100000_PT3H15M_CoreSet.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/MorningNews.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/PoliticalInsight.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/ScienceFictionShowcase.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287140.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/SportsHighlights.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000_6287143.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/TravelAdventures.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00006.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_2000_6287143.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/ComedyHour.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500_6287143.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00005.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/FitnessHour.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_1000_556702.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:NetworkInformationFile"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/cg/manifest.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:ServiceGuide"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod1/5G-MAG_v_4500_00004.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/KidsFunTime.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00009.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287141.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/RomanticEvenings.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_1000_6287144.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1007.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00013.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1009.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/TechTalk.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_4500_6287141.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1005.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_2000_6287144.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/DocumentaryWorld.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00017.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/Astronomy-2e.pdf"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/MysteryTheater.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod2/5G-Emerge_v_1000_00021.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_1000_556703.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1006.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/sge/WildlifeWonders.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_1000_6287142.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/vod1/5G-MAG_v_4500_00011.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s0/5G-EMERGE/Live/hls/crits_linear/crits_linear_v_2000_556703.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1000.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s1/5G-EMERGE/Live/hls/RaiStoria/RaiStoria_v_4500_6287142.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1011.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/s2/5G-EMERGE/Live/hls/RaiScuola/RaiScuola_v_4500_6287145.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/inverto.tv/data/IMG_1012.jpeg"));
|
||||
|
||||
//34545
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GseNip2()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("astra1_11141h_gse_nip.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//34462
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/xml.aitx"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/fr-sub/1763893122.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/main.js"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/playlist-audio.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/live/channel1/manifest.mpd"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893122.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/img/dvbnip.png"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/playlist-audio2.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/style.css"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/dvbi/service_list_ses_private.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/button.js"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B1/audio/881946560.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/index.html"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/A%20Better%20Super%20Bowl.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/service_list_full.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio2/1763893123.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/cg/CoreSetRelatedMaterials/programm-api.ard.de/images/MjAyNS0xMC0wMQ==/68ddba3f8ace97dd375c961b_1759361599632.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:nativeip:dvb-i-slep"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/HDplus_ExtraScreen.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/hbbtv/img/WTqW6FTJ2.jpeg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/audio/881946561.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/live/channel1/1-2025940.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893124.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/b1.png"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/2017_SES_4K_trailer_IBC.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/service_list_tp1045.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B1/audio/881946561.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/cg/manifest.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/SES_BS.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/5G-EMERGE.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/AIT_VF-10-08-15_French.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/C1/audio/1763893125.m4s"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/dvbi/sg/CoreSetRelatedMaterial/programm-api.ard.de/images/MjAyNS0wOS0xMA==/68c20b38bc0414230a56325d_1757547321028.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/materials/b2.png"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/private/vod_small/covers/Welcome%20to%20Luxembourg.jpg"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/ses.com/livesim2/B2/audio/881946562.m4s"));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TsNipIncludingLegacyChannel()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("hotbird_12380v_nip.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//33518
|
||||
Assert.IsTrue(result.DataStorage.TestForCaSystem(318, 8400, 7104));
|
||||
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("0.0.0.0", "224.1.1.103", 0, 16301));
|
||||
Assert.IsTrue(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/rai.it/s0/5G-EMERGE/Live/dash/crits_linear/crits_linear_v_4500_001114520.mp4"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TsNip()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("hotbird_12226v_nip.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//33518
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_tamazight_tccybxt/playlist.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_arryadia_k2tgcj0_480p/playlist.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/index.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_arrabia_hthcj4p/playlist.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch008/hls-sb/index.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87687000_23699.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_aloula_w1dqfwm/playlist.m3u8"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_tamazight_tccybxt/corp/73_tamazight_tccybxt_480p/l_22569_7413000_17779.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:NativeIPMulticastTransportObjectTypeCS:2023:bootstrap"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87690000_23700.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("urn:dvb:metadata:cs:MulticastTransportObjectTypeCS:2021:gateway-configuration"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch007/hls-sb/keyframes/orp01-ten999-ch007-video=2580000-440974019.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_360p/l_43705_87690000_23700.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/keyframes/orp01-ten999-ch009-video=2600000-440974020.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_arrabia_hthcj4p/corp/73_arrabia_hthcj4p_480p/l_43737_7398000_23696.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_aloula_w1dqfwm/l_43669_7389881_23706.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_480p/l_43701_87690000_23700.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/corp/73_arryadia_k2tgcj0_480p/l_22601_52377000_17770.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_240p/l_43709_87693000_23701.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("envelope.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://www.enensys.com/usd_bid8331_cid8335.xml"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/ts_corp/73_almaghribia_83tz85q/corp/73_almaghribia_83tz85q_480p/l_43701_87693000_23701.ts"));
|
||||
Assert.True(result.ObjectStorage.DvbNipTestForFile("http://dvb.gw/eutelsat/bpk-tv/orp01-ten999-ch009/hls-sb/orp01-ten999-ch009-audio_133600_eng=131600-video=2600000-440974020.ts"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GseRcs2()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("telstar12v-bfbs-000000.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
//32559
|
||||
Assert.True(result.DataStorage.TestForTerminalBurstTimePlan2(65281, 5, 0));
|
||||
Assert.True(result.DataStorage.TestForBroadcastConfiguration(65281, 2));
|
||||
Assert.True(result.IpTrafficHandler.TestForUdpTraffic("192.168.19.50", "238.1.1.1", 1024, 4000));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BadrDvbSis()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("badr_12563v_dvb-sis.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
Assert.True(result.ObjectStorage.TestForSisDsaci(136, 26, 1, 13));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Eutelsat5DvbSis()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("eutelsat5_12522v_dvb-sis.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
Assert.True(result.ObjectStorage.TestForSisDsaci(1375, 20700, 9, 17));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Kira7Patchday()
|
||||
{
|
||||
FileStream streamSample = GetStreamSample("kira7.ts");
|
||||
SkyscrapersTestingHarness result = ProcessSample(streamSample);
|
||||
streamSample.Close();
|
||||
Assert.IsTrue(result.IpTrafficHandler.TestForUdpTraffic("192.168.1.48", "224.0.0.252", 62983, 5355));
|
||||
Assert.IsTrue(result.IpTrafficHandler.TestForLlcTraffic("ff:ff:ff:ff:ff:ff", 8, 0, 0));
|
||||
}
|
||||
|
||||
|
||||
|
||||
private SkyscrapersTestingHarness ProcessSample(Stream sample)
|
||||
{
|
||||
TsContext ts = new TsContext();
|
||||
|
||||
InMemoryScraperStorageFactory inMemoryStorageFactory = new InMemoryScraperStorageFactory();
|
||||
DataStorage dataStorage = inMemoryStorageFactory.CreateDataStorage();
|
||||
|
||||
ObjectStorage blackholeObjectStorage = new BlackholeObjectStorage();
|
||||
|
||||
BlackholeIpTrafficHandler ipTrafficHandler = new BlackholeIpTrafficHandler();
|
||||
|
||||
SkyscraperContext context = new SkyscraperContext(ts, dataStorage, blackholeObjectStorage);
|
||||
context.InitalizeFilterChain();
|
||||
context.OverrideIpTrafficHandler(ipTrafficHandler);
|
||||
context.IngestFromStream(sample);
|
||||
|
||||
SkyscrapersTestingHarness harness = new SkyscrapersTestingHarness();
|
||||
harness.DataStorage = dataStorage;
|
||||
harness.ObjectStorage = blackholeObjectStorage;
|
||||
harness.Events = GetCapturedLogEvents();
|
||||
harness.IpTrafficHandler = ipTrafficHandler;
|
||||
return harness;
|
||||
}
|
||||
}
|
||||
@ -1,18 +0,0 @@
|
||||
using skyscraper8.GS;
|
||||
using skyscraper8.GS.GSE_RollingSyncByte;
|
||||
using skyscraper8.GSE;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class GsResourceTests
|
||||
{
|
||||
[Test]
|
||||
public void TestShortPdu()
|
||||
{
|
||||
byte[] datasource = Properties.Resources.Frame00000357_TSGS1_MIS000_SYNC184;
|
||||
GsContextDto dto = new GsContextDto();
|
||||
GseWithRollingSyncByteReader reader = new GseWithRollingSyncByteReader(dto);
|
||||
reader.PushFrame(new BBHeader(new byte[10], 0), datasource);
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
using skyscraper8.Ietf.Rfc4566_SDP;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class IetfSdpResourceTests : SkyscrapersTestingFramework
|
||||
{
|
||||
[Test]
|
||||
public void TestSdpParser()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream(Properties.Resources.sdpTest, false);
|
||||
Assert.IsTrue(SDP.IsSDP(ms));
|
||||
|
||||
SDP loaded = SDP.Load(ms);
|
||||
Assert.IsNotNull(loaded);
|
||||
}
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class Mpeg2ResourceTests
|
||||
{
|
||||
[Test]
|
||||
public void CheckBfbsCrc()
|
||||
{
|
||||
byte[] blob = Properties.Resources.Frame00001343_TSGS1_MIS000_SYNC001;
|
||||
MemoryStream ms = new MemoryStream(blob, false);
|
||||
bool result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
|
||||
Assert.IsTrue(result);
|
||||
|
||||
blob = Properties.Resources.Frame00000008_TSGS1_MIS000_SYNC001;
|
||||
ms = new MemoryStream(blob, false);
|
||||
result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckBfbsCrcSpan()
|
||||
{
|
||||
byte[] blob = Properties.Resources.Frame00000012_TSGS1_MIS000_SYNC001;
|
||||
ReadOnlySpan<byte> span = new ReadOnlySpan<byte>(blob);
|
||||
bool result = DvbCrc32.ValidateCrc(span);
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
}
|
||||
@ -1,39 +0,0 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
||||
using skyscraper8.Skyscraper.Scraper.Storage;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class SkyscraperResourceTests : SkyscrapersTestingFramework
|
||||
{
|
||||
[Test]
|
||||
public void RunTestPatterns()
|
||||
{
|
||||
byte[][] buffers = new byte[][]
|
||||
{
|
||||
Properties.Resources.test_1packet_01,
|
||||
Properties.Resources.test_2packets_02_03,
|
||||
Properties.Resources.test_3packets_04_05_06
|
||||
};
|
||||
|
||||
InMemoryScraperStorageFactory imssf = new InMemoryScraperStorageFactory();
|
||||
|
||||
foreach (byte[] buffer in buffers)
|
||||
{
|
||||
TsContext mpeg2 = new TsContext();
|
||||
DataStorage ds = new InMemoryScraperStorageFactory().CreateDataStorage();
|
||||
ObjectStorage os = new BlackholeObjectStorage();
|
||||
|
||||
SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, ds, os);
|
||||
MemoryStream ms = new MemoryStream(buffer, false);
|
||||
|
||||
skyscraper.InitalizeFilterChain();
|
||||
skyscraper.IngestFromStream(ms);
|
||||
|
||||
ms.Close();
|
||||
ms.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
|
||||
|
||||
[TestFixture]
|
||||
public class TestingTests
|
||||
{
|
||||
[Test]
|
||||
public void ReadVoileOnlineTest()
|
||||
{
|
||||
byte[] buffer = Properties.Resources.ExampleVoileOnlinePost;
|
||||
VoileOnlineTestPost? voileOnlineTestPost = JsonConvert.DeserializeObject<VoileOnlineTestPost>(Encoding.UTF8.GetString(buffer));
|
||||
Assert.IsNotNull(voileOnlineTestPost);
|
||||
Assert.IsNotNull(voileOnlineTestPost.SessionMetadata);
|
||||
Assert.IsNotNull(voileOnlineTestPost.TestResult);
|
||||
Assert.AreEqual(2, voileOnlineTestPost.TestResult.OutcomeStatus);
|
||||
Assert.AreEqual("meiko",voileOnlineTestPost.SessionMetadata.MachineName);
|
||||
|
||||
}
|
||||
}
|
||||
36
skyscraper8.Tests/TsDuckTestPatterns.cs
Normal file
36
skyscraper8.Tests/TsDuckTestPatterns.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using skyscraper5.Mpeg2;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper5.Skyscraper.Scraper.Storage.InMemory;
|
||||
using skyscraper8.Tests.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Tests
|
||||
{
|
||||
public class TsDuckTestPatterns
|
||||
{
|
||||
[Fact]
|
||||
public void RunTestPatterns()
|
||||
{
|
||||
byte[][] buffers = new byte[][] { Resources.test_1packet_01, Resources.test_2packets_02_03, Resources.test_3packets_04_05_06 };
|
||||
|
||||
InMemoryScraperStorageFactory imssf = new InMemoryScraperStorageFactory();
|
||||
|
||||
foreach (byte[] buffer in buffers)
|
||||
{
|
||||
TsContext mpeg2 = new TsContext();
|
||||
SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, null, null);
|
||||
MemoryStream ms = new MemoryStream(buffer, false);
|
||||
|
||||
skyscraper.InitalizeFilterChain();
|
||||
skyscraper.IngestFromStream(ms);
|
||||
|
||||
ms.Close();
|
||||
ms.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class VoileOnlineTestPost
|
||||
{
|
||||
public VoileOnlineTestSessionMetadata SessionMetadata { get; set; }
|
||||
public VoileOnlineTestResult TestResult { get; set; }
|
||||
}
|
||||
@ -1,16 +0,0 @@
|
||||
using NUnit.Framework.Interfaces;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class VoileOnlineTestResult
|
||||
{
|
||||
public string? ClassName { get; set; }
|
||||
public string? MethodName { get; set; }
|
||||
public long TimeTaken { get; set; }
|
||||
public string LogOutput { get; set; }
|
||||
public int AssertionCount { get; set; }
|
||||
public long TestId { get; set; }
|
||||
public string OutcomeLabel { get; set; }
|
||||
public int OutcomeSite { get; set; }
|
||||
public int OutcomeStatus { get; set; }
|
||||
}
|
||||
@ -1,10 +0,0 @@
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public class VoileOnlineTestSessionMetadata
|
||||
{
|
||||
public string OS { get; set; }
|
||||
public Guid Guid { get; set; }
|
||||
public string MachineName { get; set; }
|
||||
public DateTime StartTime { get; set; }
|
||||
public string? ProductName { get; set; }
|
||||
}
|
||||
@ -1,84 +0,0 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace skyscraper8.Tests.NUnit;
|
||||
|
||||
public sealed class VoileOnlineUploader
|
||||
{
|
||||
public static void Upload(VoileOnlineTestPost voileOnlinePost)
|
||||
{
|
||||
if (_instance == null)
|
||||
{
|
||||
_instance = new VoileOnlineUploader();
|
||||
}
|
||||
|
||||
_instance.PushResult(voileOnlinePost);
|
||||
}
|
||||
|
||||
private static VoileOnlineUploader _instance;
|
||||
private Thread _uploaderThread;
|
||||
private Queue<VoileOnlineTestPost> _queue;
|
||||
|
||||
private void PushResult(VoileOnlineTestPost voileOnlinePost)
|
||||
{
|
||||
if (_queue == null)
|
||||
_queue = new Queue<VoileOnlineTestPost>();
|
||||
|
||||
lock (_queue)
|
||||
{
|
||||
_queue.Enqueue(voileOnlinePost);
|
||||
}
|
||||
|
||||
if (_uploaderThread == null)
|
||||
{
|
||||
_uploaderThread = new Thread(PusherThread);
|
||||
_uploaderThread.Priority = ThreadPriority.Lowest;
|
||||
_uploaderThread.Name = "VoileOnlineUploader";
|
||||
}
|
||||
|
||||
switch (_uploaderThread.ThreadState)
|
||||
{
|
||||
case ThreadState.Unstarted:
|
||||
_uploaderThread.Start();
|
||||
break;
|
||||
case ThreadState.Running:
|
||||
break;
|
||||
case ThreadState.Stopped:
|
||||
_uploaderThread = new Thread(PusherThread);
|
||||
_uploaderThread.Priority = ThreadPriority.Lowest;
|
||||
_uploaderThread.Name = "VoileOnlineUploader";
|
||||
_uploaderThread.Start();
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException(String.Format("ThreadState: {0}", _uploaderThread.ThreadState));
|
||||
}
|
||||
}
|
||||
|
||||
private void PusherThread()
|
||||
{
|
||||
int numElements = 0;
|
||||
lock (_queue)
|
||||
{
|
||||
numElements = _queue.Count;
|
||||
}
|
||||
while (numElements > 0)
|
||||
{
|
||||
VoileOnlineTestPost voileOnlinePost;
|
||||
lock (_queue)
|
||||
{
|
||||
voileOnlinePost = _queue.Dequeue();
|
||||
}
|
||||
|
||||
string json = JsonConvert.SerializeObject(voileOnlinePost);
|
||||
DoPost(json);
|
||||
|
||||
lock (_queue)
|
||||
{
|
||||
numElements = _queue.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void DoPost(string json)
|
||||
{
|
||||
}
|
||||
}
|
||||
@ -1,45 +1,49 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
<RootNamespace>skyscraper8.Tests.NUnit</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
|
||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.4">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xunit.SkippableFact" Version="1.5.23" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Update="Properties\Resources.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Update="Resources1.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources1.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\skyscraper8\skyscraper8.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\skyscraper8\skyscraper8.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="Properties\Resources.Designer.cs">
|
||||
<DesignTime>True</DesignTime>
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Update="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -51,6 +51,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.DNS", "MpePlugi
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.Gimmicks.IptvCollector", "Gimmicks\skyscraper5.Gimmicks.IptvCollector\skyscraper5.Gimmicks.IptvCollector.csproj", "{8F17668C-623C-F9B3-EAD4-2922E5414B75}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests", "skyscraper8.Tests\skyscraper8.Tests.csproj", "{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UIs", "UIs", "{E23457C5-3A34-48EE-8107-C91E2C174B2D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper5.UI.WindowsForms", "GUIs\skyscraper5.UI\skyscraper5.UI.WindowsForms.csproj", "{46CACA1C-F9B2-2FE0-2068-716F381325E9}"
|
||||
@ -65,8 +67,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame", "
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame.Bridge", "GUIs\skyscraper8.UI.ImGui.MonoGame.Bridge\skyscraper8.UI.MonoGame.Bridge.csproj", "{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests", "skyscraper8.Tests\skyscraper8.Tests.csproj", "{5FB2AA76-580E-4343-B155-5D596DDC27F2}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -78,75 +78,97 @@ Global
|
||||
{8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8DAAE3A2-72EA-4908-8F62-911D293043E8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E52A1723-7193-EC3C-7371-01A3BB58E0EA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1015ACF1-E812-5410-66A5-E92DE682D2C6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C4262F19-0648-A1A1-3D62-748A45BC5329}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1B8696DA-8A81-8F1F-9463-49C727959EDA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{68EB7299-FC65-654E-B972-D79514B91BAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{68EB7299-FC65-654E-B972-D79514B91BAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{68EB7299-FC65-654E-B972-D79514B91BAD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{60F519BA-49C0-7C7B-E26F-E4313A9B1697}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{71CFF3DD-4F6C-3A21-B2C3-2F3A59D4FB4A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AD0F65A7-3257-BB3B-46F5-C16BFDF9DBCC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{868A7453-E1B7-A619-F447-41E42420405C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{868A7453-E1B7-A619-F447-41E42420405C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{868A7453-E1B7-A619-F447-41E42420405C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2296DA0C-AD28-DB06-1984-13B4AE5DE61D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{96D43A77-C1DA-16EF-2084-BA939C0BEB4D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{17C2E095-B952-8919-2C68-F2EAA7A601C3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{07214423-32B2-DDE8-8D38-511D55ADC206}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{07214423-32B2-DDE8-8D38-511D55ADC206}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{07214423-32B2-DDE8-8D38-511D55ADC206}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0E4C7079-228A-B94C-379A-8A14B08BAB34}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3B52C24E-58E2-F982-F9B7-B9E7465B82A2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8F17668C-623C-F9B3-EAD4-2922E5414B75}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{46CACA1C-F9B2-2FE0-2068-716F381325E9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{BDBDB7A9-D0A4-9B89-0801-2935B2066551}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CF21D250-9804-4191-89F5-95821E3AF39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CF21D250-9804-4191-89F5-95821E3AF39D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CF21D250-9804-4191-89F5-95821E3AF39D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EBB6B1CF-2597-4962-AA31-2B42B4C28C7D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{839C3783-020F-77D6-C22C-D50DCC97CDD6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@ -1,84 +1,12 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAllureContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fc09614b59cc98c343d268f55e356aaafe85d13755cd5ca217988e9c5362ff_003FAllureContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAllureFeatureAttribute_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F405349a6f42433abaa8b1d6d06bb6f21c66899533fa9f9648cb1cde8755143_003FAllureFeatureAttribute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArgumentNullException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Ff2_003F6872d84e_003FArgumentNullException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AArray_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6e_003Fd247db11_003FArray_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F053cba69424c47858472194d509c3cdc12bb0_003F37_003F58cc70f4_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa840692e98b74557bc005b38213a22c72dad0_003Fc8_003F58c2e0c9_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F62bb4746d7d14dc1cd4274a28788572a7a4641bd3a7d5736479c9697bcb4794_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F46a322d26154b982566e1817203e5452c91223f93b0e392d9c5b4806696fdc1_003FAssert_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002EInconclusive_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F8e305e26401afcd395b5be2da0e23d61432655dc5f2c2e5e6d5bd873bb0cb90_003FAssert_002EInconclusive_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AAssert_002EThrowsException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fe6930caf46f7fcaa445fdd26a3884170a45a4766298259e7a29bae560adef_003FAssert_002EThrowsException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABeforeAndAfterTestCommand_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003Ff536671e825030c7f17fbf3f75511651c281f2429edc8fd6ea660418f825949_003FBeforeAndAfterTestCommand_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACultureInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F8e_003Fe58e5b4a_003FCultureInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F83_003Fc73c45bc_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F4a_003Ff8de026f_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFastResourceComparer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F8f_003Ffb4ed86c_003FFastResourceComparer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F5a_003Fcf76af61_003FFileInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIDisposable_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003Ff98216d3aaee47d6a9f523673a3ec107d83a00_003F_005Fbb40f_003FIDisposable_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AInterop_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fea_003F7d70064b_003FInterop_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AJsonSerializerInternalReader_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F52f3815551fa6e6d408ea7dbf6748f7efe35caea15eb53ee27ee1bb406d62c8_003FJsonSerializerInternalReader_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F6b_003Fa410ee2c_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AManifestBasedResourceGroveler_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003F06_003F506a7cf8_003FManifestBasedResourceGroveler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemberInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fce_003F751a2c1f_003FMemberInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMemoryStream_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F068af3a6_003FMemoryStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3ad82f9910d5c82d76b445db10584a60305639dcad2533e08e6c47f85e3b6d83_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F7a_003F86728bdc_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMethodBaseInvoker_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003Fc3_003F355fe836_003FMethodBaseInvoker_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkStream_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F02ece58f2cb8b2c950c683cf599a9e387c8c8bd47c4514c6534331316be3_003FNetworkStream_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANotImplementedException_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fa3_003F2c4f9089_003FNotImplementedException_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullable_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F6549c49b_003FNullable_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANullAsserts_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F3f4719f7ce375226774d6991a6afc2f6932e58b42fd58ff13c7c03771642e_003FNullAsserts_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AObject_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F55_003F6efc7017_003FObject_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AQueue_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fb6_003F498e7c75_003FQueue_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AReadOnlyDictionary_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0d_003F1270c638_003FReadOnlyDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AResourceManager_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F0c_003Fb548fbc6_003FResourceManager_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeInformation_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F4c_003F5f771d10_003FRuntimeInformation_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARuntimeResourceSet_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fe1_003Ff15f6bbe_003FRuntimeResourceSet_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASafeFileHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Fc6_003Fd8e0f2f2_003FSafeFileHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASafeFileHandle_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F95_003Ff0feb47b_003FSafeFileHandle_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASkip_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fd8c543d93f1559af2ea2be8e9d55839b5bb1a3605f22daa45ea63772e3b4bc_003FSkip_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASocket_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6879915f5af210e93c5b87791d557eb99403cbfe54398263cd7efae55e3a67_003FSocket_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASpan_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F48f7bf031b2942d3831d66d46fe3bc99b2e200_003F49_003F017cad58_003FSpan_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASpan_00601_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffd0d7846a16a4147ad767b7c3ae2cf57b2e200_003F35_003F161711de_003FSpan_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASR_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F4d_003F7edc51d9_003FSR_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AString_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F2e_003F1a14f40f_003FString_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATestMethodInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F9ea467e7c7b4671a214143293021e7ec337916b71125d896e17a0b7fc_003FTestMethodInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThread_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1f03371654aa41ca984353e7e344e822b2e200_003F9e_003F4a40121f_003FThread_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2026_002E2_003Fresharper_002Dhost_003FSourcesCache_003F6780d13016c376c4491c5618b257d84da7eacf747ed2719783e775546b79b_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003Feb_003F3c476997_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F4f_003F7bfc5050_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AThrowHelper_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffb63d7b4f026464dbf9b2db60c7f76bc2ac00_003Fbd_003F4080deac_003FThrowHelper_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATuple_00602_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F57d616db882b441b8c50720b4477e03db2e200_003F9f_003F0d16f921_003FTuple_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AXmlSerializer_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2026_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F7d5324401ccb48a5b32c2bfdf42662547b5800_003Fb2_003F4570db6a_003FXmlSerializer_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||
|
||||
|
||||
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue"><AssemblyExplorer>
|
||||
<Assembly Path="/home/schiemas/.dotnet/packs/Microsoft.NETCore.App.Ref/8.0.21/ref/net8.0/System.Windows.dll" />
|
||||
<Assembly Path="/home/schiemas/.nuget/packages/allure.net.commons/2.14.1/lib/netstandard2.0/Allure.Net.Commons.dll" />
|
||||
</AssemblyExplorer></s:String>
|
||||
<s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">/home/schiemas/.cache/JetBrains/Rider2025.1/resharper-host/temp/Rider/vAny/CoverageData/_skyscraper8.1808907683/Snapshot/snapshot.utdcvr</s:String>
|
||||
|
||||
|
||||
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ce70f33b_002D9024_002D4750_002Da24e_002D78f4e8e5e879/@EntryIndexedValue"><SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from &lt;skyscraper8.Tests&gt;" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session">
|
||||
<Solution />
|
||||
</SessionState></s:String>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue"><data><HostParameters type="LocalHostParameters" /><Argument type="StandaloneArgument"><Arguments IsNull="False"></Arguments><FileName IsNull="False"></FileName><WorkingDirectory IsNull="False"></WorkingDirectory><Scope><ProcessFilters /></Scope></Argument><Info type="TimelineInfo" /><CoreOptions type="CoreOptions"><CoreTempPath IsNull="False"></CoreTempPath><RemoteEndPoint IsNull="False"></RemoteEndPoint><AdditionalEnvironmentVariables /></CoreOptions><HostOptions type="HostOptions"><HostTempPath IsNull="False"></HostTempPath></HostOptions></data></s:String>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002ENUnit_002FProperties_002FResources/@EntryIndexedValue">False</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002ENUnit_002FProperties_002FResources/@EntryIndexRemoved">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002FProperties_002FResources/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=skyscraper8_002ETests_002FResources1/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/ResxEditorPersonal/ShowOnlyErrors/@EntryValue">False</s:Boolean>
|
||||
|
||||
<s:Boolean x:Key="/Default/UnloadedProject/UnloadedProjects/=46caca1c_002Df9b2_002D2fe0_002D2068_002D716f381325e9_0023skyscraper5_002EUI_002EWindowsForms/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UnloadedProject/UnloadedProjects/=ebb6b1cf_002D2597_002D4962_002Daa31_002D2b42b4c28c7d_0023skyscraper8_002EAnagramViewer/@EntryIndexedValue">True</s:Boolean>
|
||||
</wpf:ResourceDictionary>
|
||||
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue"><data><HostParameters type="LocalHostParameters" /><Argument type="StandaloneArgument"><Arguments IsNull="False"></Arguments><FileName IsNull="False"></FileName><WorkingDirectory IsNull="False"></WorkingDirectory><Scope><ProcessFilters /></Scope></Argument><Info type="TimelineInfo" /><CoreOptions type="CoreOptions"><CoreTempPath IsNull="False"></CoreTempPath><RemoteEndPoint IsNull="False"></RemoteEndPoint><AdditionalEnvironmentVariables /></CoreOptions><HostOptions type="HostOptions"><HostTempPath IsNull="False"></HostTempPath></HostOptions></data></s:String></wpf:ResourceDictionary>
|
||||
@ -26,10 +26,14 @@ namespace skyscraper5.Abertis
|
||||
|
||||
public void PushPacket(TsPacket packet)
|
||||
{
|
||||
Span<byte> payload = packet.GetPayload();
|
||||
byte[] packetPayload = packet.Payload;
|
||||
|
||||
MemoryStream ms = new MemoryStream(packetPayload);
|
||||
if (packet.AdaptionFieldControl == 3)
|
||||
{
|
||||
ms.ReadByte();
|
||||
}
|
||||
|
||||
MemoryStream ms = new MemoryStream(payload.ToArray(), false);
|
||||
|
||||
int syncLossCheck = 0;
|
||||
while (ms.GetAvailableBytes() > 0)
|
||||
{
|
||||
|
||||
@ -1,35 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using skyscraper8.Skyscraper.Net.VirtualNetworks;
|
||||
|
||||
namespace skyscraper8.Atsc.A322
|
||||
{
|
||||
[VirtualNetworkId(1)]
|
||||
internal class Atsc3PlpVirtualNetworkIdentifier : VirtualNetworkIdentifier
|
||||
{
|
||||
public ushort PlpId { get; }
|
||||
|
||||
public Atsc3PlpVirtualNetworkIdentifier(ushort plpId)
|
||||
{
|
||||
PlpId = plpId;
|
||||
}
|
||||
|
||||
public override string GetCaptureFilenamePrefix()
|
||||
{
|
||||
return String.Format("atsc3plp{0}", PlpId);
|
||||
}
|
||||
|
||||
public override string GetHumanReadableName()
|
||||
{
|
||||
return String.Format("ATSC3 PLP {0}", PlpId);
|
||||
}
|
||||
|
||||
public override int GetIdentifier()
|
||||
{
|
||||
return PlpId;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,212 +0,0 @@
|
||||
using log4net;
|
||||
using skyscraper5.Ietf.Rfc971;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using skyscraper8.Atsc.A330;
|
||||
using skyscraper8.GSE.GSE_HEM;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static skyscraper5.Dvb.SystemSoftwareUpdate.SystemSoftwareUpdateInfo;
|
||||
|
||||
namespace skyscraper8.Atsc.A322
|
||||
{
|
||||
internal class AtscPlpBasebandParser
|
||||
{
|
||||
private readonly ushort _plpId;
|
||||
private readonly IAtscPlpEventHandler _eventHandler;
|
||||
|
||||
public AtscPlpBasebandParser(ushort plpId, IAtscPlpEventHandler eventHandler)
|
||||
{
|
||||
_plpId = plpId;
|
||||
_eventHandler = eventHandler;
|
||||
}
|
||||
|
||||
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
|
||||
private RayBuffer rayBuffer;
|
||||
private const int MINIMUM_REQUIRED_RAY_LENGTH = 65535 * 2;
|
||||
private const int MINIMUM_REQUIRED_RAY_PACKETS = 2;
|
||||
private uint delivered_bbframes_total;
|
||||
private uint delivered_alp_total;
|
||||
|
||||
internal void PushBbframe(Span<byte> payload)
|
||||
{
|
||||
byte a = payload[0];
|
||||
bool mode = ((a >> 7) & 0x01) != 0;
|
||||
int pointer = (a & 0x7f);
|
||||
int addToPointer;
|
||||
|
||||
if (!mode)
|
||||
{
|
||||
//1 byte done.
|
||||
addToPointer = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
addToPointer = 2;
|
||||
byte b = payload[1];
|
||||
pointer |= (((b >> 2) & 0x3F) << 7);
|
||||
OfiDescription ofi = (OfiDescription)(b & 0x3);
|
||||
switch (ofi)
|
||||
{
|
||||
case OfiDescription.NoExtensionMode:
|
||||
break;
|
||||
case OfiDescription.LongExtensionMode:
|
||||
byte lc = payload[2];
|
||||
addToPointer++;
|
||||
int extType = (lc >> 5) & 0x7;
|
||||
int extLen = (lc) & 0x1F;
|
||||
byte ld = payload[3];
|
||||
addToPointer++;
|
||||
extLen |= (((ld) & 0xFF) << 5);
|
||||
// see A322-2026-04-Physical-Layer-Protocol.pdf, Table 5.2
|
||||
//0 = counter
|
||||
//7 = padding
|
||||
Span<byte> extensionField = payload.Slice(4, extLen);
|
||||
addToPointer += extLen;
|
||||
HandleExtension(true, extType, extensionField);
|
||||
break;
|
||||
case OfiDescription.ShortExtensionMode:
|
||||
byte lc2 = payload[2];
|
||||
addToPointer++;
|
||||
int extType2 = (lc2 >> 5) & 0x07;
|
||||
int extLen2 = (lc2) & 0x1f;
|
||||
|
||||
Span<byte> extensionField2 = payload.Slice(4, extLen2);
|
||||
addToPointer += extLen2;
|
||||
HandleExtension(false, extType2, extensionField2);
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException(String.Format("{0} is not yet implemented in the ATSC 3.0 BBFrame Parser.", ofi));
|
||||
}
|
||||
}
|
||||
|
||||
Span<byte> bbHeaderStripped = payload.Slice(addToPointer);
|
||||
if (rayBuffer == null)
|
||||
rayBuffer = new RayBuffer();
|
||||
if (pointer == 8191 && rayBuffer.QueuedItems == 0)
|
||||
return;
|
||||
rayBuffer.Enqueue(new MemoryStream(bbHeaderStripped.ToArray(), false), pointer);
|
||||
delivered_bbframes_total++;
|
||||
|
||||
/*if (pointer + 4 > bbHeaderStripped.Length)
|
||||
{
|
||||
Console.WriteLine("BBFRame, offset: {0}, less than four bytes left.", pointer);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("BBFRame, offset: {0}, first bytes: 0x{1:X2}{2:X2}{3:X2}{4:X2}", pointer, bbHeaderStripped[pointer], bbHeaderStripped[pointer + 1], bbHeaderStripped[pointer + 2], bbHeaderStripped[pointer + 3]);
|
||||
}*/
|
||||
|
||||
while (rayBuffer.AvailableBytes >= MINIMUM_REQUIRED_RAY_LENGTH && rayBuffer.QueuedItems >= MINIMUM_REQUIRED_RAY_PACKETS)
|
||||
{
|
||||
AlpPacket newPacket = new AlpPacket();
|
||||
ushort syncWord = rayBuffer.ReadUInt16BE();
|
||||
newPacket.PacketType = (AlpPacketType)((syncWord & 0xe000) >> 13);
|
||||
newPacket.PayloadConfiguration = (syncWord & 0x1000) != 0;
|
||||
if (!newPacket.PayloadConfiguration)
|
||||
{
|
||||
newPacket.HeaderMode = (syncWord & 0x0800) != 0;
|
||||
newPacket.Length = (syncWord & 0x07ff);
|
||||
if (newPacket.HeaderMode)
|
||||
{
|
||||
throw new NotImplementedException("single packet header");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException(("yes payload configuration"));
|
||||
}
|
||||
|
||||
if (newPacket.PacketType == AlpPacketType.Ipv4 && newPacket.Length < 20)
|
||||
{
|
||||
rayBuffer.Resync();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (newPacket.PacketType == AlpPacketType.LinkLayerSignalling)
|
||||
{
|
||||
newPacket.AdditionalHeaderForSignalingInformation = new AdditionalHeaderForSignalingInformation(rayBuffer.ReadBytes(5));
|
||||
}
|
||||
|
||||
newPacket.Payload = rayBuffer.ReadBytes(newPacket.Length);
|
||||
DeliverPacket(newPacket);
|
||||
}
|
||||
}
|
||||
|
||||
private List<AlpPacket> packets;
|
||||
private void DeliverPacket(AlpPacket newPacket)
|
||||
{
|
||||
//Console.WriteLine(newPacket.ToString());
|
||||
delivered_alp_total++;
|
||||
|
||||
switch (newPacket.PacketType)
|
||||
{
|
||||
case AlpPacketType.Ipv4:
|
||||
HandleIpv4(newPacket.Payload);
|
||||
break;
|
||||
case AlpPacketType.LinkLayerSignalling:
|
||||
HandleLinkLayerSignalling(newPacket.AdditionalHeaderForSignalingInformation, newPacket.Payload);
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException(String.Format("ALP Packet Type {0}", newPacket.PacketType));
|
||||
}
|
||||
}
|
||||
|
||||
private Atsc3PlpVirtualNetworkIdentifier networkIdentifier;
|
||||
private void HandleIpv4(byte[] newPacketPayload)
|
||||
{
|
||||
if (networkIdentifier == null)
|
||||
{
|
||||
networkIdentifier = new Atsc3PlpVirtualNetworkIdentifier(_plpId);
|
||||
}
|
||||
_eventHandler?.OnIpDatagram(networkIdentifier, newPacketPayload);
|
||||
}
|
||||
|
||||
private void HandleLinkLayerSignalling(AdditionalHeaderForSignalingInformation signalingInformation, byte[] payload)
|
||||
{
|
||||
if (signalingInformation.SignalingType == 1 && signalingInformation.SignalingTypeExtension == 0xffff &&
|
||||
signalingInformation.SignalingFormat == 0 && signalingInformation.SignalingEncoding == 0)
|
||||
{
|
||||
LinkMappingTable lmt = new LinkMappingTable(payload);
|
||||
if (lmt.ShouldRaiseEvent())
|
||||
{
|
||||
_eventHandler?.OnAtsc3LinkMappingTable(_plpId, signalingInformation, lmt);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.WarnFormat(
|
||||
"Encountered unknown Link-Layer Signaling: Type = 0x{0:X2}, Type Extension = 0x{1:X4}, Format = 0x{2:X2}, Encoding = 0x{3:X2}",
|
||||
signalingInformation.SignalingType, signalingInformation.SignalingTypeExtension,
|
||||
signalingInformation.SignalingFormat, signalingInformation.SignalingEncoding);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleExtension(bool isLongExtension, int extType, Span<byte> extensionField)
|
||||
{
|
||||
if (extType == 7)
|
||||
{
|
||||
//Padding
|
||||
return;
|
||||
}
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
internal void OnSyncLoss()
|
||||
{
|
||||
rayBuffer = new RayBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
internal enum OfiDescription
|
||||
{
|
||||
NoExtensionMode,
|
||||
ShortExtensionMode,
|
||||
LongExtensionMode,
|
||||
MixedExtensionMode,
|
||||
}
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
using skyscraper5.Ietf.Rfc971;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using skyscraper8.Atsc.A330;
|
||||
using skyscraper8.Skyscraper.Net.VirtualNetworks;
|
||||
|
||||
namespace skyscraper8.Atsc.A322
|
||||
{
|
||||
internal interface IAtscPlpEventHandler
|
||||
{
|
||||
void OnIpDatagram(VirtualNetworkIdentifier pid, byte[] payload);
|
||||
void OnAtsc3LinkMappingTable(ushort plp, AdditionalHeaderForSignalingInformation signalingInformation, LinkMappingTable lmt);
|
||||
}
|
||||
}
|
||||
@ -1,105 +0,0 @@
|
||||
using skyscraper5.Skyscraper;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Atsc.A322
|
||||
{
|
||||
internal class L1BasicSignalling : Validatable
|
||||
{
|
||||
public L1BasicSignalling(byte[] buffer)
|
||||
{
|
||||
InBitStream bitstream = new InBitStream(buffer);
|
||||
this.Version = new Version(bitstream.ReadBitsAsUInt16(3), 0);
|
||||
MimoScatteredPilotEncoding = bitstream.ReadBitAsBoolean();
|
||||
LlsFlag = bitstream.ReadBitAsBoolean();
|
||||
TimeInfoFlag = (TimeInfoFlagSignalingFormat)bitstream.ReadBitsAsByte(2);
|
||||
ReturnChannelFlag = bitstream.ReadBitAsBoolean();
|
||||
PaprReduction = (PaprReductionSignalingFormat)bitstream.ReadBitsAsByte(2);
|
||||
bool frameLengthMode = bitstream.ReadBitAsBoolean();
|
||||
if (!frameLengthMode)
|
||||
{
|
||||
FrameLength = bitstream.ReadBitsAsUint(10);
|
||||
ExcessSamplesPerSymbol = bitstream.ReadBitsAsUint(13);
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeOffset = bitstream.ReadBitsAsUint(16);
|
||||
AdditionalSamples = bitstream.ReadBitsAsByte(7);
|
||||
}
|
||||
NumSubframes = bitstream.ReadBitsAsByte(8);
|
||||
PreambleNumSymbols = bitstream.ReadBitsAsByte(3);
|
||||
PreambleReducedCarriers = bitstream.ReadBitsAsByte(3);
|
||||
L1DetailContentTag = bitstream.ReadBitsAsByte(2);
|
||||
L1DetailSizeBytes = bitstream.ReadBitsAsUint(13);
|
||||
L1DetailFecType = bitstream.ReadBitsAsByte(3);
|
||||
L1DetailAdditionalParityMode = bitstream.ReadBitsAsByte(2);
|
||||
L1DetailTotalCells = bitstream.ReadBitsAsUint(19);
|
||||
FirstSubMimo = bitstream.ReadBitAsBoolean();
|
||||
FirstSubMiso = (MisoSignallingFormat)bitstream.ReadBitsAsByte(2);
|
||||
FirstSubFftSize = (FftSizeSignallingFormat)bitstream.ReadBitsAsByte(2);
|
||||
FirstSubReducedCarries = bitstream.ReadBitsAsByte(3);
|
||||
FirstSubGuardInterval = bitstream.ReadBitsAsByte(4);
|
||||
FirstSubNumOfdmSymbols = bitstream.ReadBitsAsUint(11);
|
||||
FirstSubScatteredPilotPattern = bitstream.ReadBitsAsByte(5);
|
||||
FirstSubScatteredPilotBoost = bitstream.ReadBitsAsByte(3);
|
||||
FirstSubSbsFirst = bitstream.ReadBitAsBoolean();
|
||||
FirstSubSbsLast = bitstream.ReadBitAsBoolean();
|
||||
FirstSubMimoMixed = bitstream.ReadBitAsBoolean();
|
||||
|
||||
byte[] bytes = bitstream.ReadBitsAsByteArray(47); //reserved
|
||||
uint crc = bitstream.ReadBitsAsUint(32);
|
||||
Valid = true;
|
||||
}
|
||||
|
||||
public Version Version { get; }
|
||||
public bool MimoScatteredPilotEncoding { get; }
|
||||
public bool LlsFlag { get; }
|
||||
public TimeInfoFlagSignalingFormat TimeInfoFlag { get; }
|
||||
public bool ReturnChannelFlag { get; }
|
||||
public PaprReductionSignalingFormat PaprReduction { get; }
|
||||
public uint? FrameLength { get; }
|
||||
public uint? ExcessSamplesPerSymbol { get; }
|
||||
public uint? TimeOffset { get; }
|
||||
public byte AdditionalSamples { get; }
|
||||
public byte NumSubframes { get; }
|
||||
public byte PreambleNumSymbols { get; }
|
||||
public byte PreambleReducedCarriers { get; }
|
||||
public byte L1DetailContentTag { get; }
|
||||
public uint L1DetailSizeBytes { get; }
|
||||
public byte L1DetailFecType { get; }
|
||||
public byte L1DetailAdditionalParityMode { get; }
|
||||
public uint L1DetailTotalCells { get; }
|
||||
public bool FirstSubMimo { get; }
|
||||
public MisoSignallingFormat FirstSubMiso { get; }
|
||||
public FftSizeSignallingFormat FirstSubFftSize { get; }
|
||||
public byte FirstSubReducedCarries { get; }
|
||||
public byte FirstSubGuardInterval { get; private set; }
|
||||
public uint FirstSubNumOfdmSymbols { get; }
|
||||
public byte FirstSubScatteredPilotPattern { get; }
|
||||
public byte FirstSubScatteredPilotBoost { get; }
|
||||
public bool FirstSubSbsFirst { get; }
|
||||
public bool FirstSubSbsLast { get; }
|
||||
public bool FirstSubMimoMixed { get; }
|
||||
}
|
||||
|
||||
enum TimeInfoFlagSignalingFormat
|
||||
{
|
||||
NotIncluded,
|
||||
IncludedMilliseconds,
|
||||
IncludedMicroseconds,
|
||||
IncludedNanoseconds,
|
||||
}
|
||||
|
||||
enum PaprReductionSignalingFormat
|
||||
{
|
||||
NoPaprReduction,
|
||||
ToneReservationOnly,
|
||||
AceOnly,
|
||||
TrAndAce
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,316 +0,0 @@
|
||||
using skyscraper5.Skyscraper;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Atsc.A322
|
||||
{
|
||||
internal class L1DetailSignalling : Validatable
|
||||
{
|
||||
public L1DetailSignalling(byte[] bytes, L1BasicSignalling basicSignalling)
|
||||
{
|
||||
InBitStream bitStream = new InBitStream(bytes);
|
||||
this.Version = new Version(bitStream.ReadBitsAsByte(4), 0);
|
||||
|
||||
byte numRf = bitStream.ReadBitsAsByte(3);
|
||||
RfIds = new ushort[numRf];
|
||||
for (int i = 1; i < numRf; i++)
|
||||
{
|
||||
RfIds[i] = bitStream.ReadBitsAsUInt16(16);
|
||||
bitStream.ReadBitsAsByte(3); //reserved
|
||||
}
|
||||
|
||||
if (basicSignalling.TimeInfoFlag != 0)
|
||||
{
|
||||
uint secs = 0;
|
||||
int msecs = 0;
|
||||
int microsecs = 0;
|
||||
int nanosecs = 0;
|
||||
secs = bitStream.ReadBitsAsUint(32);
|
||||
msecs = bitStream.ReadBitsAsUInt16(10);
|
||||
if ((int)basicSignalling.TimeInfoFlag != 1)
|
||||
{
|
||||
microsecs = bitStream.ReadBitsAsUInt16(10);
|
||||
if ((int)basicSignalling.TimeInfoFlag != 2)
|
||||
{
|
||||
nanosecs = bitStream.ReadBitsAsUInt16(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Subframes = new L1Subframe[basicSignalling.NumSubframes];
|
||||
for (int i = 0; i < basicSignalling.NumSubframes; i++)
|
||||
{
|
||||
L1Subframe child = new L1Subframe();
|
||||
Subframes[i] = child;
|
||||
|
||||
if (i > 0)
|
||||
{
|
||||
child.Mimo = bitStream.ReadBitAsBoolean();
|
||||
child.Miso = (MisoSignallingFormat)bitStream.ReadBitsAsByte(2);
|
||||
child.FftSize = (FftSizeSignallingFormat)bitStream.ReadBitsAsByte(2);
|
||||
child.ReducedCarriers = bitStream.ReadBitsAsByte(3);
|
||||
child.GuardInterval = bitStream.ReadBitsAsByte(3);
|
||||
child.NumOfdmSymbols = bitStream.ReadBitsAsUInt16(11);
|
||||
child.ScatteredPilotPatern = bitStream.ReadBitsAsByte(5);
|
||||
child.ScatteredPilotBoost = bitStream.ReadBitsAsByte(3);
|
||||
child.SbsFirst = bitStream.ReadBitAsBoolean();
|
||||
child.SbsLast = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
|
||||
if (basicSignalling.NumSubframes > 0)
|
||||
{
|
||||
child.SubframeMultiplex = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
child.FrequencyInterleaver = bitStream.ReadBitAsBoolean();
|
||||
|
||||
if (((i == 0) && (basicSignalling.FirstSubSbsFirst || basicSignalling.FirstSubSbsLast)) || ((i > 0) && (child.SbsFirst | child.SbsLast)))
|
||||
{
|
||||
child.SbsNullCells = bitStream.ReadBitsAsUInt16(13);
|
||||
}
|
||||
byte numPlp = bitStream.ReadBitsAsByte(6);
|
||||
child.Plps = new L1SubframePlp[numPlp];
|
||||
|
||||
for (int j = 0; j < numPlp; j++)
|
||||
{
|
||||
L1SubframePlp plp = new L1SubframePlp();
|
||||
child.Plps[j] = plp;
|
||||
|
||||
plp.Id = bitStream.ReadBitsAsByte(6);
|
||||
plp.LlsFlag = bitStream.ReadBitAsBoolean();
|
||||
plp.Layer = bitStream.ReadBitsAsByte(2);
|
||||
plp.Start = bitStream.ReadBitsAsUint(24);
|
||||
plp.Size = bitStream.ReadBitsAsUint(24);
|
||||
plp.ScramblerType = bitStream.ReadBitsAsByte(2);
|
||||
plp.FecType = (PlpFecTypeSignallingFormat)bitStream.ReadBitsAsByte(4);
|
||||
if (plp.NeedModCod())
|
||||
{
|
||||
plp.Mod = (PlpModSignallingFormat)bitStream.ReadBitsAsByte(4);
|
||||
plp.Cod = (PlpCodSignallingFormat)bitStream.ReadBitsAsByte(4);
|
||||
}
|
||||
plp.TiMode = (PlpTiModeSignallingFormat)bitStream.ReadBitsAsByte(2);
|
||||
if (plp.TiMode == PlpTiModeSignallingFormat.NoTimeInterleaving)
|
||||
{
|
||||
plp.FecBlockStart = bitStream.ReadBitsAsUInt16(15);
|
||||
}
|
||||
else if (plp.TiMode == PlpTiModeSignallingFormat.ConvolutionalTimeInterleaving)
|
||||
{
|
||||
plp.CtiFecBlockStart = bitStream.ReadBitsAsUint(22);
|
||||
}
|
||||
if (numRf > 0)
|
||||
{
|
||||
byte numChannelBonded = bitStream.ReadBitsAsByte(3);
|
||||
if (numChannelBonded > 0)
|
||||
{
|
||||
plp.ChannelBondingFormat = (PlpChannelBondingFormatSignallingFormat)bitStream.ReadBitsAsByte(2);
|
||||
plp.BondedRfId = new byte[numChannelBonded];
|
||||
for (byte k = 0; k < numChannelBonded; k++)
|
||||
{
|
||||
plp.BondedRfId[k] = bitStream.ReadBitsAsByte(3);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((i == 0 && basicSignalling.FirstSubMimo) || (i > 0 && child.Mimo))
|
||||
{
|
||||
plp.MimoStreamCombining = bitStream.ReadBitAsBoolean();
|
||||
plp.MimoIqInterleaving = bitStream.ReadBitAsBoolean();
|
||||
plp.MimoPh = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
|
||||
if (plp.Layer == 0)
|
||||
{
|
||||
plp.Type = bitStream.ReadBitAsBoolean();
|
||||
if (plp.Type)
|
||||
{
|
||||
plp.NumSubslices = bitStream.ReadBitsAsUInt16(14);
|
||||
plp.SubsliceInterval = bitStream.ReadBitsAsUint(24);
|
||||
}
|
||||
if (((plp.TiMode == PlpTiModeSignallingFormat.ConvolutionalTimeInterleaving) || (plp.TiMode == PlpTiModeSignallingFormat.HybridTimeInterleaving) && (plp.Mod == 0)))
|
||||
{
|
||||
plp.TiExtendedInterleaving = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
if (plp.TiMode == PlpTiModeSignallingFormat.ConvolutionalTimeInterleaving)
|
||||
{
|
||||
plp.CtiDepth = bitStream.ReadBitsAsByte(3);
|
||||
plp.CtiStartRow = bitStream.ReadBitsAsUInt16(11);
|
||||
}
|
||||
else if (plp.TiMode == PlpTiModeSignallingFormat.HybridTimeInterleaving)
|
||||
{
|
||||
plp.HtiInterSubframe = bitStream.ReadBitAsBoolean();
|
||||
byte htiNumTiBlocks = bitStream.ReadBitsAsByte(4);
|
||||
plp.HtiNumFecBlocksMax = bitStream.ReadBitsAsUInt16(12);
|
||||
if (!plp.HtiInterSubframe)
|
||||
{
|
||||
plp.HtiNumFecBlocksMax = bitStream.ReadBitsAsUInt16(12);
|
||||
}
|
||||
else
|
||||
{
|
||||
plp.HtiNumFecBlocks = new ushort[htiNumTiBlocks];
|
||||
for (byte k = 0; k < htiNumTiBlocks; k++)
|
||||
{
|
||||
plp.HtiNumFecBlocks[k] = bitStream.ReadBitsAsUInt16(12);
|
||||
}
|
||||
}
|
||||
plp.HtiCellInterleaver = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
plp.LdmInjectionLevel = bitStream.ReadBitsAsByte(5);
|
||||
}
|
||||
}
|
||||
}
|
||||
Bsid = bitStream.ReadBitsAsUInt16(16);
|
||||
for (int i = 0; i < basicSignalling.NumSubframes; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
Subframes[i].MimoMixed = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
if ((i == 0 && basicSignalling.FirstSubMimoMixed) || (i > 0 || Subframes[i].MimoMixed))
|
||||
{
|
||||
for (int j = 0; j < Subframes[i].Plps.Length; j++)
|
||||
{
|
||||
Subframes[i].Plps[j].Mimo = bitStream.ReadBitAsBoolean();
|
||||
if (Subframes[i].Plps[j].Mimo)
|
||||
{
|
||||
Subframes[i].Plps[j].MimoStreamCombining = bitStream.ReadBitAsBoolean();
|
||||
Subframes[i].Plps[j].MimoIqInterleaving = bitStream.ReadBitAsBoolean();
|
||||
Subframes[i].Plps[j].MimoPh = bitStream.ReadBitAsBoolean();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Valid = true;
|
||||
}
|
||||
|
||||
public Version Version { get; }
|
||||
public ushort[] RfIds { get; private set; }
|
||||
public L1Subframe[] Subframes { get; private set; }
|
||||
public ushort Bsid { get; }
|
||||
}
|
||||
|
||||
internal class L1SubframePlp
|
||||
{
|
||||
public byte Id { get; internal set; }
|
||||
public bool LlsFlag { get; internal set; }
|
||||
public byte Layer { get; internal set; }
|
||||
public uint Start { get; internal set; }
|
||||
public uint Size { get; internal set; }
|
||||
public byte ScramblerType { get; internal set; }
|
||||
public PlpFecTypeSignallingFormat FecType { get; internal set; }
|
||||
public PlpModSignallingFormat Mod { get; internal set; }
|
||||
public PlpCodSignallingFormat Cod { get; internal set; }
|
||||
public PlpTiModeSignallingFormat TiMode { get; internal set; }
|
||||
public ushort FecBlockStart { get; internal set; }
|
||||
public uint CtiFecBlockStart { get; internal set; }
|
||||
public PlpChannelBondingFormatSignallingFormat ChannelBondingFormat { get; internal set; }
|
||||
public byte[] BondedRfId { get; internal set; }
|
||||
public bool MimoStreamCombining { get; internal set; }
|
||||
public bool MimoIqInterleaving { get; internal set; }
|
||||
public bool MimoPh { get; internal set; }
|
||||
public bool Type { get; internal set; }
|
||||
public ushort NumSubslices { get; internal set; }
|
||||
public uint SubsliceInterval { get; internal set; }
|
||||
public bool TiExtendedInterleaving { get; internal set; }
|
||||
public byte CtiDepth { get; internal set; }
|
||||
public ushort CtiStartRow { get; internal set; }
|
||||
public bool HtiInterSubframe { get; internal set; }
|
||||
public ushort HtiNumFecBlocksMax { get; internal set; }
|
||||
public ushort[] HtiNumFecBlocks { get; internal set; }
|
||||
public bool HtiCellInterleaver { get; internal set; }
|
||||
public byte LdmInjectionLevel { get; internal set; }
|
||||
public bool Mimo { get; internal set; }
|
||||
|
||||
internal bool NeedModCod()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
class L1Subframe
|
||||
{
|
||||
public bool Mimo { get; internal set; }
|
||||
public MisoSignallingFormat Miso { get; internal set; }
|
||||
public FftSizeSignallingFormat FftSize { get; internal set; }
|
||||
public byte ReducedCarriers { get; internal set; }
|
||||
public byte GuardInterval { get; internal set; }
|
||||
public ushort NumOfdmSymbols { get; internal set; }
|
||||
public byte ScatteredPilotPatern { get; internal set; }
|
||||
public byte ScatteredPilotBoost { get; internal set; }
|
||||
public bool SbsFirst { get; internal set; }
|
||||
public bool SbsLast { get; internal set; }
|
||||
public bool SubframeMultiplex { get; internal set; }
|
||||
public bool FrequencyInterleaver { get; internal set; }
|
||||
public ushort SbsNullCells { get; internal set; }
|
||||
public L1SubframePlp[] Plps { get; internal set; }
|
||||
public bool MimoMixed { get; internal set; }
|
||||
}
|
||||
|
||||
enum MisoSignallingFormat
|
||||
{
|
||||
NoMiso,
|
||||
_64Coefficients,
|
||||
_256Coefficients,
|
||||
}
|
||||
|
||||
enum FftSizeSignallingFormat
|
||||
{
|
||||
_8k,
|
||||
_16k,
|
||||
_32k,
|
||||
}
|
||||
|
||||
enum PlpFecTypeSignallingFormat
|
||||
{
|
||||
Bch16kLdpc,
|
||||
Bch64kLdpc,
|
||||
Crc16kLdpc,
|
||||
Crc64kLdpc,
|
||||
_16kLdpc,
|
||||
_64kLdpc,
|
||||
}
|
||||
|
||||
enum PlpModSignallingFormat
|
||||
{
|
||||
Qpsk,
|
||||
_16QAM,
|
||||
_64QAM,
|
||||
_256QAM,
|
||||
_1024QAM,
|
||||
_4096Q
|
||||
}
|
||||
|
||||
enum PlpCodSignallingFormat
|
||||
{
|
||||
_2_15,
|
||||
_3_15,
|
||||
_4_15,
|
||||
_5_15,
|
||||
_6_15,
|
||||
_7_15,
|
||||
_8_15,
|
||||
_9_15,
|
||||
_10_15,
|
||||
_11_15,
|
||||
_12_15,
|
||||
_13_15,
|
||||
}
|
||||
|
||||
enum PlpTiModeSignallingFormat
|
||||
{
|
||||
NoTimeInterleaving,
|
||||
ConvolutionalTimeInterleaving,
|
||||
HybridTimeInterleaving
|
||||
}
|
||||
|
||||
enum PlpChannelBondingFormatSignallingFormat
|
||||
{
|
||||
PlainChannelBonding,
|
||||
SnrAveragedChannelBonding
|
||||
}
|
||||
}
|
||||
@ -1,189 +0,0 @@
|
||||
using log4net;
|
||||
using skyscraper5.Ietf.Rfc768;
|
||||
using skyscraper5.Ietf.Rfc971;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using skyscraper5.Skyscraper.Net.Pcap;
|
||||
using skyscraper5.Skyscraper.Plugins;
|
||||
using skyscraper5.Skyscraper.Scraper;
|
||||
using skyscraper8.Atsc.A322;
|
||||
using skyscraper8.Ietf.Rfc3550_RTP;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Atsc.A324
|
||||
{
|
||||
[SkyscraperPlugin]
|
||||
[PluginPriority(2)]
|
||||
internal class BasebandPacketDataStreamReceiver : ISkyscraperMpePlugin
|
||||
{
|
||||
private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
|
||||
private readonly IPAddress BPPS_IP_ADDRESS = IPAddress.Parse("239.0.51.48");
|
||||
private byte[] plpIndexHelpBuffer = new byte[2];
|
||||
|
||||
public bool CanHandlePacket(InternetHeader internetHeader, byte[] ipv4Packet)
|
||||
{
|
||||
if (internetHeader.Protocol != 0x11)
|
||||
return false;
|
||||
|
||||
if (ipv4Packet[8] != 0x80)
|
||||
return false;
|
||||
|
||||
if (!internetHeader.DestinationAddress.Equals(BPPS_IP_ADDRESS))
|
||||
return false;
|
||||
|
||||
if (BitConverter.IsLittleEndian)
|
||||
{
|
||||
plpIndexHelpBuffer[0] = ipv4Packet[3];
|
||||
plpIndexHelpBuffer[1] = ipv4Packet[2];
|
||||
}
|
||||
else
|
||||
{
|
||||
plpIndexHelpBuffer[0] = ipv4Packet[2];
|
||||
plpIndexHelpBuffer[1] = ipv4Packet[3];
|
||||
}
|
||||
|
||||
ushort dstPort = BitConverter.ToUInt16(plpIndexHelpBuffer, 0);
|
||||
|
||||
if (dstPort < 30000)
|
||||
return false;
|
||||
|
||||
if (dstPort > 30066)
|
||||
return false;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ConnectToStorage(object[] connector)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private ushort expectedSequenceNumber;
|
||||
private bool warnedAboutNonMarkedPackets;
|
||||
public void HandlePacket(InternetHeader internetHeader, byte[] ipv4Packet)
|
||||
{
|
||||
UserDatagram udpPacket = new UserDatagram(ipv4Packet);
|
||||
ushort plp = (ushort)(udpPacket.DestinationPort - 30000);
|
||||
RtpPacket rtpPacket = new RtpPacket(udpPacket.Payload);
|
||||
|
||||
if (!rtpPacket.RtpMarker)
|
||||
{
|
||||
if (!warnedAboutNonMarkedPackets)
|
||||
{
|
||||
logger.WarnFormat("ATSC 3.0 BBFRAMEs spanning multiple packets are not supported yet. It would be great if you could share a sample of this, so this can be implemented.");
|
||||
warnedAboutNonMarkedPackets = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
EnsurePlpSync(plp, rtpPacket);
|
||||
|
||||
if (plp == 64)
|
||||
{
|
||||
HandlePreambleData(rtpPacket.RtpPayload);
|
||||
return;
|
||||
}
|
||||
else if (plp == 65)
|
||||
{
|
||||
HandleTimingAndManagementData(rtpPacket.RtpPayload);
|
||||
return;
|
||||
}
|
||||
else if (plp <= 63)
|
||||
{
|
||||
Span<byte> rtpPayloadSpan = new Span<byte>(rtpPacket.RtpPayload);
|
||||
HandlePlp(plp, rtpPayloadSpan);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private ushort[] plpSequenceNumbers;
|
||||
private void EnsurePlpSync(ushort plp, RtpPacket rtpPacket)
|
||||
{
|
||||
if (plpSequenceNumbers == null)
|
||||
{
|
||||
plpSequenceNumbers = new ushort[66];
|
||||
}
|
||||
|
||||
if (plpSequenceNumbers[plp] != rtpPacket.RtpSequenceNumber)
|
||||
{
|
||||
if (plp == 64)
|
||||
{
|
||||
DesyncPreamble();
|
||||
}
|
||||
else if (plp == 65)
|
||||
{
|
||||
DesyncTimingAndManagement();
|
||||
}
|
||||
else if (plp <= 63)
|
||||
{
|
||||
plps?[plp]?.OnSyncLoss();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException(String.Format("Unknown PLP: {0}", plp));
|
||||
}
|
||||
}
|
||||
plpSequenceNumbers[plp] = rtpPacket.RtpSequenceNumber;
|
||||
plpSequenceNumbers[plp]++;
|
||||
}
|
||||
|
||||
private TimingAndManagementPacket timingAndManagement;
|
||||
|
||||
private void DesyncTimingAndManagement()
|
||||
{
|
||||
if (timingAndManagement != null)
|
||||
{
|
||||
timingAndManagement.Valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void DesyncPreamble()
|
||||
{
|
||||
if (preambleData != null)
|
||||
{
|
||||
preambleData.Valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
private AtscPlpBasebandParser[] plps;
|
||||
private void HandlePlp(ushort plp, Span<byte> rtpPayload)
|
||||
{
|
||||
if (plps == null)
|
||||
{
|
||||
plps = new AtscPlpBasebandParser[64];
|
||||
}
|
||||
if (plps[plp] == null)
|
||||
{
|
||||
plps[plp] = new AtscPlpBasebandParser(plp, context);
|
||||
}
|
||||
plps[plp].PushBbframe(rtpPayload);
|
||||
}
|
||||
|
||||
private void HandleTimingAndManagementData(byte[] rtpPayload)
|
||||
{
|
||||
timingAndManagement = new TimingAndManagementPacket(rtpPayload);
|
||||
}
|
||||
|
||||
private PreambleData preambleData;
|
||||
private void HandlePreambleData(byte[] rtpPayload)
|
||||
{
|
||||
preambleData = new PreambleData(rtpPayload);
|
||||
}
|
||||
|
||||
private SkyscraperContext context;
|
||||
public void SetContext(DateTime? currentTime, object skyscraperContext)
|
||||
{
|
||||
context = skyscraperContext as SkyscraperContext;
|
||||
}
|
||||
|
||||
public bool StopProcessingAfterThis()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,40 +0,0 @@
|
||||
using skyscraper5.Skyscraper;
|
||||
using skyscraper5.Skyscraper.IO;
|
||||
using skyscraper8.Atsc.A322;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace skyscraper8.Atsc.A324
|
||||
{
|
||||
internal class PreambleData : Validatable
|
||||
{
|
||||
public PreambleData(byte[] buffer)
|
||||
{
|
||||
MemoryStream ms = new MemoryStream(buffer);
|
||||
long expectedLength = ms.ReadUInt16BE();
|
||||
long actualLength = ms.Length - 4;
|
||||
if (actualLength != expectedLength)
|
||||
{
|
||||
Valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
BasicSignalling = new L1BasicSignalling(ms.ReadBytes(25));
|
||||
if (!BasicSignalling.Valid)
|
||||
{
|
||||
Valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
long detailLength = expectedLength - 25;
|
||||
DetailSignalling = new L1DetailSignalling(ms.ReadBytes(detailLength), BasicSignalling);
|
||||
Valid = DetailSignalling.Valid;
|
||||
}
|
||||
|
||||
public L1BasicSignalling BasicSignalling { get; }
|
||||
public L1DetailSignalling DetailSignalling { get; }
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user