bool IntelPerCStreamBase::initDevice(PXCSession *session) { if (NULL == session) return false; pxcStatus sts = PXC_STATUS_NO_ERROR; PXCSession::ImplDesc templat; memset(&templat,0,sizeof(templat)); templat.group = PXCSession::IMPL_GROUP_SENSOR; templat.subgroup= PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE; for (int modidx = 0; PXC_STATUS_NO_ERROR <= sts; modidx++) { PXCSession::ImplDesc desc; sts = session->QueryImpl(&templat, modidx, &desc); if (PXC_STATUS_NO_ERROR > sts) break; PXCSmartPtr<PXCCapture> capture; sts = session->CreateImpl<PXCCapture>(&desc, &capture); if (!capture.IsValid()) continue; /* enumerate devices */ for (int devidx = 0; PXC_STATUS_NO_ERROR <= sts; devidx++) { PXCSmartPtr<PXCCapture::Device> device; sts = capture->CreateDevice(devidx, &device); if (PXC_STATUS_NO_ERROR <= sts) { m_device = device.ReleasePtr(); return true; } } } return false; }
pxcStatus UtilCapture::LocateStreams(std::vector<PXCCapture::VideoStream::DataDesc*> &vinputs,std::vector<PXCCapture::AudioStream::DataDesc*> &ainputs) { UtilTrace trace(L"UtilCapture::LocateStreams(video)", m_session_service); if (vinputs.empty() && ainputs.empty()) return PXC_STATUS_ITEM_UNAVAILABLE; PXCCapture::AudioStream::DataDesc ainput; if (!ConsolidateAudioRequests(ainputs,&ainput)) return PXC_STATUS_ITEM_UNAVAILABLE; int n1=CalculateNumFormats(vinputs); pxcStatus sts; m_desc_filter.group=PXCSession::IMPL_GROUP_SENSOR; m_desc_filter.subgroup=(vinputs.size()>0?PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE:0)|(ainputs.size()>0?PXCSession::IMPL_SUBGROUP_AUDIO_CAPTURE:0); for (int module_idx=0;;module_idx++) { sts = CreateCapture(module_idx, m_capture.ReleaseRef()); if (sts == PXC_STATUS_ITEM_UNAVAILABLE) break; if (sts < PXC_STATUS_NO_ERROR) continue; PXCCapture::DeviceInfo dinfo; for (int device_idx=0;;device_idx++) { sts=m_capture->QueryDevice(device_idx,&dinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (m_session_service) m_session_service->TraceParam(L"Locating stream(s) on device ", dinfo.name); if (m_name_filter) if (!wcsstr(dinfo.name,m_name_filter)) continue; sts=m_capture->CreateDevice(device_idx,m_device.ReleaseRef()); if (sts<PXC_STATUS_NO_ERROR) continue; /* Match image formats */ ClearMaps(vinputs); int n2=0; bool am=(ainputs.size()>0)?false:true; for (int stream_idx=0;;stream_idx++) { PXCCapture::Device::StreamInfo sinfo; sts=m_device->QueryStream(stream_idx, &sinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (sinfo.cuid==PXCCapture::VideoStream::CUID && n2<n1) { PXCSmartPtr<PXCCapture::VideoStream> vstream; sts=m_device->CreateStream(stream_idx,PXCCapture::VideoStream::CUID,(void**)&vstream); if (sts<PXC_STATUS_NO_ERROR) break; std::list<PXCCapture::VideoStream::ProfileInfo> profiles; ScanProfiles(profiles,sinfo.imageType,vstream); int n3=MatchProfiles(vinputs,sinfo,profiles,(int)m_vstreams.size()); if (n3==0) continue; FindBestProfile(vinputs,profiles,(int)m_vstreams.size()); sts=vstream->SetProfile(&*profiles.begin()); if (sts<PXC_STATUS_NO_ERROR) break; m_vstreams.push_back(vstream.ReleasePtr()); n2+=n3; } if (sinfo.cuid==PXCCapture::AudioStream::CUID && !am) { sts=m_device->CreateStream(stream_idx, PXCCapture::AudioStream::CUID, (void**)m_astream.ReleaseRef()); if (sts<PXC_STATUS_NO_ERROR) continue; for (int profile_idx=0;;profile_idx++) { PXCCapture::AudioStream::ProfileInfo pinfo; sts=m_astream->QueryProfile(profile_idx,&pinfo); if (sts<PXC_STATUS_NO_ERROR) break; if (ainput.info.nchannels>0 && ainput.info.nchannels!=pinfo.audioInfo.nchannels) continue; if (ainput.info.sampleRate>0 && ainput.info.sampleRate!=pinfo.audioInfo.sampleRate) continue; if (ainput.info.bufferSize>0 && ainput.info.bufferSize!=pinfo.audioInfo.bufferSize) continue; if (ainput.info.channelMask>0 && ainput.info.channelMask!=pinfo.audioInfo.channelMask) continue; sts=m_astream->SetProfile(&pinfo); if (sts<PXC_STATUS_NO_ERROR) break; for (int i=0;i<(int)ainputs.size();i++) { memcpy_s(&ainputs[i]->info,sizeof(ainputs[i]->info),&pinfo.audioInfo,sizeof(pinfo.audioInfo)); ainputs[i]->options=pinfo.audioOptions; } am=true; break; } if (sts<PXC_STATUS_NO_ERROR) m_astream.ReleaseRef(); } if (sts>=PXC_STATUS_NO_ERROR && n2>=n1 && am) break; } if (sts>=PXC_STATUS_NO_ERROR && n2>=n1 && am) if (RecordProperties(vinputs)) break; DeleteStreams(); m_device.ReleaseRef(); } if (sts>=PXC_STATUS_NO_ERROR) { if (m_session_service) m_session_service->TraceParam(L"Successfully located streams on device ", dinfo.name); // update actual image size for (int i = 0; i < (int)vinputs.size() && i < (int)m_maps.size(); i++) { for (int c = 0; c < PXCCapture::VideoStream::STREAM_LIMIT; c++) { PXCCapture::VideoStream::ProfileInfo info; if (m_maps[i][c]<0) break; PXCCapture::VideoStream* vstream = m_vstreams[m_maps[i][c]]; if (!vstream) break; if (vstream->QueryProfile(&info) >= PXC_STATUS_NO_ERROR) { vinputs[i]->streams[c].sizeMin.width = info.imageInfo.width; vinputs[i]->streams[c].sizeMin.height = info.imageInfo.height; vinputs[i]->streams[c].sizeMax.width = info.imageInfo.width; vinputs[i]->streams[c].sizeMax.height = info.imageInfo.height; } } } break; } m_capture.ReleaseRef(); } return sts; }