Exemplo n.º 1
0
            public Model(Stream stream, byte[] header, string path)
            {
                base._data = Data = new AviFormat(this, stream, path);

                ParseRiff(header);

                var buf = new byte[0xC0];

                stream.Position = 0;
                int got = stream.Read(buf, 0, 0xC0);

                if (got != 0xC0)
                {
                    IssueModel.Add("File is short", Severity.Fatal);
                    return;
                }

                Data.StreamCount = ConvertTo.FromLit32ToInt32(buf, 0x38);
                Data.Width       = ConvertTo.FromLit32ToInt32(buf, 0x40);
                Data.Height      = ConvertTo.FromLit32ToInt32(buf, 0x44);
                Data.Codec       = Encoding.ASCII.GetString(buf, 0xBC, 4).Trim();

                CalcMark();
                GetDiagsForMarkable();
            }
Exemplo n.º 2
0
            public Model(Stream stream, string path)
            {
                base._data = Data = new IcoFormat(this, stream, path);

                // Arbitrary sanity limit.
                if (Data.FileSize > 50000000)
                {
                    IssueModel.Add("File insanely large", Severity.Fatal);
                    return;
                }

                var buf = new byte[Data.FileSize];

                stream.Position = 0;
                var got = stream.Read(buf, 0, (int)Data.FileSize);

                if (got != Data.FileSize)
                {
                    IssueModel.Add("Read error", Severity.Fatal);
                    return;
                }

                int headerCount = ConvertTo.FromLit16ToInt32(buf, 4);

                if (headerCount <= 0)
                {
                    IssueModel.Add("Corrupt header count", Severity.Fatal);
                    return;
                }

                int pos         = 6;
                int stop        = pos + 16 * headerCount;
                int actualStart = stop;

                for (pos = 6; pos < stop; pos += 16)
                {
                    int width, height, bpp, paletteSize;
                    int storedSize  = ConvertTo.FromLit32ToInt32(buf, pos + 8);
                    int storedStart = ConvertTo.FromLit32ToInt32(buf, pos + 12);

                    if (storedStart != actualStart || storedSize <= 0)
                    {
                        IssueModel.Add($"Corrupt header near byte {Data.ValidSize}", Severity.Fatal);
                        return;
                    }

                    bool isPNG = buf[actualStart] == 0x89 && buf[actualStart + 1] == 'P' && buf[actualStart + 2] == 'N' && buf[actualStart + 3] == 'G';

                    if (isPNG)
                    {
                        width       = ConvertTo.FromBig32ToInt32(buf, actualStart + 16);
                        height      = ConvertTo.FromBig32ToInt32(buf, actualStart + 20);
                        paletteSize = 0;
                        bpp         = buf[actualStart + 24];
                    }
                    else
                    {
                        width = buf[pos];
                        if (width == 0)
                        {
                            width = 256;
                        }

                        height = buf[pos + 1];
                        if (height == 0)
                        {
                            height = 256;
                        }

                        paletteSize = buf[pos + 2];
                        bpp         = buf[pos + 6];
                    }

                    Data.icons.Add(new IconItem(width, height, paletteSize, bpp, storedStart, storedSize, isPNG));

                    actualStart += storedSize;
                }

                if (actualStart != Data.FileSize)
                {
                    IssueModel.Add("Incorrect file size");
                    return;
                }
            }
Exemplo n.º 3
0
            public Model(Stream stream, byte[] hdr, string path)
            {
                base._data = Data = new WavFormat(this, stream, path);

                ParseRiff(hdr);

                Data.ActualCRC32 = null;

                if (Data.Issues.HasFatal)
                {
                    return;
                }

                if (hdr.Length < 0x2C)
                {
                    IssueModel.Add("File truncated near header", Severity.Fatal);
                    return;
                }

                if (Data.IffChunkCount > 1)
                {
                    IssueModel.Add("Contains multiple RIFF chunks", Severity.Fatal);
                    return;
                }

                int hPos = 0x0C;

                if (hdr[hPos] != 'f' || hdr[hPos + 1] != 'm' || hdr[hPos + 2] != 't' || hdr[hPos + 3] != 0x20)
                {
                    IssueModel.Add("Missing 'fmt' section", Severity.Fatal);
                    return;
                }

                Data.CompCode      = hdr[hPos + 8] | hdr[hPos + 9] << 8;
                Data.ChannelCount  = hdr[hPos + 0x0A] | hdr[hPos + 0x0B] << 8;
                Data.SampleRate    = ConvertTo.FromLit32ToUInt32(hdr, hPos + 0x0C);
                Data.AverageBPS    = ConvertTo.FromLit32ToUInt32(hdr, hPos + 0x10);
                Data.BlockAlign    = hdr[hPos + 0x14] | hdr[hPos + 0x15] << 8;
                Data.BitsPerSample = hdr[hPos + 0x16] | hdr[hPos + 0x17] << 8;

                if ((hdr[hPos] & 0x80) != 0)
                {
                    IssueModel.Add("Header size insanely huge", Severity.Fatal);
                    return;
                }

                long hdrDataSize = ConvertTo.FromLit32ToInt32(hdr, hPos + 4);
                long dataPos     = hPos + 8 + hdrDataSize;

                stream.Position = dataPos;
                var dHdr = new byte[8];

                if (stream.Read(dHdr, 0, 8) != 8)
                {
                    IssueModel.Add("Read failed", Severity.Fatal);
                    return;
                }

                if (dHdr[0] != 'd' || dHdr[1] != 'a' || dHdr[2] != 't' || dHdr[3] != 'a')
                {
                    IssueModel.Add("Missing 'data' section", Severity.Fatal);
                    return;
                }

                Data.mediaPosition = dataPos + 8;
                Data.MediaCount    = ConvertTo.FromLit32ToUInt32(dHdr, 4);
                if (Data.mediaPosition + Data.MediaCount > Data.IffSize)
                {
                    IssueModel.Add("Invalid data size", Severity.Fatal);
                    return;
                }

                Data.HasTags = Data.mediaPosition + Data.MediaCount < Data.IffSize;
                GetDiagnostics();
            }