6868
6969using std::ostringstream;
7070using std::string;
71+ using ultragrid::pthread_mutex_guard;
7172
7273struct rtp_rxtx_common_priv_state {
7374 uint32_t magic;
7475
76+ // stored for reconfiguration
77+ int force_ip_version;
78+ char *mcast_if;
79+ int ttl;
80+ char *requested_receiver;
81+ int rx_port;
82+ int tx_port;
83+
7584 struct rtp_rxtx_common info;
7685 // / This is child of vrxtx sender module to process specific messages.
7786 // / The receiver module is used directly (vrxtx doesn't process any
@@ -94,17 +103,16 @@ rtp_process_sender_message(struct rtp_rxtx_common *s, struct msg_sender *msg)
94103 assert (s->priv ->info .rxtx_mode == MODE_SENDER); // sender only
95104 ultragrid::pthread_mutex_guard lock (s->network_devices_lock );
96105 auto *old_device = s->network_device ;
97- char *old_receiver = s->requested_receiver ;
98- s->requested_receiver = msg->receiver ;
99- s->network_device = initialize_network (
100- s->requested_receiver , s->rx_port ,
101- s->tx_port , s->participants ,
102- s->force_ip_version ,
103- s->mcast_if , s->ttl );
106+ char *old_receiver = s->priv ->requested_receiver ;
107+ s->priv ->requested_receiver = strdup (msg->receiver );
108+ s->network_device = initialize_network (
109+ s->priv ->requested_receiver , s->priv ->rx_port ,
110+ s->priv ->tx_port , s->participants ,
111+ s->priv ->force_ip_version , s->priv ->mcast_if , s->priv ->ttl );
104112 if (s->network_device == nullptr ) {
105113 s->network_device = old_device;
106- free (s->requested_receiver );
107- s->requested_receiver = old_receiver;
114+ free (s->priv -> requested_receiver );
115+ s->priv -> requested_receiver = old_receiver;
108116 MSG (ERROR, " Failed receiver to %s.\n " , msg->receiver );
109117 return new_response (RESPONSE_INT_SERV_ERR,
110118 " Changing receiver failed!" );
@@ -117,21 +125,21 @@ rtp_process_sender_message(struct rtp_rxtx_common *s, struct msg_sender *msg)
117125 assert (s->rxtx_mode == MODE_SENDER); // sender only
118126 ultragrid::pthread_mutex_guard lock (s->network_devices_lock );
119127 auto *old_device = s->network_device ;
120- auto old_port = s->tx_port ;
128+ auto old_port = s->priv -> tx_port ;
121129
122- s->tx_port = msg->tx_port ;
130+ s->priv -> tx_port = msg->tx_port ;
123131 if (msg->rx_port != 0 ) {
124- s->rx_port = msg->rx_port ;
132+ s->priv -> rx_port = msg->rx_port ;
125133 }
126134 s->network_device = initialize_network (
127- s->requested_receiver , s->rx_port ,
128- s->tx_port , s->participants ,
129- s->force_ip_version ,
130- s->mcast_if , s->ttl );
135+ s->priv -> requested_receiver , s-> priv ->rx_port ,
136+ s->priv -> tx_port , s->participants ,
137+ s->priv -> force_ip_version ,
138+ s->priv -> mcast_if , s-> priv ->ttl );
131139
132140 if (s->network_device == nullptr ) {
133141 s->network_device = old_device;
134- s->tx_port = old_port;
142+ s->priv -> tx_port = old_port;
135143 MSG (ERROR, " Failed to Change TX port to %d.\n " ,
136144 msg->tx_port );
137145 return new_response (RESPONSE_INT_SERV_ERR,
@@ -173,10 +181,10 @@ rtp_process_sender_message(struct rtp_rxtx_common *s, struct msg_sender *msg)
173181 const uint32_t old_ssrc = rtp_my_ssrc (s->network_device );
174182 auto *old_device = s->network_device ;
175183 s->network_device = initialize_network (
176- s->requested_receiver , s->rx_port ,
177- s->tx_port , s->participants ,
178- s->force_ip_version ,
179- s->mcast_if , s->ttl );
184+ s->priv -> requested_receiver , s-> priv ->rx_port ,
185+ s->priv -> tx_port , s->participants ,
186+ s->priv -> force_ip_version ,
187+ s->priv -> mcast_if , s-> priv ->ttl );
180188 if (s->network_device == nullptr ) {
181189 s->network_device = old_device;
182190 MSG (ERROR, " Unable to change SSRC!\n " );
@@ -223,19 +231,19 @@ struct rtp_rxtx_common *rtp_rxtx_common_init(const struct vrxtx_params *params,
223231 s->priv = priv;
224232 s->priv ->magic = MAGIC;
225233 pthread_mutex_init (&s->network_devices_lock , nullptr );
226- s->force_ip_version = common->force_ip_version ,
227- s->mcast_if = strdup (common->mcast_if );
228- s->ttl = common->ttl ;
229- s->requested_receiver = strdup (common->receiver ),
230- s->rx_port = params->rx_port ,
231- s->tx_port = params->tx_port ,
232- s->rxtx_mode = params->rxtx_mode ;
234+ s->priv -> force_ip_version = common->force_ip_version ,
235+ s->priv -> mcast_if = strdup (common->mcast_if );
236+ s->priv -> ttl = common->ttl ;
237+ s->priv -> requested_receiver = strdup (common->receiver ),
238+ s->priv -> rx_port = params->rx_port ,
239+ s->priv -> tx_port = params->tx_port ;
240+ s->rxtx_mode = params->rxtx_mode ;
233241
234242 s->participants = pdb_init (" video" , &video_offset);
235243
236244 s->network_device = initialize_network (
237- s->requested_receiver , s->rx_port ,
238- s->tx_port , s->participants , common->force_ip_version ,
245+ s->priv -> requested_receiver , s-> priv ->rx_port ,
246+ s->priv -> tx_port , s->participants , common->force_ip_version ,
239247 common->mcast_if , common->ttl );
240248 if (s->network_device == nullptr ) {
241249 rtp_rxtx_common_done (s);
@@ -281,8 +289,8 @@ rtp_rxtx_common_done(struct rtp_rxtx_common *s)
281289 }
282290
283291 delete s->fec_state ;
284- free (s->mcast_if );
285- free (s->requested_receiver );
292+ free (s->priv -> mcast_if );
293+ free (s->priv -> requested_receiver );
286294 module_done (&priv->m_rtp_sender_mod );
287295
288296 pthread_mutex_destroy (&s->network_devices_lock );
@@ -372,3 +380,16 @@ destroy_rtp_device(struct rtp *network_device)
372380{
373381 rtp_done (network_device);
374382}
383+
384+ void rtp_rxtx_set_pbuf_delay (struct rtp_rxtx_common *s, double delay) {
385+ pthread_mutex_guard lock (s->network_devices_lock );
386+ pdb_iter_t it;
387+ // / @todo should be set only to relevant participant,
388+ // / not all
389+ struct pdb_e *cp = pdb_iter_init (s->participants , &it);
390+ while (cp != nullptr ) {
391+ pbuf_set_playout_delay (cp->playout_buffer , delay);
392+
393+ cp = pdb_iter_next (&it);
394+ }
395+ }
0 commit comments