Beispiel #1
0
XnStatus XnDeviceBase::IsNewDataAvailable(const XnChar* StreamName, XnBool* pbNewDataAvailable, XnUInt64* pnTimestamp)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(StreamName);
	XN_VALIDATE_OUTPUT_PTR(pbNewDataAvailable);

	*pbNewDataAvailable = FALSE;

	if (strcmp(StreamName, XN_PRIMARY_STREAM_ANY) == 0)
	{
		const XnChar* aStreamNames[100];
		XnUInt32 nCount = 100;

		nRetVal = GetStreamNames(aStreamNames, &nCount);
		XN_IS_STATUS_OK(nRetVal);

		for (XnUInt32 i = 0; i < nCount; ++i)
		{
			// find stream
			XnDeviceStream* pStream = NULL;
			nRetVal = FindStream(StreamName, &pStream);
			XN_IS_STATUS_OK(nRetVal);

			if (pStream->IsNewDataAvailable())
			{
				*pbNewDataAvailable = TRUE;
				*pnTimestamp = pStream->GetLastTimestamp();
				break;
			}
		}
	}
	else
	{
		// find stream
		XnDeviceStream* pStream = NULL;
		nRetVal = FindStream(StreamName, &pStream);
		XN_IS_STATUS_OK(nRetVal);

		if (pStream->IsNewDataAvailable())
		{
			*pbNewDataAvailable = TRUE;
			*pnTimestamp = pStream->GetLastTimestamp();
		}
	}

	return (XN_STATUS_OK);
}
Beispiel #2
0
XnStatus XnSensor::GetBufferPool(const XnChar* strStream, XnBufferPool** ppBufferPool)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XnDeviceModuleHolder* pHolder;
	nRetVal = FindStream(strStream, &pHolder);
	XN_IS_STATUS_OK(nRetVal);

	XnSensorStreamHolder* pSensorStreamHolder = (XnSensorStreamHolder*)(pHolder);
	XnDeviceStream* pStream = pSensorStreamHolder->GetStream();

	XnUInt64 nFrameBased;
	nRetVal = pStream->GetProperty(XN_STREAM_PROPERTY_IS_FRAME_BASED, &nFrameBased);
	XN_IS_STATUS_OK(nRetVal);

	if (nFrameBased == 0)
	{
		return XN_STATUS_BAD_TYPE;
	}

	XnFrameStream* pFrameStream = (XnFrameStream*)pStream;
	*ppBufferPool = pFrameStream->GetBufferPool();
	
	return (XN_STATUS_OK);
}
Beispiel #3
0
XnStatus XnDeviceBase::WriteStream(XnStreamData* pStreamData)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XN_VALIDATE_INPUT_PTR(pStreamData);

	if (m_ReadWriteMode.GetValue() != XN_DEVICE_MODE_WRITE)
	{
		return XN_STATUS_IO_DEVICE_WRONG_MODE;
	}

	// take the stream to write
	XnDeviceStream* pStream;
	nRetVal = FindStream(pStreamData->StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	// make sure it is open
	if (!pStream->IsOpen())
	{
		return XN_STATUS_STREAM_NOT_OPEN;
	}

	// and write
	nRetVal = pStream->Write(pStreamData);
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
Beispiel #4
0
XnStatus XnDeviceBase::ReadStream(XnStreamData* pStreamOutput)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(pStreamOutput);

	if (m_ReadWriteMode.GetValue() == XN_DEVICE_MODE_WRITE)
	{
		return XN_STATUS_IO_DEVICE_WRONG_MODE;
	}

	// take the stream to read
	XnDeviceStream* pStream;
	nRetVal = FindStream(pStreamOutput->StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	// make sure it is open
	if (!pStream->IsNewDataAvailable() && !pStream->IsOpen())
	{
		return XN_STATUS_STREAM_NOT_OPEN;
	}

	// wait for it to advance
	nRetVal = WaitForStream(m_hNewDataEvent, pStream);
	XN_IS_STATUS_OK(nRetVal);

	// and read
	nRetVal = ReadFromStreamImpl(pStream, pStreamOutput);
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
XnStatus XnDeviceFileWriter::DestroyStream(const XnChar* StreamName)
{
	XnStatus nRetVal = XN_STATUS_OK;

	// before closing this stream, we want to write down how many frames were written
	XnFileWriterStream* pStream;
	nRetVal = FindStream(StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	XnUInt64 nCurPos;
	nRetVal = GetIOStream()->Tell(&nCurPos);
	XN_IS_STATUS_OK(nRetVal);

	nRetVal = GetIOStream()->Seek(pStream->m_nNumFramesPos);
	XN_IS_STATUS_OK(nRetVal);

	nRetVal = GetDataPacker()->WriteProperty(StreamName, XN_STREAM_PROPERTY_NUMBER_OF_FRAMES, pStream->GetNumberOfFrames());
	XN_IS_STATUS_OK(nRetVal);

	// now seek back
	nRetVal = GetIOStream()->Seek(nCurPos);
	XN_IS_STATUS_OK(nRetVal);

	// and destroy it
	nRetVal = XnStreamWriterDevice::DestroyStream(StreamName);
	XN_IS_STATUS_OK(nRetVal);

	return (XN_STATUS_OK);
}
XnStatus XnDeviceFileReader::HandleStreamData(XnStreamData* pDataProps, XnCompressionFormats nCompression, XnUInt32 nCompressedSize)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XnUInt64 nPosition;
	nRetVal = GetIOStream()->Tell(&nPosition);
	XN_IS_STATUS_OK(nRetVal);

	XnUIntHash::Iterator it = m_PositionsToIgnore.End();
	if (XN_STATUS_OK == m_PositionsToIgnore.Find(nPosition, it))
	{
		// ignore this one. Just update the frame ID
		XnStreamDeviceStreamHolder* pHolder;
		nRetVal = FindStream(pDataProps->StreamName, &pHolder);
		XN_IS_STATUS_OK(nRetVal);

		XnStreamReaderStream* pStream = (XnStreamReaderStream*)pHolder->GetStream();
		pStream->NewDataAvailable(pDataProps->nTimestamp, pDataProps->nFrameID);

		// and remove it from list
		nRetVal = m_PositionsToIgnore.Remove(it);
		XN_IS_STATUS_OK(nRetVal);
	}
	else
	{
		// normal case. handle it
		nRetVal = XnStreamReaderDevice::HandleStreamData(pDataProps, nCompression, nCompressedSize);
		XN_IS_STATUS_OK(nRetVal);
	}
	
	return (XN_STATUS_OK);
}
Beispiel #7
0
XnStatus XnDeviceBase::DestroyStream(const XnChar* StreamName)
{
	XnStatus nRetVal = XN_STATUS_OK;

	xnLogInfo(XN_MASK_DDK, "Destroying stream '%s'...", StreamName);

	// keep the stream name (we now delete the module, so the name will be lost)
	XnChar strStreamName[XN_DEVICE_MAX_STRING_LENGTH];
	strncpy(strStreamName, StreamName, XN_DEVICE_MAX_STRING_LENGTH);

	// Find the stream
	XnDeviceModuleHolder* pStreamHolder;
	nRetVal = FindStream(strStreamName, &pStreamHolder);
	XN_IS_STATUS_OK(nRetVal);

	// remove it from map
	nRetVal = RemoveModule(strStreamName);
	XN_IS_STATUS_OK(nRetVal);

	// and free it's memory
	DestroyStreamModule(pStreamHolder);

	// free memory of registered properties to this stream
	FreeModuleRegisteredProperties(StreamName);

	// raise event
	m_OnStreamsChangeEvent.Raise(GetDeviceHandle(), strStreamName, XN_DEVICE_STREAM_DELETED);

	xnLogVerbose(XN_MASK_DDK, "'%s' stream destroyed.", strStreamName);

	return XN_STATUS_OK;
}
Beispiel #8
0
XnStatus XnDeviceBase::FindStream(const XnChar* StreamName, XnDeviceStream** ppStream)
{
	// find the module
	XnDeviceModuleHolder* pStreamHolder = NULL;
	XnStatus nRetVal = FindStream(StreamName, &pStreamHolder);
	XN_IS_STATUS_OK(nRetVal);

	*ppStream = (XnDeviceStream*)pStreamHolder->GetModule();

	return XN_STATUS_OK;
}
XnBool XnSensor::HasSynchedFrameArrived(const XnChar* strDepthStream, const XnChar* strImageStream)
{
	// find both streams
	XnDeviceStream* pDepth;
	XnDeviceStream* pImage;

	if (XN_STATUS_OK != FindStream(strDepthStream, &pDepth))
		return FALSE;

	if (XN_STATUS_OK != FindStream(strImageStream, &pImage))
		return FALSE;

	XnUInt32 nThreshold = XN_SENSOR_FRAME_SYNC_MAX_DIFF;
	if (IsHighResTimestamps())
		nThreshold *= 1000;

	// wait for both to advance, and time difference to be less than threshold
	XnInt32 nTimestampDiff = XnInt32(pDepth->GetLastTimestamp() - pImage->GetLastTimestamp());

	XnBool bConditionMet = (
		pDepth->IsNewDataAvailable() &&
		pImage->IsNewDataAvailable() &&
		(XnUInt32)abs(nTimestampDiff) <= nThreshold
		);

	if (xnLogIsDumpMaskEnabled(XN_DUMP_FRAME_SYNC))
	{
		XnUInt64 nNow;
		xnOSGetHighResTimeStamp(&nNow);
		xnDumpWriteString(m_FrameSyncDump, "%llu,%u,%llu,%u,%llu,%s\n",
			nNow,
			pDepth->IsNewDataAvailable(),
			pDepth->GetLastTimestamp(),
			pImage->IsNewDataAvailable(),
			pImage->GetLastTimestamp(),
			bConditionMet ? "OK" : "Waiting");
	}

	return bConditionMet;
}
int main() {

    int stream[]= {1, 2, 3, 4};

    int n=sizeof(stream)/sizeof(stream[0]);

    FindStream(stream,n);




    return 0;
}
Beispiel #11
0
XnStatus XnSensor::GetStream(const XnChar* strStream, XnDeviceStream** ppStream)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XnDeviceModuleHolder* pHolder;
	nRetVal = FindStream(strStream, &pHolder);
	XN_IS_STATUS_OK(nRetVal);

	XnSensorStreamHolder* pSensorStreamHolder = (XnSensorStreamHolder*)(pHolder);
	*ppStream = pSensorStreamHolder->GetStream();

	return XN_STATUS_OK;
}
Beispiel #12
0
XnStatus XnSensor::GetSharedBufferPool(const XnChar* strStream, XnSharedMemoryBufferPool** ppBufferPool)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XnDeviceModuleHolder* pHolder;
	nRetVal = FindStream(strStream, &pHolder);
	XN_IS_STATUS_OK(nRetVal);

	XnSensorStreamHolder* pSensorStreamHolder = (XnSensorStreamHolder*)(pHolder);
	*ppBufferPool = pSensorStreamHolder->GetSharedBufferPool();
	
	return (XN_STATUS_OK);
}
Beispiel #13
0
XnStatus XnDeviceBase::GetStreamRequiredDataSize(const XnChar* StreamName, XnUInt32* pnRequiredSize)
{
	XnStatus nRetVal = XN_STATUS_OK;

	// find stream
	XnDeviceStream* pStream;
	nRetVal = FindStream(StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	*pnRequiredSize = pStream->GetRequiredDataSize();

	return XN_STATUS_OK;
}
Beispiel #14
0
XnStatus XnSensorClient::HandlePackedObject(XnPackedDataType nObjectType)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XnUInt32 nDataSize = sizeof(m_LastReply);

	switch (nObjectType)
	{
	case XN_SENSOR_SERVER_MESSAGE_GENERAL_OP_RESPOND:
	case XN_SENSOR_SERVER_MESSAGE_GET_INT_PROPERTY:
	case XN_SENSOR_SERVER_MESSAGE_GET_REAL_PROPERTY:
	case XN_SENSOR_SERVER_MESSAGE_GET_STRING_PROPERTY:
	case XN_SENSOR_SERVER_MESSAGE_GET_GENERAL_PROPERTY:
	case XN_SENSOR_SERVER_MESSAGE_READ_STREAM:
	case XN_SENSOR_SERVER_MESSAGE_BYE:
		{
			nRetVal = GetDataPacker()->ReadCustomData(nObjectType, &m_LastReply, &nDataSize);
			XN_IS_STATUS_OK(nRetVal);

			nRetVal = xnOSSetEvent(m_hReplyEvent);
			XN_IS_STATUS_OK(nRetVal);
			break;
		}
	case XN_SENSOR_SERVER_MESSAGE_NEW_STREAM_DATA:
		{
			XnSensorServerNewStreamData message;
			XnUInt32 nDataSize = sizeof(message);
			nRetVal = GetDataPacker()->ReadCustomData(nObjectType, &message, &nDataSize);
			XN_IS_STATUS_OK(nRetVal);

			// find the stream
			XnStreamDeviceStreamHolder* pHolder = NULL;
			nRetVal = FindStream(message.strStreamName, &pHolder);
			XN_IS_STATUS_OK(nRetVal);

			pHolder->GetStream()->NewDataAvailable(message.nTimestamp, message.nFrameID);
			break;
		}
	default:
		{
			nRetVal = XnStreamReaderDevice::HandlePackedObject(nObjectType);
			XN_IS_STATUS_OK(nRetVal);
		}
	}
	
	return (XN_STATUS_OK);
}
  //
  // HaveTarget
  //
  // True if target is alive (will attempt to setup if not)  
  //
  Bool FileSrcStream::HaveTarget()
  {
    // Is the target already alive
    if (target.Alive())
    {
      return (TRUE);
    }

    // Try and find the target
    ResourceStream *s = FindStream(targetName.crc);

    // Setup our reaper
    target = s;

    // Return TRUE if we found the target
    return (s ? TRUE : FALSE);
  }
