]> git.sesse.net Git - vlc/blobdiff - modules/misc/rtsp.c
Revert "memcpy: Flag an unused param in memcpyaltivec."
[vlc] / modules / misc / rtsp.c
index 18213d409b111d4cec6011181fd183f68a38f36d..53ba65e1fbb30421f685fbf1d5c7effa210e7f23 100644 (file)
@@ -36,9 +36,9 @@
 #include <vlc_sout.h>
 #include <vlc_block.h>
 
-#include "vlc_httpd.h"
-#include "vlc_vod.h"
-#include "vlc_url.h"
+#include <vlc_httpd.h>
+#include <vlc_vod.h>
+#include <vlc_url.h>
 #include <vlc_network.h>
 #include <vlc_charset.h>
 #include <vlc_strings.h>
@@ -219,10 +219,25 @@ typedef enum
     RTSP_CMD_TYPE_SEEK,
     RTSP_CMD_TYPE_REWIND,
     RTSP_CMD_TYPE_FORWARD,
+
+    RTSP_CMD_TYPE_ADD,
+    RTSP_CMD_TYPE_DEL,
 } rtsp_cmd_type_t;
 
+/* */
+typedef struct
+{
+    int i_type;
+    int i_media_id;
+    vod_media_t *p_media;
+    char *psz_session;
+    char *psz_arg;
+    double f_arg;
+} rtsp_cmd_t;
+
 static vod_media_t *MediaNew( vod_t *, const char *, input_item_t * );
 static void         MediaDel( vod_t *, vod_media_t * );
+static void         MediaAskDel ( vod_t *, vod_media_t * );
 static int          MediaAddES( vod_t *, vod_media_t *, es_format_t * );
 static void         MediaDelES( vod_t *, vod_media_t *, es_format_t * );
 
@@ -302,7 +317,7 @@ static int Open( vlc_object_t *p_this )
     p_sys->i_media_id = 0;
 
     p_vod->pf_media_new = MediaNew;
-    p_vod->pf_media_del = MediaDel;
+    p_vod->pf_media_del = MediaAskDel;
     p_vod->pf_media_add_es = MediaAddES;
     p_vod->pf_media_del_es = MediaDelES;
 
@@ -337,12 +352,24 @@ static void Close( vlc_object_t * p_this )
 {
     vod_t *p_vod = (vod_t *)p_this;
     vod_sys_t *p_sys = p_vod->p_sys;
+    block_t *p_block_cmd;
+    rtsp_cmd_t cmd;
 
     /* Stop command thread */
     vlc_object_kill( p_vod );
     CommandPush( p_vod, RTSP_CMD_TYPE_NONE, NULL, NULL, 0.0, NULL );
     vlc_thread_join( p_vod );
 
+    while( block_FifoCount( p_sys->p_fifo_cmd ) > 0 )
+    {
+         p_block_cmd = block_FifoGet( p_sys->p_fifo_cmd );
+         memcpy( &cmd, p_block_cmd->p_buffer, sizeof(cmd) );
+         block_Release( p_block_cmd );
+         if ( cmd.i_type == RTSP_CMD_TYPE_DEL )
+             MediaDel(p_vod, cmd.p_media);
+         free( cmd.psz_session );
+         free( cmd.psz_arg );
+    }
     block_FifoRelease( p_sys->p_fifo_cmd );
 
     httpd_HostDelete( p_sys->p_rtsp_host );
@@ -432,10 +459,6 @@ static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name,
 
     p_media->p_vod = p_vod;
 
-    vlc_mutex_lock( &p_sys->lock_media );
-    TAB_APPEND( p_sys->i_media, p_sys->media, p_media );
-    vlc_mutex_unlock( &p_sys->lock_media );
-
     vlc_mutex_init( &p_media->lock );
     p_media->psz_session_name = strdup("");
     p_media->psz_session_description = strdup("");
@@ -459,9 +482,15 @@ static vod_media_t *MediaNew( vod_t *p_vod, const char *psz_name,
     }
     vlc_mutex_unlock( &p_item->lock );
 
+    CommandPush( p_vod, RTSP_CMD_TYPE_ADD, p_media, NULL, 0.0, NULL );
     return p_media;
 }
 
