diff options
Diffstat (limited to 'cv/video-property-page.cpp_')
| -rw-r--r-- | cv/video-property-page.cpp_ | 208 | 
1 files changed, 208 insertions, 0 deletions
| diff --git a/cv/video-property-page.cpp_ b/cv/video-property-page.cpp_ new file mode 100644 index 00000000..319a2a78 --- /dev/null +++ b/cv/video-property-page.cpp_ @@ -0,0 +1,208 @@ +#if 0 +#if 0 +#include "video-property-page.hpp" +#else +#include <windows.h> +#include <dshow.h> + +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 <cstring> + +#include <QString> +#include <QDebug> + +#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 | 
