本文整理汇总了C++中VideoStream::lockFrame方法的典型用法代码示例。如果您正苦于以下问题:C++ VideoStream::lockFrame方法的具体用法?C++ VideoStream::lockFrame怎么用?C++ VideoStream::lockFrame使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VideoStream
的用法示例。
在下文中一共展示了VideoStream::lockFrame方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: waitForStreams
OniStatus Context::waitForStreams(OniStreamHandle* pStreams, int streamCount, int* pStreamIndex, int timeout)
{
static const int MAX_WAITED_STREAMS = 50;
Device* deviceList[MAX_WAITED_STREAMS];
VideoStream* streamsList[MAX_WAITED_STREAMS];
unsigned long long oldestTimestamp = XN_MAX_UINT64;
int oldestIndex = -1;
if (streamCount > MAX_WAITED_STREAMS)
{
m_errorLogger.Append("Cannot wait on more than %d streams", MAX_WAITED_STREAMS);
return ONI_STATUS_NOT_SUPPORTED;
}
int numDevices = 0;
for (int i = 0; i < streamCount; ++i)
{
if (pStreams[i] == NULL)
{
continue;
}
streamsList[i] = ((_OniStream*)pStreams[i])->pStream;
Device* pDevice = &streamsList[i]->getDevice();
// Check if device already exists.
bool found = false;
for (int j = 0; j < numDevices; ++j)
{
if (deviceList[j] == pDevice)
{
found = true;
break;
}
}
// Add new device to list.
if (!found)
{
deviceList[numDevices] = pDevice;
++numDevices;
}
}
XN_EVENT_HANDLE hEvent = getThreadEvent();
XnUInt64 passedTime;
XnOSTimer workTimer;
XnUInt32 timeToWait = timeout;
xnOSStartTimer(&workTimer);
do
{
for (int i = 0; i < streamCount; ++i)
{
if (pStreams[i] == NULL)
continue;
VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream;
pStream->lockFrame();
OniFrame* pFrame = pStream->peekFrame();
if (pFrame != NULL && pFrame->timestamp < oldestTimestamp)
{
oldestTimestamp = pFrame->timestamp;
oldestIndex = i;
}
pStream->unlockFrame();
}
if (oldestIndex != -1)
{
*pStreamIndex = oldestIndex;
break;
}
// 'Poke' the driver to attempt to receive more frames.
for (int j = 0; j < numDevices; ++j)
{
deviceList[j]->tryManualTrigger();
}
if(timeout != ONI_TIMEOUT_FOREVER)
{
xnOSQueryTimer(workTimer, &passedTime);
if((int)passedTime < timeout)
timeToWait = timeout - (int)passedTime;
else
timeToWait = 0;
}
} while (XN_STATUS_OK == xnOSWaitEvent(hEvent, timeToWait));
xnOSStopTimer(&workTimer);
if (oldestIndex != -1)
{
return ONI_STATUS_OK;
}
//.........这里部分代码省略.........
示例2: waitForStreams
OniStatus Context::waitForStreams(OniStreamHandle* pStreams, int streamCount, int* pStreamIndex, int timeout)
{
static const int MAX_WAITED_DEVICES = 20;
Device* deviceList[MAX_WAITED_DEVICES];
unsigned long long oldestTimestamp = XN_MAX_UINT64;
int oldestIndex = -1;
int numDevices = 0;
for (int i = 0; i < streamCount; ++i)
{
if (pStreams[i] != NULL)
{
VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream;
Device* pDevice = &pStream->getDevice();
// Check if device already exists.
bool found = false;
for (int j = 0; j < numDevices; ++j)
{
if (deviceList[j] == pDevice)
{
found = true;
break;
}
}
// Add new device to list.
if (!found)
{
if (numDevices < MAX_WAITED_DEVICES)
{
deviceList[numDevices] = pDevice;
++numDevices;
}
else
{
// Cannot wait on streams from more than MAX_WAITED_DEVICES devices.
return ONI_STATUS_NOT_SUPPORTED;
}
}
}
}
do
{
for (int i = 0; i < streamCount; ++i)
{
if (pStreams[i] == NULL)
continue;
VideoStream* pStream = ((_OniStream*)pStreams[i])->pStream;
pStream->lockFrame();
OniFrame* pFrame = pStream->peekFrame();
if (pFrame != NULL && pFrame->timestamp < oldestTimestamp)
{
oldestTimestamp = pFrame->timestamp;
oldestIndex = i;
}
pStream->unlockFrame();
}
if (oldestIndex != -1)
{
*pStreamIndex = oldestIndex;
return ONI_STATUS_OK;
}
// 'Poke' the driver to attempt to receive more frames.
for (int j = 0; j < numDevices; ++j)
{
deviceList[j]->tryManualTrigger();
}
} while (m_newFrameAvailableEvent.Wait(timeout) == XN_STATUS_OK);
m_errorLogger.Append("waitForStreams: timeout reached");
return ONI_STATUS_TIME_OUT;
}