]> git.sesse.net Git - vlc/blobdiff - modules/demux/livedotcom.cpp
* API change in mkv. Everyone should update to the latest libraries.
[vlc] / modules / demux / livedotcom.cpp
index 497b05236d974a3199eae872457f5b80f217323c..a9709be73602099b60d216da146fa870cd3eb160 100644 (file)
@@ -2,7 +2,7 @@
  * live.cpp : live.com support.
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: livedotcom.cpp,v 1.8 2003/11/20 22:10:55 fenrir Exp $
+ * $Id: livedotcom.cpp,v 1.13 2003/12/04 18:13:28 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -65,6 +65,7 @@ vlc_module_begin();
     add_submodule();
         set_description( _("RTSP/RTP describe") );
         add_shortcut( "rtsp" );
+        add_shortcut( "sdp" );
         set_capability( "access", 0 );
         set_callbacks( AccessOpen, AccessClose );
         add_category_hint( N_("RTSP"), NULL, VLC_TRUE );
@@ -134,6 +135,7 @@ struct demux_sys_t
 };
 
 static ssize_t Read   ( input_thread_t *, byte_t *, size_t );
+static ssize_t MRLRead( input_thread_t *, byte_t *, size_t );
 
 static int     Demux  ( input_thread_t * );
 static int     Control( input_thread_t *, int, va_list );
@@ -155,86 +157,110 @@ static int  AccessOpen( vlc_object_t *p_this )
     vlc_value_t      val;
     char             *psz_url;
 
-    if( p_input->psz_access == NULL || strcasecmp( p_input->psz_access, "rtsp" ) )
+    if( p_input->psz_access == NULL || ( strcasecmp( p_input->psz_access, "rtsp" ) && strcasecmp( p_input->psz_access, "sdp" ) ) )
     {
         msg_Warn( p_input, "RTSP access discarded" );
         return VLC_EGENERIC;
     }
-    if( ( scheduler = BasicTaskScheduler::createNew() ) == NULL )
+    if( !strcasecmp( p_input->psz_access, "rtsp" ) )
     {
-        msg_Err( p_input, "BasicTaskScheduler::createNew failed" );
-        return VLC_EGENERIC;
-    }
-    if( ( env = BasicUsageEnvironment::createNew(*scheduler) ) == NULL )
-    {
-        delete scheduler;
-        msg_Err( p_input, "BasicUsageEnvironment::createNew failed" );
-        return VLC_EGENERIC;
-    }
-    if( ( rtsp = RTSPClient::createNew(*env, 1/*verbose*/, "VLC Media Player" ) ) == NULL )
-    {
-        delete env;
-        delete scheduler;
-        msg_Err( p_input, "RTSPClient::createNew failed" );
-        return VLC_EGENERIC;
-    }
+        if( ( scheduler = BasicTaskScheduler::createNew() ) == NULL )
+        {
+            msg_Err( p_input, "BasicTaskScheduler::createNew failed" );
+            return VLC_EGENERIC;
+        }
+        if( ( env = BasicUsageEnvironment::createNew(*scheduler) ) == NULL )
+        {
+            delete scheduler;
+            msg_Err( p_input, "BasicUsageEnvironment::createNew failed" );
+            return VLC_EGENERIC;
+        }
+        if( ( rtsp = RTSPClient::createNew(*env, 1/*verbose*/, "VLC Media Player" ) ) == NULL )
+        {
+            delete env;
+            delete scheduler;
+            msg_Err( p_input, "RTSPClient::createNew failed" );
+            return VLC_EGENERIC;
+        }
 
-    psz_url = (char*)malloc( strlen( p_input->psz_name ) + 8 );
-    sprintf( psz_url, "rtsp://%s", p_input->psz_name );
+        psz_url = (char*)malloc( strlen( p_input->psz_name ) + 8 );
+        sprintf( psz_url, "rtsp://%s", p_input->psz_name );
 
-    p_sys = (access_sys_t*)malloc( sizeof( access_sys_t ) );
-    p_sys->p_sdp = rtsp->describeURL( psz_url );
+        p_sys = (access_sys_t*)malloc( sizeof( access_sys_t ) );
+        p_sys->p_sdp = rtsp->describeURL( psz_url );
 
-    if( p_sys->p_sdp == NULL )
-    {
-        msg_Err( p_input, "describeURL failed (%s)", env->getResultMsg() );
+        if( p_sys->p_sdp == NULL )
+        {
+            msg_Err( p_input, "describeURL failed (%s)", env->getResultMsg() );
 
+            free( psz_url );
+            delete env;
+            delete scheduler;
+            free( p_sys );
+            return VLC_EGENERIC;
+        }
         free( psz_url );
-        delete env;
-        delete scheduler;
-        free( p_sys );
-        return VLC_EGENERIC;
-    }
-    free( psz_url );
-    p_sys->i_sdp = strlen( p_sys->p_sdp );
-    p_sys->i_pos = 0;
+        p_sys->i_sdp = strlen( p_sys->p_sdp );
+        p_sys->i_pos = 0;
 