+static void MediaAskDel ( vod_t *p_vod, vod_media_t *p_media )
+{
+    CommandPush( p_vod, RTSP_CMD_TYPE_DEL, p_media, NULL, 0.0, NULL );
+}
+
 static void MediaDel( vod_t *p_vod, vod_media_t *p_media )
 {
     vod_sys_t *p_sys = p_vod->p_sys;
@@ -472,11 +501,12 @@ static void MediaDel( vod_t *p_vod, vod_media_t *p_media )
     TAB_REMOVE( p_sys->i_media, p_sys->media, p_media );
     vlc_mutex_unlock( &p_sys->lock_media );
 
+    httpd_UrlDelete( p_media->p_rtsp_url );
+
     while( p_media->i_rtsp > 0 )
         RtspClientDel( p_media, p_media->rtsp[0] );
     TAB_CLEAN( p_media->i_rtsp, p_media->rtsp );
 
-    httpd_UrlDelete( p_media->p_rtsp_url );
     free( p_media->psz_rtsp_path );
     free( p_media->psz_rtsp_control_v6 );
     free( p_media->psz_rtsp_control_v4 );
@@ -516,7 +546,7 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
 
     switch( p_fmt->i_codec )
     {
-        case VLC_FOURCC( 's', '1', '6', 'b' ):
+        case VLC_CODEC_S16B:
             if( p_fmt->audio.i_channels == 1 && p_fmt->audio.i_rate == 44100 )
             {
                 p_es->i_payload_type = 11;
@@ -534,31 +564,30 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
                           p_fmt->audio.i_channels ) == -1 )
                 p_es->psz_rtpmap = NULL;
             break;
-        case VLC_FOURCC( 'u', '8', ' ', ' ' ):
+        case VLC_CODEC_U8:
             p_es->i_payload_type = p_media->i_payload_type++;
             if( asprintf( &p_es->psz_rtpmap, "L8/%d/%d", p_fmt->audio.i_rate,
                           p_fmt->audio.i_channels ) == -1 )
                 p_es->psz_rtpmap = NULL;
             break;
-        case VLC_FOURCC( 'm', 'p', 'g', 'a' ):
-        case VLC_FOURCC( 'm', 'p', '3', ' ' ):
+        case VLC_CODEC_MPGA:
             p_es->i_payload_type = 14;
             p_es->psz_rtpmap = strdup( "MPA/90000" );
             break;
-        case VLC_FOURCC( 'm', 'p', 'g', 'v' ):
+        case VLC_CODEC_MPGV:
             p_es->i_payload_type = 32;
             p_es->psz_rtpmap = strdup( "MPV/90000" );
             break;
-        case VLC_FOURCC( 'a', '5', '2', ' ' ):
+        case VLC_CODEC_A52:
             p_es->i_payload_type = p_media->i_payload_type++;
             if( asprintf( &p_es->psz_rtpmap, "ac3/%d", p_fmt->audio.i_rate ) == -1 )
                 p_es->psz_rtpmap = NULL;
             break;
-        case VLC_FOURCC( 'H', '2', '6', '3' ):
+        case VLC_CODEC_H263:
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( "H263-1998/90000" );
             break;
-        case VLC_FOURCC( 'h', '2', '6', '4' ):
+        case VLC_CODEC_H264:
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( "H264/90000" );
             p_es->psz_fmtp = NULL;
@@ -624,7 +653,7 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             if( !p_es->psz_fmtp )
                 p_es->psz_fmtp = strdup( "packetization-mode=1" );
             break;
-        case VLC_FOURCC( 'm', 'p', '4', 'v' ):
+        case VLC_CODEC_MP4V:
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( "MP4V-ES/90000" );
             if( p_fmt->i_extra > 0 )
@@ -637,7 +666,7 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
                 free( p_hexa );
             }
             break;
