FrameDumpFFMpeg.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2008 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <ctime>
  5. #include <memory>
  6. #include "Common/CommonTypes.h"
  7. struct FrameDumpContext;
  8. class PointerWrap;
  9. // Holds relevant emulation state during a rendered frame for
  10. // when it is later asynchronously written.
  11. struct FrameState
  12. {
  13. u64 ticks = 0;
  14. int frame_number = 0;
  15. u32 savestate_index = 0;
  16. int refresh_rate_num = 0;
  17. int refresh_rate_den = 0;
  18. };
  19. struct FrameData
  20. {
  21. const u8* data = nullptr;
  22. int width = 0;
  23. int height = 0;
  24. int stride = 0;
  25. FrameState state;
  26. };
  27. class FFMpegFrameDump
  28. {
  29. public:
  30. FFMpegFrameDump();
  31. ~FFMpegFrameDump();
  32. bool Start(int w, int h, u64 start_ticks);
  33. void AddFrame(const FrameData&);
  34. void Stop();
  35. void DoState(PointerWrap&);
  36. bool IsStarted() const;
  37. FrameState FetchState(u64 ticks, int frame_number) const;
  38. private:
  39. bool IsFirstFrameInCurrentFile() const;
  40. bool PrepareEncoding(int w, int h, u64 start_ticks, u32 savestate_index);
  41. bool CreateVideoFile();
  42. void CloseVideoFile();
  43. void CheckForConfigChange(const FrameData&);
  44. void ProcessPackets();
  45. #if defined(HAVE_FFMPEG)
  46. std::unique_ptr<FrameDumpContext> m_context;
  47. #endif
  48. // Used for FetchState:
  49. u32 m_savestate_index = 0;
  50. // Used for filename generation.
  51. std::time_t m_start_time = {};
  52. u32 m_file_index = 0;
  53. };
  54. #if !defined(HAVE_FFMPEG)
  55. inline FFMpegFrameDump::FFMpegFrameDump() = default;
  56. inline FFMpegFrameDump::~FFMpegFrameDump() = default;
  57. inline FrameState FFMpegFrameDump::FetchState(u64 ticks, int frame_number) const
  58. {
  59. return {};
  60. }
  61. #endif