[vlc-commits] Adjust for 4.0 to 3.0 differences in rist access module

Sergio Ammirata git at videolan.org
Mon Dec 14 20:08:38 UTC 2020


vlc/vlc-3.0 | branch: master | Sergio Ammirata <sergio at ammirata.net> | Sun Jul 26 15:47:50 2020 -0400| [bcf7edd8f3e84333460fa780c84491a27c321721] | committer: Pierre Ynard

Adjust for 4.0 to 3.0 differences in rist access module

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=bcf7edd8f3e84333460fa780c84491a27c321721
---

 modules/access/rist.c | 60 +++++++++++++++++++++++++++------------------------
 modules/access/rist.h |  8 ++++---
 2 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/modules/access/rist.c b/modules/access/rist.c
index 009c17790d..6b06542cab 100644
--- a/modules/access/rist.c
+++ b/modules/access/rist.c
@@ -2,7 +2,7 @@
  * rist.c: RIST (Reliable Internet Stream Transport) input module
  *****************************************************************************
  * Copyright (C) 2018, DVEO, the Broadcast Division of Computer Modules, Inc.
- * Copyright (C) 2018, SipRadius LLC
+ * Copyright (C) 2018-2020, SipRadius LLC
  *
  * Authors: Sergio Ammirata <sergio at ammirata.net>
  *          Daniele Lacamera <root at danielinux.net>
@@ -30,14 +30,11 @@
 #include <vlc_interrupt.h>
 #include <vlc_plugin.h>
 #include <vlc_access.h>
-#include <vlc_queue.h>
 #include <vlc_threads.h>
 #include <vlc_network.h>
 #include <vlc_block.h>
 #include <vlc_url.h>
-#ifdef HAVE_POLL_H
 #include <poll.h>
-#endif
 #include <bitstream/ietf/rtcp_rr.h>
 #include <bitstream/ietf/rtcp_sdes.h>
 #include <bitstream/ietf/rtcp_fb.h>
@@ -75,7 +72,7 @@ enum NACK_TYPE {
     NACK_FMT_BITMASK
 };
 
-typedef struct
+struct stream_sys_t
 {
     struct rist_flow *flow;
     char             sender_name[MAX_CNAME];
@@ -91,8 +88,7 @@ typedef struct
     bool             b_sendblindnacks;
     bool             b_disablenacks;
     bool             b_flag_discontinuity;
-    bool             dead;
-    vlc_queue_t      queue;
+    block_fifo_t     *p_fifo;
     vlc_mutex_t      lock;
     uint64_t         last_message;
     uint64_t         last_reset;
@@ -107,7 +103,7 @@ typedef struct
     uint32_t         i_recovered_packets;
     uint32_t         i_reordered_packets;
     uint32_t         i_total_packets;
-} stream_sys_t;
+};
 
 static int Control(stream_t *p_access, int i_query, va_list args)
 {
@@ -121,7 +117,7 @@ static int Control(stream_t *p_access, int i_query, va_list args)
             break;
 
         case STREAM_GET_PTS_DELAY:
-            *va_arg( args, vlc_tick_t * ) = VLC_TICK_FROM_MS(
+            *va_arg( args, int64_t * ) = RIST_TICK_FROM_MS(
                    var_InheritInteger(p_access, "network-caching") );
             break;
 
@@ -406,7 +402,7 @@ static void send_nacks(stream_t *p_access, struct rist_flow *flow)
         {
             memcpy(pkt_nacks->p_buffer, nacks, nacks_len * 2);
             pkt_nacks->i_buffer = nacks_len * 2;
-            vlc_queue_Enqueue(&p_sys->queue, pkt_nacks);
+            block_FifoPut( p_sys->p_fifo, pkt_nacks );
         }
     }
 }
