Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
receiver_session_group.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 Roc Streaming authors
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7  */
8 
9 //! @file roc_pipeline/receiver_session_group.h
10 //! @brief Receiver session group.
11 
12 #ifndef ROC_PIPELINE_RECEIVER_SESSION_GROUP_H_
13 #define ROC_PIPELINE_RECEIVER_SESSION_GROUP_H_
14 
15 #include "roc_audio/mixer.h"
16 #include "roc_core/iarena.h"
17 #include "roc_core/list.h"
18 #include "roc_core/noncopyable.h"
19 #include "roc_packet/iwriter.h"
20 #include "roc_pipeline/metrics.h"
23 #include "roc_rtcp/composer.h"
24 #include "roc_rtcp/session.h"
25 
26 namespace roc {
27 namespace pipeline {
28 
29 //! Receiver session group.
30 //!
31 //! Contains:
32 //! - a set of related receiver sessions
34 public:
35  //! Initialize.
36  ReceiverSessionGroup(const ReceiverConfig& receiver_config,
37  ReceiverState& receiver_state,
38  audio::Mixer& mixer,
39  const rtp::FormatMap& format_map,
40  packet::PacketFactory& packet_factory,
41  core::BufferFactory<uint8_t>& byte_buffer_factory,
42  core::BufferFactory<audio::sample_t>& sample_buffer_factory,
43  core::IArena& arena);
44 
46 
47  //! Route packet to session.
49 
50  //! Refresh pipeline according to current time.
51  //! @returns
52  //! deadline (absolute time) when refresh should be invoked again
53  //! if there are no frames
55 
56  //! Adjust session clock to match consumer clock.
57  //! @remarks
58  //! @p playback_time specified absolute time when first sample of last frame
59  //! retrieved from pipeline will be actually played on sink
61 
62  //! Get number of alive sessions.
63  size_t num_sessions() const;
64 
65  //! Get metrics for all sessions.
66  //! @remarks
67  //! @p metrics defines array of metrics structs, and @p metrics_size
68  //! defines number of array elements. Metrics are written to given array,
69  //! and @p metrics_size is updated of actual number of elements written.
70  //! If there is not enough space for all sessions, result is truncated.
71  void get_metrics(ReceiverSessionMetrics* metrics, size_t* metrics_size) const;
72 
73 private:
74  // Implementation of rtcp::IReceiverHooks interface.
75  // These methods are invoked by rtcp::Session.
76  virtual void on_update_source(packet::stream_source_t ssrc, const char* cname);
77  virtual void on_remove_source(packet::stream_source_t ssrc);
78  virtual size_t on_get_num_sources();
79  virtual rtcp::ReceptionMetrics on_get_reception_metrics(size_t source_index);
80  virtual void on_add_sending_metrics(const rtcp::SendingMetrics& metrics);
81  virtual void on_add_link_metrics(const rtcp::LinkMetrics& metrics);
82 
83  status::StatusCode route_transport_packet_(const packet::PacketPtr& packet);
84  status::StatusCode route_control_packet_(const packet::PacketPtr& packet);
85 
86  bool can_create_session_(const packet::PacketPtr& packet);
87 
88  status::StatusCode create_session_(const packet::PacketPtr& packet);
89  void remove_session_(ReceiverSession& sess);
90  void remove_all_sessions_();
91 
92  ReceiverSessionConfig make_session_config_(const packet::PacketPtr& packet) const;
93 
94  core::IArena& arena_;
95 
96  packet::PacketFactory& packet_factory_;
97  core::BufferFactory<uint8_t>& byte_buffer_factory_;
98  core::BufferFactory<audio::sample_t>& sample_buffer_factory_;
99 
100  const rtp::FormatMap& format_map_;
101 
102  audio::Mixer& mixer_;
103 
104  ReceiverState& receiver_state_;
105  const ReceiverConfig& receiver_config_;
106 
107  core::Optional<rtcp::Composer> rtcp_composer_;
108  core::Optional<rtcp::Session> rtcp_session_;
109 
110  core::List<ReceiverSession> sessions_;
111 };
112 
113 } // namespace pipeline
114 } // namespace roc
115 
116 #endif // ROC_PIPELINE_RECEIVER_SESSION_GROUP_H_
#define ROC_ATTR_NODISCARD
Emit warning if function result is not checked.
Definition: attributes.h:31
Mixer. Mixes multiple input streams into one output stream.
Definition: mixer.h:46
Memory arena interface.
Definition: iarena.h:23
Intrusive doubly-linked list.
Definition: list.h:35
Base class for non-copyable objects.
Definition: noncopyable.h:23
Optionally constructed object.
Definition: optional.h:25
core::nanoseconds_t refresh_sessions(core::nanoseconds_t current_time)
Refresh pipeline according to current time.
ReceiverSessionGroup(const ReceiverConfig &receiver_config, ReceiverState &receiver_state, audio::Mixer &mixer, const rtp::FormatMap &format_map, packet::PacketFactory &packet_factory, core::BufferFactory< uint8_t > &byte_buffer_factory, core::BufferFactory< audio::sample_t > &sample_buffer_factory, core::IArena &arena)
Initialize.
size_t num_sessions() const
Get number of alive sessions.
void get_metrics(ReceiverSessionMetrics *metrics, size_t *metrics_size) const
Get metrics for all sessions.
void reclock_sessions(core::nanoseconds_t playback_time)
Adjust session clock to match consumer clock.
ROC_ATTR_NODISCARD status::StatusCode route_packet(const packet::PacketPtr &packet)
Route packet to session.
Receiver session sub-pipeline.
Receiver pipeline state. Thread-safe.
Receiver hooks interface.
RTP payload format map. Thread-safe. Returned formats are immutable and can be safely used from any t...
Definition: format_map.h:33
Memory arena interface.
Packet writer interface.
Intrusive doubly-linked list.
Mixer.
int64_t nanoseconds_t
Nanoseconds.
Definition: time.h:58
uint32_t stream_source_t
Packet stream identifier.
Definition: units.h:27
Root namespace.
Non-copyable object.
Receiver session pipeline.
Receiver pipeline state.
Pipeline metrics.
RTCP packet composer.
RTCP session.
StatusCode
Status code.
Definition: status_code.h:19
Receiver parameters.
Definition: config.h:238
Receiver session parameters.
Definition: config.h:158
Metrics of receiver session (connection from sender).
Definition: metrics.h:38
Metrics for network link. Calculated independently on both sender and receiver.
Definition: metrics.h:53
Metrics sent from receiver to sender per source.
Definition: metrics.h:38
Metrics sent from sender to receiver.
Definition: metrics.h:23