diff options
Diffstat (limited to 'Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp')
-rw-r--r-- | Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp b/Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp new file mode 100644 index 00000000..cce27870 --- /dev/null +++ b/Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp @@ -0,0 +1,101 @@ +#include "Main.h" +#include "ClockLayer.h" +#include "config.h" + +ClockLayer::ClockLayer(IWMReader *reader) + : clock(0), startTime(0), + clockTick(2500000), curTime(0), + startTimeMilliseconds(0), + realTime(false), + lastOutputTime(0) +{ + if (FAILED(reader->QueryInterface(&clock))) + clock=0; +} + +void ClockLayer::Opened() +{ + realTime=!config_clock; + WMHandler::Opened(); + + if (!realTime) + { + HRESULT hr = clock->SetUserProvidedClock(TRUE); + + if (FAILED(hr)) + { + realTime=false; + } + } + else + clock->SetUserProvidedClock(FALSE); + curTime = startTime; +} + +void ClockLayer::Started() +{ + if (!realTime && config_clock) + clock->DeliverTime((QWORD) - 1); + + if (startTimeMilliseconds != 0) + out->Flush(startTimeMilliseconds); + + SetLastOutputTime(startTimeMilliseconds); + WMHandler::Started(); +} + +void ClockLayer::Clock() +{ + if (!realTime && config_clock) + clock->DeliverTime((QWORD) - 1); +} + +void ClockLayer::SetStartTimeMilliseconds(long time) +{ + startTimeMilliseconds=time; + startTime = time; + startTime *= 10000; +} + +void ClockLayer::TimeReached(QWORD &timeReached) +{ + curTime = timeReached; +} + +QWORD ClockLayer::GetStartTime() +{ + return startTime; +} + +void ClockLayer::GoRealTime() +{ + realTime = true; +} + +int ClockLayer::GetOutputTime() +{ + if (realTime) + return (int) (curTime / 10000LL); + else + return lastOutputTime + (out->GetOutputTime() - out->GetWrittenTime()); +} + +void ClockLayer::TimeToSync(QWORD timeStamp, __int64 &diff) +{ + if (realTime) + diff = 0; + else + { + QWORD outputTime = this->GetOutputTime(); + outputTime *= 10000LL; + diff = timeStamp - outputTime; + } +} + +void ClockLayer::SampleReceived(QWORD &timeStamp, QWORD &duration, unsigned long &outputNum, unsigned long &flags, INSSBuffer *&sample) +{ + if (realTime) + curTime = timeStamp; + + WMHandler::SampleReceived(timeStamp, duration, outputNum, flags, sample); +} |