Intel® RealSense™ Cross Platform API
Intel Realsense Cross-platform API
Loading...
Searching...
No Matches
archive.h
Go to the documentation of this file.
1// License: Apache 2.0. See LICENSE file in root directory.
2// Copyright(c) 2015 Intel Corporation. All Rights Reserved.
3
4#pragma once
5#ifndef LIBREALSENSE_ARCHIVE_H
6#define LIBREALSENSE_ARCHIVE_H
7
8#include "types.h"
9#include <atomic>
10#include "timestamps.h"
11
12namespace rsimpl
13{
14 // Defines general frames storage model
16 {
17 public:
19 {
20 double actual_fps = 0;
21 double timestamp = 0;
22 double exposure_value = 0;
23 unsigned long long frame_number = 0;
24 long long system_time = 0;
25 int width = 0;
26 int height = 0;
27 int fps = 0;
28 int stride_x = 0;
29 int stride_y = 0;
30 int bpp = 1;
34 int pad = 0;
35 std::shared_ptr<std::vector<rs_frame_metadata>> supported_metadata_vector;
36 std::chrono::high_resolution_clock::time_point frame_callback_started {};
37
39
40 frame_additional_data(double in_timestamp, unsigned long long in_frame_number, long long in_system_time,
41 int in_width, int in_height, int in_fps,
42 int in_stride_x, int in_stride_y, int in_bpp,
43 const rs_format in_format, rs_stream in_stream_type, int in_pad, std::shared_ptr<std::vector<rs_frame_metadata>> in_supported_metadata_vector, double in_exposure_value, double in_actual_fps)
44 : timestamp(in_timestamp),
45 frame_number(in_frame_number),
46 system_time(in_system_time),
47 width(in_width),
48 height(in_height),
49 fps(in_fps),
50 stride_x(in_stride_x),
51 stride_y(in_stride_y),
52 bpp(in_bpp),
53 format(in_format),
54 stream_type(in_stream_type),
55 pad(in_pad),
56 supported_metadata_vector(in_supported_metadata_vector),
57 exposure_value(in_exposure_value),
58 actual_fps(in_actual_fps){}
59 };
60
61 // Define a movable but explicitly noncopyable buffer type to hold our frame data
63 {
64 private:
65 // TODO: check boost::intrusive_ptr or an alternative
66 std::atomic<int> ref_count; // the reference count is on how many times this placeholder has been observed (not lifetime, not content)
67 frame_archive * owner; // pointer to the owner to be returned to by last observe
68 frame_continuation on_release;
69
70 public:
71 std::vector<byte> data;
73
74 explicit frame() : ref_count(0), owner(nullptr), on_release(){}
75 frame(const frame & r) = delete;
76 frame(frame && r)
77 : ref_count(r.ref_count.exchange(0)),
78 owner(r.owner), on_release()
79 {
80 *this = std::move(r); // TODO: This is not very safe, refactor later
81 }
82
83 frame & operator=(const frame & r) = delete;
85 {
86 data = move(r.data);
87 owner = r.owner;
88 ref_count = r.ref_count.exchange(0);
89 on_release = std::move(r.on_release);
90 additional_data = std::move(r.additional_data);
91 return *this;
92 }
93
94 ~frame() { on_release.reset(); }
95
96 double get_frame_metadata(rs_frame_metadata frame_metadata) const override;
97 bool supports_frame_metadata(rs_frame_metadata frame_metadata) const override;
98 const byte* get_frame_data() const;
99 double get_frame_timestamp() const;
101 void set_timestamp(double new_ts) override { additional_data.timestamp = new_ts; }
102 unsigned long long get_frame_number() const override;
103 void set_timestamp_domain(rs_timestamp_domain timestamp_domain) override { additional_data.timestamp_domain = timestamp_domain; }
104 long long get_frame_system_time() const;
105 int get_width() const;
106 int get_height() const;
107 int get_framerate() const;
108 int get_stride() const;
109 int get_bpp() const;
111 rs_stream get_stream_type() const override;
112
113 std::chrono::high_resolution_clock::time_point get_frame_callback_start_time_point() const;
114 void update_frame_callback_start_ts(std::chrono::high_resolution_clock::time_point ts);
115
116 void acquire() { ref_count.fetch_add(1); }
117 void release();
119 void update_owner(frame_archive * new_owner) { owner = new_owner; }
120 void attach_continuation(frame_continuation&& continuation) { on_release = std::move(continuation); }
121 void disable_continuation() { on_release.reset(); }
122 };
123
124 class frame_ref : public rs_frame_ref // esentially an intrusive shared_ptr<frame>
125 {
126 frame * frame_ptr;
127 public:
128 frame_ref() : frame_ptr(nullptr) {}
129
130 explicit frame_ref(frame* frame) : frame_ptr(frame)
131 {
132 if (frame) frame->acquire();
133 }
134
135 frame_ref(const frame_ref& other) : frame_ptr(other.frame_ptr)
136 {
137 if (frame_ptr) frame_ptr->acquire();
138 }
139
140 frame_ref(frame_ref&& other) : frame_ptr(other.frame_ptr)
141 {
142 other.frame_ptr = nullptr;
143 }
144
146 {
147 swap(other);
148 return *this;
149 }
150
152 {
153 if (frame_ptr) frame_ptr->release();
154 }
155
156 void swap(frame_ref& other)
157 {
158 std::swap(frame_ptr, other.frame_ptr);
159 }
160
162 {
163 if (frame_ptr) frame_ptr->disable_continuation();
164 }
165
166 double get_frame_metadata(rs_frame_metadata frame_metadata) const override;
167 bool supports_frame_metadata(rs_frame_metadata frame_metadata) const override;
168 const byte* get_frame_data() const override;
169 double get_frame_timestamp() const override;
170 unsigned long long get_frame_number() const override;
171 long long get_frame_system_time() const override;
173 int get_frame_width() const override;
174 int get_frame_height() const override;
175 int get_frame_framerate() const override;
176 int get_frame_stride() const override;
177 int get_frame_bpp() const override;
178 rs_format get_frame_format() const override;
179 rs_stream get_stream_type() const override;
180 std::chrono::high_resolution_clock::time_point get_frame_callback_start_time_point() const;
181 void update_frame_callback_start_ts(std::chrono::high_resolution_clock::time_point ts);
182 void log_callback_start(std::chrono::high_resolution_clock::time_point capture_start_time);
183 };
184
186 {
188 public:
189
191 void place_frame(rs_stream stream, frame&& new_frame);
192
193 const rs_frame_ref * get_frame(rs_stream stream) const
194 {
195 return &buffer[stream];
196 }
197
198 double get_frame_metadata(rs_stream stream, rs_frame_metadata frame_metadata) const { return buffer[stream].get_frame_metadata(frame_metadata); }
199 bool supports_frame_metadata(rs_stream stream, rs_frame_metadata frame_metadata) const { return buffer[stream].supports_frame_metadata(frame_metadata); }
200 const byte * get_frame_data(rs_stream stream) const { return buffer[stream].get_frame_data(); }
201 double get_frame_timestamp(rs_stream stream) const { return buffer[stream].get_frame_timestamp(); }
202 unsigned long long get_frame_number(rs_stream stream) const { return buffer[stream].get_frame_number(); }
203 long long get_frame_system_time(rs_stream stream) const { return buffer[stream].get_frame_system_time(); }
204 int get_frame_stride(rs_stream stream) const { return buffer[stream].get_frame_stride(); }
205 int get_frame_bpp(rs_stream stream) const { return buffer[stream].get_frame_bpp(); }
206
207 void cleanup();
208
209 };
210
211 private:
212 // This data will be left constant after creation, and accessed from all threads
214
215 std::atomic<uint32_t>* max_frame_queue_size;
216 std::atomic<uint32_t> published_frames_per_stream[RS_STREAM_COUNT];
220
221
222 protected:
224 std::vector<frame> freelist; // return frames here
225 std::recursive_mutex mutex;
226 std::chrono::high_resolution_clock::time_point capture_started;
227
228 public:
229 frame_archive(const std::vector<subdevice_mode_selection> & selection, std::atomic<uint32_t>* max_frame_queue_size, std::chrono::high_resolution_clock::time_point capture_started = std::chrono::high_resolution_clock::now());
230
231 // Safe to call from any thread
232 bool is_stream_enabled(rs_stream stream) const { return modes[stream].mode.pf.fourcc != 0; }
233 const subdevice_mode_selection & get_mode(rs_stream stream) const { return modes[stream]; }
234
236 {
237 published_sets.deallocate(frameset);
238 }
240
243
247 {
248 detached_refs.deallocate(ref);
249 }
250
251 // Frame callback thread API
252 byte * alloc_frame(rs_stream stream, const frame_additional_data& additional_data, bool requires_memory);
256 void log_callback_start(frame_ref* frame_ref, std::chrono::high_resolution_clock::time_point capture_start_time);
257
258 virtual void flush();
259
260 virtual ~frame_archive() {};
261 };
262}
263
264#endif
Definition: archive.h:125
int get_frame_framerate() const override
frame_ref(frame_ref &&other)
Definition: archive.h:140
void swap(frame_ref &other)
Definition: archive.h:156
double get_frame_timestamp() const override
void disable_continuation()
Definition: archive.h:161
int get_frame_height() const override
frame_ref()
Definition: archive.h:128
rs_stream get_stream_type() const override
const byte * get_frame_data() const override
frame_ref & operator=(frame_ref other)
Definition: archive.h:145
double get_frame_metadata(rs_frame_metadata frame_metadata) const override
~frame_ref()
Definition: archive.h:151
int get_frame_stride() const override
bool supports_frame_metadata(rs_frame_metadata frame_metadata) const override
int get_frame_width() const override
int get_frame_bpp() const override
rs_format get_frame_format() const override
frame_ref(const frame_ref &other)
Definition: archive.h:135
frame_ref(frame *frame)
Definition: archive.h:130
rs_timestamp_domain get_frame_timestamp_domain() const override
std::chrono::high_resolution_clock::time_point get_frame_callback_start_time_point() const
void log_callback_start(std::chrono::high_resolution_clock::time_point capture_start_time)
unsigned long long get_frame_number() const override
long long get_frame_system_time() const override
void update_frame_callback_start_ts(std::chrono::high_resolution_clock::time_point ts)
Definition: archive.h:186
int get_frame_stride(rs_stream stream) const
Definition: archive.h:204
void place_frame(rs_stream stream, frame &&new_frame)
double get_frame_timestamp(rs_stream stream) const
Definition: archive.h:201
long long get_frame_system_time(rs_stream stream) const
Definition: archive.h:203
int get_frame_bpp(rs_stream stream) const
Definition: archive.h:205
unsigned long long get_frame_number(rs_stream stream) const
Definition: archive.h:202
bool supports_frame_metadata(rs_stream stream, rs_frame_metadata frame_metadata) const
Definition: archive.h:199
double get_frame_metadata(rs_stream stream, rs_frame_metadata frame_metadata) const
Definition: archive.h:198
const byte * get_frame_data(rs_stream stream) const
Definition: archive.h:200
const rs_frame_ref * get_frame(rs_stream stream) const
Definition: archive.h:193
frame_ref detach_ref(rs_stream stream)
Definition: archive.h:16
std::recursive_mutex mutex
Definition: archive.h:225
void log_frame_callback_end(frame *frame)
frame * publish_frame(frame &&frame)
byte * alloc_frame(rs_stream stream, const frame_additional_data &additional_data, bool requires_memory)
frame_archive(const std::vector< subdevice_mode_selection > &selection, std::atomic< uint32_t > *max_frame_queue_size, std::chrono::high_resolution_clock::time_point capture_started=std::chrono::high_resolution_clock::now())
void attach_continuation(rs_stream stream, frame_continuation &&continuation)
void log_callback_start(frame_ref *frame_ref, std::chrono::high_resolution_clock::time_point capture_start_time)
frame_ref * clone_frame(frame_ref *frameset)
frame backbuffer[RS_STREAM_NATIVE_COUNT]
Definition: archive.h:223
void release_frame_ref(frame_ref *ref)
Definition: archive.h:246
void unpublish_frame(frame *frame)
frame_ref * track_frame(rs_stream stream)
virtual ~frame_archive()
Definition: archive.h:260
frameset * clone_frameset(frameset *frameset)
virtual void flush()
void release_frameset(frameset *frameset)
Definition: archive.h:235
std::chrono::high_resolution_clock::time_point capture_started
Definition: archive.h:226
std::vector< frame > freelist
Definition: archive.h:224
frame_ref * detach_frame_ref(frameset *frameset, rs_stream stream)
const subdevice_mode_selection & get_mode(rs_stream stream) const
Definition: archive.h:233
bool is_stream_enabled(rs_stream stream) const
Definition: archive.h:232
Definition: types.h:577
void reset()
Definition: types.h:602
Definition: types.h:497
void deallocate(T *item)
Definition: types.h:532
Definition: archive.h:13
rs_stream
Streams are different types of data provided by RealSense devices.
Definition: rs.h:34
@ RS_STREAM_COUNT
Definition: rs.h:47
rs_frame_metadata
Types of value provided from the device with each frame.
Definition: rs.h:204
rs_format
Formats: defines how each stream can be encoded.
Definition: rs.h:54
@ RS_FORMAT_ANY
Definition: rs.h:55
rs_timestamp_domain
Specifies the clock in relation to which the frame timestamp was measured.
Definition: rs.h:293
@ RS_TIMESTAMP_DOMAIN_CAMERA
Definition: rs.h:294
Definition: rscore.hpp:45
long long system_time
Definition: archive.h:24
std::shared_ptr< std::vector< rs_frame_metadata > > supported_metadata_vector
Definition: archive.h:35
unsigned long long frame_number
Definition: archive.h:23
rs_format format
Definition: archive.h:31
frame_additional_data(double in_timestamp, unsigned long long in_frame_number, long long in_system_time, int in_width, int in_height, int in_fps, int in_stride_x, int in_stride_y, int in_bpp, const rs_format in_format, rs_stream in_stream_type, int in_pad, std::shared_ptr< std::vector< rs_frame_metadata > > in_supported_metadata_vector, double in_exposure_value, double in_actual_fps)
Definition: archive.h:40
int stride_x
Definition: archive.h:28
frame_additional_data()
Definition: archive.h:38
int stride_y
Definition: archive.h:29
double timestamp
Definition: archive.h:21
std::chrono::high_resolution_clock::time_point frame_callback_started
Definition: archive.h:36
double exposure_value
Definition: archive.h:22
rs_timestamp_domain timestamp_domain
Definition: archive.h:33
double actual_fps
Definition: archive.h:20
rs_stream stream_type
Definition: archive.h:32
Definition: archive.h:63
const byte * get_frame_data() const
long long get_frame_system_time() const
frame & operator=(const frame &r)=delete
void acquire()
Definition: archive.h:116
frame_additional_data additional_data
Definition: archive.h:72
rs_stream get_stream_type() const override
double get_frame_metadata(rs_frame_metadata frame_metadata) const override
double get_frame_timestamp() const
std::chrono::high_resolution_clock::time_point get_frame_callback_start_time_point() const
void update_owner(frame_archive *new_owner)
Definition: archive.h:119
void set_timestamp_domain(rs_timestamp_domain timestamp_domain) override
Definition: archive.h:103
unsigned long long get_frame_number() const override
std::vector< byte > data
Definition: archive.h:71
frame(const frame &r)=delete
void update_frame_callback_start_ts(std::chrono::high_resolution_clock::time_point ts)
rs_format get_format() const
frame(frame &&r)
Definition: archive.h:76
frame & operator=(frame &&r)
Definition: archive.h:84
~frame()
Definition: archive.h:94
frame()
Definition: archive.h:74
void disable_continuation()
Definition: archive.h:121
void attach_continuation(frame_continuation &&continuation)
Definition: archive.h:120
rs_timestamp_domain get_frame_timestamp_domain() const
bool supports_frame_metadata(rs_frame_metadata frame_metadata) const override
void set_timestamp(double new_ts) override
Definition: archive.h:101
Definition: timestamps.h:15
uint32_t fourcc
Definition: types.h:141
Definition: types.h:294
subdevice_mode mode
Definition: types.h:295
native_pixel_format pf
Definition: types.h:158
const uint8_t RS_STREAM_NATIVE_COUNT
Definition: types.h:27