#pragma once #include "stdafx.h" #include "../Utilities/SimpleLock.h" #include "../Utilities/AutoResetEvent.h" #include "SettingTypes.h" class BaseVideoFilter; class ScaleFilter; //class RotateFilter; class IRenderingDevice; //class VideoHud; class Console; class VideoDecoder { private: shared_ptr _console; uint16_t *_ppuOutputBuffer = nullptr; uint32_t _frameNumber = 0; unique_ptr _decodeThread; //unique_ptr _hud; AutoResetEvent _waitForFrame; atomic _frameChanged; atomic _stopFlag; uint32_t _frameCount = 0; FrameInfo _baseFrameInfo = { 256, 224 }; ScreenSize _previousScreenSize = {}; double _previousScale = 0; FrameInfo _lastFrameInfo; VideoFilterType _videoFilterType = VideoFilterType::None; unique_ptr _videoFilter; shared_ptr _scaleFilter; //shared_ptr _rotateFilter; void UpdateVideoFilter(); void DecodeThread(); public: VideoDecoder(shared_ptr console); ~VideoDecoder(); void DecodeFrame(bool synchronous = false); void TakeScreenshot(); void TakeScreenshot(std::stringstream &stream); uint32_t GetFrameCount(); FrameInfo GetFrameInfo(); ScreenSize GetScreenSize(bool ignoreScale); void UpdateFrameSync(uint16_t *ppuOutputBuffer, uint16_t width, uint16_t height, uint32_t frameNumber, bool forRewind); void UpdateFrame(uint16_t *ppuOutputBuffer, uint16_t width, uint16_t height, uint32_t frameNumber); bool IsRunning(); void StartThread(); void StopThread(); };