// NOTE(fox): Even though each layer has its own completely isolated AV // instance, it appears two layers with the same file still share something. // When the layers aren't at the same position in time, the playhead of one // layer gets misaligned every few frames and causes a manual seek back to the // position. Different files don't exhibit this behavior. struct av_info { uint64 PreviousPTS = (uint64)-1; // PTS value of the previous frame, used to check timings. AVCodecParameters *VideoCodecParameters; // Used to supply info about the decoder. const AVCodec* VideoCodec; // const AVCodecHWConfig* VideoHWConfig; // Haven't done enough research to know if HW decoding is already done by default or if we need these. // AVPixelFormat HWPixFormat; AVStream *VideoStream; // Which stream, or channel, the video is in. Holds FPS info and is used to verify that the decoded packet belongs to this stream. AVFormatContext *FileFormatContext; // Umbrella for everything else, seems to contain the playhead state AVCodecContext *VideoCodecContext; AVPacket *VideoPacket; AVFrame *VideoFrame; SwsContext *RGBContext; }; static bool32 AV_TryFrame(av_info *AVPacket, int32 *err); // Internal attempt to decode a frame. Typically run in a while loop until it returns true.