Beispiel #1
0
        public virtual int GetAudioFrameBlockNumber(uint frameNumber)
        {
            try
            {
                if (!AudfXrefList.ContainsKey(frameNumber))
                {
                    return(-1);
                }
                frameXrefEntry xref = AudfXrefList[frameNumber];
                return(xref.blockIndexPos);
            }
            catch (Exception e)
            {
                e.ToString();
            }

            return(-1);
        }
Beispiel #2
0
        public virtual object[] GetAudioFrameMetadata(uint frameNumber)
        {
            try
            {
                if (!AudfXrefList.ContainsKey(frameNumber))
                {
                    return(null);
                }
                frameXrefEntry xref = AudfXrefList[frameNumber];
                return(xref.metadata);
            }
            catch (Exception e)
            {
                e.ToString();
            }

            return(null);
        }
Beispiel #3
0
        public override void BuildFrameIndex()
        {
            Dictionary <uint, frameXrefEntry> vidfXrefList = new Dictionary <uint, frameXrefEntry>();

            for (int blockIndexPos = 0; blockIndexPos < BlockIndex.Length; blockIndexPos++)
            {
                var block = BlockIndex[blockIndexPos];

                if (!vidfXrefList.ContainsKey((uint)blockIndexPos))
                {
                    frameXrefEntry entry = new frameXrefEntry();
                    entry.blockIndexPos = blockIndexPos;
                    entry.metadata      = new object[] { FileHeader, RawiHeader };
                    entry.timestamp     = (ulong)(blockIndexPos + 1);
                    vidfXrefList.Add((uint)blockIndexPos, entry);
                }
            }

            VidfXrefList = vidfXrefList;
        }
