aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp')
-rw-r--r--Src/Plugins/Input/in_wmvdrm/ClockLayer.cpp101
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);
+}