telegram/TMessagesProj/jni/voip/tgcalls/desktop_capturer/DesktopCaptureSourceManager.cpp
2025-11-22 14:04:28 +01:00

65 lines
2.1 KiB
C++

//
// DesktopCaptureSourceManager.m
// TgVoipWebrtc
//
// Created by Mikhail Filimonov on 28.12.2020.
// Copyright © 2020 Mikhail Filimonov. All rights reserved.
//
#include "tgcalls/desktop_capturer/DesktopCaptureSourceManager.h"
#include "modules/desktop_capture/desktop_and_cursor_composer.h"
#include "modules/desktop_capture/desktop_capturer_differ_wrapper.h"
#include "third_party/libyuv/include/libyuv.h"
#include "api/video/i420_buffer.h"
#include "tgcalls/desktop_capturer/DesktopCaptureSourceHelper.h"
namespace tgcalls {
DesktopCaptureSourceManager::DesktopCaptureSourceManager(
DesktopCaptureType type)
: _capturer(CreateForType(type))
, _type(type) {
}
DesktopCaptureSourceManager::~DesktopCaptureSourceManager() = default;
webrtc::DesktopCaptureOptions DesktopCaptureSourceManager::OptionsForType(
DesktopCaptureType type) {
auto result = webrtc::DesktopCaptureOptions::CreateDefault();
#ifdef WEBRTC_WIN
result.set_allow_directx_capturer(true);
#elif defined WEBRTC_MAC
result.set_allow_iosurface(type == DesktopCaptureType::Screen);
#elif defined WEBRTC_USE_PIPEWIRE
result.set_allow_pipewire(true);
#endif // WEBRTC_WIN || WEBRTC_MAC
result.set_detect_updated_region(true);
return result;
}
auto DesktopCaptureSourceManager::CreateForType(DesktopCaptureType type)
-> std::unique_ptr<webrtc::DesktopCapturer> {
const auto options = OptionsForType(type);
if (auto result = webrtc::DesktopCapturer::CreateGenericCapturer(options)) {
return result;
}
return (type == DesktopCaptureType::Screen)
? webrtc::DesktopCapturer::CreateScreenCapturer(options)
: webrtc::DesktopCapturer::CreateWindowCapturer(options);
}
std::vector<DesktopCaptureSource> DesktopCaptureSourceManager::sources() {
auto result = std::vector<DesktopCaptureSource>();
auto list = webrtc::DesktopCapturer::SourceList();
if (_capturer && _capturer->GetSourceList(&list)) {
const auto isWindow = (_type == DesktopCaptureType::Window);
for (const auto &source : list) {
result.emplace_back(source.id, source.title, isWindow);
}
}
return result;
}
} // namespace tgcalls