Files
Client/Library/dxx8/samples/Multimedia/DirectShow/DMO/DMOSample/state.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

138 lines
3.4 KiB
C++

//------------------------------------------------------------------------------
// File: State.cpp
//
// Desc: DirectShow sample code - implementation of CStreamState class.
//
// Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
#include "stdafx.h"
#include <limits.h> // _I64_MAX
#include <crtdbg.h>
#include <dmo.h>
#include "state.h"
void CStreamState::TimeStamp(REFERENCE_TIME rt)
{
DWORD dwIndex = m_cbBytes >= 4 ? 0 : m_cbBytes;
m_arTS[dwIndex].bValid = true;
m_arTS[dwIndex].rt = rt;
}
void CStreamState::Reset()
{
m_cbBytes = 0;
m_dwNextTimeCode = 0;
for (int i = 0; i < 4; i++) {
m_arTS[i].bValid = false;
}
}
bool CStreamState::NextByte(BYTE bData)
{
_ASSERTE(m_arTS[0].bValid);
switch (m_cbBytes) {
case 0:
if (bData == 0) {
m_cbBytes++;
}
return false;
case 1:
if (bData == 0) {
m_cbBytes++;
} else {
m_cbBytes = 0;
// Pick up new timestamp if there was one
if (m_arTS[1].bValid) {
m_arTS[0].rt = m_arTS[1].rt;
m_arTS[1].bValid = false;
}
}
return false;
case 2:
if (bData == 1) {
m_cbBytes++;
} else {
if (bData == 0) {
if (m_arTS[1].bValid) {
m_arTS[0].rt = m_arTS[1].rt;
m_arTS[1].bValid = false;
}
if (m_arTS[2].bValid) {
m_arTS[1] = m_arTS[2];
m_arTS[2].bValid = false;
}
} else {
// Not 0 or 1, revert
m_cbBytes = 0;
// and pick up latest timestamp
if (m_arTS[1].bValid) {
m_arTS[0].rt = m_arTS[1].rt;
m_arTS[1].bValid = false;
}
if (m_arTS[2].bValid) {
m_arTS[0].rt = m_arTS[2].rt;
m_arTS[2].bValid = false;
}
}
}
return false;
case 3:
{
// It's a start code whatever it is
// return the timestamp and reset everything
m_rt = m_arTS[0].rt;
// If it's a picture start code can't use this timestamp again.
if (0 == bData) {
m_arTS[0].rt = INVALID_TIME;
m_cbBytes = 0;
}
// Catch up and clean out timestamps
for (int i = 1; i < 4; i++) {
if (m_arTS[i].bValid) {
m_arTS[0].rt = m_arTS[i].rt;
m_arTS[i].bValid = false;
}
}
// Picture start code?
if (0 == bData) {
m_cbBytes = 0;
m_dwTimeCode = m_dwNextTimeCode;
m_dwNextTimeCode++;
return true;
} else {
// Is it a GOP start code?
if (bData == 0xb8) {
m_cbBytes++;
} else {
m_cbBytes = 0;
}
return false;
}
}
case 4:
case 5:
case 6:
case 7:
m_bGOPData[m_cbBytes - 4] = bData;
m_cbBytes++;
if (m_cbBytes == 8) {
m_cbBytes = 0;
m_dwNextTimeCode = ((DWORD)m_bGOPData[0] << 17) +
((DWORD)m_bGOPData[1] << 9) +
((DWORD)m_bGOPData[2] << 1) +
((DWORD)m_bGOPData[3] >> 7);
}
return false;
}
// Should never reach here
return false;
};