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: 1261406" data-attributes="member: 101499"><p>ich habe noch einen Bug in PacketChecks.cs gefixt:</p><p></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 nullPackets;</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> nullPackets = 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>// ISO/IEC 13818-1: "In the case of a null packet the value of the continuity_counter is undefined."</p><p> if (header.Pid == 0x1fff) nullPackets++;</p><p> else CheckContinuityCounter((byte)(tsPacket[3]), ref pi); // check continuity_counter if no null packet</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 "null packets=" + nullPackets.ToString() + " 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> 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>ziemlich am Ende, fehlerhafte Zeile auskommentiert und verbesserte Zeile eingefügt.</p><p></p><p>@Kay:</p><p>köönen wir es erst mal so machen, dass ich PacketChecks.cs bearbeite und Du den Rest?</p></blockquote><p></p>
[QUOTE="alexi, post: 1261406, member: 101499"] ich habe noch einen Bug in PacketChecks.cs gefixt: [code]using System; using System.Collections.Generic; using System.Text; namespace TsPacketChecker { class PacketChecker { private long droppedPackets; private long nullPackets; 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; nullPackets = 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]; // ISO/IEC 13818-1: "In the case of a null packet the value of the continuity_counter is undefined." if (header.Pid == 0x1fff) nullPackets++; else CheckContinuityCounter((byte)(tsPacket[3]), ref pi); // check continuity_counter if no null packet 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 "null packets=" + nullPackets.ToString() + " 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; 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] ziemlich am Ende, fehlerhafte Zeile auskommentiert und verbesserte Zeile eingefügt. @Kay: köönen wir es erst mal so machen, dass ich PacketChecks.cs bearbeite und Du den Rest? [/QUOTE]
Insert quotes…
Verification
Post reply
Forums
Language specific support
Deutsches MediaPortal Forum
Allgemein
Einsteigerforum
TS Packet Checker
Contact us
RSS
Top
Bottom