Files
tdesktop/Telegram/lib_webrtc/webrtc/details/webrtc_environment_video_capture.cpp
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
init
2026-02-16 15:50:16 +03:00

134 lines
3.6 KiB
C++

// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#include "webrtc/details/webrtc_environment_video_capture.h"
#include "webrtc/webrtc_environment.h"
#include <api/task_queue/default_task_queue_factory.h>
#include <modules/video_capture/video_capture_factory.h>
#include <modules/audio_device/include/audio_device_factory.h>
#ifdef WEBRTC_LINUX // Breaks compilation on MSVC because of ERROR define.
#include <modules/video_capture/video_capture_options.h>
#endif // WEBRTC_LINUX
namespace Webrtc::details {
namespace {
#ifdef WEBRTC_LINUX
[[nodiscard]] webrtc::VideoCaptureOptions GetVideoCaptureOptions() {
auto result = webrtc::VideoCaptureOptions();
result.set_allow_v4l2(true);
#ifdef WEBRTC_USE_PIPEWIRE
//result.set_allow_pipewire(true);
// This requires a call to result.Init(callback)
// and waiting for the callback to finish.
#endif
return result;
}
#endif
[[nodiscard]] std::vector<DeviceInfo> GetDevices() {
#ifdef WEBRTC_LINUX
auto options = GetVideoCaptureOptions();
const auto info = std::unique_ptr<
webrtc::VideoCaptureModule::DeviceInfo
>(webrtc::VideoCaptureFactory::CreateDeviceInfo(&options));
#else // WEBRTC_LINUX
const auto info = std::unique_ptr<
webrtc::VideoCaptureModule::DeviceInfo
>(webrtc::VideoCaptureFactory::CreateDeviceInfo());
#endif
auto result = std::vector<DeviceInfo>();
if (!info) {
return result;
}
const auto count = info->NumberOfDevices();
for (auto i = uint32_t(); i != count; ++i) {
constexpr auto kLengthLimit = 256;
auto id = std::string(kLengthLimit, char(0));
auto name = std::string(kLengthLimit, char(0));
info->GetDeviceName(
i,
name.data(),
name.size(),
id.data(),
id.size());
const auto utfName = QString::fromUtf8(name.c_str());
const auto utfId = id[0] ? QString::fromUtf8(id.c_str()) : utfName;
result.push_back({
.id = utfId,
.name = utfName,
.type = DeviceType::Camera,
});
}
return result;
}
} // namespace
EnvironmentVideoCapture::EnvironmentVideoCapture(
not_null<EnvironmentDelegate*> delegate)
: _delegate(delegate) {
}
EnvironmentVideoCapture::~EnvironmentVideoCapture() {
}
QString EnvironmentVideoCapture::defaultId(DeviceType type) {
Expects(type == DeviceType::Camera);
return DefaultId();
}
DeviceInfo EnvironmentVideoCapture::device(
DeviceType type,
const QString &id) {
Expects(type == DeviceType::Camera);
const auto devices = GetDevices();
const auto i = ranges::find(devices, id, &DeviceInfo::id);
return (i != end(devices)) ? *i : DeviceInfo();
}
std::vector<DeviceInfo> EnvironmentVideoCapture::devices(DeviceType type) {
Expects(type == DeviceType::Camera);
return GetDevices();
}
bool EnvironmentVideoCapture::refreshFullListOnChange(DeviceType type) {
Expects(type == DeviceType::Camera);
return true;
}
bool EnvironmentVideoCapture::desktopCaptureAllowed() const {
Unexpected("EnvironmentVideoCapture::desktopCaptureAllowed.");
}
auto EnvironmentVideoCapture::uniqueDesktopCaptureSource() const
-> std::optional<QString> {
Unexpected("EnvironmentVideoCapture::uniqueDesktopCaptureSource.");
}
void EnvironmentVideoCapture::defaultIdRequested(DeviceType type) {
_delegate->devicesForceRefresh(type);
}
void EnvironmentVideoCapture::devicesRequested(DeviceType type) {
_delegate->devicesForceRefresh(type);
}
QString EnvironmentVideoCapture::DefaultId() {
const auto devices = GetDevices();
return devices.empty() ? QString() : devices.front().id;
}
} // namespace Webrtc::details