usb_windows_utils.h
Go to the documentation of this file.
1 /*
2  * BSD 3-Clause License
3  *
4  * Copyright (c) 2019, Analog Devices, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice, this
11  * list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from
19  * this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 #pragma once
33 
35 #include <string>
36 
37 #include <dshow.h>
38 #include <initguid.h>
39 #include <strmif.h>
40 // begin of RDK_extension unit
41 // Headers added to support extension unit
42 #include <iostream>
43 #include <ks.h>
44 #include <ksmedia.h>
45 #include <ksproxy.h>
46 #include <vidcap.h>
47 // end of RDK_extension unit
48 
49 #define MAX_PACKET_SIZE 58
50 #define MAX_BUF_SIZE (MAX_PACKET_SIZE + 2)
51 
52 DEFINE_GUID(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00,
53  0x60, 0x08, 0x03, 0x9e, 0x37);
54 DEFINE_GUID(IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92, 0xad, 0x02,
55  0x66, 0xb5, 0xd7, 0xc7, 0x8f);
56 DEFINE_GUID(CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00,
57  0x60, 0x08, 0x03, 0x9e, 0x37);
58 DEFINE_GUID(MEDIASUBTYPE_BY8, 0x20385942, 0x0000, 0x0010, 0x80, 0x00, 0x00,
59  0xaa, 0x00, 0x38, 0x9b, 0x71);
60 DEFINE_GUID(MEDIASUBTYPE_Y16, 0x20363159, 0x0000, 0x0010, 0x80, 0x00, 0x00,
61  0xAA, 0x00, 0x38, 0x9B, 0x71);
62 DEFINE_GUID(MEDIASUBTYPE_GREY, 0x59455247, 0x0000, 0x0010, 0x80, 0x00, 0x00,
63  0xaa, 0x00, 0x38, 0x9b, 0x71);
64 DEFINE_GUID(MEDIASUBTYPE_Y8, 0x20203859, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa,
65  0x00, 0x38, 0x9b, 0x71);
66 DEFINE_GUID(MEDIASUBTYPE_Y800, 0x30303859, 0x0000, 0x0010, 0x80, 0x00, 0x00,
67  0xaa, 0x00, 0x38, 0x9b, 0x71);
68 
69 static const GUID EXT_UNIT_GUID = {0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00,
70  0x00, 0x00, 0x00, 0x00, 0x00};
71 
72 #pragma comment(lib, "strmiids")
73 
74 interface ISampleGrabberCB : public IUnknown {
75  virtual HRESULT STDMETHODCALLTYPE SampleCB(double SampleTime,
76  IMediaSample *pSample) = 0;
77 
78  virtual HRESULT STDMETHODCALLTYPE BufferCB(double SampleTime, BYTE *pBuffer,
79  LONG BufferLen) = 0;
80 
81  virtual ~ISampleGrabberCB() {}
82 };
83 
84 interface ISampleGrabber : public IUnknown {
85  virtual HRESULT STDMETHODCALLTYPE SetOneShot(BOOL OneShot) = 0;
86 
87  virtual HRESULT STDMETHODCALLTYPE
88  SetMediaType(const AM_MEDIA_TYPE *pType) = 0;
89 
90  virtual HRESULT STDMETHODCALLTYPE
91  GetConnectedMediaType(AM_MEDIA_TYPE *pType) = 0;
92 
93  virtual HRESULT STDMETHODCALLTYPE SetBufferSamples(BOOL BufferThem) = 0;
94 
95  virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(LONG *pBufferSize,
96  LONG *pBuffer) = 0;
97 
98  virtual HRESULT STDMETHODCALLTYPE
99  GetCurrentSample(IMediaSample **ppSample) = 0;
100 
101  virtual HRESULT STDMETHODCALLTYPE
102  SetCallback(ISampleGrabberCB *pCallback, LONG WhichMethodToCallback) = 0;
103 
104  virtual ~ISampleGrabber() {}
105 };
106 
108 // Callback class
109 class SampleGrabberCallback : public ISampleGrabberCB {
110  public:
111  //------------------------------------------------
113  InitializeCriticalSection(&critSection);
114  newFrame = false;
115  }
116 
117  //------------------------------------------------
118  ~SampleGrabberCallback() { DeleteCriticalSection(&critSection); }
119 
120  //------------------------------------------------
121  STDMETHODIMP_(ULONG) AddRef() { return 1; }
122  STDMETHODIMP_(ULONG) Release() { return 2; }
123 
124  //------------------------------------------------
125  STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) {
126  *ppvObject = static_cast<ISampleGrabberCB *>(this);
127  return S_OK;
128  }
129 
130  // This method is meant to have less overhead
131  //------------------------------------------------
132  STDMETHODIMP SampleCB(double Time, IMediaSample *pSample) {
133  EnterCriticalSection(&critSection);
134  newFrame = true;
135  LeaveCriticalSection(&critSection);
136  return S_OK;
137  }
138 
139  // This method is meant to have more overhead
140  STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen) {
141  EnterCriticalSection(&critSection);
142  newFrame = true;
143  LeaveCriticalSection(&critSection);
144  return S_OK;
145  }
146 
147  bool newFrame;
148  CRITICAL_SECTION critSection;
149 };
150 
151 struct UsbHandle {
152  ICaptureGraphBuilder2 *pCaptureGraph; // Capture graph builder object
153  IGraphBuilder *pGraph; // Graph builder object
154  IMediaControl *pControl; // Media control object
155  IBaseFilter *pVideoInputFilter; // Video Capture filter
156  IBaseFilter *pGrabberF;
157  IBaseFilter *pDestFilter;
158  IAMStreamConfig *streamConf;
159  ISampleGrabber *pGrabber; // Grabs frame
160  AM_MEDIA_TYPE *pAmMediaType;
161  IMediaEventEx *pMediaEvent;
163  GUID videoType;
164 
166  : pCaptureGraph{nullptr}, pGraph{nullptr}, pControl{nullptr},
167  pVideoInputFilter{nullptr}, pGrabberF{nullptr}, pDestFilter{nullptr},
168  streamConf{nullptr}, pGrabber{nullptr}, pAmMediaType{nullptr},
169  pMediaEvent{nullptr}, pCB{nullptr} {}
170 };
171 
172 struct ExUnitHandle {
173  IKsTopologyInfo *pKsTopologyInfo;
174  IKsControl *pKsUnk;
175  ULONG node;
176 
177  ExUnitHandle() : pKsTopologyInfo(nullptr), pKsUnk(nullptr), node(0) {}
179  if (pKsTopologyInfo) {
180  pKsTopologyInfo->Release();
181  pKsTopologyInfo = nullptr;
182  }
183  }
184 };
185 
187  public:
188  static HRESULT UvcFindNodeAndGetControl(ExUnitHandle *handle,
189  IBaseFilter **pVideoInputFilter);
190 
191  static HRESULT UvcExUnitSetProperty(ExUnitHandle *handle, ULONG selector,
192  const uint8_t *buffer, ULONG nbBytes);
193 
194  static HRESULT UvcExUnitGetProperty(ExUnitHandle *handle, ULONG selector,
195  uint8_t *buffer, ULONG nbBytes);
196 
197  static HRESULT UvcExUnitReadBuffer(IBaseFilter *pVideoInputFilter,
198  ULONG selector, int16_t id,
199  uint32_t address, uint8_t *data,
200  uint32_t bufferLength);
201 
202  static HRESULT UvcExUnitWriteBuffer(IBaseFilter *pVideoInputFilter,
203  ULONG selector, int16_t id,
204  uint32_t address, const uint8_t *data,
205  uint32_t bufferLength);
206 
207  static aditof::Status uvcExUnitGetString(IBaseFilter *pVideoInputFilter,
208  int uvcControlId,
209  std::string &outStr);
210 
211  static aditof::Status uvcExUnitSendRequest(IBaseFilter *pVideoInputFilter,
212  const std::string &requestStr);
213  static aditof::Status uvcExUnitGetResponse(IBaseFilter *pVideoInputFilter,
215 };
UsbWindowsUtils::UvcExUnitWriteBuffer
static HRESULT UvcExUnitWriteBuffer(IBaseFilter *pVideoInputFilter, ULONG selector, int16_t id, uint32_t address, const uint8_t *data, uint32_t bufferLength)
Definition: usb_windows_utils.cpp:191
UsbWindowsUtils::uvcExUnitGetString
static aditof::Status uvcExUnitGetString(IBaseFilter *pVideoInputFilter, int uvcControlId, std::string &outStr)
Definition: usb_windows_utils.cpp:243
UsbHandle::pGrabber
ISampleGrabber * pGrabber
Definition: usb_windows_utils.h:159
ExUnitHandle::pKsTopologyInfo
IKsTopologyInfo * pKsTopologyInfo
Definition: usb_windows_utils.h:173
ExUnitHandle::node
ULONG node
Definition: usb_windows_utils.h:175
SampleGrabberCallback::~SampleGrabberCallback
~SampleGrabberCallback()
Definition: usb_windows_utils.h:118
EXT_UNIT_GUID
static const GUID EXT_UNIT_GUID
Definition: usb_windows_utils.h:69
GetCurrentSample
virtual HRESULT STDMETHODCALLTYPE GetCurrentSample(IMediaSample **ppSample)=0
SetCallback
virtual HRESULT STDMETHODCALLTYPE SetCallback(ISampleGrabberCB *pCallback, LONG WhichMethodToCallback)=0
UsbHandle::videoType
GUID videoType
Definition: usb_windows_utils.h:163
SampleGrabberCallback::newFrame
bool newFrame
Definition: usb_windows_utils.h:147
UsbHandle::pDestFilter
IBaseFilter * pDestFilter
Definition: usb_windows_utils.h:157
UsbHandle::pControl
IMediaControl * pControl
Definition: usb_windows_utils.h:154
SampleGrabberCallback::QueryInterface
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject)
Definition: usb_windows_utils.h:125
UsbHandle::UsbHandle
UsbHandle()
Definition: usb_windows_utils.h:165
SampleGrabberCallback::STDMETHODIMP_
STDMETHODIMP_(ULONG) AddRef()
Definition: usb_windows_utils.h:121
SetBufferSamples
virtual HRESULT STDMETHODCALLTYPE SetBufferSamples(BOOL BufferThem)=0
UsbWindowsUtils
Definition: usb_windows_utils.h:186
UsbHandle::pVideoInputFilter
IBaseFilter * pVideoInputFilter
Definition: usb_windows_utils.h:155
UsbWindowsUtils::uvcExUnitSendRequest
static aditof::Status uvcExUnitSendRequest(IBaseFilter *pVideoInputFilter, const std::string &requestStr)
Definition: usb_windows_utils.cpp:282
ExUnitHandle::pKsUnk
IKsControl * pKsUnk
Definition: usb_windows_utils.h:174
UsbHandle::pGrabberF
IBaseFilter * pGrabberF
Definition: usb_windows_utils.h:156
GetCurrentBuffer
virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(LONG *pBufferSize, LONG *pBuffer)=0
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
UsbHandle::pMediaEvent
IMediaEventEx * pMediaEvent
Definition: usb_windows_utils.h:161
DEFINE_GUID
DEFINE_GUID(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37)
address
const char * address
Definition: builds/zos/test_fork.cpp:6
UsbWindowsUtils::UvcExUnitReadBuffer
static HRESULT UvcExUnitReadBuffer(IBaseFilter *pVideoInputFilter, ULONG selector, int16_t id, uint32_t address, uint8_t *data, uint32_t bufferLength)
Definition: usb_windows_utils.cpp:135
pSample
interface IMediaSample * pSample
Definition: usb_windows_utils.h:76
SampleGrabberCallback
Definition: usb_windows_utils.h:109
SampleGrabberCallback::BufferCB
STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
Definition: usb_windows_utils.h:140
UsbHandle
Definition: usb_windows_utils.h:151
responseStr
ROSCPP_DECL XmlRpc::XmlRpcValue responseStr(int code, const std::string &msg, const std::string &response)
ExUnitHandle::~ExUnitHandle
~ExUnitHandle()
Definition: usb_windows_utils.h:178
UsbHandle::pAmMediaType
AM_MEDIA_TYPE * pAmMediaType
Definition: usb_windows_utils.h:160
UsbHandle::pCB
SampleGrabberCallback * pCB
Definition: usb_windows_utils.h:162
SampleGrabberCallback::SampleCB
STDMETHODIMP SampleCB(double Time, IMediaSample *pSample)
Definition: usb_windows_utils.h:132
UsbHandle::streamConf
IAMStreamConfig * streamConf
Definition: usb_windows_utils.h:158
UsbWindowsUtils::UvcExUnitGetProperty
static HRESULT UvcExUnitGetProperty(ExUnitHandle *handle, ULONG selector, uint8_t *buffer, ULONG nbBytes)
Definition: usb_windows_utils.cpp:119
SampleGrabberCallback::SampleGrabberCallback
SampleGrabberCallback()
Definition: usb_windows_utils.h:112
buffer
Definition: buffer_processor.h:43
UsbWindowsUtils::uvcExUnitGetResponse
static aditof::Status uvcExUnitGetResponse(IBaseFilter *pVideoInputFilter, std::string &responseStr)
Definition: usb_windows_utils.cpp:335
UsbHandle::pCaptureGraph
ICaptureGraphBuilder2 * pCaptureGraph
Definition: usb_windows_utils.h:152
GetConnectedMediaType
virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType(AM_MEDIA_TYPE *pType)=0
aditof::Status
Status
Status of any operation that the TOF sdk performs.
Definition: status_definitions.h:48
~ISampleGrabber
virtual ~ISampleGrabber()
Definition: usb_windows_utils.h:104
SampleGrabberCallback::STDMETHODIMP_
STDMETHODIMP_(ULONG) Release()
Definition: usb_windows_utils.h:122
UsbHandle::pGraph
IGraphBuilder * pGraph
Definition: usb_windows_utils.h:153
SetMediaType
virtual HRESULT STDMETHODCALLTYPE SetMediaType(const AM_MEDIA_TYPE *pType)=0
SampleGrabberCallback::critSection
CRITICAL_SECTION critSection
Definition: usb_windows_utils.h:148
ExUnitHandle
Definition: usb_windows_utils.h:172
UsbWindowsUtils::UvcFindNodeAndGetControl
static HRESULT UvcFindNodeAndGetControl(ExUnitHandle *handle, IBaseFilter **pVideoInputFilter)
Definition: usb_windows_utils.cpp:42
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
status_definitions.h
ExUnitHandle::ExUnitHandle
ExUnitHandle()
Definition: usb_windows_utils.h:177
UsbWindowsUtils::UvcExUnitSetProperty
static HRESULT UvcExUnitSetProperty(ExUnitHandle *handle, ULONG selector, const uint8_t *buffer, ULONG nbBytes)
Definition: usb_windows_utils.cpp:101
~ISampleGrabberCB
virtual ~ISampleGrabberCB()
Definition: usb_windows_utils.h:81
BufferCB
virtual HRESULT STDMETHODCALLTYPE BufferCB(double SampleTime, BYTE *pBuffer, LONG BufferLen)=0


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:01