Beispiel #4
0
        public virtual void BuildFrameIndex()
        {
            if (Reader == null)
            {
                return;
            }

            HighestVideoFrameNumber = 0;
            TotalVideoFrameCount    = 0;

            Dictionary <uint, frameXrefEntry> vidfXrefList = new Dictionary <uint, frameXrefEntry>();
            Dictionary <uint, frameXrefEntry> audfXrefList = new Dictionary <uint, frameXrefEntry>();
            MetadataContainer metadataContainer            = new MetadataContainer();
            uint highestFrameNumber = 0;

            for (int blockIndexPos = 0; blockIndexPos < BlockIndex.Length; blockIndexPos++)
            {
                var block = BlockIndex[blockIndexPos];

                Reader[block.fileNumber].BaseStream.Position = block.position;

                /* 16 bytes are enough for size, type and timestamp, but we try to read all blocks up to 1k */
                byte[] buf = new byte[1024];

                /* read MLV block header */
                if (Reader[block.fileNumber].Read(buf, 0, 16) != 16)
                {
                    break;
                }

                uint   size      = BitConverter.ToUInt32(buf, 4);
                string type      = Encoding.UTF8.GetString(buf, 0, 4);
                UInt64 timestamp = BitConverter.ToUInt64(buf, 8);

                /* read that block, up to 256 byte */
                Reader[block.fileNumber].BaseStream.Position = block.position;

                /* read MLV block header */
                int readSize = (int)Math.Min(size, 256);
                if (Reader[block.fileNumber].Read(buf, 0, readSize) != readSize)
                {
                    break;
                }

                object blockData = MLVTypes.ToStruct(buf);

                switch (type)
                {
                case "NULL":
                    continue;

                case "VIDF":
                {
                    MLVTypes.mlv_vidf_hdr_t header = (MLVTypes.mlv_vidf_hdr_t)blockData;
                    if (!vidfXrefList.ContainsKey(header.frameNumber))
                    {
                        frameXrefEntry entry = new frameXrefEntry();
                        entry.blockIndexPos = blockIndexPos;
                        entry.metadata      = metadataContainer.Metadata;
                        entry.timestamp     = timestamp;
                        vidfXrefList.Add(header.frameNumber, entry);
                    }
                    else
                    {
                        FrameRedundantErrors++;
                    }
                    highestFrameNumber = Math.Max(highestFrameNumber, header.frameNumber);
                }
                break;

                case "AUDF":
                {
                    MLVTypes.mlv_audf_hdr_t header = (MLVTypes.mlv_audf_hdr_t)blockData;
                    if (!audfXrefList.ContainsKey(header.frameNumber))
                    {
                        frameXrefEntry entry = new frameXrefEntry();
                        entry.blockIndexPos = blockIndexPos;
                        entry.metadata      = metadataContainer.Metadata;
                        entry.timestamp     = timestamp;
                        audfXrefList.Add(header.frameNumber, entry);
                    }
                    else
                    {
                        FrameRedundantErrors++;
                    }
                }
                break;

                default:
                    metadataContainer.Update(type, blockData);
                    break;
                }
            }

            /* count the number of missing video frames */
            uint curFrame = 0;

            foreach (var elem in vidfXrefList.OrderBy(elem => elem.Key))
            {
                if (elem.Key != curFrame)
                {
                    curFrame = elem.Key;
                    FrameMissingErrors++;
                }
                curFrame++;
            }

            VidfXrefList            = vidfXrefList;
            AudfXrefList            = audfXrefList;
            TotalVideoFrameCount    = (uint)vidfXrefList.Count;
            HighestVideoFrameNumber = highestFrameNumber;
        }
        public virtual void BuildFrameIndex()
        {
            if (Reader == null)
            {
                return;
            }

            HighestVideoFrameNumber = 0;
            TotalVideoFrameCount = 0;

            Dictionary<uint, frameXrefEntry> vidfXrefList = new Dictionary<uint, frameXrefEntry>();
            Dictionary<uint, frameXrefEntry> audfXrefList = new Dictionary<uint, frameXrefEntry>();
            MetadataContainer metadataContainer = new MetadataContainer();
            uint highestFrameNumber = 0;

            for (int blockIndexPos = 0; blockIndexPos < BlockIndex.Length; blockIndexPos++)
            {
                var block = BlockIndex[blockIndexPos];

                Reader[block.fileNumber].BaseStream.Position = block.position;

                /* 16 bytes are enough for size, type and timestamp, but we try to read all blocks up to 1k */
                byte[] buf = new byte[1024];

                /* read MLV block header */
                if (Reader[block.fileNumber].Read(buf, 0, 16) != 16)
                {
                    break;
                }

                uint size = BitConverter.ToUInt32(buf, 4);
                string type = Encoding.UTF8.GetString(buf, 0, 4);
                UInt64 timestamp = BitConverter.ToUInt64(buf, 8);

                /* read that block, up to 256 byte */
                Reader[block.fileNumber].BaseStream.Position = block.position;

                /* read MLV block header */
                int readSize = (int)Math.Min(size, 256);
                if (Reader[block.fileNumber].Read(buf, 0, readSize) != readSize)
                {
                    break;
                }

                object blockData = MLVTypes.ToStruct(buf);

                switch (type)
                {
                    case "NULL":
                        continue;

                    case "VIDF":
                        {
                            MLVTypes.mlv_vidf_hdr_t header = (MLVTypes.mlv_vidf_hdr_t)blockData;
                            if (!vidfXrefList.ContainsKey(header.frameNumber))
                            {
                                frameXrefEntry entry = new frameXrefEntry();
                                entry.blockIndexPos = blockIndexPos;
                                entry.metadata = metadataContainer.Metadata;
                                entry.timestamp = timestamp;
                                vidfXrefList.Add(header.frameNumber, entry);
                            }
                            else
                            {
                                FrameRedundantErrors++;
                            }
                            highestFrameNumber = Math.Max(highestFrameNumber, header.frameNumber);
                        }
                        break;

                    case "AUDF":
                        {
                            MLVTypes.mlv_audf_hdr_t header = (MLVTypes.mlv_audf_hdr_t)blockData;
                            if (!audfXrefList.ContainsKey(header.frameNumber))
                            {
                                frameXrefEntry entry = new frameXrefEntry();
                                entry.blockIndexPos = blockIndexPos;
                                entry.metadata = metadataContainer.Metadata;
                                entry.timestamp = timestamp;
                                audfXrefList.Add(header.frameNumber, entry);
                            }
                            else
                            {
                                FrameRedundantErrors++;
                            }
                        }
                        break;

                    default:
                        metadataContainer.Update(type, blockData);
                        break;
                }
            }

            /* count the number of missing video frames */
            uint curFrame = 0;
            foreach (var elem in vidfXrefList.OrderBy(elem => elem.Key))
            {
                if (elem.Key != curFrame)
                {
                    curFrame = elem.Key;
                    FrameMissingErrors++;
                }
                curFrame++;
            }

            VidfXrefList = vidfXrefList;
            AudfXrefList = audfXrefList;
            TotalVideoFrameCount = (uint)vidfXrefList.Count;
            HighestVideoFrameNumber = highestFrameNumber;
        }