diff --git a/src/media/video/winvideo/video_device_impl.cpp b/src/media/video/winvideo/video_device_impl.cpp index 4b67435a11d6ef7d6f70225f4e071f93c3a52d03..07729f74c746545aaf79fb90fb2d1a84eaa414cd 100644 --- a/src/media/video/winvideo/video_device_impl.cpp +++ b/src/media/video/winvideo/video_device_impl.cpp @@ -77,11 +77,7 @@ VideoDeviceImpl::VideoDeviceImpl(const std::string& path) void VideoDeviceImpl::setup() { - HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); - if (FAILED(hr)) - return fail("Could not initialize video device."); - - hr = CoCreateInstance( + HRESULT hr = CoCreateInstance( CLSID_CaptureGraphBuilder2, nullptr, CLSCTX_INPROC_SERVER, diff --git a/src/media/video/winvideo/video_device_monitor_impl.cpp b/src/media/video/winvideo/video_device_monitor_impl.cpp index fff39876e8870e529e2f32701184814a28a2ac25..8ef60e284fd9d9bf88a64d26b133e93c7cf7a977 100644 --- a/src/media/video/winvideo/video_device_monitor_impl.cpp +++ b/src/media/video/winvideo/video_device_monitor_impl.cpp @@ -52,7 +52,6 @@ private: void run(); - HRESULT enumerateVideoInputDevices(IEnumMoniker **ppEnum); std::vector<std::string> enumerateVideoInputDevices(); std::thread thread_; @@ -68,6 +67,11 @@ VideoDeviceMonitorImpl::VideoDeviceMonitorImpl(VideoDeviceMonitor* monitor) void VideoDeviceMonitorImpl::start() { + // Enumerate the initial capture device list. + auto captureDeviceList = enumerateVideoInputDevices(); + for (auto node : captureDeviceList) { + monitor_->addDevice(node); + } thread_ = std::thread(&VideoDeviceMonitorImpl::run, this); } @@ -244,12 +248,6 @@ VideoDeviceMonitorImpl::WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, void VideoDeviceMonitorImpl::run() { - // Enumerate the initial capture device list. - auto captureDeviceList = enumerateVideoInputDevices(); - for (auto node : captureDeviceList) { - monitor_->addDevice(node); - } - // Create a dummy window with the sole purpose to receive device change messages. static const char* className = "Message"; WNDCLASSEX wx = {}; @@ -275,35 +273,13 @@ VideoDeviceMonitorImpl::run() } } -HRESULT -VideoDeviceMonitorImpl::enumerateVideoInputDevices(IEnumMoniker **ppEnum) -{ - ICreateDevEnum *pDevEnum; - HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, - CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); - - if (SUCCEEDED(hr)) { - hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, ppEnum, 0); - if (hr == S_FALSE) { - hr = VFW_E_NOT_FOUND; - } - pDevEnum->Release(); - } - return hr; -} - std::vector<std::string> VideoDeviceMonitorImpl::enumerateVideoInputDevices() { - HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if (FAILED(hr)) { - return {}; - } - std::vector<std::string> deviceList; ICreateDevEnum *pDevEnum; - hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, + HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); if (FAILED(hr)) { @@ -312,7 +288,11 @@ VideoDeviceMonitorImpl::enumerateVideoInputDevices() } IEnumMoniker *pEnum = nullptr; - hr = enumerateVideoInputDevices(&pEnum); + hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); + if (hr == S_FALSE) { + hr = VFW_E_NOT_FOUND; + } + pDevEnum->Release(); if (FAILED(hr) || pEnum == nullptr) { JAMI_ERR() << "No webcam found"; return {}; @@ -351,7 +331,6 @@ VideoDeviceMonitorImpl::enumerateVideoInputDevices() deviceID++; } pEnum->Release(); - CoUninitialize(); return deviceList; }