public Maybe<VideoFrame> TryParseVideoFrame(Stream rawStream)
        {
            using (var rewindGuard = new RewindGuard(rawStream))
            {
                var frameHeaderParser = new FrameHeaderParser(_header);
                Maybe<Header> frameHeaderMaybe = frameHeaderParser.TryParseHeader(rawStream); // We don't do anything with the frame, so who cares?
                if (frameHeaderMaybe.IsNothing())
                {
                    // We have to at least succeed
                    return Maybe<VideoFrame>.Nothing;
                }

                Maybe<VideoFrame> videoFrame = from lumaPlane in TryReadLumaPlane(rawStream)
                                               from blueDiff in TryReadChromaPlane(rawStream)
                                               from redDiff in TryReadChromaPlane(rawStream)
                                               from frameHeader in frameHeaderMaybe
                                               from colorSpace in frameHeader.ColorSpace
                                               from colorMatrix in ColorConverters.TryConvertFrameToRGB(
                                                   colorSpace,
                                                   lumaPlane,
                                                   blueDiff,
                                                   redDiff,
                                                   _header.Width,
                                                   _header.Height
                                               )
                                               select new VideoFrame(frameHeader, colorMatrix);

                videoFrame.Apply(_ =>
                {
                    rewindGuard.DoNotRewind();
                });

                return videoFrame;
            }
        }
        public Maybe<Header> TryParseHeader(Stream rawStream)
        {
            using (var rewindGuard = new RewindGuard(rawStream))
            {
                if (TryReadHeaderMagicTag(rawStream, HeaderMagicTag) == false)
                {
                    return Maybe<Header>.Nothing;
                }

                Maybe<Header> candidateHeader = TryReadHeaderParameters(rawStream);
                candidateHeader.Apply(header =>
                {
                    rewindGuard.DoNotRewind();
                });

                return candidateHeader;
            }
        }