MillicastSDK 2.5.0
Loading...
Searching...
No Matches
track.h
Go to the documentation of this file.
1#ifndef MILLICAST_API_TRACK_H
2#define MILLICAST_API_TRACK_H
3
11#ifdef __cplusplus
12
13#include "event_handling.h"
14#include "exports.h"
15#include "metadata.h"
16#include "promise.h"
17#include "rts_stats.h"
18
19#include <optional>
20#include <string>
21#include <vector>
22
23namespace millicast {
24
25// Forward declarations ///////////////////////////////////////////////////////
26class VideoRenderer;
27class AudioRenderer;
28
29// Track //////////////////////////////////////////////////////////////////////
30
35class MILLICAST_API Track {
36 public:
37 Track() = default;
38 virtual ~Track() = default;
39
45 [[nodiscard]] virtual const std::string& id() const = 0;
46
52 [[nodiscard]] virtual const std::string& kind() const = 0;
53
59 [[nodiscard]] virtual bool is_enabled() const = 0;
60
68 virtual void enable(bool e) = 0;
69};
70
71// VideoTrack /////////////////////////////////////////////////////////////////
72
77class MILLICAST_API VideoTrack : public Track {
78 public:
83 enum class ContentHint { NONE, FLUID, DETAILED, TEXT };
84
85 VideoTrack() = default;
86 ~VideoTrack() override = default;
87
95 virtual void add_renderer(VideoRenderer* renderer) = 0;
96
102 virtual void remove_renderer(VideoRenderer* renderer) = 0;
103
109 virtual void set_content_hint(ContentHint hint) noexcept = 0;
110
115 [[nodiscard]] virtual ContentHint content_hint() const noexcept = 0;
116};
117
118// AudioTrack /////////////////////////////////////////////////////////////////
119
124class MILLICAST_API AudioTrack : public Track {
125 public:
126 AudioTrack() = default;
127 ~AudioTrack() override = default;
128
136 virtual void add_renderer(AudioRenderer* renderer) = 0;
137
143 virtual void remove_renderer(AudioRenderer* renderer) = 0;
144
150 virtual void set_volume(double volume) = 0;
151};
152
153#ifndef MC_DISABLE_COPY_AND_ASSIGN
154#define MC_DISABLE_COPY_AND_ASSIGN(Klass) \
155 Klass(Klass&&) = delete; \
156 Klass(const Klass&) = delete; \
157 Klass& operator=(Klass&&) = delete; \
158 Klass& operator=(const Klass&) = delete
159#endif // !defined(MC_DISABLE_COPY_AND_ASSIGN)
160
161class RtsRemoteTrack;
162class RtsRemoteVideoTrack;
163class RtsRemoteAudioTrack;
164class WebrtcRemoteAudioTrack;
165class WebrtcRemoteVideoTrack;
166
178class MILLICAST_API WebrtcRemoteTrack {
179 public:
180 WebrtcRemoteTrack() = default;
181 MC_DISABLE_COPY_AND_ASSIGN(WebrtcRemoteTrack);
182
186 enum Kind {
187 AUDIO,
188 VIDEO
189 };
190
200 struct Disabled {};
201
217 struct MidUpdated {
218 std::optional<std::string> mid;
219 };
220
225 [[nodiscard]] virtual Kind kind() const = 0;
226
233 virtual Promise<void> unproject() = 0;
234
247 virtual std::optional<std::string> get_current_mid() const = 0;
248
249 virtual const std::string& get_cname() const = 0;
250
256 virtual WebrtcRemoteVideoTrack* as_video() = 0;
257
263 virtual WebrtcRemoteAudioTrack* as_audio() = 0;
264
270 virtual EventConnectionPtr add_event_handler(
271 EventHandler<Disabled>&& handler) = 0;
272
278 virtual EventConnectionPtr add_event_handler(
279 EventHandler<MidUpdated>&& handler) = 0;
280
286 virtual EventConnectionPtr add_event_handler(
287 EventHandler<FrameMetadata>&& handler) = 0;
288};
289
301class MILLICAST_API RtsRemoteTrack {
302 public:
303 RtsRemoteTrack() = default;
304 MC_DISABLE_COPY_AND_ASSIGN(RtsRemoteTrack);
305
324 struct Active {};
325
343 struct Inactive {};
344
352 struct RtsStatsEvent {
353 const std::shared_ptr<const RtsTrackStats> track_stats;
354 };
355
360 using MidUpdated = WebrtcRemoteTrack::MidUpdated;
361
369 struct Layers {
371 struct Resolution {
372 int width;
373 int height;
374 };
375
380 struct Layer {
381 std::string encoding_id;
382 int bitrate = 0;
383 std::optional<int>
384 target_bitrate{};
385 std::optional<int> target_fps{};
386 std::optional<int>
387 target_height{};
388 std::optional<int> target_width{};
389 std::optional<int> temporal_layer_id;
390 std::optional<int> spatial_layer_id;
392 std::optional<Resolution> layer_resolution;
395 std::optional<int> max_temporal_layer_id;
398 std::optional<int> max_spatial_layer_id;
399 };
400
401 std::vector<Layer> active;
402 std::vector<std::string> inactive;
403 };
404
405 using Kind = WebrtcRemoteTrack::Kind;
406
412 virtual EventConnectionPtr add_event_handler(
413 EventHandler<Active>&& handler) = 0;
414
420 virtual EventConnectionPtr add_event_handler(
421 EventHandler<Inactive>&& handler) = 0;
422
428 virtual EventConnectionPtr add_event_handler(
429 EventHandler<Layers>&& handler) = 0;
430
436 virtual EventConnectionPtr add_event_handler(
437 EventHandler<MidUpdated>&& handler) = 0;
438
444 virtual EventConnectionPtr add_event_handler(
445 EventHandler<FrameMetadata>&& handler) = 0;
446
455 virtual EventConnectionPtr add_event_handler(
456 EventHandler<RtsStatsEvent>&& handler) = 0;
457
467 [[nodiscard]] virtual const std::optional<std::string>& source_id() const = 0;
468
473 [[nodiscard]] virtual Kind kind() const = 0;
474
482 [[nodiscard]] virtual bool is_active() const = 0;
483
496 virtual std::optional<std::string> get_current_mid() const = 0;
497
506 virtual Promise<void> disable() = 0;
507
513 virtual RtsRemoteVideoTrack* as_video() = 0;
514
520 virtual RtsRemoteAudioTrack* as_audio() = 0;
521};
522
526class MILLICAST_API RtsRemoteVideoTrack : public virtual RtsRemoteTrack {
527 public:
528 RtsRemoteVideoTrack() = default;
529 MC_DISABLE_COPY_AND_ASSIGN(RtsRemoteVideoTrack);
533 struct Layer {
534 std::optional<std::string> encodingId;
535 std::optional<int> spatialLayerId;
536 std::optional<int> temporalLayerId;
537 std::optional<int> maxSpatialLayerId;
538 std::optional<int> maxTemporalLayerId;
539
540 operator bool() const noexcept {
541 return encodingId || spatialLayerId || temporalLayerId ||
542 maxSpatialLayerId || maxTemporalLayerId;
543 }
544 };
545
554 virtual millicast::Promise<void> enable_frame_metadata(bool enabled) = 0;
555
575 virtual Promise<void> enable(const std::shared_ptr<VideoRenderer>& renderer,
576 const Layer& layer = {},
577 bool promote = false) = 0;
578};
579
583class MILLICAST_API RtsRemoteAudioTrack : public virtual RtsRemoteTrack {
584 public:
585 RtsRemoteAudioTrack() = default;
586 MC_DISABLE_COPY_AND_ASSIGN(RtsRemoteAudioTrack);
587
593 virtual Promise<void> enable() = 0;
594
605 virtual Promise<void> set_volume(double volume) = 0;
606};
607
611class MILLICAST_API WebrtcRemoteVideoTrack : public virtual WebrtcRemoteTrack {
612 public:
613 WebrtcRemoteVideoTrack() = default;
614 MC_DISABLE_COPY_AND_ASSIGN(WebrtcRemoteVideoTrack);
615
624 virtual millicast::Promise<void> enable_frame_metadata(bool enabled) = 0;
625
649 virtual Promise<void> project(RtsRemoteVideoTrack& rts_track,
650 const RtsRemoteVideoTrack::Layer& layer = {},
651 bool promote = false) = 0;
652
661 virtual Promise<void> add_renderer(
662 const std::shared_ptr<VideoRenderer>& renderer) = 0;
663
670 virtual Promise<void> remove_renderer(const VideoRenderer* renderer) = 0;
671
681 virtual Promise<RtsRemoteVideoTrack*> current_projection() = 0;
682};
683
687class MILLICAST_API WebrtcRemoteAudioTrack : public virtual WebrtcRemoteTrack {
688 public:
689 WebrtcRemoteAudioTrack() = default;
690 MC_DISABLE_COPY_AND_ASSIGN(WebrtcRemoteAudioTrack);
691
707 virtual Promise<void> project(RtsRemoteAudioTrack& rts_track) = 0;
708
719 virtual Promise<void> set_volume(double volume) = 0;
720
730 virtual Promise<RtsRemoteAudioTrack*> current_projection() = 0;
731};
732
733} // namespace millicast
734
735#endif // __cplusplus
736#endif /* TRACK_H */
#define MILLICAST_API
Definition exports.h:51