gstreamer
Loading...
Searching...
No Matches
stream.cc
Go to the documentation of this file.
1// gstreamer
4
5// Non-Doxygen implementation file: behavior is documented in the header.
6
7bool GstreamerJSROFactory::startStreamImpl(const GFrameDataCollection* frameRunData) {
8 if (ofile == nullptr) { log->error(ERR_CANTOPENOUTPUT, "Error: can't open ", ofile); }
9
10 static constexpr int header_offset = sizeof(DataFrameHeader) / 4;
11 const GFrameHeader* header = frameRunData->getHeader();
12 long int frameID = header->getFrameID();
13 const std::vector<GIntegralPayload*>* intPayloadvec = frameRunData->getIntegralPayload();
14
15 frame_data.resize(header_offset, 0);
16
17 if (frameID == 1) {
18 std::vector<std::uint32_t> const super_magic = {0xC0DA2019, 0XC0DA0001};
19 ofile->write(reinterpret_cast<const char*>(super_magic.data()), sizeof(std::uint32_t) * 2);
20 }
21
22 // fill dataFrameHeader here or in publishFrameHeader
23 DataFrameHeader& dataFrameHeader = *reinterpret_cast<DataFrameHeader*>(frame_data.data());
24
25 dataFrameHeader.source_id = 0;
26 dataFrameHeader.magic = 0xC0DA2019;
27 dataFrameHeader.format_version = 257;
28 dataFrameHeader.flags = 0;
29 dataFrameHeader.record_counter = llswap(frameID);
30 dataFrameHeader.ts_sec = llswap((frameID * 65536) / static_cast<int>(1e9));
31 dataFrameHeader.ts_nsec = llswap((frameID * 65536) % static_cast<int>(1e9));
32
33
34 //make payload data
35 unsigned int crate = 0;
36 unsigned int slot, channel, charge, time;
37 unsigned int slots = 16;
38
39 frame_data.resize(header_offset);
40 frame_data.push_back(0x80000000);
41 frame_data.insert(frame_data.end(), slots, 0);
42
43 for (unsigned int i = 0; i < slots; ++i) {
44 int starting_point = (int)frame_data.size() - header_offset;
45 frame_data.push_back(0x80008000 | (crate << 8) | i);
46 int hit_counter = 0;
47
48 for (unsigned int hit = 0; hit < intPayloadvec->size(); ++hit) {
49 GIntegralPayload* intpayload = intPayloadvec->at(hit);
50 std::vector<int> payload = intpayload->getPayload();
51 crate = payload[0];
52 slot = payload[1];
53 channel = payload[2];
54 charge = payload[3];
55 time = payload[4];
56
57 if (i == slot) {
58 // if(hit<100) cout << time << endl;
59 frame_data.push_back(charge | (channel << 13) | ((time / 4) << 17));
60 ++hit_counter;
61 }
62 }
63
64 if (hit_counter == 0) {
65 frame_data.pop_back();
66 }
67 else {
68 ++hit_counter;
69 }
70
71 frame_data[header_offset + 1 + i] =
72 ((hit_counter) << 16) | starting_point;
73 }
74
75 DataFrameHeader& dfh = *reinterpret_cast<DataFrameHeader*>(frame_data.data());
76
77 dfh.payload_length = (uint32_t)frame_data.size() * sizeof(unsigned int) - sizeof(DataFrameHeader);
79 dfh.total_length = dfh.compressed_length + sizeof(DataFrameHeader) - 4;
80
81 return true;
82}
83
84
85bool GstreamerJSROFactory::endStreamImpl([[maybe_unused]] const GFrameDataCollection* frameRunData) {
86 if (ofile == nullptr) { log->error(ERR_CANTOPENOUTPUT, "Error: can't open ", ofile); }
87
88 return true;
89}
std::shared_ptr< GLogger > log
const GFrameHeader * getHeader() const
const std::vector< GIntegralPayload * > * getIntegralPayload() const
long int getFrameID() const
void error(int exit_code, Args &&... args) const
Shared constants and error codes for the gstreamer module.
#define ERR_CANTOPENOUTPUT
Output medium could not be opened (file/device not accessible).
JLAB SRO frame streamer plugin definitions.
Packed frame header written at the beginning of each frame record.
std::vector< int > getPayload() const