-    //fprintf( stderr, "sdp=%s\n", p_sys->p_sdp );
+        //fprintf( stderr, "sdp=%s\n", p_sys->p_sdp );
 
-    delete env;
-    delete scheduler;
+        delete env;
+        delete scheduler;
 
-    var_Create( p_input, "rtsp-tcp", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
-    var_Get( p_input, "rtsp-tcp", &val );
+        var_Create( p_input, "rtsp-tcp", VLC_VAR_BOOL|VLC_VAR_DOINHERIT );
+        var_Get( p_input, "rtsp-tcp", &val );
 
-    p_input->p_access_data = p_sys;
-    p_input->i_mtu = 0;
+        p_input->p_access_data = p_sys;
+        p_input->i_mtu = 0;
 
-    /* Set exported functions */
-    p_input->pf_read = Read;
-    p_input->pf_seek = NULL;
-    p_input->pf_set_program = input_SetProgram;
-    p_input->pf_set_area = NULL;
-    p_input->p_private = NULL;
+        /* Set exported functions */
+        p_input->pf_read = Read;
+        p_input->pf_seek = NULL;
+        p_input->pf_set_program = input_SetProgram;
+        p_input->pf_set_area = NULL;
+        p_input->p_private = NULL;
 
-    p_input->psz_demux = "live";
+        p_input->psz_demux = "live";
 
-    /* Finished to set some variable */
-    vlc_mutex_lock( &p_input->stream.stream_lock );
-    /* FIXME that's not true but eg over tcp, server send data too fast */
-    p_input->stream.b_pace_control = val.b_bool;
-    p_input->stream.p_selected_area->i_tell = 0;
-    p_input->stream.b_seekable = 1; /* Hack to display time */
-    p_input->stream.p_selected_area->i_size = 0;
-    p_input->stream.i_method = INPUT_METHOD_NETWORK;
-    vlc_mutex_unlock( &p_input->stream.stream_lock );
+        /* Finished to set some variable */
+        vlc_mutex_lock( &p_input->stream.stream_lock );
+        /* FIXME that's not true but eg over tcp, server send data too fast */
+        p_input->stream.b_pace_control = val.b_bool;
+        p_input->stream.p_selected_area->i_tell = 0;
+        p_input->stream.b_seekable = 1; /* Hack to display time */
+        p_input->stream.p_selected_area->i_size = 0;
+        p_input->stream.i_method = INPUT_METHOD_NETWORK;
+        vlc_mutex_unlock( &p_input->stream.stream_lock );
 
-    /* Update default_pts to a suitable value for RTSP access */
-    var_Create( p_input, "rtsp-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
-    var_Get( p_input, "rtsp-caching", &val );
-    p_input->i_pts_delay = val.i_int * 1000;
+        /* Update default_pts to a suitable value for RTSP access */
+        var_Create( p_input, "rtsp-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );
+        var_Get( p_input, "rtsp-caching", &val );
+        p_input->i_pts_delay = val.i_int * 1000;
 
-    return VLC_SUCCESS;
+        return VLC_SUCCESS;
+    }
+    else
+    {
+        p_input->p_access_data = (access_sys_t*)0;
+        p_input->i_mtu = 0;
+        p_input->pf_read = MRLRead;
+        p_input->pf_seek = NULL;
+        p_input->pf_set_program = input_SetProgram;
+        p_input->pf_set_area = NULL;
+        p_input->p_private = NULL;
+        p_input->psz_demux = "live";
+        /* Finished to set some variable */
+        vlc_mutex_lock( &p_input->stream.stream_lock );
+        p_input->stream.b_pace_control = VLC_TRUE;
+        p_input->stream.p_selected_area->i_tell = 0;
+        p_input->stream.b_seekable = VLC_FALSE;
+        p_input->stream.p_selected_area->i_size = 0;
+        p_input->stream.i_method = INPUT_METHOD_NETWORK;
+        vlc_mutex_unlock( &p_input->stream.stream_lock );
+
+        return VLC_SUCCESS;
+    }
 }
 
 /*****************************************************************************
@@ -244,9 +270,11 @@ static void AccessClose( vlc_object_t *p_this )
 {
     input_thread_t *p_input = (input_thread_t *)p_this;
     access_sys_t   *p_sys = p_input->p_access_data;
-
-    delete[] p_sys->p_sdp;
-    free( p_sys );
+    if( !strcasecmp( p_input->psz_access, "rtsp" ) )
+    {
+        delete[] p_sys->p_sdp;
+        free( p_sys );
+    }
 }
 
 /*****************************************************************************
@@ -264,6 +292,22 @@ static ssize_t Read ( input_thread_t *p_input, byte_t *p_buffer, size_t i_len )
     }
     return i_copy;
 }
+/*****************************************************************************
+ * MRLRead: read data from the mrl
+ *****************************************************************************/
+static ssize_t MRLRead ( input_thread_t *p_input, byte_t *p_buffer, size_t i_len )
+{
+    int i_done = (int)p_input->p_access_data;
+    int            i_copy = __MIN( (int)i_len, (int)strlen(p_input->psz_name) - i_done );
+
+    if( i_copy > 0 )
+    {
+        memcpy( p_buffer, &p_input->psz_name[i_done], i_copy );
+        i_done += i_copy;
+        p_input->p_access_data = (access_sys_t*)i_done;
+    }
+    return i_copy;
+}
 
 
 /*****************************************************************************
@@ -316,6 +360,15 @@ static int  DemuxOpen ( vlc_object_t *p_this )
     p_sys->i_start = 0;
 
     /* Gather the complete sdp file */
+    vlc_mutex_lock( &p_input->stream.stream_lock );
+    if( input_InitStream( p_input, 0 ) == -1)
+    {
+        vlc_mutex_unlock( &p_input->stream.stream_lock );
+        msg_Err( p_input, "cannot init stream" );
+        goto error;
+    }
+    vlc_mutex_unlock( &p_input->stream.stream_lock );
+
     i_sdp = 0;
     i_sdp_max = 1000;
     p_sdp = (uint8_t*)malloc( i_sdp_max );
@@ -568,7 +621,7 @@ static int  DemuxOpen ( vlc_object_t *p_this )
 
         if( tk->p_es || tk->b_quicktime )
         {
-            TAB_APPEND( p_sys->i_track, (void**)p_sys->track, (void*)tk );
+            TAB_APPEND( p_sys->i_track, p_sys->track, tk );
             tk->readSource = sub->readSource();
             tk->rtpSource  = sub->rtpSource();
         }
@@ -812,10 +865,9 @@ static void StreamRead( void *p_private, unsigned int i_size, struct timeval pts
     live_track_t   *tk = (live_track_t*)p_private;
     input_thread_t *p_input = tk->p_input;
     demux_sys_t    *p_sys = p_input->p_demux_data;
-    pes_packet_t   *p_pes;
-    data_packet_t  *p_data;
+    block_t        *p_block;
 
-    mtime_t        i_pts = (mtime_t)pts.tv_sec * 1000000LL + (mtime_t)pts.tv_usec;
+    mtime_t i_pts = (mtime_t)pts.tv_sec * 1000000LL + (mtime_t)pts.tv_usec;
 
     if( tk->b_quicktime && tk->p_es == NULL )
     {
@@ -846,41 +898,31 @@ static void StreamRead( void *p_private, unsigned int i_size, struct timeval pts
              i_size,
              pts.tv_sec * 1000000LL + pts.tv_usec );
 #endif
-    /* Create a PES */
-    if( ( p_pes = input_NewPES( p_input->p_method_data ) ) == NULL )
-    {
-        return;
-    }
     if( i_size > 65536 )
     {
         msg_Warn( p_input, "buffer overflow" );
     }
     /* FIXME could i_size be > buffer size ? */
-    p_data = input_NewPacket( p_input->p_method_data, i_size );
-
-    memcpy( p_data->p_payload_start, tk->buffer, i_size );
-    p_data->p_payload_end = p_data->p_payload_start + i_size;
+    p_block = block_New( p_input, i_size );
 
-    p_pes->p_first = p_pes->p_last = p_data;
-    p_pes->i_nb_data = 1;
-    p_pes->i_pes_size = i_size;
-    p_pes->i_rate = p_input->stream.control.i_rate;
+    memcpy( p_block->p_buffer, tk->buffer, i_size );
+    //p_block->i_rate = p_input->stream.control.i_rate;
 
     if( i_pts != tk->i_pts )
     {
-        p_pes->i_dts =
-        p_pes->i_pts = input_ClockGetTS( p_input,
+        p_block->i_dts =
+        p_block->i_pts = input_ClockGetTS( p_input,
                                          p_input->stream.p_selected_program,
                                          i_pts * 9 / 100 );
     }
     else
     {
-        p_pes->i_dts = 0;
-        p_pes->i_pts = 0;
+        p_block->i_dts = 0;
+        p_block->i_pts = 0;
     }
     //fprintf( stderr, "tk -> dpts=%lld\n", i_pts - tk->i_pts );
 
-    es_out_Send( p_input->p_es_out, tk->p_es, p_pes );
+    es_out_Send( p_input->p_es_out, tk->p_es, p_block );
 
     /* warm that's ok */
     p_sys->event = 0xff;