Beispiel #16
0
XnBool XnDeviceBase::HasPrimaryStreamAdvanced(XnStreamDataSet* pOutputSet)
{
	if (strcmp(m_PrimaryStream.GetValue(), XN_PRIMARY_STREAM_NONE) == 0)
	{
		// special case of None: condition is always true
		return TRUE;
	}

	const XnChar* astrNames[XN_DEVICE_BASE_MAX_STREAMS_COUNT];
	XnUInt32 nArraySize = XN_DEVICE_BASE_MAX_STREAMS_COUNT;

	// take a list of streams to check for new data
	if (strcmp(m_PrimaryStream.GetValue(), XN_PRIMARY_STREAM_ANY) != 0)
	{
		// we have a specific stream. Add it to the list
		astrNames[0] = m_PrimaryStream.GetValue();
		nArraySize = 1;
	}
	else
	{
		// special case of ANY. we need to check every one of requested streams
		XnStreamData* apStreamOutputs[XN_DEVICE_BASE_MAX_STREAMS_COUNT];
		if (XN_STATUS_OK != XnStreamDataSetCopyToArray(pOutputSet, apStreamOutputs, &nArraySize))
		{
			return FALSE;
		}

		for (XnUInt32 i = 0; i < nArraySize; ++i)
		{
			astrNames[i] = apStreamOutputs[i]->StreamName;
		}
	}

	// now check if we have new data
	for (XnUInt32 i = 0; i < nArraySize; ++i)
	{
		XnDeviceStream* pStream = NULL;
		if (XN_STATUS_OK == FindStream(astrNames[i], &pStream))
		{
			if (pStream->IsNewDataAvailable())
				return TRUE;
		}
	}

	return FALSE;
}
Beispiel #17
0
XnStatus XnDeviceBase::CreateStreamData(const XnChar* StreamName, XnStreamData** ppStreamData)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XN_VALIDATE_INPUT_PTR(StreamName);
	XN_VALIDATE_OUTPUT_PTR(ppStreamData);

	// find stream
	XnDeviceStream* pStream;
	nRetVal = FindStream(StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	// and create stream output
	nRetVal = pStream->CreateStreamData(ppStreamData);
	XN_IS_STATUS_OK(nRetVal);
	
	return (XN_STATUS_OK);
}
Beispiel #18
0
XnStatus XnSensorClient::HandleNewStream(const XnChar* strType, const XnChar* strName, const XnActualPropertiesHash* pInitialValues)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	nRetVal = XnStreamReaderDevice::HandleNewStream(strType, strName, pInitialValues);
	XN_IS_STATUS_OK(nRetVal);

	// open shared memory
	XnStreamDeviceStreamHolder* pHolder = NULL;
	nRetVal = FindStream(strName, &pHolder);
	XN_IS_STATUS_OK(nRetVal);

	XnSensorClientStream* pStream = (XnSensorClientStream*)pHolder->GetStream();
	nRetVal = pStream->OpenSharedMemory();
	XN_IS_STATUS_OK(nRetVal);
	
	return (XN_STATUS_OK);
}
Beispiel #19
0
XnStatus XnDeviceBase::Read(XnStreamDataSet* pStreamOutputSet)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(pStreamOutputSet);

	if (m_ReadWriteMode.GetValue() == XN_DEVICE_MODE_WRITE)
	{
		return XN_STATUS_IO_DEVICE_WRONG_MODE;
	}

	XnUInt64 nNow;
	xnOSGetHighResTimeStamp(&nNow);
	xnDumpFileWriteString(m_StreamsDataDump, "%llu,Read Called\n", nNow);

	// First thing to do is wait for primary stream to advance. We do this BEFORE checking streams
	// because device streams might change during this wait.
	nRetVal = WaitForPrimaryStream(m_hNewDataEvent, pStreamOutputSet);
	XN_IS_STATUS_OK(nRetVal);

	xnOSGetHighResTimeStamp(&nNow);
	xnDumpFileWriteString(m_StreamsDataDump, "%llu,Read Condition Met\n", nNow);

	// take the list of stream output objects
	XnStreamData* apStreamOutputs[XN_DEVICE_BASE_MAX_STREAMS_COUNT];
	XnUInt32 nOutputsCount = XN_DEVICE_BASE_MAX_STREAMS_COUNT;

	nRetVal = XnStreamDataSetCopyToArray(pStreamOutputSet, apStreamOutputs, &nOutputsCount);
	XN_IS_STATUS_OK(nRetVal);

	// now read
	for (XnUInt32 nIndex = 0; nIndex < nOutputsCount; ++nIndex)
	{
		// find its corresponding stream
		XnDeviceStream* pStream;
		nRetVal = FindStream(apStreamOutputs[nIndex]->StreamName, &pStream);
		XN_IS_STATUS_OK(nRetVal);

		nRetVal = ReadFromStreamImpl(pStream, apStreamOutputs[nIndex]);
		XN_IS_STATUS_OK(nRetVal);
	}

	return (XN_STATUS_OK);
}
Beispiel #20
0
XnStatus XnDeviceBase::Write(XnStreamDataSet* pStreamDataSet)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	XN_VALIDATE_INPUT_PTR(pStreamDataSet);

	if (m_ReadWriteMode.GetValue() != XN_DEVICE_MODE_WRITE)
	{
		return XN_STATUS_IO_DEVICE_WRONG_MODE;
	}

	// take the list of stream output objects
	XnStreamData* apStreamOutputs[XN_DEVICE_BASE_MAX_STREAMS_COUNT];
	XnUInt32 nOutputsCount = XN_DEVICE_BASE_MAX_STREAMS_COUNT;

	nRetVal = XnStreamDataSetCopyToArray(pStreamDataSet, apStreamOutputs, &nOutputsCount);
	XN_IS_STATUS_OK(nRetVal);

	// find the stream for each one
	XnDeviceStream* apStreams[XN_DEVICE_BASE_MAX_STREAMS_COUNT];

	for (XnUInt32 nIndex = 0; nIndex < nOutputsCount; ++nIndex)
	{
		// find its corresponding stream
		nRetVal = FindStream(apStreamOutputs[nIndex]->StreamName, &apStreams[nIndex]);
		XN_IS_STATUS_OK(nRetVal);

		// make sure it is open
		if (!apStreams[nIndex]->IsOpen())
		{
			return XN_STATUS_STREAM_NOT_OPEN;
		}
	}

	// go over them, and write into each one
	for (XnUInt32 nIndex = 0; nIndex < nOutputsCount; ++nIndex)
	{
		nRetVal = apStreams[nIndex]->Write(apStreamOutputs[nIndex]);
		XN_IS_STATUS_OK(nRetVal);
	}
	
	return (XN_STATUS_OK);
}
Beispiel #21
0
XnStatus XnDeviceBase::CloseStream(const XnChar* StreamName)
{
	XnStatus nRetVal = XN_STATUS_OK;

	XN_VALIDATE_INPUT_PTR(StreamName);

	xnLogVerbose(XN_MASK_DDK, "Closing stream %s...", StreamName);

	// find this stream
	XnDeviceStream* pStream;
	nRetVal = FindStream(StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);

	// close it
	nRetVal = pStream->Close();
	XN_IS_STATUS_OK(nRetVal);

	xnLogInfo(XN_MASK_DDK, "Stream %s is closed.", StreamName);

	return (XN_STATUS_OK);
}
XnStatus XnDeviceFileWriter::CreateStream(const XnChar* StreamType, const XnChar* StreamName /* = NULL */, const XnPropertySet* pInitialValues /* = NULL */)
{
	XnStatus nRetVal = XN_STATUS_OK;

	// create stream using base (this will also write it down to the file)
	nRetVal = XnStreamWriterDevice::CreateStream(StreamType, StreamName, pInitialValues);
	XN_IS_STATUS_OK(nRetVal);

	// now, we leave a place for a property change - the number of frames. We will update this
	// property once the stream is closed.
	XnFileWriterStream* pStream;
	nRetVal = FindStream(StreamName, &pStream);
	XN_IS_STATUS_OK(nRetVal);
	nRetVal = GetIOStream()->Tell(&pStream->m_nNumFramesPos);
	XN_IS_STATUS_OK(nRetVal);

	nRetVal = GetDataPacker()->WriteProperty(StreamName, XN_STREAM_PROPERTY_NUMBER_OF_FRAMES, 0ULL);
	XN_IS_STATUS_OK(nRetVal);
	
	return (XN_STATUS_OK);
}
Beispiel #23
0
XnStatus XnDeviceBase::DestroyStream(const XnChar* StreamName)
{
    XnStatus nRetVal = XN_STATUS_OK;

    xnLogInfo(XN_MASK_DDK, "Destroying stream '%s'...", StreamName);

    // keep the stream name (we now delete the module, so the name will be lost)
    XnChar strStreamName[XN_DEVICE_MAX_STRING_LENGTH];
    strncpy(strStreamName, StreamName, XN_DEVICE_MAX_STRING_LENGTH);

    xnl::AutoCSLocker lock(m_hLock);

    // Find the stream
    XnDeviceModuleHolder* pStreamHolder;
    nRetVal = FindStream(strStreamName, &pStreamHolder);
    XN_IS_STATUS_OK(nRetVal);

    XnDeviceStream* pStream = (XnDeviceStream*)pStreamHolder->GetModule();
    XnUInt32 nRefCount = pStream->DecRef();
    if (0 == nRefCount)
    {
        // remove it from map
        nRetVal = RemoveModule(strStreamName);
        XN_IS_STATUS_OK(nRetVal);

        // and free it's memory
        DestroyStreamModule(pStreamHolder);

        // free memory of registered properties to this stream
        FreeModuleRegisteredProperties(StreamName);

        xnLogVerbose(XN_MASK_DDK, "'%s' stream destroyed.", strStreamName);
    }
    else
    {
        xnLogVerbose(XN_MASK_DDK, "'%s' stream now has %d references.", strStreamName, nRefCount);
    }

    return XN_STATUS_OK;
}
Beispiel #24
0
XnStatus XnDeviceBase::SetPrimaryStream(const XnChar* strPrimaryStream)
{
	XnStatus nRetVal = XN_STATUS_OK;

	if (strcmp(strPrimaryStream, XN_PRIMARY_STREAM_ANY) != 0 &&
		strcmp(strPrimaryStream, XN_PRIMARY_STREAM_NONE) != 0)
	{
		// specific stream. check it exists
		XnDeviceStream* pStream;
		nRetVal = FindStream(strPrimaryStream, &pStream);
		if (nRetVal != XN_STATUS_OK)
		{
			return XN_STATUS_UNSUPPORTED_STREAM;
		}
	}

	// OK. set the value
	nRetVal = m_PrimaryStream.UnsafeUpdateValue(strPrimaryStream);
	XN_IS_STATUS_OK(nRetVal);
	
	return (XN_STATUS_OK);
}
XnStatus XnStreamReaderDevice::HandleStreamData(XnStreamData* pDataProps, XnCompressionFormats nCompression, XnUInt32 nCompressedSize)
{
	XnStatus nRetVal = XN_STATUS_OK;
	
	// find the stream
	XnStreamDeviceStreamHolder* pStreamHolder;
	nRetVal = FindStream(pDataProps->StreamName, &pStreamHolder);
	XN_IS_STATUS_OK(nRetVal);

	XnStreamReaderStream* pStream = (XnStreamReaderStream*)pStreamHolder->GetStream();

	XnStreamData* pStreamData = pStream->GetStreamData();

	// check size
	nRetVal = XnStreamDataCheckSize(pStreamData, pStream->GetRequiredDataSize());
	XN_IS_STATUS_OK(nRetVal);

	nRetVal = GetDataPacker()->ReadStreamData(pStreamData, pStreamHolder->GetCodec());
	XN_IS_STATUS_OK(nRetVal);

	pStream->NewDataAvailable(pStreamData->nTimestamp, pStreamData->nFrameID);
	
	return (XN_STATUS_OK);
}
Beispiel #26
0
bool Multiplexer::SendWaypointToGPS(RoutePoint *prp, wxString &com_name, wxGauge *pProgress)
{
    bool ret_bool = false;
    DataStream *old_stream = FindStream( com_name );
    if( old_stream ) {
        SaveStreamProperties( old_stream );
        StopAndRemoveStream( old_stream );
    }      
    
#ifdef USE_GARMINHOST
#ifdef __WXMSW__
    if(com_name.Upper().Matches(_T("*GARMIN*"))) // Garmin USB Mode
    {
//        if(m_pdevmon)
//            m_pdevmon->StopIOThread(true);

        int v_init = Garmin_GPS_Init(wxString(_T("usb:")));

        if(v_init < 0)
        {
            wxString msg(_T(" Garmin USB GPS could not be initialized"));
            wxLogMessage(msg);
            msg.Printf(_T(" Error Code is %d"), v_init);
            wxLogMessage(msg);
            msg = _T(" LastGarminError is: ");
            msg += GetLastGarminError();
            wxLogMessage(msg);

            ret_bool = false;
        }
        else
        {
            wxLogMessage(_T("Garmin USB Initialized"));

            wxString msg = _T("USB Unit identifies as: ");
            wxString GPS_Unit = Garmin_GPS_GetSaveString();
            msg += GPS_Unit;
            wxLogMessage(msg);

            wxLogMessage(_T("Sending Waypoint..."));

            // Create a RoutePointList with one item
            RoutePointList rplist;
            rplist.Append(prp);

            int ret1 = Garmin_GPS_SendWaypoints(wxString(_T("usb:")), &rplist);

            if(ret1 != 1)
            {
                wxLogMessage(_T(" Error Sending Waypoint to Garmin USB"));
                wxString msg;
                msg = _T(" LastGarminError is: ");
                msg += GetLastGarminError();
                wxLogMessage(msg);

                ret_bool = false;
            }
            else
                ret_bool = true;
        }

//        if(m_pdevmon)
//            m_pdevmon->RestartIOThread();

        return ret_bool;
    }
#endif

    // Are we using Garmin Host mode for uploads?
    if(g_bGarminHostUpload)
    {
        RoutePointList rplist;
        int ret_val;

        wxString short_com = com_name.Mid(7);
        // Initialize the Garmin receiver, build required Jeeps internal data structures
        int v_init = Garmin_GPS_Init(short_com);
        if(v_init < 0)
        {
            wxString msg(_T("Garmin GPS could not be initialized on port: "));
            msg +=com_name;
            wxString err;
            err.Printf(_T(" Error Code is %d"), v_init);
            msg += err;

            msg += _T("\n LastGarminError is: ");
            msg += GetLastGarminError();

            wxLogMessage(msg);

            ret_bool = false;
            goto ret_point;
        }
        else
        {
            wxString msg(_T("Sent waypoint(s) to Garmin GPS on port: "));
            msg +=com_name;
            msg += _T("\n Unit identifies as: ");
            wxString GPS_Unit = Garmin_GPS_GetSaveString();
            msg += GPS_Unit;
            wxLogMessage(msg);
        }

        // Create a RoutePointList with one item
        rplist.Append(prp);

        ret_val = Garmin_GPS_SendWaypoints(short_com, &rplist);
        if(ret_val != 1)
        {
            wxString msg(_T("Error Sending Waypoint(s) to Garmin GPS on port: "));
            msg +=com_name;
            wxString err;
            err.Printf(_T(" Error Code is %d"), ret_val);
            msg += err;

            msg += _T("\n LastGarminError is: ");
            msg += GetLastGarminError();

            wxLogMessage(msg);

            ret_bool = false;
            goto ret_point;
        }
        else
            ret_bool = true;

        goto ret_point;
    }
    else
#endif //USE_GARMINHOST

    { // Standard NMEA mode
    
    //  If the port was temporarily closed, reopen as I/O type
    //  Otherwise, open another port using default properties
    wxString baud;
    
    if( old_stream ) {
        baud = baud_rate_save;
    }
    else {
        baud = _T("4800");
    }
    
    DataStream *dstr = new DataStream( this,
                                       com_name,
                                       baud,
                                       DS_TYPE_INPUT_OUTPUT,
                                       0 );
    
        SENTENCE snt;
        NMEA0183 oNMEA0183;
        oNMEA0183.TalkerID = _T ( "EC" );

        if ( pProgress )
            pProgress->SetRange ( 100 );

        if(g_GPS_Ident == _T("Generic"))
        {
            if ( prp->m_lat < 0. )
                oNMEA0183.Wpl.Position.Latitude.Set ( -prp->m_lat, _T ( "S" ) );
            else
                oNMEA0183.Wpl.Position.Latitude.Set ( prp->m_lat, _T ( "N" ) );

            if ( prp->m_lon < 0. )
                oNMEA0183.Wpl.Position.Longitude.Set ( -prp->m_lon, _T ( "W" ) );
            else
                oNMEA0183.Wpl.Position.Longitude.Set ( prp->m_lon, _T ( "E" ) );

            oNMEA0183.Wpl.To = prp->GetName().Truncate ( 6 );

            oNMEA0183.Wpl.Write ( snt );
        }
        else if(g_GPS_Ident == _T("FurunoGP3X"))
        {
            oNMEA0183.TalkerID = _T ( "PFEC," );

            if ( prp->m_lat < 0. )
                oNMEA0183.GPwpl.Position.Latitude.Set ( -prp->m_lat, _T ( "S" ) );
            else
                oNMEA0183.GPwpl.Position.Latitude.Set ( prp->m_lat, _T ( "N" ) );

            if ( prp->m_lon < 0. )
                oNMEA0183.GPwpl.Position.Longitude.Set ( -prp->m_lon, _T ( "W" ) );
            else
                oNMEA0183.GPwpl.Position.Longitude.Set ( prp->m_lon, _T ( "E" ) );


            oNMEA0183.GPwpl.To = prp->GetName().Truncate ( 8 );

            oNMEA0183.GPwpl.Write ( snt );
        }

        if( dstr->SendSentence( snt.Sentence ) )
            LogOutputMessage( snt.Sentence, dstr->GetPort(), false );
        
        wxString msg(_T("-->GPS Port:"));
        msg += com_name;
        msg += _T(" Sentence: ");
        msg += snt.Sentence;
        msg.Trim();
        wxLogMessage(msg);

        if(g_GPS_Ident == _T("FurunoGP3X"))
        {
            wxString term;
            term.Printf(_T("$PFEC,GPxfr,CTL,E%c%c"), 0x0d, 0x0a);

            if( dstr->SendSentence( term ) )
                LogOutputMessage( term, dstr->GetPort(), false );
            
            wxString msg(_T("-->GPS Port:"));
            msg += com_name;
            msg += _T(" Sentence: ");
            msg += term;
            msg.Trim();
            wxLogMessage(msg);
        }

        if ( pProgress )
        {
            pProgress->SetValue ( 100 );
            pProgress->Refresh();
            pProgress->Update();
        }

        wxMilliSleep ( 500 );

        //  All finished with the temp port
        dstr->Close();
        
        ret_bool = true;
    }

ret_point:
    
    if( old_stream )
        CreateAndRestoreSavedStreamProperties();
    
    
    return ret_bool;
    
}
Beispiel #27
0
bool Multiplexer::SendRouteToGPS(Route *pr, wxString &com_name, bool bsend_waypoints, wxGauge *pProgress)
{
    bool ret_bool = false;
    DataStream *old_stream = FindStream( com_name );
    if( old_stream ) {
        SaveStreamProperties( old_stream );
        StopAndRemoveStream( old_stream );
    }      
        
    
#ifdef USE_GARMINHOST
#ifdef __WXMSW__
    if(com_name.Upper().Matches(_T("*GARMIN*"))) // Garmin USB Mode
    {
//        if(m_pdevmon)
//            m_pdevmon->StopIOThread(true);

        int v_init = Garmin_GPS_Init(wxString(_T("usb:")));

        if(v_init < 0)
        {
            wxString msg(_T(" Garmin USB GPS could not be initialized"));
            wxLogMessage(msg);
            msg.Printf(_T(" Error Code is %d"), v_init);
            wxLogMessage(msg);
            msg = _T(" LastGarminError is: ");
            msg += GetLastGarminError();
            wxLogMessage(msg);

            ret_bool = false;
        }
        else
        {
            wxLogMessage(_T("Garmin USB Initialized"));

            wxString msg = _T("USB Unit identifies as: ");
            wxString GPS_Unit = Garmin_GPS_GetSaveString();
            msg += GPS_Unit;
            wxLogMessage(msg);

            wxLogMessage(_T("Sending Routes..."));
            int ret1 = Garmin_GPS_SendRoute(wxString(_T("usb:")), pr, pProgress);

            if(ret1 != 1)
            {
                wxLogMessage(_T(" Error Sending Routes"));
                wxString msg;
                msg = _T(" LastGarminError is: ");
                msg += GetLastGarminError();
                wxLogMessage(msg);

                ret_bool = false;
            }
            else
                ret_bool = true;
        }

//        if(m_pdevmon)
//            m_pdevmon->RestartIOThread();

        goto ret_point_1;
    }
#endif

    if(g_bGarminHostUpload)
    {
        int ret_val;
        if ( pProgress )
        {
            pProgress->SetValue ( 20 );
            pProgress->Refresh();
            pProgress->Update();
        }

        wxString short_com = com_name.Mid(7);
        // Initialize the Garmin receiver, build required Jeeps internal data structures
        int v_init = Garmin_GPS_Init(short_com);
        if(v_init < 0)
        {
            wxString msg(_T("Garmin GPS could not be initialized on port: "));
            msg +=short_com;
            wxString err;
            err.Printf(_T(" Error Code is %d"), v_init);
            msg += err;

            msg += _T("\n LastGarminError is: ");
            msg += GetLastGarminError();

            wxLogMessage(msg);

            ret_bool = false;
            goto ret_point;
        }
        else
        {
            wxString msg(_T("Sent Route to Garmin GPS on port: "));
            msg +=short_com;
            msg += _T("\n Unit identifies as: ");
            wxString GPS_Unit = Garmin_GPS_GetSaveString();
            msg += GPS_Unit;

            wxLogMessage(msg);
        }

        if ( pProgress )
        {
            pProgress->SetValue ( 40 );
            pProgress->Refresh();
            pProgress->Update();
        }

        ret_val = Garmin_GPS_SendRoute(short_com, pr, pProgress);
        if(ret_val != 1)
        {
            wxString msg(_T("Error Sending Route to Garmin GPS on port: "));
            msg +=short_com;
            wxString err;
            err.Printf(_T(" Error Code is %d"), ret_val);

            msg += _T("\n LastGarminError is: ");
            msg += GetLastGarminError();

            msg += err;
            wxLogMessage(msg);

            ret_bool = false;
            goto ret_point;
        }
        else
            ret_bool = true;

ret_point:

        if ( pProgress )
        {
            pProgress->SetValue ( 100 );
            pProgress->Refresh();
            pProgress->Update();
        }

        wxMilliSleep ( 500 );

        goto ret_point_1;
    }
    else
#endif //USE_GARMINHOST

    {
        { // Standard NMEA mode
        
            //  If the port was temporarily closed, reopen as I/O type
            //  Otherwise, open another port using default properties
            wxString baud;

            if( old_stream ) {
                baud = baud_rate_save;
            }
            else {
                baud = _T("4800");
            }
            
            DataStream *dstr = new DataStream( this,
                                               com_name,
                                               baud,
                                               DS_TYPE_INPUT_OUTPUT,
                                               0 );
            
            SENTENCE snt;
            NMEA0183 oNMEA0183;
            oNMEA0183.TalkerID = _T ( "EC" );

            int nProg = pr->pRoutePointList->GetCount() + 1;
            if ( pProgress )
            pProgress->SetRange ( 100 );

            int progress_stall = 500;
            if(pr->pRoutePointList->GetCount() > 10)
                progress_stall = 500;

            // Send out the waypoints, in order
            if ( bsend_waypoints )
            {
                wxRoutePointListNode *node = pr->pRoutePointList->GetFirst();

                int ip = 1;
                while ( node )
                {
                    RoutePoint *prp = node->GetData();

                    if(g_GPS_Ident == _T("Generic"))
                    {
                        if ( prp->m_lat < 0. )
                            oNMEA0183.Wpl.Position.Latitude.Set ( -prp->m_lat, _T ( "S" ) );
                        else
                            oNMEA0183.Wpl.Position.Latitude.Set ( prp->m_lat, _T ( "N" ) );

                        if ( prp->m_lon < 0. )
                            oNMEA0183.Wpl.Position.Longitude.Set ( -prp->m_lon, _T ( "W" ) );
                        else
                            oNMEA0183.Wpl.Position.Longitude.Set ( prp->m_lon, _T ( "E" ) );

                        oNMEA0183.Wpl.To = prp->GetName().Truncate ( 6 );

                        oNMEA0183.Wpl.Write ( snt );

                    }
                    else if(g_GPS_Ident == _T("FurunoGP3X"))
                    {
                        oNMEA0183.TalkerID = _T ( "PFEC," );

                        if ( prp->m_lat < 0. )
                            oNMEA0183.GPwpl.Position.Latitude.Set ( -prp->m_lat, _T ( "S" ) );
                        else
                            oNMEA0183.GPwpl.Position.Latitude.Set ( prp->m_lat, _T ( "N" ) );

                        if ( prp->m_lon < 0. )
                            oNMEA0183.GPwpl.Position.Longitude.Set ( -prp->m_lon, _T ( "W" ) );
                        else
                            oNMEA0183.GPwpl.Position.Longitude.Set ( prp->m_lon, _T ( "E" ) );

                        oNMEA0183.GPwpl.To = prp->GetName().Truncate ( 8 );

                        oNMEA0183.GPwpl.Write ( snt );
                    }

                    if( dstr->SendSentence( snt.Sentence ) )
                        LogOutputMessage( snt.Sentence, dstr->GetPort(), false );
                    
                    wxString msg(_T("-->GPS Port:"));
                    msg += com_name;
                    msg += _T(" Sentence: ");
                    msg += snt.Sentence;
                    msg.Trim();
                    wxLogMessage(msg);

                    if ( pProgress )
                    {
                        pProgress->SetValue ( ( ip * 100 ) / nProg );
                        pProgress->Refresh();
                        pProgress->Update();
                    }

                    wxMilliSleep ( progress_stall );

                    node = node->GetNext();

                    ip++;
                }
            }

            // Create the NMEA Rte sentence

            oNMEA0183.Rte.Empty();
            oNMEA0183.Rte.TypeOfRoute = CompleteRoute;

            if ( pr->m_RouteNameString.IsEmpty() )
                oNMEA0183.Rte.RouteName = _T ( "1" );
            else
                oNMEA0183.Rte.RouteName = pr->m_RouteNameString;

            if(g_GPS_Ident == _T("FurunoGP3X"))
            {
                oNMEA0183.Rte.RouteName = _T ( "1" );
                oNMEA0183.TalkerID = _T ( "GP" );
            }

            oNMEA0183.Rte.total_number_of_messages = 1;
            oNMEA0183.Rte.message_number = 1;

            // add the waypoints
            wxRoutePointListNode *node = pr->pRoutePointList->GetFirst();
            while ( node )
            {
                RoutePoint *prp = node->GetData();
                wxString name = prp->GetName().Truncate ( 6 );

                if(g_GPS_Ident == _T("FurunoGP3X"))
                {
                      name = prp->GetName().Truncate ( 7 );
                      name.Prepend(_T(" "));
                }

                oNMEA0183.Rte.AddWaypoint ( name );
                node = node->GetNext();
            }

            oNMEA0183.Rte.Write ( snt );

            unsigned int max_length = 70;

            if(snt.Sentence.Len() > max_length)
            {
                // Make a route with one waypoint to get tare load.
                NMEA0183 tNMEA0183;
                SENTENCE tsnt;
                tNMEA0183.TalkerID = _T ( "EC" );

                tNMEA0183.Rte.Empty();
                tNMEA0183.Rte.TypeOfRoute = CompleteRoute;

                if(g_GPS_Ident != _T("FurunoGP3X"))
                {
                    if ( pr->m_RouteNameString.IsEmpty() )
                        tNMEA0183.Rte.RouteName = _T ( "1" );
                    else
                        tNMEA0183.Rte.RouteName = pr->m_RouteNameString;

                    tNMEA0183.Rte.AddWaypoint ( _T("123456") );
                }
                else
                {
                    if (( pr->m_RouteNameString.IsNumber() ) &&
                        ( pr->m_RouteNameString.Len() <= 2 ) ) {
                            if( pr->m_RouteNameString.Len() == 2) {
                                tNMEA0183.Rte.RouteName = pr->m_RouteNameString;
                            }
                            else {
                                tNMEA0183.Rte.RouteName = _T("0");
                                tNMEA0183.Rte.RouteName += pr->m_RouteNameString;
                            }
                        }
                    else
                    {
                        tNMEA0183.Rte.RouteName = _T ( "01" );
                    }
                    tNMEA0183.Rte.AddWaypoint ( _T(" 1234567") );
                }


                tNMEA0183.Rte.Write ( tsnt );

                unsigned int tare_length = tsnt.Sentence.Len();

                wxArrayString sentence_array;

                // Trial balloon: add the waypoints, with length checking
                int n_total = 1;
                bool bnew_sentence = true;
                int sent_len=0;

                wxRoutePointListNode *node = pr->pRoutePointList->GetFirst();
                while ( node )
                {
                    RoutePoint *prp = node->GetData();
                    unsigned int name_len = prp->GetName().Truncate ( 6 ).Len();
                    if(g_GPS_Ident == _T("FurunoGP3X"))
                        name_len = 1 + prp->GetName().Truncate ( 7 ).Len();


                    if(bnew_sentence)
                    {
                        sent_len = tare_length;
                        sent_len += name_len;
                        bnew_sentence = false;
                        node = node->GetNext();

                    }
                    else
                    {
                        if(sent_len + name_len > max_length)
                        {
                            n_total ++;
                            bnew_sentence = true;
                        }
                        else
                        {
                            sent_len += name_len;
                            node = node->GetNext();
                        }
                    }
                }

                // Now we have the sentence count, so make the real sentences using the same counting logic
                int final_total = n_total;
                int n_run = 1;
                bnew_sentence = true;

                node = pr->pRoutePointList->GetFirst();
                while ( node )
                {
                    RoutePoint *prp = node->GetData();
                    wxString name = prp->GetName().Truncate ( 6 );
                    if(g_GPS_Ident == _T("FurunoGP3X"))
                    {
                        name = prp->GetName().Truncate ( 7 );
                        name.Prepend(_T(" "));
                    }

                    unsigned int name_len = name.Len();

                    if(bnew_sentence)
                    {
                        sent_len = tare_length;
                        sent_len += name_len;
                        bnew_sentence = false;

                        oNMEA0183.Rte.Empty();
                        oNMEA0183.Rte.TypeOfRoute = CompleteRoute;

                        if(g_GPS_Ident != _T("FurunoGP3X"))
                        {
                              if ( pr->m_RouteNameString.IsEmpty() )
                                    oNMEA0183.Rte.RouteName = _T ( "1" );
                              else
                                    oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
                        }
                        else {
                            if (( pr->m_RouteNameString.IsNumber() ) &&
                                ( pr->m_RouteNameString.Len() <= 2 ) ) {
                                    if( pr->m_RouteNameString.Len() == 2) {
                                        oNMEA0183.Rte.RouteName = pr->m_RouteNameString;
                                    }
                                    else {
                                        oNMEA0183.Rte.RouteName = _T("0");
                                        oNMEA0183.Rte.RouteName += pr->m_RouteNameString;
                                    }
                                }
                                else {
                                    oNMEA0183.Rte.RouteName = _T ( "01" );
                                }
                        }


                        oNMEA0183.Rte.total_number_of_messages = final_total;
                        oNMEA0183.Rte.message_number = n_run;
                        snt.Sentence.Clear();

                        oNMEA0183.Rte.AddWaypoint ( name );
                        node = node->GetNext();
                    }
                    else
                    {
                        if(sent_len + name_len > max_length)
                        {
                            n_run ++;
                            bnew_sentence = true;

                            oNMEA0183.Rte.Write ( snt );
                    // printf("%s", snt.Sentence.mb_str());

                            sentence_array.Add(snt.Sentence);
                        }
                        else
                        {
                            sent_len += name_len;
                            oNMEA0183.Rte.AddWaypoint ( name );
                            node = node->GetNext();
                        }
                    }
                }

                oNMEA0183.Rte.Write ( snt ); //last one...
                if(snt.Sentence.Len() > tare_length)
                      sentence_array.Add(snt.Sentence);

                for(unsigned int ii=0 ; ii < sentence_array.GetCount(); ii++)
                {
                    if(dstr->SendSentence( sentence_array.Item(ii) ) )
                        LogOutputMessage( sentence_array.Item(ii), dstr->GetPort(), false );
                    
                    wxString msg(_T("-->GPS Port:"));
                    msg += com_name;
                    msg += _T(" Sentence: ");
                    msg += sentence_array.Item(ii);
                    msg.Trim();
                    wxLogMessage(msg);

                    wxMilliSleep ( 500 );
                }

            }
            else
            {
                if( dstr->SendSentence( snt.Sentence ) )
                    LogOutputMessage( snt.Sentence, dstr->GetPort(), false );
                
                wxString msg(_T("-->GPS Port:"));
                msg += com_name;
                msg += _T(" Sentence: ");
                msg += snt.Sentence;
                msg.Trim();
                wxLogMessage(msg);
            }

            if(g_GPS_Ident == _T("FurunoGP3X"))
            {
                wxString term;
                term.Printf(_T("$PFEC,GPxfr,CTL,E%c%c"), 0x0d, 0x0a);

                if( dstr->SendSentence( term ) )
                    LogOutputMessage( term, dstr->GetPort(), false );
                
                wxString msg(_T("-->GPS Port:"));
                msg += com_name;
                msg += _T(" Sentence: ");
                msg += term;
                msg.Trim();
                wxLogMessage(msg);
            }

            if ( pProgress )
            {
                pProgress->SetValue ( 100 );
                pProgress->Refresh();
                pProgress->Update();
            }

            wxMilliSleep ( 500 );

            ret_bool = true;
            
            //  All finished with the temp port
            dstr->Close();
        }
    }

ret_point_1:

    if( old_stream )
        CreateAndRestoreSavedStreamProperties();
    
    return ret_bool;
}
Beispiel #28
0
void MpegDemultiplexer::PES_packet()
{
	int stream_id = m_file->m_next_code & 0xff;
	uint16 PES_packet_length = m_file->getnbits(16);
	m_file->m_countBits = 0;

	switch (stream_id)
	{
	case 0xbc/*program_stream_map*/:
		{
			ASSERT(0);
		}
		break;

	case 0xbf/*private-stream2*/:
		{
			/*m_file->m_bytepos =*/ m_file->SetBytePos(m_file->GetBytePos() + PES_packet_length);
			//m_file->m_nstacked = 0;
		}
		break;
		
	case 0xbe/*padding*/:
		{
			// Maybe check that all bytes are 0xFF
			/*m_file->m_bytepos =*/ m_file->SetBytePos(m_file->GetBytePos() + PES_packet_length);
			//m_file->m_nstacked = 0;
		}
		break;
		
	default:
		{
			int fill = m_file->getnbits(2);
			ASSERT(fill == 2);

			int PES_scrambling_control = m_file->getnbits(2);// bslbf
			int PES_priority = m_file->getbit();// bslbf
			int data_alignment_indicator = m_file->getbit();// bslbf
			int copyright = m_file->getbit();// bslbf
			int original_or_copy = m_file->getbit();// bslbf
			int PTS_DTS_flags = m_file->getnbits(2);// bslbf
			int ESCR_flag = m_file->getbit();// bslbf
			int ES_rate_flag = m_file->getbit();// bslbf
			int DSM_trick_mode_flag = m_file->getbit();// bslbf
			int additional_copy_info_flag = m_file->getbit();// bslbf
			int PES_CRC_flag = m_file->getbit();// bslbf
			int PES_extension_flag = m_file->getbit();// bslbf
			uint8 PES_header_data_length = m_file->getnbits(8);

			if (PTS_DTS_flags == 2)
			{
				int fill = m_file->getnbits(4);//	'0010' 4 bslbf
				ASSERT(fill == 2);
				
				m_file->getnbits(3);//PTS [32..30] 3 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				m_file->getnbits(15);//PTS [29..15] 15 bslbf
				m_file->getmarkerbit();// 1 bslbf
				m_file->getnbits(15);//PTS [14..0] 15 bslbf
				m_file->getmarkerbit();// 1 bslbf
			}
			else if (PTS_DTS_flags == 3)
			{
				int fill = m_file->getnbits(4);//
				ASSERT(fill == 3);//'0011' 4 bslbf
				m_file->getnbits(3);//PTS [32..30] 3 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				m_file->getnbits(15);//PTS [29..15] 15 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				m_file->getnbits(15);//PTS [14..0] 15 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				fill = m_file->getnbits(4);//marker_bit 1 bslbf
				ASSERT(fill == 1);//'0001' 4 bslbf
				m_file->getnbits(3);//DTS [32..30] 3 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				m_file->getnbits(15);//DTS [29..15] 15 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
				m_file->getnbits(15);//DTS [14..0] 15 bslbf
				m_file->getmarkerbit();//marker_bit 1 bslbf
			}

			if (ESCR_flag == 1)
			{
				ASSERT(0);
				/*
			reserved 2 bslbf
			ESCR_base[32..30] 3 bslbf
			marker_bit 1 bslbf
			ESCR_base[29..15] 15 bslbf
			marker_bit 1 bslbf
			ESCR_base[14..0] 15 bslbf
			marker_bit 1 bslbf
			ESCR_extension 9 uimsbf
			marker_bit 1 bslbf
			*/
			}

			if (ES_rate_flag == 1)
			{
				ASSERT(0);
				/*
marker_bit 1 bslbf
ES_rate 22 uimsbf
marker_bit 1 bslbf
*/
			}

			if (DSM_trick_mode_flag == 1)
			{
				ASSERT(0);
				/*
				trick_mode_control 3 uimsbf
				if ( trick_mode_control = = fast_forward )
				{
				field_id 2 bslbf
				intra_slice_refresh 1 bslbf
				frequency_truncation 2 bslbf
				}
				else if ( trick_mode_control = = slow_motion )
				{
				rep_cntrl 5 uimsbf
				}
				else if ( trick_mode_control = = freeze_frame )
				{
				field_id 2 uimsbf
				reserved 3 bslbf
				}
				else if ( trick_mode_control = = fast_reverse )
				{
				field_id 2 bslbf
				intra_slice_refresh 1 bslbf
				frequency_truncation 2 bslbf
				}
				else if ( trick_mode_control = = slow_reverse )
				{
					rep_cntrl 5 uimsbf
				}
				else
					reserved 5 bslbf
			*/
			}

			if (additional_copy_info_flag == 1)
			{
				m_file->getmarkerbit();// 1 bslbf
				int additional_copy_info = m_file->getnbits(7);// bslbf
			}

			if (PES_CRC_flag == 1)
			{
				int previous_PES_packet_CRC = m_file->getnbits(16);// bslbf
			}

			if (PES_extension_flag == 1)
			{
				int PES_private_data_flag = m_file->getbit();// bslbf
				int pack_header_field_flag = m_file->getbit();// 1 bslbf
				int program_packet_sequence_counter_flag = m_file->getbit();// 1 bslbf
				int P_STD_buffer_flag = m_file->getnbits(1);// 1 bslbf
				m_file->getnbits(3);//reserved 3 bslbf
				int PES_extension_flag_2 = m_file->getbit();// 1 bslbf
				if ( PES_private_data_flag == 1)
				{
					m_file->skipnbits(128);
					//PES_private_data 128 bslbf
				}
				if (pack_header_field_flag == 1)
				{
					int pack_field_length = m_file->getnbits(8);// uimsbf
					pack_header();
				}
				if (program_packet_sequence_counter_flag == 1)
				{
					ASSERT(0);
					/*
					marker_bit 1 bslbf
						program_packet_sequence_counter 7 uimsbf
						marker_bit 1 bslbf
						MPEG1_MPEG2_identifier 1 bslbf
						original_stuff_length 6 uimsbf
						*/
				}
				if (P_STD_buffer_flag == 1)
				{
					int fill = m_file->getnbits(2);//'01' 2 bslbf
					ASSERT(fill == 1);

					int P_STD_buffer_scale = m_file->getbit();//1 bslbf
					int P_STD_buffer_size = m_file->getnbits(13);//13 uimsbf
				}
				if (PES_extension_flag_2 == 1)
				{
					m_file->getmarkerbit();// 1 bslbf
					uint8 PES_extension_field_length = m_file->getnbits(7);// uimsbf
					for (int i = 0; i < PES_extension_field_length; i++)
					{
						//reserved 8 bslbf
						uint8 reserved = m_file->getnbits(8);
					}
				}
			}

			int i;

			ASSERT((m_file->m_countBits & 0x3) == 0);
			int n = (m_file->m_countBits >> 3);

			int N1 = n - (PES_header_data_length+3);
			int N2 = PES_packet_length - n;

			for (i = 0; i < N1; i++)
			{
				m_file->getnbits(8);//stuffing_byte 8 bslbf
			}

			MpegStream* pStream = FindStream(stream_id);

			if (pStream == NULL)	// ???
			{
				pStream = new MpegStream;
				pStream->m_pFilter = this;
				pStream->m_stream_id = stream_id;

				m_streams.push_back(pStream);
			}

			CPacket* pPacket = NULL;
			if (pStream)
			{
				pPacket = new CPacket;
				pPacket->m_pStream = pStream;

				pStream->m_packets.push_back(pPacket);
			}

			pPacket->m_byteOffset = m_file->GetBytePos();
			pPacket->m_byteLength = N2;

			pStream->m_byteLength += pPacket->m_byteLength;

			m_file->SetBytePos(pPacket->m_byteOffset + N2);

			/*
			for (i = 0; i < N2; i++)
			{
				m_file->getnbits(8);//PES_packet_data_byte 8 bslbf
			}
			*/
		}
		break;
	}

	m_file->next_start_code();
}
Beispiel #29
0
void Multiplexer::OnEvtStream(OCPN_DataStreamEvent& event)
{
    wxString message = wxString(event.GetNMEAString().c_str(), wxConvUTF8);
    wxString port = wxString(event.GetStreamName().c_str(), wxConvUTF8);
    DataStream *stream = FindStream(port);
    if( !message.IsEmpty() )
    {
        //Send to core consumers
        //if it passes the source's input filter
        //  If there is no datastream, as for PlugIns, then pass everything
        bool bpass = true;
        if( stream )
            bpass = stream->SentencePassesFilter( message, FILTER_INPUT );
            
        if( bpass ) {
            if( message.Mid(3,3).IsSameAs(_T("VDM")) ||
                message.Mid(1,5).IsSameAs(_T("FRPOS")) ||
                message.Mid(1,2).IsSameAs(_T("CD")) )
            {
                if( m_aisconsumer )
                    m_aisconsumer->AddPendingEvent(event);
            }
            else
            {
                if( m_gpsconsumer )
                    m_gpsconsumer->AddPendingEvent(event);
            }

            //  Handle AIVDO messages from transponder....
            if( message.Mid(3,3).IsSameAs(_T("VDO")) ) {
                if( m_gpsconsumer )
                    m_gpsconsumer->AddPendingEvent(event);
            }
        }

            //Send to the Debug Window, if open
        LogInputMessage( message, port, !bpass );
            
        //Send to plugins
        if ( g_pi_manager )
            g_pi_manager->SendNMEASentenceToAllPlugIns( message );
            
       //Send to all the other outputs
        for (size_t i = 0; i < m_pdatastreams->Count(); i++)
        {
            DataStream* s = m_pdatastreams->Item(i);
            if ( s->IsOk() ) {
                if((s->GetConnectionType() == SERIAL)  || (s->GetPort() != port)) {
                    if ( s->GetIoSelect() == DS_TYPE_INPUT_OUTPUT || s->GetIoSelect() == DS_TYPE_OUTPUT ) {
                        bool bout_filter = true;
                       
                        if(s->SentencePassesFilter( message, FILTER_OUTPUT ) ) {
                            s->SendSentence(message);
                            bout_filter = false;
                        }    
                            //Send to the Debug Window, if open
                        LogOutputMessage( message, port, bout_filter );
                    }
                }
            }
        }
    }
}
Beispiel #30
0
extern "C" ULONG __far __loadds __cdecl DDCMD_EntryPoint(PDDCMDCOMMON pCommon)
{
   STREAM *pstream = FindStream(pCommon->hStream);

// printf("MPU: DDCMD %lu stream=%p\n",pCommon->ulFunction,(void __far *) pstream);

   switch (pCommon->ulFunction) {
      case DDCMD_SETUP: {
         Trace(TRACE_DDCMD_SETUP, (ULONG) (void __far *) pstream);
         if (!pstream) return ERROR_INVALID_STREAM;
         PDDCMDSETUP p = (PDDCMDSETUP) pCommon;
         SETUP_PARM __far *psp = (SETUP_PARM __far *) p->pSetupParm;
         pstream->ulCurrentTime = psp->ulStreamTime;
         if (p->ulSetupParmSize > sizeof(ULONG)) {
            fRecurringSupported = TRUE;
            psp->ulFlags = SETUP_RECURRING_EVENTS;
         }
         break;
      }
      case DDCMD_READ:
         Trace(TRACE_DDCMD_READ, (ULONG) (void __far *) pstream);
         return ERROR_INVALID_FUNCTION;
      case DDCMD_WRITE: {
         Trace(TRACE_DDCMD_WRITE, (ULONG) (void __far *) pstream);
         if (!pstream) return ERROR_INVALID_STREAM;
         PDDCMDREADWRITE p = (PDDCMDREADWRITE) pCommon;
         pstream->Write((PSTREAMBUF) p->pBuffer,(unsigned) p->ulBufferSize);
         break;
      }
      case DDCMD_STATUS: {
         Trace(TRACE_DDCMD_STATUS, (ULONG) (void __far *) pstream);
         if (!pstream) return ERROR_INVALID_STREAM;
         PDDCMDSTATUS p = (PDDCMDSTATUS) pCommon;
         PSTATUS_PARM p2 = (PSTATUS_PARM) p->pStatus;
         p2->ulTime = pstream->ulCurrentTime;
         break;
      }
      case DDCMD_CONTROL: {
         if (!pstream) return ERROR_INVALID_STREAM;
         PDDCMDCONTROL p = (PDDCMDCONTROL) pCommon;
         return pstream->Control(p);
      }
      case DDCMD_REG_STREAM: {
         Trace(TRACE_DDCMD_REGISTER, (ULONG) (void __far *) pstream);
         if (pstream)
            return ERROR_HNDLR_REGISTERED;
         pstream = FindFile(((PDDCMDREGISTER) pCommon)->ulSysFileNum);
         if (!pstream)
            return ERROR_STREAM_CREATION;
         pstream->Register((PDDCMDREGISTER) pCommon);
         return 0;
      }
      case DDCMD_DEREG_STREAM:
         Trace(TRACE_DDCMD_DEREG, (ULONG) (void __far *) pstream);
         if (!pstream) return ERROR_INVALID_STREAM;
         pstream->DeRegister();
         break;
      default:
         return ERROR_INVALID_FUNCTION;
   }

   return NO_ERROR;
}