示例#1
0
        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;
                }
            }
        }
示例#2
0
        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;
        }
示例#3
0
        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>();
        }
示例#4
0
        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;
                }
            }
        }
示例#5
0
        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>();
        }