From c7215393794b7a901cfcca22c9afe200f5bb959e Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 17 Sep 2016 16:09:40 +0200 Subject: cv: bring video property page from the attic --- cv/video-property-page.cpp | 155 +++++++++++++++++++++++++++++++++ cv/video-property-page.cpp_ | 208 -------------------------------------------- cv/video-property-page.hpp | 21 +++++ 3 files changed, 176 insertions(+), 208 deletions(-) create mode 100644 cv/video-property-page.cpp delete mode 100644 cv/video-property-page.cpp_ create mode 100644 cv/video-property-page.hpp 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 +#include +#include + +#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 +# include "compat/camera-names.hpp" + +bool video_property_page::show(int idx) +{ + const QList 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 diff --git a/cv/video-property-page.cpp_ b/cv/video-property-page.cpp_ deleted file mode 100644 index 319a2a78..00000000 --- a/cv/video-property-page.cpp_ +++ /dev/null @@ -1,208 +0,0 @@ -#if 0 -#if 0 -#include "video-property-page.hpp" -#else -#include -#include - -struct video_property_page final -{ - video_property_page() = delete; - static bool show(int id); - -private: - static HRESULT ShowFilterPropertyPages(IBaseFilter* filter); - static IBaseFilter* get_device(int id); -}; -#endif -// above is the header, for completeness -// OleInitialize, CoCreateInstance et al. don't help with ps3 eye. - -#include - -#include -#include - -#if 0 -DEFINE_GUID(CLSID_SampleGrabber,0xc1f400a0,0x3f08,0x11d3,0x9f,0x0b,0x00,0x60,0x08,0x03,0x9e,0x37); -DEFINE_GUID(IID_ISampleGrabber,0x6b652fff,0x11fe,0x4fce,0x92,0xad,0x02,0x66,0xb5,0xd7,0xc7,0x8f); - -struct ISampleGrabberCB : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE SampleCB( - double SampleTime, - IMediaSample *pSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE BufferCB( - double SampleTime, - BYTE *pBuffer, - LONG BufferLen) = 0; -}; - -struct ISampleGrabber : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE SetOneShot( - BOOL OneShot) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMediaType( - const AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( - AM_MEDIA_TYPE *pType) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( - BOOL BufferThem) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( - LONG *pBufferSize, - LONG *pBuffer) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( - IMediaSample **ppSample) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetCallback( - ISampleGrabberCB *pCallback, - LONG WhichMethodToCallback) = 0; -}; -#endif - -#define CHECK(expr) if (FAILED(hr = (expr))) { qDebug() << QStringLiteral(#expr) << hr; goto done; } -#define CHECK2(expr) if (!(expr)) { qDebug() << QStringLiteral(#expr); goto done; } - -#if 0 -static IPin* GetPin(IBaseFilter *pFilter, PIN_DIRECTION dir_) -{ - IPin* ret = NULL; - IEnumPins* pin_enum = NULL; - PIN_DIRECTION dir; - HRESULT hr; - - CHECK(pFilter->EnumPins(&pin_enum)); - - while (SUCCEEDED(pin_enum->Next(1, &ret, NULL))) - { - CHECK(ret->QueryDirection(&dir)); - if (dir == dir_) - goto done; - ret->Release(); - ret = NULL; - } - - ret = NULL; - -done: - if (pin_enum) - pin_enum->Release(); - - return ret; -} -#endif - -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); - - // 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; -} - -#endif diff --git a/cv/video-property-page.hpp b/cv/video-property-page.hpp new file mode 100644 index 00000000..7c51f111 --- /dev/null +++ b/cv/video-property-page.hpp @@ -0,0 +1,21 @@ +#pragma once + +#ifdef _WIN32 +# include +# include +#endif + +#include "opencv2/videoio.hpp" + +struct video_property_page final +{ + video_property_page() = delete; + static bool show(int id); + static bool show_from_capture(cv::VideoCapture& cap, int idx); + +private: +#ifdef _WIN32 + static HRESULT ShowFilterPropertyPages(IBaseFilter* filter); + static IBaseFilter* get_device(int id); +#endif +}; -- cgit v1.2.3