} // constructor public void AddSectionData(DvbStpHeader header, byte[] data, bool isRawData) { // section received? if (IsSectionReceived[header.SectionNumber]) { return; } // store data if (SegmentData != null) { if (isRawData) { SegmentData.AddSectionData(header.SectionNumber, data, header.PayloadOffset, header.PayloadSize); } else { SegmentData.AddSectionData(header.SectionNumber, data, 0, data.Length); } // if-else } // if IsSectionReceived[header.SectionNumber] = true; RemainingSections--; CheckSegmentComplete(); } // AddSectionData
} // IsSegmentComplete public void Reset(DvbStpHeader header) { TotalSectionsCount = header.LastSectionNumber + 1; RemainingSections = TotalSectionsCount; IsSectionReceived = new BitArray(TotalSectionsCount); SegmentIdentity = new DvbStpSegmentIdentity(header); SegmentData = new SegmentAssembler(new DvbStpSegmentIdentity(header), header.LastSectionNumber); Round = 0; } // Reset
} // AddSectionData private SegmentInfo NewSegmentInfo(DvbStpHeader header) { var info = new SegmentInfo(header); // hook-up events info.SegmentDataDownloaded += Info_SegmentDataComplete; info.SegmentReceived += Info_SegmentReceived; if (SegmentNew != null) { SegmentNew(info.SegmentIdentity); } return(info); } // NewSegmentInfo
} // SegmentsCount public void AddSectionData(DvbStpHeader header, byte[] data, bool isRawData) { SegmentInfo info; var p = (int)header.PayloadId; var s = (int)header.SegmentId; var key = ((p << 16) | s); if (!Segments.TryGetValue(key, out info)) { info = NewSegmentInfo(header); Segments[key] = info; } // if DetectVersionChange(header, info); info.AddSectionData(header, data, isRawData); } // AddSectionData
} // NewSegmentInfo private void DetectVersionChange(DvbStpHeader header, SegmentInfo info) { if (header.SegmentVersion == info.SegmentIdentity.Version) { return; } foreach (var segment in Segments.Values) { segment.AdjustRound(-1); } // foreach var oldVersion = info.SegmentIdentity.Version; var wasComplete = (info.Round > 0); info.Reset(header); if (SegmentVersionChanged != null) { SegmentVersionChanged(oldVersion, info.SegmentIdentity, wasComplete); } // if } // DetectVersionChange
} // Round public SegmentInfo(DvbStpHeader header) { Reset(header); } // constructor
} // constructor public DvbStpSegmentIdentity(DvbStpHeader header) : this(header.PayloadId, header.SegmentId, header.SegmentVersion) { } // constructor