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; }
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); }