@@ -675,7 +671,7 @@ static bool rist_input(stream_t *p_access, struct rist_flow *flow, uint8_t *buf,
     pkt->buffer->i_buffer = len;
     memcpy(pkt->buffer->p_buffer, buf, len);
     pkt->rtp_ts = pkt_ts;
-    p_sys->last_data_rx = vlc_tick_now();
+    p_sys->last_data_rx = mdate();
     /* Reset the try counter regardless of wether it was a retransmit or not */
     flow->nacks_retries[idx] = 0;
 
@@ -776,12 +772,14 @@ static void *rist_thread(void *data)
 {
     stream_t *p_access = data;
     stream_sys_t *p_sys = p_access->p_sys;
-    block_t *pkt_nacks;
 
     /* Process nacks every 5ms */
     /* We only ask for the relevant ones */
-    while ((pkt_nacks = vlc_queue_DequeueKillable(&p_sys->queue,
-                                                  &p_sys->dead)) != NULL) {
+    for (;;) {
+        block_t *pkt_nacks = block_FifoGet(p_sys->p_fifo);
+
+        int canc = vlc_savecancel();
+
         /* there are two bytes per nack */
         uint16_t nack_count = (uint16_t)pkt_nacks->i_buffer/2;
         switch(p_sys->nack_type) {
@@ -796,6 +794,8 @@ static void *rist_thread(void *data)
         if (nack_count > 1)
             msg_Dbg(p_access, "Sent %u NACKs !!!", nack_count);
         block_Release(pkt_nacks);
+
+        vlc_restorecancel (canc);
     }
 
     return NULL;
@@ -917,12 +917,12 @@ static block_t *BlockRIST(stream_t *p_access, bool *restrict eof)
         buf = NULL;
     }
 
-    now = vlc_tick_now();
+    now = mdate();
 
     /* Process stats and print them out */
     /* We need to measure some items every 70ms */
     uint64_t interval = (now - flow->feedback_time);
-    if ( interval > VLC_TICK_FROM_MS(RTCP_INTERVAL) )
+    if ( interval > RIST_TICK_FROM_MS(RTCP_INTERVAL) )
     {
         if (p_sys->i_poll_timeout_nonzero_count > 0)
         {
@@ -941,7 +941,7 @@ static block_t *BlockRIST(stream_t *p_access, bool *restrict eof)
     }
     /* We print out the stats once per second */
     interval = (now - p_sys->i_last_stat);
-    if ( interval > VLC_TICK_FROM_MS(STATS_INTERVAL) )
+    if ( interval >  RIST_TICK_FROM_MS(STATS_INTERVAL) )
     {
         if ( p_sys->i_lost_packets > 0)
             msg_Err(p_access, "We have %d lost packets", p_sys->i_lost_packets);
@@ -969,17 +969,17 @@ static block_t *BlockRIST(stream_t *p_access, bool *restrict eof)
 
     /* Send rtcp feedback every RTCP_INTERVAL */
     interval = (now - flow->feedback_time);
-    if ( interval > VLC_TICK_FROM_MS(RTCP_INTERVAL) )
+    if ( interval > RIST_TICK_FROM_MS(RTCP_INTERVAL) )
     {
         /* msg_Dbg(p_access, "Calling RTCP Feedback %lu<%d ms using timer", interval,
-        VLC_TICK_FROM_MS(RTCP_INTERVAL)); */
+        RIST_TICK_FROM_MS(RTCP_INTERVAL)); */
         send_rtcp_feedback(p_access, flow);
         flow->feedback_time = now;
     }
 
     /* Send nacks every NACK_INTERVAL (only the ones that have matured, if any) */
     interval = (now - p_sys->last_nack_tx);
-    if ( interval > VLC_TICK_FROM_MS(NACK_INTERVAL) )
+    if ( interval > RIST_TICK_FROM_MS(NACK_INTERVAL) )
     {
         send_nacks(p_access, p_sys->flow);
         p_sys->last_nack_tx = now;
@@ -987,8 +987,8 @@ static block_t *BlockRIST(stream_t *p_access, bool *restrict eof)
 
     /* Safety check for when the input stream stalls */
     if ( p_sys->last_data_rx > 0 && now > p_sys->last_data_rx &&
-        (uint64_t)(now - p_sys->last_data_rx) >  (uint64_t)VLC_TICK_FROM_MS(flow->latency) &&
-        (uint64_t)(now - p_sys->last_reset) > (uint64_t)VLC_TICK_FROM_MS(flow->latency) )
+        (uint64_t)(now - p_sys->last_data_rx) >  (uint64_t)RIST_TICK_FROM_MS(flow->latency) &&
+        (uint64_t)(now - p_sys->last_reset) > (uint64_t)RIST_TICK_FROM_MS(flow->latency) )
     {
         msg_Err(p_access, "No data received for %"PRId64" ms, resetting buffers",
             (int64_t)(now - p_sys->last_data_rx)/1000);
@@ -1012,6 +1012,9 @@ static void Clean( stream_t *p_access )
 {
     stream_sys_t *p_sys = p_access->p_sys;
 
+    if( likely(p_sys->p_fifo != NULL) )
+        block_FifoRelease( p_sys->p_fifo );
+
     if (p_sys->flow)
     {
         if (p_sys->flow->fd_in >= 0)
@@ -1037,7 +1040,7 @@ static void Close(vlc_object_t *p_this)
     stream_t     *p_access = (stream_t*)p_this;
     stream_sys_t *p_sys = p_access->p_sys;
 
-    vlc_queue_Kill(&p_sys->queue, &p_sys->dead);
+    vlc_cancel(p_sys->thread);
     vlc_join(p_sys->thread, NULL);
 
     Clean( p_access );
@@ -1095,12 +1098,13 @@ static int Open(vlc_object_t *p_this)
     msg_Info(p_access, "Setting queue latency to %d ms", p_sys->flow->latency);
 
     /* Convert to rtp times */
-    p_sys->flow->rtp_latency = rtp_get_ts(VLC_TICK_FROM_MS(p_sys->flow->latency));
-    p_sys->flow->retry_interval = rtp_get_ts(VLC_TICK_FROM_MS(p_sys->flow->retry_interval));
-    p_sys->flow->reorder_buffer = rtp_get_ts(VLC_TICK_FROM_MS(p_sys->flow->reorder_buffer));
+    p_sys->flow->rtp_latency = rtp_get_ts(RIST_TICK_FROM_MS(p_sys->flow->latency));
+    p_sys->flow->retry_interval = rtp_get_ts(RIST_TICK_FROM_MS(p_sys->flow->retry_interval));
+    p_sys->flow->reorder_buffer = rtp_get_ts(RIST_TICK_FROM_MS(p_sys->flow->reorder_buffer));
 
-    p_sys->dead = false;
-    vlc_queue_Init(&p_sys->queue, offsetof (block_t, p_next));
+    p_sys->p_fifo = block_FifoNew();
+    if( unlikely(p_sys->p_fifo == NULL) )
+        goto failed;
 
     /* This extra thread is for sending feedback/nack packets even when no data comes in */
     if (vlc_clone(&p_sys->thread, rist_thread, p_access, VLC_THREAD_PRIORITY_INPUT))
diff --git a/modules/access/rist.h b/modules/access/rist.h
index ec0f6ae0f9..263b43cb2e 100644
--- a/modules/access/rist.h
+++ b/modules/access/rist.h
@@ -63,6 +63,8 @@
 
 #define RTCP_PT_RTPFR             204
 
+#define RIST_TICK_FROM_MS(ms) ((CLOCK_FREQ / INT64_C(1000)) * (ms))
+
 struct rtp_pkt {
     uint32_t rtp_ts;
     struct block_t *buffer;
@@ -172,7 +174,7 @@ static inline void populate_cname(int fd, char *identifier)
     }
 }
 
-static inline uint32_t rtp_get_ts( vlc_tick_t i_pts )
+static inline uint32_t rtp_get_ts( int64_t i_pts )
 {
     unsigned i_clock_rate = 90000;
     /* This is an overflow-proof way of doing:
@@ -185,10 +187,10 @@ static inline uint32_t rtp_get_ts( vlc_tick_t i_pts )
           + q.rem * (int64_t)i_clock_rate / CLOCK_FREQ;
 }
 
-static inline vlc_tick_t ts_get_from_rtp( uint32_t i_rtp_ts )
+static inline int64_t ts_get_from_rtp( uint32_t i_rtp_ts )
 {
     unsigned i_clock_rate = 90000;
-    return (vlc_tick_t)i_rtp_ts * (vlc_tick_t)(CLOCK_FREQ/i_clock_rate);
+    return (int64_t)i_rtp_ts * (int64_t)(CLOCK_FREQ/i_clock_rate);
 }
 
 static inline ssize_t rist_ReadFrom_i11e(int fd, void *buf, size_t len, struct sockaddr *peer, 



More information about the vlc-commits mailing list