/// <summary> /// Parse the descriptor. /// </summary> /// <param name="byteData">The mpeg2 section containing the descriptor.</param> /// <param name="index">Index of the byte in the mpeg2 section following the descriptor length.</param> internal override void Process(byte[] byteData, int index) { lastIndex = index; try { while (lastIndex < byteData.Length - 4) { DVBLocalTimeOffsetEntry entry = new DVBLocalTimeOffsetEntry(); entry.CountryCode = Utils.GetString(byteData, lastIndex, 3); lastIndex += 3; entry.Region = (int)byteData[lastIndex] >> 2; entry.OffsetPositive = (byteData[lastIndex] & 0x01) == 0; lastIndex++; int hoursTens = (int)byteData[lastIndex] >> 4; int hoursUnits = (int)byteData[lastIndex] & 0x0f; int minutesTens = (int)byteData[lastIndex + 1] >> 4; int minutesUnits = (int)byteData[lastIndex + 1] & 0x0f; entry.TimeOffset = new TimeSpan((hoursTens * 10) + hoursUnits, (minutesTens * 10) + minutesUnits, 0); lastIndex += 2; entry.ChangeTime = getChangeTime(byteData, lastIndex); lastIndex += 5; int nextHoursTens = (int)byteData[lastIndex] >> 4; int nextHoursUnits = (int)byteData[lastIndex] & 0x0f; int nextMinutesTens = (int)byteData[lastIndex + 1] >> 4; int nextMinutesUnits = (int)byteData[lastIndex + 1] & 0x0f; entry.NextTimeOffset = new TimeSpan((nextHoursTens * 10) + nextHoursUnits, (nextMinutesTens * 10) + nextMinutesUnits, 0); lastIndex += 2; TimeOffsetEntries.Add(entry); } Validate(); } catch (IndexOutOfRangeException) { throw (new ArgumentOutOfRangeException("The DVB Local Time Offset Descriptor message is short")); } }