/// <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"));
            }
        }
        /// <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"));
            }
        }