-        case VLC_FOURCC( 'm', 'p', '4', 'a' ):
+        case VLC_CODEC_MP4A:
             p_es->i_payload_type = p_media->i_payload_type++;
             if( asprintf( &p_es->psz_rtpmap, "mpeg4-generic/%d", p_fmt->audio.i_rate ) == -1 )
                 p_es->psz_rtpmap = NULL;
@@ -663,13 +692,13 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt )
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( "MP2P/90000" );
             break;
-        case VLC_FOURCC( 's', 'a', 'm', 'r' ):
+        case VLC_CODEC_AMR_NB:
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( p_fmt->audio.i_channels == 2 ?
                                     "AMR/8000/2" : "AMR/8000" );
             p_es->psz_fmtp = strdup( "octet-align=1" );
             break;
-        case VLC_FOURCC( 's', 'a', 'w', 'b' ):
+        case VLC_CODEC_AMR_WB:
             p_es->i_payload_type = p_media->i_payload_type++;
             p_es->psz_rtpmap = strdup( p_fmt->audio.i_channels == 2 ?
                                     "AMR-WB/16000/2" : "AMR-WB/16000" );
@@ -779,17 +808,6 @@ static void MediaDelES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt)
     free( p_es );
 }
 
-/* */
-typedef struct
-{
-    int i_type;
-    int i_media_id;
-    //vod_media_t *p_media;
-    char *psz_session;
-    char *psz_arg;
-    double f_arg;
-} rtsp_cmd_t;
-
 static void CommandPush( vod_t *p_vod, rtsp_cmd_type_t i_type, vod_media_t *p_media, const char *psz_session,
                          double f_arg, const char *psz_arg )
 {
@@ -798,6 +816,7 @@ static void CommandPush( vod_t *p_vod, rtsp_cmd_type_t i_type, vod_media_t *p_me
 
     memset( &cmd, 0, sizeof(cmd) );
     cmd.i_type = i_type;
+    cmd.p_media = p_media;
     if( p_media )
         cmd.i_media_id = p_media->id;
     if( psz_session )
@@ -834,6 +853,20 @@ static void* CommandThread( vlc_object_t *p_this )
         if( cmd.i_type == RTSP_CMD_TYPE_NONE )
             break;
 
+        if ( cmd.i_type == RTSP_CMD_TYPE_ADD )
+        {
+            vlc_mutex_lock( &p_sys->lock_media );
+            TAB_APPEND( p_sys->i_media, p_sys->media, cmd.p_media );
+            vlc_mutex_unlock( &p_sys->lock_media );
+            goto next;
+        }
+
+        if ( cmd.i_type == RTSP_CMD_TYPE_DEL )
+        {
+            MediaDel(p_vod, cmd.p_media);
+            goto next;
+        }
+
         /* */
         vlc_mutex_lock( &p_sys->lock_media );
         for( i = 0; i < p_sys->i_media; i++ )
@@ -842,7 +875,10 @@ static void* CommandThread( vlc_object_t *p_this )
                 break;
         }
         if( i >= p_sys->i_media )
+        {
+            vlc_mutex_unlock( &p_sys->lock_media );
             goto next;
+        }
         p_media = p_sys->media[i];
 
         switch( cmd.i_type )
@@ -878,9 +914,9 @@ static void* CommandThread( vlc_object_t *p_this )
         default:
             break;
         }
+        vlc_mutex_unlock( &p_sys->lock_media );
 
     next:
-        vlc_mutex_unlock( &p_sys->lock_media );
         free( cmd.psz_session );
         free( cmd.psz_arg );
     }
@@ -1387,6 +1423,13 @@ static int RtspCallbackES( httpd_callback_sys_t *p_args, httpd_client_t *cl,
                     psz_session = psz_new;
 
                     p_rtsp = RtspClientNew( p_media, psz_new );
+                    if( !p_rtsp )
+                    {
+                        answer->i_status = 454;
+                        answer->i_body = 0;
+                        answer->p_body = NULL;
+                        break;
+                    }
                 }
                 else
                 {