Compare commits

..

No commits in common. "master" and "ptsFrameDumper" have entirely different histories.

491 changed files with 11187 additions and 42671 deletions

8
.gitignore vendored
View File

@ -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

View File

@ -515,32 +515,5 @@ namespace skyscraper5.Data
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();
}
}
}

View File

@ -5,7 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Minio" Version="6.0.4" />
<PackageReference Include="Minio" Version="6.0.5" />
</ItemGroup>
<ItemGroup>

View File

@ -22,9 +22,7 @@ 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 +105,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 +231,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();
}
@ -293,122 +291,6 @@ namespace skyscraper5.Data.MySql
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();

View File

@ -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);
}

View File

@ -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");

View File

@ -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();
}

View File

@ -2,17 +2,13 @@
using Npgsql;
using skyscraper5.src.InteractionChannel.Model;
using skyscraper5.src.InteractionChannel.Model.Descriptors;
using skyscraper5.src.InteractionChannel.Model2;
using skyscraper5.src.Skyscraper.Scraper.Storage.Utilities;
using skyscraper8.InteractionChannel.Model2;
using System;
using System.Collections.Generic;
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 +947,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)
@ -1079,7 +969,5 @@ namespace skyscraper5.Data.PostgreSql
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1);
command.ExecuteNonQuery();
}
}
}

View File

@ -6,7 +6,6 @@ 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;
@ -257,16 +256,6 @@ namespace skyscraper5.Data.PostgreSql
{
throw new NotImplementedException();
}
public bool TestForRmt(Rmt rmt)
{
return true;
}
public void InsertRmt(Rmt rmt)
{
throw new NotImplementedException();
}
}
}

View File

