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"
19#include "roc_packet/iwriter.h"
23#include "roc_rtcp/composer.h"
24#include "roc_rtcp/session.h"
25
26namespace roc {
27namespace pipeline {
28
29//! Receiver session group.
30//!
31//! Contains:
32//! - a set of related receiver sessions
34public:
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
73private:
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
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