34 #include "usb_buffer.pb.h"
40 #include <glog/logging.h>
44 #include <unordered_map>
61 int slength = (int)
s.length() + 1;
62 len = MultiByteToWideChar(CP_ACP, 0,
s.c_str(), slength,
nullptr, 0);
63 wchar_t *
buf =
new wchar_t[
len];
64 MultiByteToWideChar(CP_ACP, 0,
s.c_str(), slength,
buf,
len);
77 ICreateDevEnum *DevEnum =
nullptr;
79 hr = CoCreateInstance(CLSID_SystemDeviceEnum,
nullptr, CLSCTX_INPROC_SERVER,
80 IID_PPV_ARGS(&DevEnum));
82 LOG(
WARNING) <<
"Create Device Enumeration Failed";
86 IEnumMoniker *EnumMoniker =
nullptr;
87 hr = DevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
96 IMoniker *Moniker =
nullptr;
98 while (!done && EnumMoniker->Next(1, &Moniker, &cFetched) == S_OK) {
99 IPropertyBag *PropBag;
100 hr = Moniker->BindToStorage(
nullptr,
nullptr, IID_PPV_ARGS(&PropBag));
104 VariantInit(&varName);
105 hr = PropBag->Read(L
"FriendlyName", &varName,
nullptr);
109 if (
str == devName) {
112 Moniker->BindToObject(
nullptr,
nullptr, IID_IBaseFilter,
113 (
void **)pVideoInputFilter);
114 if (!SUCCEEDED(hr)) {
115 LOG(
WARNING) <<
"Failed to bind video input filter";
121 VariantClear(&varName);
130 EnumMoniker->Release();
137 bool IsSingleByteFormat =
true;
139 if (FormatType == MEDIASUBTYPE_Y800 || FormatType == MEDIASUBTYPE_Y8 ||
140 FormatType == MEDIASUBTYPE_GREY || FormatType == MEDIASUBTYPE_BY8) {
141 IsSingleByteFormat =
true;
143 IsSingleByteFormat =
false;
146 return IsSingleByteFormat;
152 IEnumPins *pins =
nullptr;
154 HRESULT hr = pBF->EnumPins(&pins);
156 while (hr == NOERROR) {
157 hr = pins->Next(1, &pP, &u);
158 if (hr == S_OK && pP) {
159 pP->ConnectedTo(&pTo);
161 hr = pTo->QueryPinInfo(&pininfo);
163 if (pininfo.dir == PINDIR_INPUT) {
165 pGraph->Disconnect(pTo);
166 pGraph->Disconnect(pP);
167 pGraph->RemoveFilter(pininfo.pFilter);
169 pininfo.pFilter->Release();
170 pininfo.pFilter =
nullptr;
185 while (hr == NOERROR) {
186 IEnumFilters *pEnum =
nullptr;
192 hr = pGraph->EnumFilters(&pEnum);
194 IBaseFilter *pFilter =
nullptr;
196 if (pEnum->Next(1, &pFilter, &cFetched) == S_OK) {
197 FILTER_INFO FilterInfo;
198 memset(&FilterInfo, 0,
sizeof(FilterInfo));
199 hr = pFilter->QueryFilterInfo(&FilterInfo);
200 FilterInfo.pGraph->Release();
204 memset(
buffer, 0, 255 *
sizeof(
char));
206 while (FilterInfo.achName[
count] != 0x00) {
211 hr = pGraph->RemoveFilter(pFilter);
213 LOG(
WARNING) <<
"SETUP: pGraph->RemoveFilter() failed.";
230 : m_driverPath(driverPath), m_implData(new
UsbDepthSensor::ImplData) {
231 m_implData->handle.pMediaEvent =
nullptr;
232 m_implData->opened =
false;
239 HRESULT HR = NOERROR;
250 delete[]
it->second.cache;
251 it->second.cache =
nullptr;
266 m_implData->handle.pVideoInputFilter->Release();
290 if (
m_implData->handle.pAmMediaType->cbFormat != 0) {
291 CoTaskMemFree((PVOID)
m_implData->handle.pAmMediaType->pbFormat);
292 m_implData->handle.pAmMediaType->cbFormat = 0;
293 m_implData->handle.pAmMediaType->pbFormat =
nullptr;
295 if (
m_implData->handle.pAmMediaType->pUnk !=
nullptr) {
297 m_implData->handle.pAmMediaType->pUnk->Release();
298 m_implData->handle.pAmMediaType->pUnk =
nullptr;
300 CoTaskMemFree(
m_implData->handle.pAmMediaType);
324 GUID CAPTURE_MODE = PIN_CATEGORY_CAPTURE;
326 hr = CoInitializeEx(
nullptr, COINIT_MULTITHREADED);
328 hr = CoCreateInstance(CLSID_CaptureGraphBuilder2,
nullptr,
329 CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
330 (
void **)&(
m_implData->handle.pCaptureGraph));
332 LOG(
WARNING) <<
"Failed CoCreateInstance(CLSID_CaptureGraphBuilder2)";
333 return Status::GENERIC_ERROR;
336 hr = CoCreateInstance(CLSID_FilterGraph,
nullptr, CLSCTX_INPROC_SERVER,
340 LOG(
WARNING) <<
"Failed CoCreateInstance(CLSID_FilterGraph)";
341 return Status::GENERIC_ERROR;
344 hr =
m_implData->handle.pCaptureGraph->SetFiltergraph(
348 return Status::GENERIC_ERROR;
351 hr =
m_implData->handle.pGraph->QueryInterface(
352 IID_IMediaControl, (
void **)&(
m_implData->handle.pControl));
354 LOG(
WARNING) <<
"Failed QueryInterface(IID_IMediaControl)";
355 return Status::GENERIC_ERROR;
366 usb_payload::ClientRequest requestMsg;
369 requestMsg.SerializeToString(&requestStr);
371 m_implData->handle.pVideoInputFilter, requestStr);
373 LOG(
ERROR) <<
"Request to get available frame types failed";
380 m_implData->handle.pVideoInputFilter, responseStr);
382 LOG(
ERROR) <<
"Response for get available frame types request failed";
385 usb_payload::ServerResponse responseMsg;
386 bool parsed = responseMsg.ParseFromString(responseStr);
389 <<
"Failed to deserialize string containing UVC gadget response";
395 <<
"Get available frame types operation failed on UVC gadget";
405 m_implData->handle.pVideoInputFilter, stemp.c_str());
407 LOG(
WARNING) <<
"ADI TOF Camera cannot be opened";
408 return Status::GENERIC_ERROR;
411 IAMStreamConfig *streamConfTest =
nullptr;
412 hr =
m_implData->handle.pCaptureGraph->FindInterface(
413 &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
414 m_implData->handle.pVideoInputFilter, IID_IAMStreamConfig,
415 (
void **)&streamConfTest);
420 CAPTURE_MODE = PIN_CATEGORY_PREVIEW;
421 streamConfTest->Release();
422 streamConfTest =
nullptr;
425 hr =
m_implData->handle.pCaptureGraph->FindInterface(
426 &CAPTURE_MODE, &MEDIATYPE_Video,
m_implData->handle.pVideoInputFilter,
427 IID_IAMStreamConfig, (
void **)&(
m_implData->handle.streamConf));
429 LOG(
WARNING) <<
"Failed FindInterface(CAPTURE_MODE)";
430 return Status::GENERIC_ERROR;
433 hr =
m_implData->handle.streamConf->GetFormat(
436 LOG(
WARNING) <<
"Failed to get format from streamConf";
437 return Status::GENERIC_ERROR;
440 hr = CoCreateInstance(CLSID_SampleGrabber,
nullptr, CLSCTX_INPROC_SERVER,
444 LOG(
WARNING) <<
"Could not Create Sample Grabber - CoCreateInstance()";
445 return Status::GENERIC_ERROR;
451 LOG(
WARNING) <<
"Could not add Sample Grabber - AddFilter()";
452 return Status::GENERIC_ERROR;
455 hr =
m_implData->handle.pGrabberF->QueryInterface(
456 IID_ISampleGrabber, (
void **)&(
m_implData->handle.pGrabber));
458 LOG(
WARNING) <<
"ERROR: Could not query SampleGrabber";
459 return Status::GENERIC_ERROR;
462 hr =
m_implData->handle.pGrabber->SetOneShot(FALSE);
463 hr =
m_implData->handle.pGrabber->SetBufferSamples(TRUE);
466 return Status::GENERIC_ERROR;
470 ZeroMemory(&mt,
sizeof(AM_MEDIA_TYPE));
472 mt.majortype = MEDIATYPE_Video;
475 (
m_implData->handle.pAmMediaType->subtype == MEDIASUBTYPE_Y16)) {
476 mt.subtype =
m_implData->handle.pAmMediaType->subtype;
478 mt.subtype = MEDIASUBTYPE_RGB24;
482 mt.formattype = FORMAT_VideoInfo;
484 hr =
m_implData->handle.pGrabber->SetMediaType(&mt);
488 hr = CoCreateInstance(CLSID_NullRenderer,
nullptr, CLSCTX_INPROC_SERVER,
490 (
void **)(&(
m_implData->handle.pDestFilter)));
492 LOG(
WARNING) <<
"ERROR: Could not create filter - NullRenderer";
493 return Status::GENERIC_ERROR;
499 LOG(
WARNING) <<
"ERROR: Could not add filter - NullRenderer";
500 return Status::GENERIC_ERROR;
505 hr =
m_implData->handle.pCaptureGraph->RenderStream(
506 &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
511 LOG(
WARNING) <<
"ERROR: Could not connect pins - RenderStream()";
512 return Status::GENERIC_ERROR;
516 IMediaFilter *pMediaFilter =
nullptr;
517 hr =
m_implData->handle.pGraph->QueryInterface(IID_IMediaFilter,
518 (
void **)&pMediaFilter);
520 LOG(
WARNING) <<
"ERROR: Could not get IID_IMediaFilter interface";
521 return Status::GENERIC_ERROR;
523 pMediaFilter->SetSyncSource(
nullptr);
524 pMediaFilter->Release();
540 usb_payload::ClientRequest requestMsg;
545 requestMsg.SerializeToString(&requestStr);
547 m_implData->handle.pVideoInputFilter, requestStr);
549 LOG(
ERROR) <<
"Request to write registers failed";
556 m_implData->handle.pVideoInputFilter, responseStr);
559 <<
"Failed to get response of the request to write registers";
562 usb_payload::ServerResponse responseMsg;
563 bool parsed = responseMsg.ParseFromString(responseStr);
566 <<
"Failed to deserialize string containing UVC gadget response";
571 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
581 HRESULT hr =
m_implData->handle.pControl->Run();
583 LOG(
WARNING) <<
"ERROR: Could not start graph";
584 return Status::GENERIC_ERROR;
594 LOG(
INFO) <<
"Stopping device";
601 HRESULT hr =
m_implData->handle.pControl->Stop();
603 LOG(
WARNING) <<
"ERROR: Could not stop graph";
604 return Status::GENERIC_ERROR;
613 modes.emplace_back(
mode.modeNumber);
625 if (modeDetails.modeNumber ==
mode) {
626 details = modeDetails;
641 HRESULT hr =
m_implData->handle.streamConf->GetFormat(
645 return Status::GENERIC_ERROR;
648 usb_payload::ClientRequest requestMsg;
649 auto frameTypeMsg = requestMsg.mutable_mode_details();
654 requestMsg.SerializeToString(&requestStr);
656 m_implData->handle.pVideoInputFilter, requestStr);
658 LOG(
ERROR) <<
"Set frame type operation failed on UVC gadget";
661 VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER *
>(
681 usb_payload::ClientRequest requestMsg;
683 requestMsg.set_func_name(usb_payload::FunctionName::PROCESS_FRAME);
685 requestMsg.SerializeToString(&requestStr);
687 m_implData->handle.pVideoInputFilter, requestStr);
689 LOG(
ERROR) <<
"Failed to process frame on target!";
693 VIDEOINFOHEADER *pVi =
reinterpret_cast<VIDEOINFOHEADER *
>(
695 int currentWidth =
HEADER(pVi)->biWidth * 2;
696 int currentHeight =
HEADER(pVi)->biHeight * 2;
698 while (retryCount < 1000) {
700 long bufferSize = currentWidth * currentHeight * 2;
701 hr =
m_implData->handle.pGrabber->GetCurrentBuffer(
702 (
long *)&bufferSize, (
long *)
buffer);
704 LOG(
WARNING) <<
"Incorrect Buffer Size allocated, Allocate "
708 EnterCriticalSection(&
m_implData->handle.pCB->critSection);
710 LeaveCriticalSection(&
m_implData->handle.pCB->critSection);
719 return retryCount >= 1000 ? Status::GENERIC_ERROR : status;
729 usb_payload::ClientRequest requestMsg;
734 requestMsg.SerializeToString(&requestStr);
736 m_implData->handle.pVideoInputFilter, requestStr);
738 LOG(
ERROR) <<
"Request to get available controls failed";
745 m_implData->handle.pVideoInputFilter, responseStr);
747 LOG(
ERROR) <<
"Failed to get response of the request to get controls";
750 usb_payload::ServerResponse responseMsg;
751 bool parsed = responseMsg.ParseFromString(responseStr);
754 <<
"Failed to deserialize string containing UVC gadget response";
759 LOG(
ERROR) <<
"Get available controls operation failed on UVC gadget";
766 for (
int i = 0;
i < responseMsg.strings_payload_size();
i++) {
767 std::string controlName = responseMsg.strings_payload(
i);
768 controls.push_back(controlName);
782 usb_payload::ClientRequest requestMsg;
784 requestMsg.add_func_strings_param(control);
785 requestMsg.add_func_strings_param(
value);
789 requestMsg.SerializeToString(&requestStr);
791 m_implData->handle.pVideoInputFilter, requestStr);
793 LOG(
ERROR) <<
"Request to set control failed: " << control;
800 m_implData->handle.pVideoInputFilter, responseStr);
802 LOG(
ERROR) <<
"Failed to get response of the request to set control: "
806 usb_payload::ServerResponse responseMsg;
807 bool parsed = responseMsg.ParseFromString(responseStr);
810 <<
"Failed to deserialize string containing UVC gadget response";
815 LOG(
ERROR) <<
"Set control:" << control
816 <<
" operation failed on UVC gadget";
830 usb_payload::ClientRequest requestMsg;
832 requestMsg.add_func_strings_param(control);
836 requestMsg.SerializeToString(&requestStr);
838 m_implData->handle.pVideoInputFilter, requestStr);
840 LOG(
ERROR) <<
"Request to get control: " << control <<
" failed";
847 m_implData->handle.pVideoInputFilter, responseStr);
849 LOG(
ERROR) <<
"Failed to get response of the request to get control: "
853 usb_payload::ServerResponse responseMsg;
854 bool parsed = responseMsg.ParseFromString(responseStr);
857 <<
"Failed to deserialize string containing UVC gadget response";
862 LOG(
ERROR) <<
"Get control: " << control
863 <<
" operation failed on UVC gadget";
867 value = responseMsg.strings_payload(0);
884 LOG(
ERROR) <<
"Won't return the handle. Device hasn't been opened yet.";
896 LOG(
INFO) <<
"Function used only on target!";
901 unsigned int usDelay) {
907 usb_payload::ClientRequest requestMsg;
909 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(cmd));
913 requestMsg.SerializeToString(&requestStr);
915 m_implData->handle.pVideoInputFilter, requestStr);
917 LOG(
ERROR) <<
"Request to read registers failed";
924 m_implData->handle.pVideoInputFilter, responseStr);
926 LOG(
ERROR) <<
"Failed to get response of the request to read registers";
929 usb_payload::ServerResponse responseMsg;
930 bool parsed = responseMsg.ParseFromString(responseStr);
933 <<
"Failed to deserialize string containing UVC gadget response";
938 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
943 *
data = responseMsg.int32_payload(0);
949 unsigned int usDelay) {
955 usb_payload::ClientRequest requestMsg;
957 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(cmd));
962 requestMsg.SerializeToString(&requestStr);
964 m_implData->handle.pVideoInputFilter, requestStr);
966 LOG(
ERROR) <<
"Request to write registers failed";
973 m_implData->handle.pVideoInputFilter, responseStr);
976 <<
"Failed to get response of the request to write registers";
979 usb_payload::ServerResponse responseMsg;
980 bool parsed = responseMsg.ParseFromString(responseStr);
983 <<
"Failed to deserialize string containing UVC gadget response";
988 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
996 uint8_t *readback_data,
997 uint16_t payload_len) {
1003 usb_payload::ClientRequest requestMsg;
1004 requestMsg.set_func_name(
1006 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(cmd));
1007 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(payload_len));
1008 requestMsg.add_func_bytes_param(readback_data, 4 *
sizeof(uint8_t));
1012 requestMsg.SerializeToString(&requestStr);
1014 m_implData->handle.pVideoInputFilter, requestStr);
1016 LOG(
ERROR) <<
"Request to read registers failed";
1023 m_implData->handle.pVideoInputFilter, responseStr);
1025 LOG(
ERROR) <<
"Failed to get response of the request to read registers";
1028 usb_payload::ServerResponse responseMsg;
1029 bool parsed = responseMsg.ParseFromString(responseStr);
1032 <<
"Failed to deserialize string containing UVC gadget response";
1037 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
1042 memcpy(readback_data, responseMsg.bytes_payload(0).c_str(),
1043 responseMsg.bytes_payload(0).length());
1049 uint16_t payload_len) {
1055 usb_payload::ClientRequest requestMsg;
1057 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(payload_len));
1061 requestMsg.SerializeToString(&requestStr);
1063 m_implData->handle.pVideoInputFilter, requestStr);
1065 LOG(
ERROR) <<
"Request to read registers failed";
1072 m_implData->handle.pVideoInputFilter, responseStr);
1074 LOG(
ERROR) <<
"Failed to get response of the request to read registers";
1077 usb_payload::ServerResponse responseMsg;
1078 bool parsed = responseMsg.ParseFromString(responseStr);
1081 <<
"Failed to deserialize string containing UVC gadget response";
1086 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
1091 memcpy(payload, responseMsg.bytes_payload(0).c_str(),
1092 responseMsg.bytes_payload(0).length());
1099 uint16_t payload_len) {
1105 usb_payload::ClientRequest requestMsg;
1106 requestMsg.set_func_name(
1108 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(cmd));
1109 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(payload_len));
1110 requestMsg.add_func_bytes_param(payload, payload_len);
1114 requestMsg.SerializeToString(&requestStr);
1116 m_implData->handle.pVideoInputFilter, requestStr);
1118 LOG(
ERROR) <<
"Request to write registers failed";
1125 m_implData->handle.pVideoInputFilter, responseStr);
1128 <<
"Failed to get response of the request to write registers";
1131 usb_payload::ServerResponse responseMsg;
1132 bool parsed = responseMsg.ParseFromString(responseStr);
1135 <<
"Failed to deserialize string containing UVC gadget response";
1140 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
1148 uint16_t payload_len) {
1154 usb_payload::ClientRequest requestMsg;
1156 requestMsg.add_func_int32_param(
static_cast<::
google::int32>(payload_len));
1157 requestMsg.add_func_bytes_param(payload, payload_len);
1161 requestMsg.SerializeToString(&requestStr);
1163 m_implData->handle.pVideoInputFilter, requestStr);
1165 LOG(
ERROR) <<
"Request to write registers failed";
1172 m_implData->handle.pVideoInputFilter, responseStr);
1175 <<
"Failed to get response of the request to write registers";
1178 usb_payload::ServerResponse responseMsg;
1179 bool parsed = responseMsg.ParseFromString(responseStr);
1182 <<
"Failed to deserialize string containing UVC gadget response";
1187 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
1195 LOG(
INFO) <<
"Not available!";
1201 LOG(
WARNING) <<
"Registering an interrupt callback on a USB connection "
1202 "is not supported yet!";
1208 LOG(
WARNING) <<
"Unregistering an interrupt callback on a USB connection "
1209 "is not supported yet!";
1214 int &imagerStatus) {
1221 uint16_t iniFileLength,
1223 uint16_t calDataLength) {
1229 usb_payload::ClientRequest requestMsg;
1230 requestMsg.set_func_name(
1232 requestMsg.add_func_int32_param(
1234 requestMsg.add_func_int32_param(
1236 requestMsg.add_func_bytes_param(iniFile, iniFileLength);
1237 requestMsg.add_func_bytes_param(calData, calDataLength);
1241 requestMsg.SerializeToString(&requestStr);
1244 m_implData->handle.pVideoInputFilter, requestStr);
1246 LOG(
ERROR) <<
"Request to write registers failed";
1253 m_implData->handle.pVideoInputFilter, responseStr);
1256 <<
"Failed to get response of the request to write registers";
1259 usb_payload::ServerResponse responseMsg;
1260 bool parsed = responseMsg.ParseFromString(responseStr);
1263 <<
"Failed to deserialize string containing UVC gadget response";
1268 LOG(
ERROR) <<
"Read registers operation failed on UVC gadget";
1276 std::map<std::string, std::string> &
params) {
1281 const std::map<std::string, std::string> &
params) {