diff --git a/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj b/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj
index 8676a00..85cd7c1 100644
--- a/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj
+++ b/BlobStorages/skyscraper5.Data.Minio/skyscraper5.Data.Minio.csproj
@@ -5,7 +5,7 @@
-
+
diff --git a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs
index 85cb480..5898e64 100644
--- a/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs
+++ b/DataTableStorages/skyscraper5.Data.PostgreSql/InteractionChannel.cs
@@ -2,7 +2,9 @@
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;
@@ -969,5 +971,30 @@ namespace skyscraper5.Data.PostgreSql
command.Parameters.AddWithValue("@nid", NpgsqlTypes.NpgsqlDbType.Integer, (int)coordinate.Item1);
command.ExecuteNonQuery();
}
- }
+
+ public bool TestForTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, byte frameFrameNumber)
+ {
+ throw new NotImplementedException();
+ }
+ public void StoreTerminalBurstTimePlan2(ushort interactiveNetworkId, byte tbtp2GroupId, Tbtp2.Frame frame)
+ {
+ throw new NotImplementedException();
+ }
+ public bool TestForFrameComposition2(ushort networkId, Fct2.Frame fct2)
+ {
+ throw new NotImplementedException();
+ }
+ public void InsertFct2Frame(ushort networkId, Fct2.Frame frame)
+ {
+ throw new NotImplementedException();
+ }
+ public bool TestForBroadcastConfiguration(ushort networkId, byte txTypeTxType)
+ {
+ throw new NotImplementedException();
+ }
+ public void InsertBroadcastConfiguration(ushort networkId, Bct.BroadcastConfiguration txType)
+ {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/GUIs/skyscraper8.UI.ImGui/.filenesting.json b/GUIs/skyscraper8.UI.ImGui/.filenesting.json
new file mode 100644
index 0000000..0b71966
--- /dev/null
+++ b/GUIs/skyscraper8.UI.ImGui/.filenesting.json
@@ -0,0 +1,3 @@
+{
+ "help":"https://go.microsoft.com/fwlink/?linkid=866610"
+}
\ No newline at end of file
diff --git a/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json b/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json
new file mode 100644
index 0000000..544000f
--- /dev/null
+++ b/GUIs/skyscraper8.UI.ImGui/Properties/launchSettings.json
@@ -0,0 +1,7 @@
+{
+ "profiles": {
+ "skyscraper8.UI.SDL2": {
+ "commandName": "Project"
+ }
+ }
+}
\ No newline at end of file
diff --git a/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs b/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs
index c18467d..922ce56 100644
--- a/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs
+++ b/IoPlugins/skyscraper5.IO.StreamReader.RemoteStreamReaderServer/RemoteStreamReaderServer.cs
@@ -588,11 +588,9 @@ 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()
{
@@ -615,15 +613,6 @@ 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);
}
}
diff --git a/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs b/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs
index 36a23de..9cb2aa7 100644
--- a/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs
+++ b/IoPlugins/skyscraper5.IO.StreamReader/LocalStreamReader.cs
@@ -80,7 +80,15 @@ namespace skyscraper5.IO.StreamReader
public bool SetChannel(int freq, int symbrate, int pol, VITERBIRATE_TYPE fec, int lof1, int lof2, int lofsw)
{
- return UnsafeStreamReaderMethods.SetChannel(freq, symbrate, pol, fec, lof1, lof2, 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)
diff --git a/skyscraper8.slnLaunch.user b/skyscraper8.slnLaunch.user
new file mode 100644
index 0000000..9da9afd
--- /dev/null
+++ b/skyscraper8.slnLaunch.user
@@ -0,0 +1,15 @@
+[
+ {
+ "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"
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/skyscraper8/GS/GSE/GseReader.cs b/skyscraper8/GS/GSE/GseReader.cs
index e2272d1..015b052 100644
--- a/skyscraper8/GS/GSE/GseReader.cs
+++ b/skyscraper8/GS/GSE/GseReader.cs
@@ -33,6 +33,8 @@ internal class GseReader : IMisHandler
GsePacket child = new GsePacket(startIndicator, endIndicator, labelTypeIndicator);
if (!startIndicator || !endIndicator)
{
+ if (ms.Position == ms.Length)
+ return;
child.FragmentId = ms.ReadUInt8();
gseLength--;
}
@@ -45,6 +47,8 @@ internal class GseReader : IMisHandler
if (startIndicator)
{
+ if (ms.GetAvailableBytes() < 2)
+ return;
child.ProtocolType = ms.ReadUInt16BE();
gseLength -= 2;
if (!endIndicator)
@@ -52,6 +56,8 @@ internal class GseReader : IMisHandler
switch (labelTypeIndicator)
{
case 0:
+ if (ms.GetAvailableBytes() < 6)
+ return;
child.Label = new _6byteLabel(ms.ReadBytes(6));
gseLength -= 6;
if (!endIndicator)
@@ -59,6 +65,8 @@ internal class GseReader : IMisHandler
lastLabel = child.Label;
break;
case 1:
+ if (ms.GetAvailableBytes() < 3)
+ return;
child.Label = new _3byteLabel(ms.ReadBytes(3));
gseLength -= 3;
if (!endIndicator)
@@ -81,6 +89,8 @@ internal class GseReader : IMisHandler
if (gseLength > ms.GetAvailableBytes())
return;
+ if (gseLength <= -1)
+ return;
child.GseDataBytes = ms.ReadBytes(gseLength);
if (!startIndicator && endIndicator)
@@ -120,6 +130,21 @@ internal class GseReader : IMisHandler
return;
}
+ if (!child.StartIndicator && !child.EndIndicator)
+ {
+ if (fragmentations == null)
+ {
+ //We haven't seen any starting frames yet, so we can't use an inbetween frame. We can throw this away.
+ return;
+ }
+ if (fragmentations[child.FragmentId.Value] == null)
+ {
+ //fragment beginning missing, we can throw this away.
+ return;
+ }
+ throw new NotImplementedException(child.ToString());
+ }
+
if (child.StartIndicator && child.EndIndicator)
{
switch (child.ProtocolType)
@@ -129,10 +154,10 @@ internal class GseReader : IMisHandler
break;
default:
if (warnedEthertypes == null)
- warnedEthertypes = new bool[0xffff];
+ warnedEthertypes = new bool[ushort.MaxValue];
if (!warnedEthertypes[child.ProtocolType.Value])
{
- logger.WarnFormat("This GSE contains other traffic types (type {0:X4}) besides IP (type 0x0800). If it's not too much trouble, please consider submitting a sample.",child.ProtocolType.Value);
+ logger.WarnFormat("This GSE contains other traffic types (type 0x{0:X4}) besides IP (type 0x0800). If it's not too much trouble, please consider submitting a sample.",child.ProtocolType.Value);
warnedEthertypes[child.ProtocolType.Value] = true;
}
break;
diff --git a/skyscraper8/Mpeg2/PesPacket.cs b/skyscraper8/Mpeg2/PesPacket.cs
index 0bada52..e352fe9 100644
--- a/skyscraper8/Mpeg2/PesPacket.cs
+++ b/skyscraper8/Mpeg2/PesPacket.cs
@@ -236,7 +236,10 @@ namespace skyscraper5.Mpeg2
//Marker Flag
markerBit = (escrBinary & 0x0000000000000001) != 0;
if (!markerBit)
- throw new DvbException("invalid pes packet");
+ {
+ //invalid PES
+ return;
+ }
}
if (EsRateFlag)
diff --git a/skyscraper8/Program.cs b/skyscraper8/Program.cs
index cff18c6..e91852c 100644
--- a/skyscraper8/Program.cs
+++ b/skyscraper8/Program.cs
@@ -34,6 +34,7 @@ using skyscraper8.SatIp;
using skyscraper8.SatIp.RtspResponses;
using skyscraper8.SimpleServiceDiscoveryProtocol;
using skyscraper8.Skyscraper.Math;
+using skyscraper8.Skyscraper;
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
namespace skyscraper5
diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json
index 5d5c369..8ff1d59 100644
--- a/skyscraper8/Properties/launchSettings.json
+++ b/skyscraper8/Properties/launchSettings.json
@@ -2,7 +2,11 @@
"profiles": {
"skyscraper8": {
"commandName": "Project",
+<<<<<<< HEAD
"commandLineArgs": "\"D:\\sorglos-iww-rww-aca-oca.ts\"",
+=======
+ "commandLineArgs": "udpin udp://127.0.0.1:6970",
+>>>>>>> remotes/origin/sauerland
"remoteDebugEnabled": false
},
"Container (Dockerfile)": {
diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs
index b75338d..f5af635 100644
--- a/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs
+++ b/skyscraper8/Skyscraper/FrequencyListGenerator/BaseBlindscanJob.cs
@@ -572,6 +572,12 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
if (caps.HasFlag(Caps.SR_SIGINFO))
{
+ int polarity = result.SearchResult.Pol;
+ int freq = result.SearchResult.Freq;
+ bool isHighBand = freq > config.LnbType.LofSw * 1000;
+ bool isHorizontal = polarity == 0;
+
+ SendDiseqcCommand(isHighBand, isHorizontal);
logger.Log(PluginLogLevel.Info, string.Format("Trying to BLScanEx..."), 8);
if (!config.StreamReader.BLScanEx(result.SearchResult.Freq, 5000, result.SearchResult.Pol,
config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000,
@@ -587,35 +593,31 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
if (!satelliteSr.Lock)
{
- logger.Log(PluginLogLevel.Info, string.Format("Trying to SetChannel..."), 8);
- bool channel = config.StreamReader.SetChannel(result.SearchResult.Freq, result.SearchResult.SR, result.SearchResult.Freq, result.SearchResult.FEC, config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000, config.LnbType.LofSw * 1000);
- if (!channel)
+ int attempts = (result.SearchResult.Freq / 1000).GetHighestDigit();
+ bool success = false;
+ for (int i = 0; i < attempts; i++)
{
- result.State = BlindscanResultState.TuningFailed;
- config.Ui.OnBlindscanLockFail(satelliteSr, result.State);
- config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2);
- return;
- }
- else
- {
- logger.Log(PluginLogLevel.Info, string.Format("Trying to get SignalInfo..."), 8);
- bool signalInfo = config.StreamReader.SignalInfo(ref satelliteSr);
- if (!signalInfo)
+ Thread.Sleep(1000);
+ result.State = BlindscanResultState.Retrying;
+ logger.Log(PluginLogLevel.Info, string.Format("Retrying BLScanEx... ({0}/{1})", i + 1, attempts + 1), 8);
+ bool retryResult = config.StreamReader.BLScanEx(result.SearchResult.Freq, 5000, result.SearchResult.Pol, config.LnbType.Lof1 * 1000, config.LnbType.Lof2 * 1000, config.LnbType.LofSw * 1000, 1000000, (STD_TYPE)result.SearchResult.StdType,ref satelliteSr);
+ if (!retryResult)
{
- result.State = BlindscanResultState.TuningFailed;
- config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2);
- config.Ui.OnBlindscanLockFail(satelliteSr, result.State);
- return;
- }
-
+ result.State = BlindscanResultState.BlScanFailure;
+ continue;
+ }
if (!satelliteSr.Lock)
{
result.State = BlindscanResultState.NoLock;
- config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2);
- config.Ui.OnBlindscanLockFail(satelliteSr, result.State);
- return;
+ continue;
}
- }
+ success = true;
+ break;
+ }
+ config.DataStorage.UpdateTransponderState(jobInDb, result.IsSatellite(), result.SearchResult, result.State, result.SearchResult2);
+ if (!success)
+ return;
+ logger.Log(PluginLogLevel.Debug, "Sucessfully tuned with retries.");
}
if (caps.HasFlag(Caps.SR_MISSEL))
diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs
index b3ee564..a0ed0c8 100644
--- a/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs
+++ b/skyscraper8/Skyscraper/FrequencyListGenerator/BlindscanResult.cs
@@ -27,6 +27,7 @@ namespace skyscraper5.src.Skyscraper.FrequencyListGenerator
BlScanFailure = 108,
DataSaving = 4,
IqCollecting = 5,
- IqSaving = 6
- }
+ IqSaving = 6,
+ Retrying = 7
+ }
}
diff --git a/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs b/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs
index 3c426d4..e6b1aa2 100644
--- a/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs
+++ b/skyscraper8/Skyscraper/FrequencyListGenerator/CoopBlindscanStreamReaderProxy.cs
@@ -52,11 +52,19 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
if (!_proxiedStreamReader.StartDvbEx(targetTuner))
return false;
- if (lastDiseqcType != uint.MaxValue)
+ /*if (lastDiseqcType != uint.MaxValue)
{
if (!_proxiedStreamReader.SendDiSEqC(lastDiseqcType, lastDiseqcOpcode))
return false;
- }
+ }*/
+
+ if (lastDiseqcOpcode.HasFlag(DiSEqC_Opcode.DISEQC_HORIZONTAL))
+ {
+ if (!_proxiedStreamReader.StopDVB())
+ return false;
+ if (!_proxiedStreamReader.StartDvbEx(targetTuner))
+ return false;
+ }
currentlySelectedTuner = targetTuner;
return true;
@@ -260,9 +268,13 @@ namespace skyscraper8.Skyscraper.FrequencyListGenerator
if (!SwitchTuner(_setFilterTuner))
return false;
+ bool diseqc = SendDiSEqC(lastDiseqcType, lastDiseqcOpcode);
+
if (!_proxiedStreamReader.BLScanEx(freq, freq_range, pol, lof1, lof2, lofsw, minsr, std, ref pSearchResult))
return false;
+ logger.InfoFormat("Frequency: {0}, Polarity: {1}, Lock: {2}", freq, pol, pSearchResult.Lock);
+
return true;
}
diff --git a/skyscraper8/Skyscraper/IntegerExtensions.cs b/skyscraper8/Skyscraper/IntegerExtensions.cs
new file mode 100644
index 0000000..8d10bb8
--- /dev/null
+++ b/skyscraper8/Skyscraper/IntegerExtensions.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace skyscraper8.Skyscraper
+{
+ internal static class IntegerExtensions
+ {
+ public static int GetHighestDigit(this int source)
+ {
+ int result = 0;
+ while (source > 0)
+ {
+ int currentDigit = source % 10;
+ if (currentDigit > result)
+ result = currentDigit;
+ source /= 10;
+ }
+ return result;
+ }
+ }
+}
diff --git a/skyscraper8/Skyscraper/QualificationTool.cs b/skyscraper8/Skyscraper/QualificationTool.cs
index 10019d3..af24a46 100644
--- a/skyscraper8/Skyscraper/QualificationTool.cs
+++ b/skyscraper8/Skyscraper/QualificationTool.cs
@@ -30,9 +30,10 @@ namespace skyscraper5.src.Skyscraper
string versionString = version.ToString();
switch(versionString)
{
+ case "1.2.5.208": return QualificationToolResultEnum.Good;
case "1.2.5.194": return QualificationToolResultEnum.Bad; //Won't find most transponders with a 6903x
case "1.2.5.176": return QualificationToolResultEnum.Bad; //Won't find most transponders with a 6903x
- case "1.2.4.101": return QualificationToolResultEnum.Good; //Works great, but is reather slow with a 6903x
+ case "1.2.4.101": return QualificationToolResultEnum.Bad; //Breaks GS encapsulation on 6903x.
default: return QualificationToolResultEnum.Unknown;
}
}
diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs
index d5dbfde..4f59fcd 100644
--- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs
+++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs
@@ -1276,14 +1276,21 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory
return 0;
}
+ private byte[][] _tmst;
public byte[] GetTmst(ushort interactiveNetworkId)
{
- throw new NotImplementedException();
+ if (_tmst == null)
+ return null;
+ if (_tmst[interactiveNetworkId] == null)
+ return null;
+ return _tmst[interactiveNetworkId];
}
public void InsertTmst(ushort interactiveNetworkId, byte[] modes)
{
- throw new NotImplementedException();
+ if (_tmst == null)
+ _tmst = new byte[ushort.MaxValue][];
+ _tmst[interactiveNetworkId] = modes;
}
public void UpdateTmst(ushort interactiveNetworkId, byte[] modes)
diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs
index 747e1f4..f25b936 100644
--- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs
+++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-1.cs
@@ -32,6 +32,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xc7: resultBuilder.Append('Ç'); break;
case 0xc9: resultBuilder.Append('É'); break;
case 0xcb: resultBuilder.Append('¼'); break;
+ case 0xcd: resultBuilder.Append('Í'); break;
case 0xd6: resultBuilder.Append('Ö'); break;
case 0xdc: resultBuilder.Append('Ü'); break;
case 0xdf: resultBuilder.Append('ß'); break;
@@ -59,6 +60,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xfa: resultBuilder.Append('ú'); break;
case 0xfb: resultBuilder.Append('û'); break;
case 0xfc: resultBuilder.Append('ü'); break;
+ case 0xfd: resultBuilder.Append('ý'); break;
default:
throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i]));
}
diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs
index 2b4a0e8..5e3f0d0 100644
--- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs
+++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-13.cs
@@ -78,19 +78,21 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xee: resultBuilder.Append('ī'); break;
case 0xf0: resultBuilder.Append('š'); break;
case 0xf1: resultBuilder.Append('ń'); break;
+ case 0xf2: resultBuilder.Append('ņ'); break;
case 0xf3: resultBuilder.Append('ó'); break;
+ case 0xf5: resultBuilder.Append('õ'); break;
case 0xf6: resultBuilder.Append('ö'); break;
- case 0xf8: resultBuilder.Append('ų'); break;
- case 0xf9: resultBuilder.Append('ł'); break;
- case 0xfa: resultBuilder.Append('ś'); break;
- case 0xfb: resultBuilder.Append('ū'); break;
- case 0xfc: resultBuilder.Append('ü'); break;
- case 0xfd: resultBuilder.Append('ż'); break;
- case 0xfe: resultBuilder.Append('ž'); break;
- case 0xff: resultBuilder.Append('’'); break;
- default:
- throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i]));
- }
+ case 0xf8: resultBuilder.Append('ų'); break;
+ case 0xf9: resultBuilder.Append('ł'); break;
+ case 0xfa: resultBuilder.Append('ś'); break;
+ case 0xfb: resultBuilder.Append('ū'); break;
+ case 0xfc: resultBuilder.Append('ü'); break;
+ case 0xfd: resultBuilder.Append('ż'); break;
+ case 0xfe: resultBuilder.Append('ž'); break;
+ case 0xff: resultBuilder.Append('’'); break;
+ default:
+ throw new NotImplementedException(String.Format("0x{0:X2}", preprocessed[i]));
+ }
}
return resultBuilder.ToString().ToCharArray();
diff --git a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs
index 91f3225..87a6fc5 100644
--- a/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs
+++ b/skyscraper8/Skyscraper/Text/Encodings/dvb-iso-8859-7.cs
@@ -26,6 +26,7 @@ namespace skyscraper5.Skyscraper.Text.Encodings
case 0xa2: resultBuilder.Append('’'); break;
case 0xa3: resultBuilder.Append('£'); break;
case 0xa4: resultBuilder.Append('€'); break;
+ case 0xa8: resultBuilder.Append('¨'); break;
case 0xa9: resultBuilder.Append('©'); break;
case 0xab: resultBuilder.Append('«'); break;
case 0xad: resultBuilder.Append('\u00AD'); break;
diff --git a/skyscraper8/Teletext/EbuTeletextDataField.cs b/skyscraper8/Teletext/EbuTeletextDataField.cs
index 0388987..206f76b 100644
--- a/skyscraper8/Teletext/EbuTeletextDataField.cs
+++ b/skyscraper8/Teletext/EbuTeletextDataField.cs
@@ -32,17 +32,26 @@ namespace skyscraper5.Teletext
{
//Non-Displayable Packet Y = 26 to 31
if (ms.GetAvailableBytes() == 0)
+ {
+ Valid = false;
return;
+ }
DesignationCode = ms.ReadUInt8();
if (ms.GetAvailableBytes() < 39)
- return;
+ {
+ Valid = false;
+ return;
+ }
CharacterCodes = ms.ReadBytes(39);
}
else
{
//Normal Packet (Y = 1 to 25)
if (ms.GetAvailableBytes() < 40)
- return;
+ {
+ Valid = false;
+ return;
+ }
CharacterCodes = ms.ReadBytes(40);
}
}