@ -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()))
{

View File

@ -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>

View File

@ -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.

View File

@ -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 byte1 in Hex unkn1 in hex unkn1 in Binary byte2 in Hex Times occurred smallest seen packet largest seen packet
2 0x01 0x10 0b00010000 0x00 1941 18 18
3 0x01 0x18 0b00011000 0x00 2898 24 24
4 0x01 0xC8 0b11001000 0x00 268 200 200
5 0x01 0xD4 0b11010100 0x00 286 212 212
6 0x01 0x38 0b00111000 0x01 24 312 312
7 0x01 0x3A 0b00111010 0x01 84 314 314
8 0x01 0x42 0b01000010 0x01 9 322 322
9 0x01 0x44 0b01000100 0x01 163 324 324
10 0x01 0x46 0b01000110 0x01 295 326 326
11 0x01 0x48 0b01001000 0x01 480 328 328
12 0x01 0x4A 0b01001010 0x01 143 330 330
13 0x01 0x4C 0b01001100 0x01 129 332 332
14 0x01 0x4E 0b01001110 0x01 86 334 334
15 0x01 0x50 0b01010000 0x01 102 336 336
16 0x01 0x52 0b01010010 0x01 145 338 338
17 0x01 0x54 0b01010100 0x01 149 340 340
18 0x01 0x56 0b01010110 0x01 444 342 342
19 0x01 0x58 0b01011000 0x01 93 344 344
20 0x01 0x5A 0b01011010 0x01 5 346 346
21 0x01 0x5C 0b01011100 0x01 69 348 348
22 0x01 0x5E 0b01011110 0x01 238 350 350
23 0x01 0x60 0b01100000 0x01 191 352 352
24 0x01 0x62 0b01100010 0x01 395 354 354
25 0x01 0x64 0b01100100 0x01 145 356 356
26 0x01 0x66 0b01100110 0x01 170 358 358
27 0x01 0x68 0b01101000 0x01 308 360 360
28 0x01 0x6A 0b01101010 0x01 262 362 362
29 0x01 0x6C 0b01101100 0x01 81 364 364
30 0x01 0x6E 0b01101110 0x01 153 366 366
31 0x01 0x70 0b01110000 0x01 177 368 368
32 0x01 0x72 0b01110010 0x01 207 370 370
33 0x01 0x74 0b01110100 0x01 158 372 372
34 0x01 0x76 0b01110110 0x01 285 374 374
35 0x01 0x78 0b01111000 0x01 421 376 376
36 0x01 0x7A 0b01111010 0x01 107 378 378
37 0x01 0x7C 0b01111100 0x01 59 380 380
38 0x01 0x7E 0b01111110 0x01 54 382 382
39 0x01 0x80 0b10000000 0x01 33 384 384
40 0x01 0x82 0b10000010 0x01 45 386 386
41 0x01 0x84 0b10000100 0x01 5 388 388
42 0x01 0x86 0b10000110 0x01 10 390 390
43 0x01 0x88 0b10001000 0x01 15 392 392
44 0x01 0x8A 0b10001010 0x01 15 394 394
45 0x01 0x8E 0b10001110 0x01 10 398 398
46 0x01 0x90 0b10010000 0x01 10 400 400
47 0x01 0x92 0b10010010 0x01 5 402 402
48 0x01 0x96 0b10010110 0x01 5 406 406
49 0x01 0x9A 0b10011010 0x01 10 410 410
50 0x01 0x9C 0b10011100 0x01 10 412 412
51 0x01 0x9E 0b10011110 0x01 5 414 414
52 0x01 0xA2 0b10100010 0x01 10 418 418
53 0x01 0xAE 0b10101110 0x01 10 430 430
54 0x01 0xB6 0b10110110 0x01 5 438 438
55 0x01 0x90 0b10010000 0x05 17020001 1424 1424
56 0x01 0xA0 0b10100000 0x05 257300 1440 1440
57 0x03 0x42 0b01000010 0x00 789 66 66
58 0x03 0x3E 0b00111110 0x01 2494 318 318
59 0x03 0x40 0b01000000 0x01 6732 320 320
60 0x03 0x42 0b01000010 0x01 674 322 322
61 0x03 0x44 0b01000100 0x01 654 324 324
62 0x03 0x46 0b01000110 0x01 1182 326 326
63 0x03 0x48 0b01001000 0x01 696 328 328
64 0x03 0x4A 0b01001010 0x01 2046 330 330
65 0x03 0x4C 0b01001100 0x01 843 332 332
66 0x03 0x4E 0b01001110 0x01 4130 334 334
67 0x03 0x50 0b01010000 0x01 2032 336 336
68 0x03 0x54 0b01010100 0x01 1121 340 340
69 0x03 0x56 0b01010110 0x01 2686 342 342
70 0x03 0x58 0b01011000 0x01 6191 344 344
71 0x03 0x5A 0b01011010 0x01 533 346 346
72 0x03 0x5C 0b01011100 0x01 1102 348 348
73 0x03 0x5E 0b01011110 0x01 2777 350 350
74 0x03 0x60 0b01100000 0x01 3290 352 352
75 0x03 0x62 0b01100010 0x01 4831 354 354
76 0x03 0x64 0b01100100 0x01 140 356 356
77 0x03 0x66 0b01100110 0x01 2485 358 358
78 0x03 0x68 0b01101000 0x01 4622 360 360
79 0x03 0x6A 0b01101010 0x01 3865 362 362
80 0x03 0x6C 0b01101100 0x01 5000 364 364
81 0x03 0x70 0b01110000 0x01 305 368 368
82 0x03 0x72 0b01110010 0x01 372 370 370
83 0x03 0x74 0b01110100 0x01 1106 372 372
84 0x03 0x78 0b01111000 0x01 1969 376 376
85 0x03 0xBA 0b10111010 0x05 4037 1466 1466
86 0xFF 0x08 0b00001000 0x00 421 18 18

View File

@ -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・・・・・ ・・・・"$・・

View File

@ -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・・・・・・・ ・・・・・・

View File

@ -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 ・・・・・・・・ ・・

View File

@ -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 ・・・・・・・・

View File

@ -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 ・・・・

View File

@ -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 ・・・・・・・・ ・・・・

View File

@ -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 ・・・・・・・・

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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.

View File

@ -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

View File

@ -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_PIDs -->
<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>

View File

@ -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

View File

@ -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:

View File

@ -19,14 +19,3 @@ These will have IP packets forwarded to.
|--|-----------|
| 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 |

View File

@ -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());
@ -620,80 +574,5 @@ namespace skyscraper5.UI.Overrides
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();
}
}
}

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

