aboutsummaryrefslogtreecommitdiff
path: root/DvdLib/Ifo/Title.cs
blob: 335e929928bd487d19ca715d943082e82145fe91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System.Collections.Generic;
using System.IO;

namespace DvdLib.Ifo
{
    public class Title
    {
        public uint TitleNumber { get; private set; }
        public uint AngleCount { get; private set; }
        public ushort ChapterCount { get; private set; }
        public byte VideoTitleSetNumber { get; private set; }

        private ushort _parentalManagementMask;
        private byte _titleNumberInVTS;
        private uint _vtsStartSector; // relative to start of entire disk

        public ProgramChain EntryProgramChain { get; private set; }
        public readonly List<ProgramChain> ProgramChains;

        public readonly List<Chapter> Chapters;

        public Title(uint titleNum)
        {
            ProgramChains = new List<ProgramChain>();
            Chapters = new List<Chapter>();
            Chapters = new List<Chapter>();
            TitleNumber = titleNum;
        }

        public bool IsVTSTitle(uint vtsNum, uint vtsTitleNum)
        {
            return (vtsNum == VideoTitleSetNumber && vtsTitleNum == _titleNumberInVTS);
        }

        internal void ParseTT_SRPT(BinaryReader br)
        {
            byte titleType = br.ReadByte();
            // TODO parse Title Type

            AngleCount = br.ReadByte();
            ChapterCount = br.ReadUInt16();
            _parentalManagementMask = br.ReadUInt16();
            VideoTitleSetNumber = br.ReadByte();
            _titleNumberInVTS = br.ReadByte();
            _vtsStartSector = br.ReadUInt32();
        }

        internal void AddPgc(BinaryReader br, long startByte, bool entryPgc, uint pgcNum)
        {
            long curPos = br.BaseStream.Position;
            br.BaseStream.Seek(startByte, SeekOrigin.Begin);

            var pgc = new ProgramChain(pgcNum);
            pgc.ParseHeader(br);
            ProgramChains.Add(pgc);
            if (entryPgc) EntryProgramChain = pgc;

            br.BaseStream.Seek(curPos, SeekOrigin.Begin);
        }
    }
}