protected override int ReadFrameHeader()
        {
            if (Read8() != 'F' ||
                Read8() != 'R' ||
                Read8() != 'A' ||
                Read8() != 'M' ||
                Read8() != 'E')
            {
                throw new CorruptStreamException("Invalid frame signature.");
            }

            var c = Read8();

            if (c != '\n' && c != ' ')
            {
                throw new CorruptStreamException("Malformed frame header.");
            }

            Width  = _HeaderWidth;
            Height = _HeaderHeight;
            while (c != '\n')
            {
                c = Read8();
                if (c == 'W')
                {
                    var s = ReadParameter(out c);

                    if (ParseAssistant.TryParseIntegerValue(s, out var width))
                    {
                        Width = width;
                    }
                    else
                    {
                        throw new CorruptStreamException("Invalid frame header width.");
                    }
                }
                else if (c == 'H')
                {
                    var s = ReadParameter(out c);

                    if (ParseAssistant.TryParseIntegerValue(s, out var height))
                    {
                        Height = height;
                    }
                    else
                    {
                        throw new CorruptStreamException("Invalid frame header height.");
                    }
                }
                else
                {
                    var p = Utf8.Decode(new[] { (byte)c });
                    var s = ReadParameter(out c);
                    _Log.Warn(string.Format("Ignoring frame header parameter {0}{1}", p, s));
                }
            }

            return(Width * Height * 3 / 2);
        }
Пример #2
0
 public void Decode_Buffer(Byte[] bytes, Int32[] expected)
 {
     Rune[] text = new Rune[expected.Length];
     for (Int32 i = 0; i < text.Length; i++)
     {
         text[i] = new Rune(expected[i]);
     }
     Assert.Equal(text, Utf8.Decode(bytes));
 }
        private string ReadParameter(out int c)
        {
            var s = new StringBuilder();

            c = Read8();
            while (c != '\n' && c != ' ')
            {
                s.Append(Utf8.Decode(new[] { (byte)c }));
                c = Read8();
            }
            return(s.ToString());
        }
Пример #4
0
 public Rune[] Stringier_Stack() => Utf8.Decode(useStack: true, Buffer);
Пример #5
0
 public Rune[] Stringier_Heap() => Utf8.Decode(Buffer);
        protected override void ReadStreamHeader()
        {
            // YUV4MPEG2
            if (Read8() != 'Y' ||
                Read8() != 'U' ||
                Read8() != 'V' ||
                Read8() != '4' ||
                Read8() != 'M' ||
                Read8() != 'P' ||
                Read8() != 'E' ||
                Read8() != 'G' ||
                Read8() != '2')
            {
                throw new CorruptStreamException("Invalid stream signature.");
            }

            var c = Read8();

            if (c != '\n' && c != ' ')
            {
                throw new CorruptStreamException("Malformed stream header.");
            }

            while (c != '\n')
            {
                c = Read8();
                if (c == 'W')
                {
                    var s = ReadParameter(out c);

                    if (!ParseAssistant.TryParseIntegerValue(s, out _HeaderWidth))
                    {
                        throw new CorruptStreamException("Invalid stream header width.");
                    }
                }
                else if (c == 'H')
                {
                    var s = ReadParameter(out c);

                    if (!ParseAssistant.TryParseIntegerValue(s, out _HeaderHeight))
                    {
                        throw new CorruptStreamException("Invalid stream header height.");
                    }
                }
                else if (c == 'F')
                {
                    var s     = ReadParameter(out c);
                    var split = s.Split(':');
                    if (split.Length != 2)
                    {
                        throw new CorruptStreamException("Invalid stream header frame rate.");
                    }

                    if (!ParseAssistant.TryParseIntegerValue(split[0], out var num) ||
                        !ParseAssistant.TryParseIntegerValue(split[1], out var den))
                    {
                        throw new CorruptStreamException("Invalid stream header frame rate.");
                    }

                    _HeaderFrameRate = (double)num / den;
                }
                else if (c == 'I')
                {
                    _HeaderInterlacing = ReadParameter(out c);
                }
                else if (c == 'A')
                {
                    var s     = ReadParameter(out c);
                    var split = s.Split(':');
                    if (split.Length != 2)
                    {
                        throw new CorruptStreamException("Invalid stream header pixel aspect ratio.");
                    }

                    if (!ParseAssistant.TryParseIntegerValue(split[0], out var num) ||
                        !ParseAssistant.TryParseIntegerValue(split[1], out var den))
                    {
                        throw new CorruptStreamException("Invalid stream header pixel aspect ratio.");
                    }

                    _HeaderPixelAspectRatio = (double)num / den;
                }
                else if (c == 'C')
                {
                    _HeaderColourSpace = ReadParameter(out c);
                }
                else if (c == 'X')
                {
                    _HeaderComment = ReadParameter(out c);
                }
                else
                {
                    var p = Utf8.Decode(new[] { (byte)c });
                    var s = ReadParameter(out c);
                    _Log.Warn(string.Format("Ignoring stream header parameter {0}{1}", p, s));
                }
            }

            // log details
            var headerParams = new List <string>();

            if (_HeaderWidth > 0)
            {
                headerParams.Add($"Width={_HeaderWidth}");
            }
            if (_HeaderHeight > 0)
            {
                headerParams.Add($"Height={_HeaderHeight}");
            }
            if (_HeaderFrameRate > 0)
            {
                headerParams.Add($"FrameRate={_HeaderFrameRate}");
            }
            if (_HeaderInterlacing != null)
            {
                headerParams.Add($"Interlacing={_HeaderInterlacing}");
            }
            if (_HeaderPixelAspectRatio > 0)
            {
                headerParams.Add($"PixelAspectRatio={_HeaderPixelAspectRatio}");
            }
            if (_HeaderColourSpace != null)
            {
                headerParams.Add($"ColourSpace={_HeaderColourSpace}");
            }
            if (_HeaderComment != null)
            {
                headerParams.Add($"Comment={_HeaderComment}");
            }
            _Log.Debug(Id, $"Stream Header => {string.Join(", ", headerParams)}");
        }
Пример #7
0
 public void Decode_4(Byte first, Byte second, Byte third, Byte fourth, Int32 expected) => Assert.Equal(expected, Utf8.Decode(first, second, third, fourth).Value);
Пример #8
0
 public void Decode_2(Byte first, Byte second, Int32 expected) => Assert.Equal(expected, Utf8.Decode(first, second).Value);
Пример #9
0
 public void Decode_1(Byte first, Int32 expected) => Assert.Equal(expected, Utf8.Decode(first).Value);