View File

@ -28,8 +28,4 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
</ItemGroup>
</Project>

View File

@ -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; }

View File

@ -1,3 +0,0 @@
{
"help":"https://go.microsoft.com/fwlink/?linkid=866610"
}

View File

@ -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;

View File

@ -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 &&

View File

@ -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)
{

View File

@ -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
{
@ -566,11 +551,6 @@ namespace SDL2Demo.Forms
patEntry.pmt = result;
}
public void NotifyMpeTraffic(IpTrafficInfo iti, byte[] ipv4PacketLength)
{
throw new NotImplementedException();
}
private string pmtTabBarUuid;
public void RenderPmt()
{
@ -1172,11 +1152,6 @@ namespace SDL2Demo.Forms
}
}
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,106 +2182,6 @@ 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; }
private ushort? ResolveCaId(ProgramMapping patValuePmt, SdtCoordinate sdt)
@ -2332,70 +2207,5 @@ 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)
{
}
}
}

View File

@ -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("");

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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,172 +1800,6 @@ 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; }
internal JobContext jobContext;

View File

@ -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;

View File

@ -1,7 +0,0 @@
{
"profiles": {
"skyscraper8.UI.SDL2": {
"commandName": "Project"
}
}
}

View File

@ -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;
}
}
}

View File

@ -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>

View File

@ -588,9 +588,11 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader
{
this.wrapped = client;
this.bufferedStream = new BufferedStream(wrapped.GetStream(), 96256);
this.packetsRemainBeforeStart = 512;
}
internal TcpClient wrapped;
internal BufferedStream bufferedStream;
private int packetsRemainBeforeStart;
public void Dispose()
{
@ -613,6 +615,15 @@ namespace skyscraper5.Skyscraper.IO.CrazycatStreamReader
internal void DropPacket(byte[] buffer, int offset, int length)
{
if (packetsRemainBeforeStart > 0)
{
if (packetsRemainBeforeStart == 512 || packetsRemainBeforeStart == 256 || packetsRemainBeforeStart == 128 || packetsRemainBeforeStart == 64 || packetsRemainBeforeStart == 32 || packetsRemainBeforeStart == 16 || packetsRemainBeforeStart == 8 || packetsRemainBeforeStart == 4 || packetsRemainBeforeStart == 2 || packetsRemainBeforeStart == 1)
{
Console.WriteLine("Waiting {0} packets before starting to send to client {1}...", packetsRemainBeforeStart, wrapped.Client.RemoteEndPoint);
}
packetsRemainBeforeStart--;
return;
}
bufferedStream?.Write(buffer, offset, length);
}
}

View File

@ -79,17 +79,9 @@ namespace skyscraper5.IO.StreamReader
}
public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw)
{
try
{
return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, lofsw);
}
catch (DivideByZeroException dvze)
{
Console.WriteLine("Mitigated Division-by-Zero bug in StreamReader.dll.");
return false;
}
}
public bool SetChannelEx(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw, MOD_TYPE mod)
{

View File

@ -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>

View File

@ -0,0 +1 @@
[assembly: CollectionBehavior(DisableTestParallelization = true)]

View File

@ -0,0 +1,100 @@
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();
Skip.If(stream == null, "Barker Transponder stream not available.");
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();
Skip.If(stream == null, "Barker Transponder stream not available.");
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();
}
}
}

View File

@ -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;
}
}
}

View File

@ -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();
}
}
}

View File

@ -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 class DocsisTests
{
[Fact]
public void ModemCapabilitiesEncoding()
{
byte[] buffer = Properties.Resources.ModemCapabilitiesEncodingTest;
byte[] buffer = Resources.ModemCapabilitiesEncodingTest;
ModemCapabilitiesEncoding modemCapabilitiesEncoding = new ModemCapabilitiesEncoding(buffer);
Assert.IsTrue(modemCapabilitiesEncoding.Valid);
Assert.True(modemCapabilitiesEncoding.Valid);
}
[Test]
[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);
}
}
}

