165 lines
6.0 KiB
C#

//////////////////////////////////////////////////////////////////////////////////
// //
// Copyright © 2005-2020 nzsjb //
// //
// This Program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2, or (at your option) //
// any later version. //
// //
// This Program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with GNU Make; see the file COPYING. If not, write to //
// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. //
// http://www.gnu.org/copyleft/gpl.html //
// //
//////////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.ObjectModel;
using DomainObjects;
namespace DVBServices
{
/// <summary>
/// The class that describes a MediaHighway2 Title section.
/// </summary>
public class MediaHighway2TitleSection
{
/// <summary>
/// Get the title data for this section.
/// </summary>
public Collection<MediaHighway2TitleData> Titles { get { return (titles); } }
private byte[] unknown;
private Collection<MediaHighway2TitleData> titles;
private int lastIndex = -1;
/// <summary>
/// Initialize a new instance of the MediaHighway2TitleSection class.
/// </summary>
internal MediaHighway2TitleSection()
{
titles = new Collection<MediaHighway2TitleData>();
}
/// <summary>
/// Parse the section.
/// </summary>
/// <param name="byteData">The MPEG2 section containing the section.</param>
/// <param name="index">Index of the first byte of the title section in the MPEG2 section.</param>
/// <returns>True if the section is an MHW2 title section; false otherwise.</returns>
internal bool Process(byte[] byteData, int index)
{
lastIndex = index;
/*int checkIndex = 18;
bool process = false;
while (checkIndex < byteData.Length)
{
process = false;
checkIndex += 7;
if (checkIndex < byteData.Length)
{
checkIndex += 3;
if (checkIndex < byteData.Length)
{
if (byteData[checkIndex] > 0xc0)
{
checkIndex += (byteData[checkIndex] - 0xc0);
checkIndex += 4;
if (checkIndex < byteData.Length)
{
if (byteData[checkIndex] == 0xff)
{
checkIndex += 1;
process = true;
}
}
}
}
}
}
if (!process)
return (false);*/
/*Logger.Instance.Dump("Title Section", byteData, byteData.Length);*/
unknown = Utils.GetBytes(byteData, lastIndex, 15);
lastIndex += unknown.Length;
while (lastIndex < byteData.Length)
{
MediaHighway2TitleData title = new MediaHighway2TitleData();
title.Process(byteData, lastIndex);
titles.Add(title);
lastIndex = title.Index;
}
return (true);
}
/// <summary>
/// Log the section fields.
/// </summary>
public void LogMessage()
{
if (Logger.ProtocolLogger == null)
return;
if (titles != null)
{
Logger.IncrementProtocolIndent();
foreach (MediaHighway2TitleData title in titles)
title.LogMessage();
Logger.DecrementProtocolIndent();
}
}
/// <summary>
/// Process an MPEG2 section from the MediaHighway title table.
/// </summary>
/// <param name="byteData">The MPEG2 section.</param>
/// <returns>A MediaHighway2TitleSection instance.</returns>
public static MediaHighway2TitleSection ProcessMediaHighwayTitleTable(byte[] byteData)
{
Mpeg2BasicHeader mpeg2Header = new Mpeg2BasicHeader();
try
{
mpeg2Header.Process(byteData);
MediaHighway2TitleSection titleSection = new MediaHighway2TitleSection();
bool process = titleSection.Process(byteData, mpeg2Header.Index);
if (process)
{
titleSection.LogMessage();
return (titleSection);
}
else
return (null);
}
catch (ArgumentOutOfRangeException e)
{
Logger.Instance.Write("<e> Title section parsing failed: " + e.Message);
return (null);
}
}
}
}