public void Read(Stream stream) { using (var binReader = new BinaryReader(stream)) { //Check that magic number is here. if (MAGIC != binReader.ReadUInt32()) //4 { throw new InvalidFileFormatException("Invalid caption file (not VCCD)."); } if (Version != binReader.ReadUInt32()) //8 { throw new InvalidFileFormatException("Only VCCD version 2 is supported."); } uint blockCount = binReader.ReadUInt32(); //12 BlockSize = binReader.ReadUInt32(); //16 uint numberOfCaptions = binReader.ReadUInt32(); //20 (match to DirectorySize in VRF) uint dataOffset = binReader.ReadUInt32(); if (dataOffset != (baseHeader + paddingBytes + (numberOfCaptions * headerSize))) { //throw new InvalidFileFormatException("Data offset is invalid."); //Apparently this calculation is wrong. So, for now we will ignore it. } for (uint i = 0; i < numberOfCaptions; i++) { var caption = new ClosedCaption(); caption.SoundEventHash = binReader.ReadUInt32(); caption.DefinitionHash = binReader.ReadUInt32(); caption.Blocknum = binReader.ReadUInt32(); caption.Offset = binReader.ReadUInt16(); caption.ReadLength = binReader.ReadUInt16(); Captions.Add(caption); } foreach (var caption in Captions) { binReader.BaseStream.Position = dataOffset + (caption.Blocknum * BlockSize) + caption.Offset; var captionText = binReader.ReadNullTermString(Encoding.Unicode); //possibility of validating definitionHash against hash of captiontext here. caption.Definition = captionText; } } }
public ClosedCaptionDependencyObject(ClosedCaption caption) { Caption = caption; CaptionText = caption.Definition; }
public ClosedCaptionDependencyObject() { Caption = new ClosedCaption(); }
public void Add(ClosedCaption caption) { Add(caption.SoundEvent, caption.RawDefinition); }
public void Insert(int index, ClosedCaption caption) { Insert(index, caption.SoundEvent, caption.RawDefinition); }
public CaptionModifierRule() { Caption = new ClosedCaption(); }