View 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");
}
}
}

View File

@ -1,3 +0,0 @@
global using NUnit.Framework;
[assembly: LevelOfParallelism(1)]

View File

@ -1,30 +1,31 @@
using System.Reflection;
using skyscraper5.Mpeg2;
using skyscraper8.Tests.Properties;
namespace skyscraper8.Tests.NUnit.Tests.ResourceTests;
namespace skyscraper8.Tests;
[TestFixture]
public class Mpeg2ResourceTests
public class GsType1SanityTest
{
[Test]
[Fact]
public void CheckBfbsCrc()
{
byte[] blob = Properties.Resources.Frame00001343_TSGS1_MIS000_SYNC001;
byte[] blob = Resources.Frame00001343_TSGS1_MIS000_SYNC001;
MemoryStream ms = new MemoryStream(blob, false);
bool result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
Assert.IsTrue(result);
Assert.True(result);
blob = Properties.Resources.Frame00000008_TSGS1_MIS000_SYNC001;
blob = Resources.Frame00000008_TSGS1_MIS000_SYNC001;
ms = new MemoryStream(blob, false);
result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length);
Assert.IsTrue(result);
Assert.True(result);
}
[Test]
[Fact]
public void CheckBfbsCrcSpan()
{
byte[] blob = Properties.Resources.Frame00000012_TSGS1_MIS000_SYNC001;
byte[] blob = Resources.Frame00000012_TSGS1_MIS000_SYNC001;
ReadOnlySpan<byte> span = new ReadOnlySpan<byte>(blob);
bool result = DvbCrc32.ValidateCrc(span);
Assert.IsTrue(result);
Assert.True(result);
}
}

View File

@ -7,7 +7,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace skyscraper8.Tests.NUnit.Properties {
namespace skyscraper8.Tests.Properties {
using System;
@ -28,7 +28,7 @@ namespace skyscraper8.Tests.NUnit.Properties {
internal static 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);
System.Resources.ResourceManager temp = new System.Resources.ResourceManager("skyscraper8.Tests.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@ -45,34 +45,6 @@ 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));
}
}
internal static byte[] ModemCapabilitiesEncodingTest {
get {
object obj = ResourceManager.GetObject("ModemCapabilitiesEncodingTest", resourceCulture);
@ -80,6 +52,13 @@ namespace skyscraper8.Tests.NUnit.Properties {
}
}
internal static byte[] MultipartRegistrationResponseTest {
get {
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture);
return ((byte[])(obj));
}
}
internal static byte[] PushMacManagementMessage_Version4_Type45 {
get {
object obj = ResourceManager.GetObject("PushMacManagementMessage_Version4_Type45", resourceCulture);
@ -94,23 +73,9 @@ namespace skyscraper8.Tests.NUnit.Properties {
}
}
internal static byte[] sdpTest {
internal static byte[] MultipartRegistrationResponseTest2 {
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);
object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest2", resourceCulture);
return ((byte[])(obj));
}
}
@ -150,9 +115,23 @@ namespace skyscraper8.Tests.NUnit.Properties {
}
}
internal static byte[] ExampleVoileOnlinePost {
internal static byte[] Frame00001343_TSGS1_MIS000_SYNC001 {
get {
object obj = ResourceManager.GetObject("ExampleVoileOnlinePost", resourceCulture);
object obj = ResourceManager.GetObject("Frame00001343_TSGS1_MIS000_SYNC001", resourceCulture);
return ((byte[])(obj));
}
}
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));
}
}

View File

@ -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,13 @@
<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 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="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>
</root>

View 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);
}
}
}

View File

@ -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
}
}

View File

@ -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

View File

@ -0,0 +1,30 @@
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);
readUInt8 &= 0b01111111;
int result = ms.ReadUInt8();
result <<= 8;
result += readUInt8;
Assert.Equal(9001, result);
}
}
}

View File

