virtualcam-filter.hpp 1.5 KB

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