| 1535 | } |
| 1536 | |
| 1537 | XnStatus PlayerNode::SeekToTimeStampAbsolute(XnUInt64 nDestTimeStamp) |
| 1538 | { |
| 1539 | XnStatus nRetVal = XN_STATUS_OK; |
| 1540 | XnUInt64 nRecordTimeStamp = 0LL; |
| 1541 | XnUInt64 nStartPos = TellStream(); //We'll revert to this in case nDestTimeStamp is beyond end of stream |
| 1542 | XN_IS_STATUS_OK(nRetVal); |
| 1543 | |
| 1544 | if (nDestTimeStamp < m_nTimeStamp) |
| 1545 | { |
| 1546 | nRetVal = Rewind(); |
| 1547 | } |
| 1548 | else if (nDestTimeStamp == m_nTimeStamp) |
| 1549 | { |
| 1550 | //Nothing to do |
| 1551 | return XN_STATUS_OK; |
| 1552 | } |
| 1553 | else if (nDestTimeStamp > m_nGlobalMaxTimeStamp) |
| 1554 | { |
| 1555 | nDestTimeStamp = m_nGlobalMaxTimeStamp; |
| 1556 | } |
| 1557 | |
| 1558 | Record record(m_pRecordBuffer, RECORD_MAX_SIZE, m_bIs32bitFileFormat); |
| 1559 | XnBool bEnd = FALSE; |
| 1560 | XnUInt32 nBytesRead = 0; |
| 1561 | |
| 1562 | while ((nRecordTimeStamp < nDestTimeStamp) && !bEnd) |
| 1563 | { |
| 1564 | nRetVal = ReadRecordHeader(record); |
| 1565 | XN_IS_STATUS_OK(nRetVal); |
| 1566 | switch (record.GetType()) |
| 1567 | { |
| 1568 | case RECORD_NEW_DATA: |
| 1569 | { |
| 1570 | //We already read Record::HEADER_SIZE, now read the rest of the new data record header |
| 1571 | nRetVal = Read(m_pRecordBuffer + record.HEADER_SIZE, |
| 1572 | NewDataRecordHeader::MAX_SIZE - record.HEADER_SIZE, |
| 1573 | nBytesRead); |
| 1574 | XN_IS_STATUS_OK(nRetVal); |
| 1575 | if (nBytesRead < NewDataRecordHeader::MAX_SIZE - record.HEADER_SIZE) |
| 1576 | { |
| 1577 | return XN_STATUS_CORRUPT_FILE; |
| 1578 | } |
| 1579 | NewDataRecordHeader newDataRecordHeader(record); |
| 1580 | nRetVal = newDataRecordHeader.Decode(); |
| 1581 | XN_IS_STATUS_OK(nRetVal); |
| 1582 | //Save record time stamp |
| 1583 | nRecordTimeStamp = newDataRecordHeader.GetTimeStamp(); |
| 1584 | |
| 1585 | if (nRecordTimeStamp >= nDestTimeStamp) |
| 1586 | { |
| 1587 | //We're done - move back to beginning of record |
| 1588 | nRetVal = SeekStream(XN_OS_SEEK_CUR, -XnInt32(nBytesRead)); |
| 1589 | XN_IS_STATUS_OK(nRetVal); |
| 1590 | } |
| 1591 | else |
| 1592 | { |
| 1593 | //Skip to next record |
| 1594 | nRetVal = SeekStream(XN_OS_SEEK_CUR, |
nothing calls this directly
no test coverage detected