MediaFormatReader

The MediaFormatReader obtains from a media resource decoded samples intended for forward playback.

MediaFormatReader::Update() manages transitions between multiple states. The key transitions are captured in the diagram below:

        stateDiagram-v2

    DecodeError : Decode error
    EOSDrain : Drain on end of stream
    FatalDecodeError : Fatal decode error
    InternalSeek : Internal seek to random access point
    InternalSeekDemux : Demux to complete internal seek
    InternalSeekDecode : Decode to complete internal seek
    StreamChangeDrain : Drain of stream before stream change
    VideoSkip : Skip video demux to next key frame
    WaitingDrain : Drain when waiting for more data

    [*] --> Demux
    Demux --> Decode
    Demux --> WaitingDrain
    Demux --> StreamChangeDrain
    Demux --> EOSDrain
    Decode --> Demux
    Decode --> DecodeError
    Decode --> VideoSkip
    DecodeError --> FatalDecodeError
    DecodeError --> InternalSeek
    DecodeError --> VideoSkip
    WaitingDrain --> InternalSeek
    WaitingDrain --> DecodeError
    StreamChangeDrain --> Decode
    StreamChangeDrain --> InternalSeek
    StreamChangeDrain --> DecodeError
    InternalSeek --> InternalSeekDemux
    InternalSeekDemux --> InternalSeekDecode
    InternalSeekDemux --> VideoSkip
    InternalSeekDecode --> InternalSeekDemux
    InternalSeekDecode --> VideoSkip
    InternalSeekDecode --> Demux
    VideoSkip --> Demux
    VideoSkip --> DecodeError
    FatalDecodeError --> [*]
    EOSDrain --> [*]