virtualcam-filter.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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 "../libdshowcapture/source/dshow-formats.hpp"
  9. #include "../../../libobs/util/windows/WinHandle.hpp"
  10. #define DEFAULT_CX 1920
  11. #define DEFAULT_CY 1080
  12. #define DEFAULT_INTERVAL 333333ULL
  13. typedef struct {
  14. int cx;
  15. int cy;
  16. nv12_scale_t scaler;
  17. const uint8_t *source_data;
  18. uint8_t *scaled_data;
  19. } placeholder_t;
  20. class VCamFilter : public DShow::OutputFilter {
  21. std::thread th;
  22. video_queue_t *vq = nullptr;
  23. int queue_mode = 0;
  24. bool in_obs = false;
  25. enum queue_state prev_state = SHARED_QUEUE_STATE_INVALID;
  26. placeholder_t placeholder;
  27. uint32_t cx = DEFAULT_CX;
  28. uint32_t cy = DEFAULT_CY;
  29. DShow::VideoFormat format;
  30. uint64_t interval = DEFAULT_INTERVAL;
  31. WinHandle thread_start;
  32. WinHandle thread_stop;
  33. nv12_scale_t scaler = {};
  34. inline bool stopped() const
  35. {
  36. return WaitForSingleObject(thread_stop, 0) != WAIT_TIMEOUT;
  37. }
  38. inline uint64_t GetTime();
  39. void Thread();
  40. void Frame(uint64_t ts);
  41. void ShowOBSFrame(uint8_t *ptr);
  42. void ShowDefaultFrame(uint8_t *ptr);
  43. void UpdatePlaceholder(void);
  44. const int GetOutputBufferSize(void);
  45. protected:
  46. const wchar_t *FilterName() const override;
  47. public:
  48. VCamFilter();
  49. ~VCamFilter() override;
  50. STDMETHODIMP Pause() override;
  51. };