aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/OutputFile.cpp54
-rw-r--r--src/OutputFile.h6
2 files changed, 52 insertions, 8 deletions
diff --git a/src/OutputFile.cpp b/src/OutputFile.cpp
index 46a9ec9..af32b33 100644
--- a/src/OutputFile.cpp
+++ b/src/OutputFile.cpp
@@ -27,11 +27,11 @@
#include "OutputFile.h"
#include "PcDebug.h"
#include "Log.h"
-#include "TimestampDecoder.h"
#include <string>
-#include <assert.h>
+#include <chrono>
#include <stdexcept>
+#include <cassert>
using namespace std;
@@ -53,7 +53,6 @@ OutputFile::OutputFile(const std::string& filename, bool show_metadata) :
myFile.reset(fd);
}
-
int OutputFile::process(Buffer* dataIn)
{
PDEBUG("OutputFile::process(%p)\n", dataIn);
@@ -72,8 +71,18 @@ meta_vec_t OutputFile::process_metadata(const meta_vec_t& metadataIn)
if (myShowMetadata) {
stringstream ss;
+ frame_timestamp first_ts;
+
for (const auto& md : metadataIn) {
if (md.ts) {
+ // The following code assumes TM I, where we get called every 96ms.
+ // Support for other transmission modes skipped because this is mostly
+ // debugging code.
+
+ if (md.ts->fp == 0 or md.ts->fp == 4) {
+ first_ts = *md.ts;
+ }
+
ss << " FCT=" << md.ts->fct <<
" FP=" << (int)md.ts->fp;
if (md.ts->timestamp_valid) {
@@ -90,13 +99,46 @@ meta_vec_t OutputFile::process_metadata(const meta_vec_t& metadataIn)
}
}
- if (metadataIn.empty()) {
- etiLog.level(debug) << "Output File got no mdIn";
+ if (myLastTimestamp.timestamp_valid) {
+ if (first_ts.timestamp_valid) {
+ uint32_t timestamp = myLastTimestamp.timestamp_pps;
+ timestamp += 96 << 14; // Shift 96ms by 14 to Timestamp level 2
+ if (timestamp > 0xf9FFff) {
+ timestamp -= 0xfa0000; // Substract 16384000, corresponding to one second
+ myLastTimestamp.timestamp_sec += 1;
+ }
+ myLastTimestamp.timestamp_pps = timestamp;
+
+ if (myLastTimestamp.timestamp_sec != first_ts.timestamp_sec or
+ myLastTimestamp.timestamp_pps != first_ts.timestamp_pps) {
+ ss << " TS wrong interval; ";
+ }
+ myLastTimestamp = first_ts;
+ }
+ else {
+ ss << " TS of FP=0 MISSING; ";
+ myLastTimestamp.timestamp_valid = false;
+ }
}
else {
- etiLog.level(debug) << "Output File got metadata: " << ss.str();
+ // Includes invalid and valid cases
+ myLastTimestamp = first_ts;
}
+ if (metadataIn.empty()) {
+ etiLog.level(debug) << "Output File got no metadata";
+ }
+ else {
+ using namespace std::chrono;
+ const auto now = system_clock::now();
+ const int64_t ticks_now = duration_cast<milliseconds>(now.time_since_epoch()).count();
+ //const int64_t first_ts_ticks = first_ts.timestamp_sec * 1000 + first_ts.timestamp_pps / 16384;
+ const int64_t first_ts_ticks = std::llrint(first_ts.get_real_secs() * 1000);
+
+ ss << " DELTA: " << first_ts_ticks - ticks_now << "ms;";
+
+ etiLog.level(debug) << "Output File metadata: " << ss.str();
+ }
}
return {};
}
diff --git a/src/OutputFile.h b/src/OutputFile.h
index 745e672..b10d406 100644
--- a/src/OutputFile.h
+++ b/src/OutputFile.h
@@ -33,10 +33,11 @@
#include "ModPlugin.h"
#include "EtiReader.h"
+#include "TimestampDecoder.h"
#include <string>
-#include <stdio.h>
-#include <sys/types.h>
+#include <cstdio>
+#include <cstdint>
#include <memory>
class OutputFile : public ModOutput, public ModMetadata
@@ -52,6 +53,7 @@ public:
protected:
bool myShowMetadata = false;
+ frame_timestamp myLastTimestamp;
std::string myFilename;
struct FILEDeleter{ void operator()(FILE* fd){ if (fd) fclose(fd); }};