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; } }