virtualcam-filter.hpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. #include <windows.h>
  3. #include <cstdint>
  4. #include <thread>
  5. #include "../shared-memory-queue.h"
  6. #include "../tiny-nv12-scale.h"
  7. #include "../libdshowcapture/source/output-filter.hpp"
  8. #include "../../../libobs/util/windows/WinHandle.hpp"
  9. #define DEFAULT_CX 1920
  10. #define DEFAULT_CY 1080
  11. #define DEFAULT_INTERVAL 333333ULL
  12. typedef struct {
  13. int cx;
  14. int cy;
  15. nv12_scale_t scaler;
  16. const uint8_t *data;
  17. } placeholder_t;
  18. class VCamFilter : public DShow::OutputFilter {
  19. std::thread th;
  20. video_queue_t *vq = nullptr;
  21. int queue_mode = 0;
  22. bool in_obs = false;
  23. enum queue_state prev_state = SHARED_QUEUE_STATE_INVALID;
  24. placeholder_t placeholder;
  25. uint32_t cx = DEFAULT_CX;
  26. uint32_t cy = DEFAULT_CY;
  27. uint64_t interval = DEFAULT_INTERVAL;
  28. WinHandle thread_start;
  29. WinHandle thread_stop;
  30. nv12_scale_t scaler = {};
  31. inline bool stopped() const
  32. {
  33. return WaitForSingleObject(thread_stop, 0) != WAIT_TIMEOUT;
  34. }
  35. inline uint64_t GetTime();
  36. void Thread();
  37. void Frame(uint64_t ts);
  38. void ShowOBSFrame(uint8_t *ptr);
  39. void ShowDefaultFrame(uint8_t *ptr);
  40. protected:
  41. const wchar_t *FilterName() const override;
  42. public:
  43. VCamFilter();
  44. ~VCamFilter() override;
  45. STDMETHODIMP Pause() override;
  46. };