diff options
Diffstat (limited to 'compat/camera-names.cpp')
-rw-r--r-- | compat/camera-names.cpp | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/compat/camera-names.cpp b/compat/camera-names.cpp index 5d190943..82776584 100644 --- a/compat/camera-names.cpp +++ b/compat/camera-names.cpp @@ -12,7 +12,8 @@ #endif #ifdef __APPLE__ -# include <QCameraInfo> +# include <QCameraDevice> +# include <QMediaDevices> #endif #ifdef __linux__ @@ -41,6 +42,36 @@ int camera_name_to_index(const QString &name) return -1; } +#ifdef _WIN32 +# include <QRegularExpression> + +static QString prop_to_qstring(IPropertyBag* pPropBag, const wchar_t* name) +{ + QString ret{}; + VARIANT var; + VariantInit(&var); + HRESULT hr = pPropBag->Read(name, &var, nullptr); + if (SUCCEEDED(hr)) + ret = QString{(const QChar*)var.bstrVal, int(std::wcslen(var.bstrVal))}; + VariantClear(&var); + return ret; +} + +static QString device_path_from_qstring(const QString& str) +{ + // language=RegExp prefix=R"/( suffix=)/" + static const QRegularExpression regexp{R"/(#vid_([0-9a-f]{4})&pid_([0-9a-f]{4})&mi_([0-9a-f]{2})#([^#]+))/", + QRegularExpression::CaseInsensitiveOption}; + auto match = regexp.match(str); + if (!match.hasMatch()) + return {}; + QString id = match.captured(4); + id.replace('&', '_'); + return id; +} + +#endif + std::vector<std::tuple<QString, int>> get_camera_names() { std::vector<std::tuple<QString, int>> ret; @@ -67,26 +98,26 @@ std::vector<std::tuple<QString, int>> get_camera_names() { IPropertyBag *pPropBag; hr = pMoniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag, (void **)&pPropBag); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr)) { // To retrieve the filter's friendly name, do the following: - VARIANT var; - VariantInit(&var); - hr = pPropBag->Read(L"FriendlyName", &var, nullptr); if (SUCCEEDED(hr)) { - // Display the name in your UI somehow. - QString str((QChar*)var.bstrVal, int(std::wcslen(var.bstrVal))); - ret.push_back({ str, ret.size() }); + QString str = prop_to_qstring(pPropBag, L"FriendlyName"); + QString path = device_path_from_qstring(prop_to_qstring(pPropBag, L"DevicePath")); + if (!path.isNull()) + str += QStringLiteral(" [%1]").arg(path); + ret.push_back({ str, (int)ret.size() }); } - VariantClear(&var); pPropBag->Release(); } pMoniker->Release(); } pEnumCat->Release(); } +#if 0 else qDebug() << "failed CLSID_VideoInputDeviceCategory" << hr; +#endif pSysDevEnum->Release(); #endif @@ -113,9 +144,8 @@ std::vector<std::tuple<QString, int>> get_camera_names() } #endif #ifdef __APPLE__ - QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); - for (const QCameraInfo &cameraInfo : cameras) - ret.push_back({ cameraInfo.description(), ret.size() }); + for (const QCameraDevice& camera_info : QMediaDevices::videoInputs()) + ret.push_back({ camera_info.description(), ret.size() }); #endif return ret; |