Esempio n. 1
0
XnStatus GeneralPropRecord::Decode()
{
	XnStatus nRetVal = XN_STATUS_OK;
	nRetVal = StartRead();
	XN_IS_STATUS_OK(nRetVal);
	nRetVal = ReadString(m_strPropName);
	XN_IS_STATUS_OK(nRetVal);
	nRetVal = Read(&m_nPropDataSize, sizeof(m_nPropDataSize));
	XN_IS_STATUS_OK(nRetVal);

	//The property data is not copied but just pointed to
	XnUInt8* pData = const_cast<XnUInt8*>(GetReadPos());

#if (XN_PLATFORM == XN_PLATFORM_LINUX_ARM || XN_PLATFORM == XN_PLATFORM_ARC || XN_PLATFORM == XN_PLATFORM_ANDROID_ARM)
	// under ARM we have some alignment issues. Move this buffer so it will be aligned.
	XnUInt32 nAlignFix = XN_DEFAULT_MEM_ALIGN - ((XnUInt32)pData % XN_DEFAULT_MEM_ALIGN);
	if (nAlignFix != 0)
	{
		xnOSMemMove(pData + nAlignFix, pData, m_nPropDataSize);
		pData += nAlignFix;
	}
#endif

	m_pPropData = pData;

	XN_IS_STATUS_OK(nRetVal);
	return XN_STATUS_OK;
}
Esempio n. 2
0
XnStatus Link24zYuv422Parser::ParsePacketImpl(XnLinkFragmentation fragmentation, const XnUInt8* pSrc, const XnUInt8* pSrcEnd, XnUInt8*& pDst, const XnUInt8* pDstEnd)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	if ((fragmentation | XN_LINK_FRAG_BEGIN) != 0)
	{
		m_dataFromPrevPacketBytes = 0;
		m_tempYuvImageBytes = 0;
	}

	const XnUInt8* pInput = pSrc;
	XnSizeT inputSize = pSrcEnd - pSrc;

	// if there's data left from previous packet, append new data to it
	if (m_dataFromPrevPacketBytes > 0)
	{
		if (m_dataFromPrevPacketBytes + inputSize > m_expectedFrameSize)
		{
			XN_ASSERT(FALSE);
			m_dataFromPrevPacketBytes = 0;
			return XN_STATUS_OUTPUT_BUFFER_OVERFLOW;
		}

		xnOSMemCopy(m_dataFromPrevPacket, pSrc, inputSize);
		pInput = m_dataFromPrevPacket;
		inputSize = m_dataFromPrevPacketBytes + inputSize;
	}

	XnUInt8* pOutput = pDst;
	XnSizeT outputSize = pDstEnd - pDst;

	if (m_transformToRGB)
	{
		pOutput = m_tempYuvImage + m_tempYuvImageBytes;
		outputSize = m_rgbFrameSize - m_tempYuvImageBytes;
	}
	
	XnSizeT actualRead;
	nRetVal = Uncompress24z(pInput, inputSize, pOutput, &outputSize, m_lineWidthBytes, &actualRead, (fragmentation | XN_LINK_FRAG_END) == XN_LINK_FRAG_END);
	XN_IS_STATUS_OK(nRetVal);

	pDst += outputSize;

	// if we have bytes left, keep them for next packet
	if (actualRead < inputSize)
	{
		m_dataFromPrevPacketBytes = inputSize - actualRead;
		xnOSMemMove(m_dataFromPrevPacket, pInput + actualRead, m_dataFromPrevPacketBytes);
	}

	if ((fragmentation | XN_LINK_FRAG_END) != 0)
	{
		outputSize = pDstEnd - pDst;
		LinkYuvToRgb::Yuv422ToRgb888(m_tempYuvImage, m_tempYuvImageBytes, pDst, outputSize);
		pDst += outputSize;
	}
	
	return (XN_STATUS_OK);
}