private void LoadIndex() { BinaryReader index = new BinaryReader(File.Open(IndexName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); /* read MLV block header */ byte[] mlvBlockBuf = ReadBlockData(index); MLVTypes.mlv_file_hdr_t fileHeader = (MLVTypes.mlv_file_hdr_t)MLVTypes.ToStruct("MLVI", mlvBlockBuf); MLVTypes.mlv_file_hdr_t mainHeader = ReadMainHeader(); if (mainHeader.fileGuid != fileHeader.fileGuid) { throw new Exception("GUID mismatch"); } byte[] xrefBlockBuf = ReadBlockData(index); MLVTypes.mlv_xref_hdr_t xrefHeader = (MLVTypes.mlv_xref_hdr_t)MLVTypes.ToStruct("XREF", xrefBlockBuf); BlockIndex = new xrefEntry[xrefHeader.entryCount]; int entrySize = Marshal.SizeOf(new MLVTypes.mlv_xref_t()); for (int pos = 0; pos < xrefHeader.entryCount; pos++) { MLVTypes.mlv_xref_t xrefEntry = (MLVTypes.mlv_xref_t)MLVTypes.ToStruct("XREF_ENTRY", xrefBlockBuf, Marshal.SizeOf(xrefHeader) + pos * entrySize); BlockIndex[pos] = new xrefEntry(); BlockIndex[pos].fileNumber = xrefEntry.fileNumber; BlockIndex[pos].position = (long)xrefEntry.frameOffset; BlockIndex[pos].size = 0; switch (xrefEntry.frameType) { case 0: BlockIndex[pos].type = ""; break; case 1: BlockIndex[pos].type = "VIDF"; break; case 2: BlockIndex[pos].type = "AUDF"; break; } } }
public override void BuildIndex() { ArrayList list = new ArrayList(); Dictionary <uint, xrefEntry> frameXrefList = new Dictionary <uint, xrefEntry>(); long currentFileOffset = 0; int fileNum = 0; int block = 0; while (fileNum < Reader.Length) { /* create xref entry */ xrefEntry xref = new xrefEntry(); xref.fileNumber = fileNum; xref.position = currentFileOffset; xref.size = 0; xref.timestamp = (ulong)(block * (1000000000.0d / Footer.sourceFpsx1000)); list.Add(xref); frameXrefList.Add((uint)block, xref); /* increment position */ block++; currentFileOffset += Footer.frameSize; /* if the read goes beyond the file end, go to next file */ if (currentFileOffset > Reader[fileNum].BaseStream.Length) { currentFileOffset -= Reader[fileNum].BaseStream.Length; fileNum++; } /* the last block isnt a frame, but the footer. so skip that one. */ if ((fileNum == Reader.Length - 1) && (Reader[fileNum].BaseStream.Length - currentFileOffset < Footer.frameSize)) { break; } } BlockIndex = ((xrefEntry[])list.ToArray(typeof(xrefEntry))).OrderBy(x => x.timestamp).ToArray <xrefEntry>(); FileHeader.videoFrameCount = (uint)BlockIndex.Length; }
public virtual void BuildIndex() { if (Reader == null) { return; } ArrayList list = new ArrayList(); for (int fileNum = 0; fileNum < Reader.Length; fileNum++) { Reader[fileNum].BaseStream.Position = 0; while (Reader[fileNum].BaseStream.Position < Reader[fileNum].BaseStream.Length - 16) { byte[] buf = new byte[16]; long offset = Reader[fileNum].BaseStream.Position; /* read MLV block header and seek to next block */ if (Reader[fileNum].Read(buf, 0, 16) != 16) { break; } uint size = BitConverter.ToUInt32(buf, 4); string type = Encoding.UTF8.GetString(buf, 0, 4); if (size < 0x10 || size > 50 * 1024 * 1024) { MessageBox.Show("File '" + FileNames[fileNum] + "' has a an invalid block at offset 0x" + offset.ToString("X8") + "."); break; } /* just skip NULL blocks */ if (type == "NULL") { Reader[fileNum].BaseStream.Position = offset + size; continue; } /* create xref entry */ xrefEntry xref = new xrefEntry(); xref.fileNumber = fileNum; xref.position = offset; xref.size = (int)size; xref.timestamp = BitConverter.ToUInt64(buf, 8); xref.type = type; if (type == "MLVI") { /* at this position there is the file version string */ xref.timestamp = 0; } if (type == "VIDF" && xref.timestamp == 0) { /* at this position there is the file version string */ xref.timestamp = 0xDEADBEEF; } list.Add(xref); /* skip block */ Reader[fileNum].BaseStream.Position = offset + size; } } /* update global indices */ BlockIndex = ((xrefEntry[])list.ToArray(typeof(xrefEntry))).OrderBy(x => x.timestamp).ToArray <xrefEntry>(); }
private void LoadIndex() { BinaryReader index = new BinaryReader(File.Open(IndexName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); /* read MLV block header */ byte[] mlvBlockBuf = ReadBlockData(index); MLVTypes.mlv_file_hdr_t fileHeader = (MLVTypes.mlv_file_hdr_t)MLVTypes.ToStruct("MLVI", mlvBlockBuf); MLVTypes.mlv_file_hdr_t mainHeader = ReadMainHeader(); if (mainHeader.fileGuid != fileHeader.fileGuid) { throw new Exception("GUID mismatch"); } byte[] xrefBlockBuf = ReadBlockData(index); MLVTypes.mlv_xref_hdr_t xrefHeader = (MLVTypes.mlv_xref_hdr_t)MLVTypes.ToStruct("XREF", xrefBlockBuf); BlockIndex = new xrefEntry[xrefHeader.entryCount]; int entrySize = Marshal.SizeOf(new MLVTypes.mlv_xref_t()); for (int pos = 0; pos < xrefHeader.entryCount; pos++) { MLVTypes.mlv_xref_t xrefEntry = (MLVTypes.mlv_xref_t)MLVTypes.ToStruct("XREF_ENTRY", xrefBlockBuf, Marshal.SizeOf(xrefHeader) + pos * entrySize); BlockIndex[pos] = new xrefEntry(); BlockIndex[pos].fileNumber = xrefEntry.fileNumber; BlockIndex[pos].position = (long)xrefEntry.frameOffset; BlockIndex[pos].size = 0; switch(xrefEntry.frameType) { case 0: BlockIndex[pos].type = ""; break; case 1: BlockIndex[pos].type = "VIDF"; break; case 2: BlockIndex[pos].type = "AUDF"; break; } } }
public virtual void BuildIndex() { if (Reader == null) { return; } ArrayList list = new ArrayList(); for(int fileNum = 0; fileNum < Reader.Length; fileNum++) { Reader[fileNum].BaseStream.Position = 0; while (Reader[fileNum].BaseStream.Position < Reader[fileNum].BaseStream.Length - 16) { byte[] buf = new byte[16]; long offset = Reader[fileNum].BaseStream.Position; /* read MLV block header and seek to next block */ if (Reader[fileNum].Read(buf, 0, 16) != 16) { break; } uint size = BitConverter.ToUInt32(buf, 4); string type = Encoding.UTF8.GetString(buf, 0, 4); if (size < 0x10 || size > 50 * 1024 * 1024) { MessageBox.Show("File '" + FileNames[fileNum] + "' has a an invalid block at offset 0x" + offset.ToString("X8") + "."); break; } /* just skip NULL blocks */ if (type == "NULL") { Reader[fileNum].BaseStream.Position = offset + size; continue; } /* create xref entry */ xrefEntry xref = new xrefEntry(); xref.fileNumber = fileNum; xref.position = offset; xref.size = (int)size; xref.timestamp = BitConverter.ToUInt64(buf, 8); xref.type = type; if (type == "MLVI") { /* at this position there is the file version string */ xref.timestamp = 0; } if (type == "VIDF" && xref.timestamp == 0) { /* at this position there is the file version string */ xref.timestamp = 0xDEADBEEF; } list.Add(xref); /* skip block */ Reader[fileNum].BaseStream.Position = offset + size; } } /* update global indices */ BlockIndex = ((xrefEntry[])list.ToArray(typeof(xrefEntry))).OrderBy(x => x.timestamp).ToArray<xrefEntry>(); }