virtualcam-filter.hpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #pragma once
  2. #include <windows.h>
  3. #include <cstdint>
  4. #include <thread>
  5. #ifdef OBS_LEGACY
  6. #include "../shared-memory-queue.h"
  7. #include "../tiny-nv12-scale.h"
  8. #include "../../../deps/libdshowcapture/src/source/output-filter.hpp"
  9. #include "../../../deps/libdshowcapture/src/source/dshow-formats.hpp"
  10. #include "../../../libobs/util/windows/WinHandle.hpp"
  11. #include "../../../libobs/util/threading-windows.h"
  12. #else
  13. #include <shared-memory-queue.h>
  14. #include <tiny-nv12-scale.h>
  15. #include <source/output-filter.hpp>
  16. #include <source/dshow-formats.hpp>
  17. #include <util/windows/WinHandle.hpp>
  18. #include <util/threading-windows.h>
  19. #endif
  20. typedef struct {
  21. int cx;
  22. int cy;
  23. nv12_scale_t scaler;
  24. const uint8_t *source_data;
  25. uint8_t *scaled_data;
  26. } placeholder_t;
  27. class VCamFilter : public DShow::OutputFilter {
  28. std::thread th;
  29. video_queue_t *vq = nullptr;
  30. int queue_mode = 0;
  31. bool in_obs = false;
  32. enum queue_state prev_state = SHARED_QUEUE_STATE_INVALID;
  33. placeholder_t placeholder;
  34. uint32_t obs_cx = 0;
  35. uint32_t obs_cy = 0;
  36. uint64_t obs_interval = 0;
  37. uint32_t filter_cx = 0;
  38. uint32_t filter_cy = 0;
  39. DShow::VideoFormat format;
  40. WinHandle thread_start;
  41. WinHandle thread_stop;
  42. volatile bool active = false;
  43. nv12_scale_t scaler = {};
  44. inline bool stopped() const { return WaitForSingleObject(thread_stop, 0) != WAIT_TIMEOUT; }
  45. inline uint64_t GetTime();
  46. void Thread();
  47. void Frame(uint64_t ts);
  48. void ShowOBSFrame(uint8_t *ptr);
  49. void ShowDefaultFrame(uint8_t *ptr);
  50. void UpdatePlaceholder(void);
  51. const int GetOutputBufferSize(void);
  52. protected:
  53. const wchar_t *FilterName() const override;
  54. public:
  55. VCamFilter();
  56. ~VCamFilter() override;
  57. STDMETHODIMP Pause() override;
  58. STDMETHODIMP Run(REFERENCE_TIME tStart) override;
  59. STDMETHODIMP Stop() override;
  60. };