diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-17 16:09:40 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-09-17 16:20:19 +0200 |
commit | c7215393794b7a901cfcca22c9afe200f5bb959e (patch) | |
tree | 1a96ae7e44f48ce84219fd778181b0a85f09bc77 /cv/video-property-page.cpp | |
parent | 1cb46ce512333342f292462121b6e23bee0a715d (diff) |
cv: bring video property page from the attic
Diffstat (limited to 'cv/video-property-page.cpp')
-rw-r--r-- | cv/video-property-page.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/cv/video-property-page.cpp b/cv/video-property-page.cpp new file mode 100644 index 00000000..08ac00d0 --- /dev/null +++ b/cv/video-property-page.cpp @@ -0,0 +1,155 @@ +/* Copyright (c) 2016 Stanislaw Halik + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#include "video-property-page.hpp" + +#ifdef _WIN32 + +#include <cstring> +#include <QString> +#include <QDebug> + +#define CHECK(expr) if (FAILED(hr = (expr))) { qDebug() << QStringLiteral(#expr) << hr; goto done; } +#define CHECK2(expr) if (!(expr)) { qDebug() << QStringLiteral(#expr); goto done; } + +bool video_property_page::show_from_capture(cv::VideoCapture& cap, int) +{ + cap.set(cv::CAP_PROP_SETTINGS, 0); + return true; +} + +bool video_property_page::show(int id) +{ + IBaseFilter* filter = NULL; + bool ret = false; + + CHECK2(filter = get_device(id)); + + ret = SUCCEEDED(ShowFilterPropertyPages(filter)); + +done: + if (filter) + filter->Release(); + + return ret; +} + +HRESULT video_property_page::ShowFilterPropertyPages(IBaseFilter* filter) +{ + ISpecifyPropertyPages* pProp = NULL; + IUnknown* unk = NULL; + CAUUID caGUID = { 0, NULL }; + FILTER_INFO FilterInfo = { {0}, NULL }; + HRESULT hr; + + CHECK(filter->QueryInterface(IID_ISpecifyPropertyPages, (void**)&pProp)); + CHECK(pProp->GetPages(&caGUID)); + CHECK(filter->QueryFilterInfo(&FilterInfo)); + + filter->QueryInterface(IID_IUnknown, (void**)&unk); + + // OleInitialize, CoCreateInstance et al. don't help with ps3 eye. + + // cl-eye uses this + // perhaps more than IBaseFilter* -> IUnknown* needs be passed to lplpUnk + // and the OleCreatePropertyFrame equiv +#if 0 + OCPFIPARAMS params; + params.cbStructSize = sizeof(params); + params.hWndOwner = GetActiveWindow(); + params.x = 0; + params.y = 0; + params.lpszCaption = L"camera props"; + params.cObjects = 1; + params.lplpUnk = &unk; + params.cPages = 1; + //OleCreatePropertyFrameIndirect() +#endif + + OleCreatePropertyFrame( + NULL, // Parent window + 0, 0, // Reserved + FilterInfo.achName, // Caption for the dialog box + 1, // Number of objects (just the filter) + &unk, // Array of object pointers. + caGUID.cElems, // Number of property pages + caGUID.pElems, // Array of property page CLSIDs + 0, // Locale identifier + 0, NULL // Reserved + ); + +done: + if (FilterInfo.pGraph) + FilterInfo.pGraph->Release(); + + if (caGUID.pElems) + CoTaskMemFree(caGUID.pElems); + + if (pProp) + pProp->Release(); + + if (unk) + unk->Release(); + + return hr; +} + +IBaseFilter* video_property_page::get_device(int id) +{ + ICreateDevEnum* pSysDevEnum = NULL; + IEnumMoniker* pEnumCat = NULL; + IMoniker* pMoniker = NULL; + IBaseFilter* filter = NULL; + HRESULT hr; + + CHECK(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pSysDevEnum)); + CHECK(pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0)); + + for (int i = 0; !filter && SUCCEEDED(pEnumCat->Next(1, &pMoniker, NULL)); pMoniker->Release(), i++) + { + if (i == id) + { + CHECK(pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&filter)); + break; + } + } + +done: + if (pMoniker) + pMoniker->Release(); + + if (pEnumCat) + pEnumCat->Release(); + + if (pSysDevEnum) + pSysDevEnum->Release(); + + return filter; +} + +#elif defined(__linux) +# include <QProcess> +# include "compat/camera-names.hpp" + +bool video_property_page::show(int idx) +{ + const QList<QString> camera_names(get_camera_names()); + + if (idx >= 0 && idx < camera_names.size()) + return QProcess::startDetached("qv4l2", QStringList() << "-d" << camera_names[idx]); + else + return false; +} + +bool video_property_page::show_from_capture(cv::VideoCapture&, int idx) +{ + return show(idx); +} +#else +bool video_property_page::show(int) { return false; } +bool video_property_page::show_from_capture(cv::VideoCapture&, int) { return false; } +#endif |