@ -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)
{
}
}

View File

@ -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;
}
}

View File

@ -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; }
}

View File

@ -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

View File

@ -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));
}
}

View File

@ -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 });
}
}

View File

@ -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);
}
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,40 @@
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;
using skyscraper8.Skyscraper.Scraper.Storage;
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();
DataStorage ds = new InMemoryScraperStorageFactory().CreateDataStorage();
ObjectStorage os = new NullObjectStorage();
SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, ds, os);
MemoryStream ms = new MemoryStream(buffer, false);
skyscraper.InitalizeFilterChain();
skyscraper.IngestFromStream(ms);
ms.Close();
ms.Dispose();
}
}
}
}

View File

@ -0,0 +1,13 @@
using skyscraper5.Mpeg2;
namespace skyscraper8.Tests;
public class UselessCodeCoverageTests
{
[Fact]
void PsiSectionTest()
{
PsiSection section = new PsiSection();
section.Append(new byte[] { 3 });
}
}

View File

@ -1,7 +0,0 @@
namespace skyscraper8.Tests.NUnit;
public class VoileOnlineTestPost
{
public VoileOnlineTestSessionMetadata SessionMetadata { get; set; }
public VoileOnlineTestResult TestResult { get; set; }
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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)
{
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@ -7,15 +7,28 @@
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<RootNamespace>skyscraper8.Tests.NUnit</RootNamespace>
</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" />
<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>
<ProjectReference Include="..\skyscraper8\skyscraper8.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
@ -24,15 +37,6 @@
<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>

View File

@ -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

View File

@ -1,84 +1,22 @@
<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">&lt;AssemblyExplorer&gt;
&lt;Assembly Path="/home/schiemas/.dotnet/packs/Microsoft.NETCore.App.Ref/8.0.21/ref/net8.0/System.Windows.dll" /&gt;
&lt;Assembly Path="/home/schiemas/.nuget/packages/allure.net.commons/2.14.1/lib/netstandard2.0/Allure.Net.Commons.dll" /&gt;
&lt;/AssemblyExplorer&gt;</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">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from &amp;lt;skyscraper8.Tests&amp;gt;" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=1108d3f2_002D5e6f_002D416b_002Da8ee_002D3c9502a978e2/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="CheckBfbsCrc #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;Solution /&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</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/Environment/UnitTesting/UnitTestSessionStore/Sessions/=8cbe9c8f_002Dfc55_002D47f1_002D9df1_002Dcb4c7fbbc56b/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="CheckBfbsCrc" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt;
&lt;TestId&gt;xUnit::84EE9FCD-2C7F-DF84-C1BA-99D018CE9412::net8.0::skyscraper8.Tests.GsType1SanityTest.CheckBfbsCrc&lt;/TestId&gt;
&lt;/TestAncestor&gt;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String></wpf:ResourceDictionary>

View File

@ -1,15 +0,0 @@
[
{
"Name": "Neues Profil",
"Projects": [
{
"Path": "IoPlugins\\skyscraper5.IO.StreamReader.RemoteStreamReaderServer\\skyscraper5.IO.StreamReader.RemoteStreamReaderServer.csproj",
"Action": "Start"
},
{
"Path": "GUIs\\skyscraper8.UI.ImGui\\skyscraper8.UI.SDL2.csproj",
"Action": "Start"
}
]
}
]

View File

@ -26,9 +26,13 @@ namespace skyscraper5.Abertis
public void PushPacket(TsPacket packet)
{
Span<byte> payload = packet.GetPayload();
byte[] packetPayload = packet.Payload;
MemoryStream ms = new MemoryStream(payload.ToArray(), false);
MemoryStream ms = new MemoryStream(packetPayload);
if (packet.AdaptionFieldControl == 3)
{
ms.ReadByte();
}
int syncLossCheck = 0;
while (ms.GetAvailableBytes() > 0)

View File

@ -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;
}
}
}

View File

@ -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,
}
}

View File

@ -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);
}
}

View File

@ -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
}
}

Some files were not shown because too many files have changed in this diff Show More