Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
sender_endpoint.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 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/sender_endpoint.h
10 //! @brief Sender endpoint pipeline.
11 
12 #ifndef ROC_PIPELINE_SENDER_ENDPOINT_H_
13 #define ROC_PIPELINE_SENDER_ENDPOINT_H_
14 
15 #include "roc_address/protocol.h"
17 #include "roc_core/iarena.h"
18 #include "roc_core/mpsc_queue.h"
19 #include "roc_core/noncopyable.h"
20 #include "roc_core/optional.h"
21 #include "roc_core/scoped_ptr.h"
22 #include "roc_packet/icomposer.h"
23 #include "roc_packet/iparser.h"
24 #include "roc_packet/iwriter.h"
25 #include "roc_packet/shipper.h"
27 #include "roc_rtcp/composer.h"
28 #include "roc_rtcp/parser.h"
29 #include "roc_rtp/composer.h"
30 
31 namespace roc {
32 namespace pipeline {
33 
34 class SenderSession;
35 
36 //! Sender endpoint sub-pipeline.
37 //!
38 //! Contains:
39 //! - a pipeline for processing packets for single network endpoint
41 public:
42  //! Initialize.
43  //! - @p outbound_address specifies destination address that is assigned to the
44  //! outgoing packets in the end of endpoint pipeline
45  //! - @p outbound_writer specifies destination writer to which packets are sent
46  //! in the end of endpoint pipeline
48  StateTracker& state_tracker,
49  SenderSession& sender_session,
52  core::IArena& arena);
53 
54  //! Check if pipeline was succefully constructed.
55  bool is_valid() const;
56 
57  //! Get protocol.
59 
60  //! Get destination address for outbound packets.
62 
63  //! Get composer for outbound packets.
64  //! @remarks
65  //! This composer will create packets according to endpoint protocol.
67 
68  //! Get writer for outbound packets.
69  //! This way packets generated by sender reach network.
70  //! @remarks
71  //! Packets passed to this writer will be enqueued for sending.
72  //! When frame is written to SenderSession, it generates packets
73  //! and writes them to outbound writers of endpoints.
75 
76  //! Get writer for inbound packets.
77  //! This way feedback packets from receiver reach sender pipeline.
78  //! @remarks
79  //! Packets passed to this writer will be pulled into pipeline.
80  //! This writer is thread-safe and lock-free, packets can be written
81  //! to it from netio thread.
82  //! pull_packets() will pull enqueued inbound packets into SenderSession,
83  //! which will use them next time when frame is written.
84  //! @note
85  //! Not all protocols support inbound packets on sender. If it's
86  //! not supported, the method returns NULL.
88 
89  //! Pull packets written to inbound writer into pipeline.
90  //! @remarks
91  //! Packets are written to inbound_writer() from network thread.
92  //! They don't appear in pipeline immediately. Instead, pipeline thread
93  //! should periodically call pull_packets() to make them available.
95 
96 private:
97  virtual ROC_ATTR_NODISCARD status::StatusCode write(const packet::PacketPtr& packet);
98 
99  const address::Protocol proto_;
100 
101  StateTracker& state_tracker_;
102  SenderSession& sender_session_;
103 
104  // Outbound packets sub-pipeline.
105  // On sender, always present.
106  packet::IComposer* composer_;
107  core::Optional<rtp::Composer> rtp_composer_;
109  core::Optional<rtcp::Composer> rtcp_composer_;
111 
112  // Inbound packets sub-pipeline.
113  // On sender, typically present only in control endpoints.
114  packet::IParser* parser_;
115  core::Optional<rtcp::Parser> rtcp_parser_;
116  core::MpscQueue<packet::Packet> inbound_queue_;
117 
118  bool valid_;
119 };
120 
121 } // namespace pipeline
122 } // namespace roc
123 
124 #endif // ROC_PIPELINE_SENDER_ENDPOINT_H_
#define ROC_ATTR_NODISCARD
Emit warning if function result is not checked.
Definition: attributes.h:31
Socket address.
Definition: socket_addr.h:26
Memory arena interface.
Definition: iarena.h:23
Thread-safe lock-free node-based intrusive multi-producer single-consumer queue.
Definition: mpsc_queue.h:45
Base class for non-copyable objects.
Definition: noncopyable.h:23
Optionally constructed object.
Definition: optional.h:25
Unique ownrship pointer.
Definition: scoped_ptr.h:33
Packet composer interface.
Definition: icomposer.h:22
Packet parser interface.
Definition: iparser.h:22
Packet writer interface.
Definition: iwriter.h:23
Sender endpoint sub-pipeline.
address::Protocol proto() const
Get protocol.
packet::IComposer & outbound_composer()
Get composer for outbound packets.
bool is_valid() const
Check if pipeline was succefully constructed.
const address::SocketAddr & outbound_address() const
Get destination address for outbound packets.
packet::IWriter & outbound_writer()
Get writer for outbound packets. This way packets generated by sender reach network.
packet::IWriter * inbound_writer()
Get writer for inbound packets. This way feedback packets from receiver reach sender pipeline.
status::StatusCode pull_packets(core::nanoseconds_t current_time)
Pull packets written to inbound writer into pipeline.
SenderEndpoint(address::Protocol proto, StateTracker &state_tracker, SenderSession &sender_session, const address::SocketAddr &outbound_address, packet::IWriter &outbound_writer, core::IArena &arena)
Initialize.
Sender session sub-pipeline.
Pipeline state tracker.
Definition: state_tracker.h:30
Memory arena interface.
Packet composer interface.
Packet parser interface.
Packet writer interface.
Multi-producer single-consumer queue.
Protocol
Protocol ID.
Definition: protocol.h:19
int64_t nanoseconds_t
Nanoseconds.
Definition: time.h:58
StatusCode
Status code.
Definition: status_code.h:19
Root namespace.
Non-copyable object.
Optionally constructed object.
Protocol ID.
RTCP packet composer.
RTCP packet parser.
RTP packet composer.
Unique ownrship pointer.
Prepare and ship outgoing packets.
Socket address.
Pipeline state tracker.