]> git.sesse.net Git - vlc/blobdiff - modules/access_output/udp.c
* all: do not export input_NullPacket
[vlc] / modules / access_output / udp.c
index 034119e8e4ed97bd741efb3ffba909afe48a0b0c..25f248adc817c46549617cc4aea5966845106752 100644 (file)
@@ -2,7 +2,7 @@
  * udp.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: udp.c,v 1.12 2003/08/01 19:38:48 fenrir Exp $
+ * $Id: udp.c,v 1.16 2003/11/17 14:46:37 massiot Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *          Eric Petit <titer@videolan.org>
@@ -61,8 +61,9 @@
 static int     Open   ( vlc_object_t * );
 static void    Close  ( vlc_object_t * );
 
-static int     Write( sout_access_out_t *, sout_buffer_t * );
-static int     Seek ( sout_access_out_t *, off_t  );
+static int     Write   ( sout_access_out_t *, sout_buffer_t * );
+static int     WriteRaw( sout_access_out_t *, sout_buffer_t * );
+static int     Seek    ( sout_access_out_t *, off_t  );
 
 static void    ThreadWrite( vlc_object_t * );
 
@@ -96,6 +97,8 @@ typedef struct sout_access_thread_s
 
     int         i_handle;
 
+    int64_t     i_caching;
+
 } sout_access_thread_t;
 
 struct sout_access_out_sys_t
@@ -209,6 +212,12 @@ static int Open( vlc_object_t *p_this )
     module_Unneed( p_sys->p_thread, p_network );
 
     p_sys->p_thread->i_handle = socket_desc.i_handle;
+    p_sys->p_thread->i_caching = config_GetInt( p_this, "udp-sout-caching" ) * 1000;
+    if( ( val = sout_cfg_find_value( p_access->p_cfg, "caching" ) ) )
+    {
+        p_sys->p_thread->i_caching = atoll( val ) * 1000;
+    }
+
     p_sys->i_mtu     = socket_desc.i_mtu;
 
     if( vlc_thread_create( p_sys->p_thread, "sout write thread", ThreadWrite,
@@ -224,7 +233,14 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_sequence_number = rand()&0xffff;
     p_sys->i_ssrc            = rand()&0xffffffff;
 
-    p_access->pf_write       = Write;
+    if( sout_cfg_find( p_access->p_cfg, "raw" ) )
+    {
+        p_access->pf_write       = WriteRaw;
+    }
+    else
+    {
+        p_access->pf_write       = Write;
+    }
     p_access->pf_seek        = Seek;
 
     msg_Info( p_access, "Open: addr:`%s' port:`%d'",
@@ -276,7 +292,7 @@ static void Close( vlc_object_t * p_this )
 }
 
 /*****************************************************************************
- * Read: standard read on a file descriptor.
+ * Write: standard write on a file descriptor.
  *****************************************************************************/
 static int Write( sout_access_out_t *p_access, sout_buffer_t *p_buffer )
 {
@@ -323,6 +339,18 @@ static int Write( sout_access_out_t *p_access, sout_buffer_t *p_buffer )
     return( p_sys->p_thread->b_error ? -1 : 0 );
 }
 
+/*****************************************************************************
+ * WriteRaw: write p_buffer without trying to fill mtu
+ *****************************************************************************/
+static int WriteRaw( sout_access_out_t *p_access, sout_buffer_t *p_buffer )
+{
+    sout_access_out_sys_t   *p_sys = p_access->p_sys;
+
+    sout_FifoPut( p_sys->p_thread->p_fifo, p_buffer );
+
+    return( p_sys->p_thread->b_error ? -1 : 0 );
+}
+
 /*****************************************************************************
  * Seek: seek to a specific location in a file
  *****************************************************************************/
@@ -380,20 +408,16 @@ static void ThreadWrite( vlc_object_t *p_this )
 {
     sout_access_thread_t *p_thread = (sout_access_thread_t*)p_this;
     sout_instance_t      *p_sout = p_thread->p_sout;
-    mtime_t              i_pts_delay;
     mtime_t              i_date_last = -1;
 
-    /* Get the i_pts_delay value */
-    i_pts_delay = config_GetInt( p_this, "udp-sout-caching" ) * 1000;
-
     while( ! p_thread->b_die )
     {
         sout_buffer_t *p_pk;
-        mtime_t       i_date;
+        mtime_t       i_date, i_sent;
 
         p_pk = sout_FifoGet( p_thread->p_fifo );
 
-        i_date = i_pts_delay + p_pk->i_dts;
+        i_date = p_thread->i_caching + p_pk->i_dts;
         if( i_date_last > 0 )
         {
             if( i_date - i_date_last > 2000000 )
@@ -414,9 +438,14 @@ static void ThreadWrite( vlc_object_t *p_this )
             }
         }
 
-
         mwait( i_date );
         send( p_thread->i_handle, p_pk->p_buffer, p_pk->i_size, 0 );
+        i_sent = mdate();
+        if ( i_sent > i_date + 20000 )
+        {
+            msg_Dbg( p_thread, "packet has been sent too late (" I64Fd ")",
+                     i_sent - i_date );
+        }
         sout_BufferDelete( p_sout, p_pk );
         i_date_last = i_date;
     }