home
products
contribute
download
documentation
forum
Home
Forums
New posts
Search forums
What's new
New posts
All posts
Latest activity
Members
Registered members
Current visitors
Donate
Log in
Register
What's new
Search
Search
Search titles only
By:
New posts
Search forums
Search titles only
By:
Menu
Log in
Register
Navigation
Install the app
Install
More options
Contact us
Close Menu
Forums
Language specific support
Deutsches MediaPortal Forum
Allgemein
Einsteigerforum
TS Packet Checker
Contact us
RSS
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Message
<blockquote data-quote="alexi" data-source="post: 1261318" data-attributes="member: 101499"><p>so ähnlich (PacketChecks.cs):</p><p>[code]using System;</p><p>using System.Collections.Generic;</p><p>using System.Text;</p><p></p><p>namespace TsPacketChecker</p><p>{</p><p> class PacketChecker</p><p> {</p><p> private long droppedPackets;</p><p> private long totalCCErrors;</p><p> private long totalPcrErrors;</p><p> private long totalPtsErrors;</p><p> private long totalPayloadStartErrors;</p><p> private double diffAllowed;</p><p> private SortedDictionary<ushort, PidInfo> pids = new SortedDictionary<ushort, PidInfo>();</p><p></p><p> #region Existence checks</p><p> private bool PacketContainsPcr(TsHeader header, byte[] tsPacket)</p><p> {</p><p> return (header.HasAdaptionField && (tsPacket[5] & 0x10) == 0x10);</p><p> }</p><p> private ulong PacketContainsPtsDts(TsHeader header, byte[] tsPacket, ref PidInfo pi)</p><p> {</p><p> if (!header.PayloadUnitStart)</p><p> return 0;</p><p> if (header.PayLoadStart > 185 && header.HasPayload)</p><p> {</p><p> totalPayloadStartErrors++;</p><p> pi.payloadStartErrorTexts.Add(" payloadStart=" + header.PayLoadStart.ToString() + " HasAdaption=" + header.HasAdaptionField.ToString() + " HasPayload=" + header.HasPayload.ToString() + " AdaptionFieldSize=" + tsPacket[4].ToString());</p><p> return 0;</p><p> }</p><p> if (!header.HasPayload)</p><p> return 0;</p><p> return header.PayLoadStart;</p><p> }</p><p> #endregion</p><p></p><p> #region Continuity checks</p><p> private bool CheckContinuityCounter(byte tsPacket3, ref PidInfo pi)</p><p> {</p><p> bool isOk = true;</p><p> byte cc = (byte)(tsPacket3 & 0xF);</p><p> if (pi.continuityCounter != 0xFF)</p><p> {</p><p> byte afc = (byte)((tsPacket3 >> 4) & 0x3);</p><p> byte expected;</p><p>// ISO/IEC 13818-1: "The continuity_counter shall not be incremented when the adaptation_field_control of the packet equals '00' or '10'." (binary)</p><p> if ((afc.Equals(0)) || (afc.Equals(2))) expected = (byte)(pi.continuityCounter);</p><p> else expected = (byte)(pi.continuityCounter + 1);</p><p> if (expected == 16) expected = 0;</p><p> if (cc != expected)</p><p> {</p><p> totalCCErrors++;</p><p> isOk = false;</p><p> }</p><p> }</p><p> pi.continuityCounter = cc;</p><p> return isOk;</p><p> }</p><p> private void CheckPcr(TsHeader header, byte[] tsPacket, ref PidInfo pi)</p><p> {</p><p> if (!pi.shouldCheck) return;</p><p> if (!PacketContainsPcr(header, tsPacket)) return;</p><p> Pcr pcr = new Pcr(tsPacket);</p><p> if (pi.lastPcr.isValid)</p><p> {</p><p> TimeSpan diff = pcr.ToDateTime() - pi.lastPcr.ToDateTime();</p><p> if (diff.TotalSeconds > diffAllowed)</p><p> {</p><p> pi.pcrErrorTexts.Add("last pcr: " + pi.lastPcr.ToDateTime().ToString("HH:MM:ss") + " current pcr: " + pcr.ToDateTime().ToString("HH:MM:ss"));</p><p> totalPcrErrors++;</p><p> }</p><p> }</p><p> pi.lastPcr = pcr;</p><p> }</p><p> private void CheckPtsDts(TsHeader header, byte[] tsPacket, ref PidInfo pi)</p><p> {</p><p> if (!pi.shouldCheck) return;</p><p> ulong offset = PacketContainsPtsDts(header, tsPacket, ref pi);</p><p> if (offset == 0) return;</p><p> Pcr pts; Pcr dts;</p><p> PcrUtils.DecodePtsDts(tsPacket, offset, out pts, out dts);</p><p> if (pi.lastPts.isValid)</p><p> {</p><p> TimeSpan diff = pts.ToDateTime() - pi.lastPts.ToDateTime();</p><p> if (diff.TotalSeconds > diffAllowed)</p><p> {</p><p> pi.ptsErrorTexts.Add("last pts: " + pi.lastPts.ToDateTime().ToString("HH:MM:ss") + " current pts: " + pts.ToDateTime().ToString("HH:MM:ss"));</p><p> totalPtsErrors++;</p><p> }</p><p> }</p><p> pi.lastPts = pts;</p><p> }</p><p> #endregion</p><p></p><p> #region Constructor</p><p> public PacketChecker(double maxAllowedPcrDiff)</p><p> {</p><p> droppedPackets = 0;</p><p> totalCCErrors = 0;</p><p> totalPcrErrors = 0;</p><p> totalPtsErrors = 0;</p><p> totalPayloadStartErrors = 0;</p><p> diffAllowed = maxAllowedPcrDiff;</p><p> pids = new SortedDictionary<ushort, PidInfo>();</p><p> }</p><p> #endregion</p><p></p><p> #region Public methods</p><p> public void AddPidsToCheck(List<ushort> streamPids)</p><p> {</p><p> foreach (ushort pid in streamPids)</p><p> {</p><p> if (pids.ContainsKey(pid))</p><p> pids[pid].shouldCheck = true;</p><p> }</p><p> }</p><p> public void ProcessPacket(byte[] tsPacket,TsHeader header)</p><p> {</p><p> if (header.TransportError)</p><p> {</p><p> droppedPackets++;</p><p> return;</p><p> }</p><p> if (!pids.ContainsKey(header.Pid))</p><p> pids.Add(header.Pid, new PidInfo());</p><p></p><p> PidInfo pi = pids[header.Pid];</p><p> CheckContinuityCounter((byte)(tsPacket[3]), ref pi);</p><p> if (header.Pid > 0x1f) // don't check pids which contain SI information</p><p> {</p><p> CheckPcr(header, tsPacket, ref pi);</p><p> CheckPtsDts(header, tsPacket, ref pi);</p><p> }</p><p> pids[header.Pid] = pi;</p><p> }</p><p></p><p> public string GetStatistics()</p><p> {</p><p> return "dropped packets=" + droppedPackets.ToString()+" cc errors="+totalCCErrors.ToString()+" pcr holes="+totalPcrErrors.ToString()+" pts holes="+totalPtsErrors.ToString()+" total payloadstart errors="+totalPayloadStartErrors.ToString();</p><p> }</p><p> public string GetErrorDetails()</p><p> {</p><p> string log = "";</p><p> foreach (ushort pid in pids.Keys)</p><p> {</p><p> if (pids[pid].HasErrors())</p><p> {</p><p> PidInfo pi = pids[pid];</p><p> log+="Pid 0x" + pid.ToString("x")+Environment.NewLine;</p><p> if (pi.pcrErrorTexts.Count > 0)</p><p> {</p><p> log+=" - pcr errors=" + pi.pcrErrorTexts.Count.ToString()+Environment.NewLine;</p><p> foreach (string s in pi.pcrErrorTexts)</p><p> log=" ->" + s+Environment.NewLine;</p><p> }</p><p> if (pi.ptsErrorTexts.Count > 0)</p><p> {</p><p> log+=" - pts errors=" + pi.ptsErrorTexts.Count.ToString()+Environment.NewLine;</p><p> foreach (string s in pi.ptsErrorTexts)</p><p> log+=" ->" + s+Environment.NewLine;</p><p> }</p><p> if (pi.payloadStartErrorTexts.Count > 0)</p><p> {</p><p> log+=" - payloadStart errors=" + pi.payloadStartErrorTexts.Count.ToString()+Environment.NewLine;</p><p> foreach (string s in pi.payloadStartErrorTexts)</p><p> log+=" ->" + s+Environment.NewLine;</p><p> }</p><p> }</p><p> }</p><p> return log;</p><p> }</p><p> #endregion</p><p> }</p><p>}[/code]</p><p></p><p>DVB-T2 Stream, DemuxToy findet keine Fehler:</p><p></p><p>[ATTACH=full]202193[/ATTACH]</p><p></p><p>TSPacketChecker Originalversion zeigt "cc errors=102743" an, mit meinem PacketChecks.cs "cc errors=48636":</p><p></p><p> [ATTACH=full]202194[/ATTACH]</p><p></p><p>ich versuche cc errors auf 0 zu bekommen, wird aber nicht einfach.</p><p></p><p>und: "SDT (7 services)" aber tatsächlich nur 5. Scheint auch ein bug zu sein.</p></blockquote><p></p>
[QUOTE="alexi, post: 1261318, member: 101499"] so ähnlich (PacketChecks.cs): [code]using System; using System.Collections.Generic; using System.Text; namespace TsPacketChecker { class PacketChecker { private long droppedPackets; private long totalCCErrors; private long totalPcrErrors; private long totalPtsErrors; private long totalPayloadStartErrors; private double diffAllowed; private SortedDictionary<ushort, PidInfo> pids = new SortedDictionary<ushort, PidInfo>(); #region Existence checks private bool PacketContainsPcr(TsHeader header, byte[] tsPacket) { return (header.HasAdaptionField && (tsPacket[5] & 0x10) == 0x10); } private ulong PacketContainsPtsDts(TsHeader header, byte[] tsPacket, ref PidInfo pi) { if (!header.PayloadUnitStart) return 0; if (header.PayLoadStart > 185 && header.HasPayload) { totalPayloadStartErrors++; pi.payloadStartErrorTexts.Add(" payloadStart=" + header.PayLoadStart.ToString() + " HasAdaption=" + header.HasAdaptionField.ToString() + " HasPayload=" + header.HasPayload.ToString() + " AdaptionFieldSize=" + tsPacket[4].ToString()); return 0; } if (!header.HasPayload) return 0; return header.PayLoadStart; } #endregion #region Continuity checks private bool CheckContinuityCounter(byte tsPacket3, ref PidInfo pi) { bool isOk = true; byte cc = (byte)(tsPacket3 & 0xF); if (pi.continuityCounter != 0xFF) { byte afc = (byte)((tsPacket3 >> 4) & 0x3); byte expected; // ISO/IEC 13818-1: "The continuity_counter shall not be incremented when the adaptation_field_control of the packet equals '00' or '10'." (binary) if ((afc.Equals(0)) || (afc.Equals(2))) expected = (byte)(pi.continuityCounter); else expected = (byte)(pi.continuityCounter + 1); if (expected == 16) expected = 0; if (cc != expected) { totalCCErrors++; isOk = false; } } pi.continuityCounter = cc; return isOk; } private void CheckPcr(TsHeader header, byte[] tsPacket, ref PidInfo pi) { if (!pi.shouldCheck) return; if (!PacketContainsPcr(header, tsPacket)) return; Pcr pcr = new Pcr(tsPacket); if (pi.lastPcr.isValid) { TimeSpan diff = pcr.ToDateTime() - pi.lastPcr.ToDateTime(); if (diff.TotalSeconds > diffAllowed) { pi.pcrErrorTexts.Add("last pcr: " + pi.lastPcr.ToDateTime().ToString("HH:MM:ss") + " current pcr: " + pcr.ToDateTime().ToString("HH:MM:ss")); totalPcrErrors++; } } pi.lastPcr = pcr; } private void CheckPtsDts(TsHeader header, byte[] tsPacket, ref PidInfo pi) { if (!pi.shouldCheck) return; ulong offset = PacketContainsPtsDts(header, tsPacket, ref pi); if (offset == 0) return; Pcr pts; Pcr dts; PcrUtils.DecodePtsDts(tsPacket, offset, out pts, out dts); if (pi.lastPts.isValid) { TimeSpan diff = pts.ToDateTime() - pi.lastPts.ToDateTime(); if (diff.TotalSeconds > diffAllowed) { pi.ptsErrorTexts.Add("last pts: " + pi.lastPts.ToDateTime().ToString("HH:MM:ss") + " current pts: " + pts.ToDateTime().ToString("HH:MM:ss")); totalPtsErrors++; } } pi.lastPts = pts; } #endregion #region Constructor public PacketChecker(double maxAllowedPcrDiff) { droppedPackets = 0; totalCCErrors = 0; totalPcrErrors = 0; totalPtsErrors = 0; totalPayloadStartErrors = 0; diffAllowed = maxAllowedPcrDiff; pids = new SortedDictionary<ushort, PidInfo>(); } #endregion #region Public methods public void AddPidsToCheck(List<ushort> streamPids) { foreach (ushort pid in streamPids) { if (pids.ContainsKey(pid)) pids[pid].shouldCheck = true; } } public void ProcessPacket(byte[] tsPacket,TsHeader header) { if (header.TransportError) { droppedPackets++; return; } if (!pids.ContainsKey(header.Pid)) pids.Add(header.Pid, new PidInfo()); PidInfo pi = pids[header.Pid]; CheckContinuityCounter((byte)(tsPacket[3]), ref pi); if (header.Pid > 0x1f) // don't check pids which contain SI information { CheckPcr(header, tsPacket, ref pi); CheckPtsDts(header, tsPacket, ref pi); } pids[header.Pid] = pi; } public string GetStatistics() { return "dropped packets=" + droppedPackets.ToString()+" cc errors="+totalCCErrors.ToString()+" pcr holes="+totalPcrErrors.ToString()+" pts holes="+totalPtsErrors.ToString()+" total payloadstart errors="+totalPayloadStartErrors.ToString(); } public string GetErrorDetails() { string log = ""; foreach (ushort pid in pids.Keys) { if (pids[pid].HasErrors()) { PidInfo pi = pids[pid]; log+="Pid 0x" + pid.ToString("x")+Environment.NewLine; if (pi.pcrErrorTexts.Count > 0) { log+=" - pcr errors=" + pi.pcrErrorTexts.Count.ToString()+Environment.NewLine; foreach (string s in pi.pcrErrorTexts) log=" ->" + s+Environment.NewLine; } if (pi.ptsErrorTexts.Count > 0) { log+=" - pts errors=" + pi.ptsErrorTexts.Count.ToString()+Environment.NewLine; foreach (string s in pi.ptsErrorTexts) log+=" ->" + s+Environment.NewLine; } if (pi.payloadStartErrorTexts.Count > 0) { log+=" - payloadStart errors=" + pi.payloadStartErrorTexts.Count.ToString()+Environment.NewLine; foreach (string s in pi.payloadStartErrorTexts) log+=" ->" + s+Environment.NewLine; } } } return log; } #endregion } }[/code] DVB-T2 Stream, DemuxToy findet keine Fehler: [ATTACH=full]202193[/ATTACH] TSPacketChecker Originalversion zeigt "cc errors=102743" an, mit meinem PacketChecks.cs "cc errors=48636": [ATTACH=full]202194[/ATTACH] ich versuche cc errors auf 0 zu bekommen, wird aber nicht einfach. und: "SDT (7 services)" aber tatsächlich nur 5. Scheint auch ein bug zu sein. [/QUOTE]
Insert quotes…
Verification
Post reply
Forums
Language specific support
Deutsches MediaPortal Forum
Allgemein
Einsteigerforum
TS Packet Checker
Contact us
RSS
Top
Bottom