]> git.sesse.net Git - vlc/commitdiff
* modules/misc/rtsp.c, src/misc/vlm.c: VOD RTSP support is beginning to work.
authorGildas Bazin <gbazin@videolan.org>
Mon, 20 Sep 2004 21:50:18 +0000 (21:50 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 20 Sep 2004 21:50:18 +0000 (21:50 +0000)
include/vlc_vlm.h
include/vlc_vod.h
modules/misc/rtsp.c
src/misc/vlm.c

index 49ca30298211b33da7bf9b4b2081e5081c43a062..255e9659420894685a4c5a631c67d17f962ebe00 100644 (file)
@@ -69,6 +69,7 @@ typedef struct
 
     /* only for vod */
     vod_media_t *vod_media;
+    char *psz_vod_output;
 
     /* actual input instances */
     int                  i_instance;
index 05a79a896fcb214c263e8ebd95ef551e8d71729a..bf47424f0a0d3d236fbf6f4c0dc4d59cdbbaa91f 100644 (file)
@@ -37,6 +37,32 @@ struct vod_t
     int           (*pf_media_add_es)( vod_t *, vod_media_t *, es_format_t * );
     void          (*pf_media_del_es)( vod_t *, vod_media_t *, es_format_t * );
 
+    /* Owner properties */
+    int (*pf_media_control) ( void *, vod_media_t *, char *, int, va_list );
+    void *p_data;
+};
+
+static inline int vod_MediaControl( vod_t *p_vod, vod_media_t *p_media,
+                                    char *psz_id, int i_query, ... )
+{
+    va_list args;
+    int i_result;
+
+    if( !p_vod->pf_media_control ) return VLC_EGENERIC;
+
+    va_start( args, i_query );
+    i_result = p_vod->pf_media_control( p_vod->p_data, p_media, psz_id,
+                                        i_query, args );
+    va_end( args );
+    return i_result;
+}
+
+enum vod_query_e
+{
+    VOD_MEDIA_PLAY,         /* arg1= double *       res=    */
+    VOD_MEDIA_PAUSE,        /* arg1= double *       res=    */
+    VOD_MEDIA_STOP,         /* arg1= double         res=can fail    */
+    VOD_MEDIA_SEEK,         /* arg1= double *       res=    */
 };
 
 #endif
index 9cbe32121844b50b750325b551869ab16e828161..aa73d178ffaaeafb1556e6d32996dc3b644bc8f6 100644 (file)
@@ -577,6 +577,8 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
         case HTTPD_MSG_PLAY:
         {
             rtsp_client_t *rtsp;
+            char *psz_output, *ip;
+            int i, i_port_audio = 0, i_port_video = 0;
 
             /* for now only multicast so easy */
             answer->i_status = 200;
@@ -588,17 +590,34 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
             msg_Dbg( p_vod, "HTTPD_MSG_PLAY for session: %s", psz_session );
 
             rtsp = RtspClientGet( p_media, psz_session );
-            if( rtsp && !rtsp->b_playing )
+            if( !rtsp || rtsp->b_playing ) break;
+            if( !(ip = httpd_ClientIP( cl )) ) break;
+
+            rtsp->b_playing = VLC_TRUE;
+
+            /* FIXME for != 1 video and 1 audio */
+            for( i = 0; i < p_media->i_es; i++ )
             {
-                rtsp->b_playing = VLC_TRUE;
-                /* TODO: do something useful */
+                if( p_media->es[i]->fmt.i_cat == AUDIO_ES )
+                    i_port_audio = p_media->es[i]->i_port;
+                if( p_media->es[i]->fmt.i_cat == VIDEO_ES )
+                    i_port_video = p_media->es[i]->i_port;
             }
+
+            asprintf( &psz_output, "rtp{dst=%s,port-video=%i,port-audio=%i}",
+                      ip, i_port_video, i_port_audio );
+            vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PLAY,
+                              psz_output );
+            free( psz_output );
+            free( ip );
             break;
         }
 
         case HTTPD_MSG_PAUSE:
             psz_session = httpd_MsgGet( query, "Session" );
             msg_Dbg( p_vod, "HTTPD_MSG_PAUSE for session: %s", psz_session );
+
+            vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_PAUSE );
             /* TODO: do something useful */
             return VLC_EGENERIC;
 
@@ -616,11 +635,10 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl,
             msg_Dbg( p_vod, "HTTPD_MSG_TEARDOWN for session: %s", psz_session);
 
             rtsp = RtspClientGet( p_media, psz_session );
-            if( rtsp )
-            {
-                /* TODO: do something useful */
-                RtspClientDel( p_media, rtsp );
-            }
+            if( !rtsp ) break;
+
+            vod_MediaControl( p_vod, p_media, psz_session, VOD_MEDIA_STOP );
+            RtspClientDel( p_media, rtsp );
             break;
         }
 
index 4a5dbd78344a2167f8d427a5ff046d2bee8b40e7..04fca30ac029a1d9446772f5b11123453e605ce0 100644 (file)
@@ -62,6 +62,8 @@ static void            vlm_ScheduleDelete( vlm_t *, vlm_schedule_t *, char *);
 static int             vlm_ScheduleSetup( vlm_schedule_t *, char *, char *);
 static vlm_schedule_t *vlm_ScheduleSearch( vlm_t *, char *);
 
+static int vlm_MediaVodControl( void *, vod_media_t *, char *, int, va_list );
+
 static int ExecuteCommand( vlm_t *, char *, vlm_message_t **);
 static int Manage( vlc_object_t* );
 
@@ -755,6 +757,9 @@ static vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type )
             free( media );
             return NULL;
         }
+
+        vlm->vod->p_data = vlm;
+        vlm->vod->pf_media_control = vlm_MediaVodControl;
     }
     if( i_type == VOD_TYPE ) vlm->i_vod++;
 
@@ -762,6 +767,7 @@ static vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type )
     media->b_enabled = VLC_FALSE;
     media->b_loop = VLC_FALSE;
     media->vod_media = NULL;
+    media->psz_vod_output = NULL;
     media->i_input = 0;
     media->input = NULL;
     media->psz_output = NULL;
@@ -960,11 +966,14 @@ static int vlm_MediaControl( vlm_t *vlm, vlm_media_t *media, char *psz_id,
             vlc_input_item_Init( VLC_OBJECT(vlm), &p_instance->item );
             p_instance->p_input = 0;
 
-            if( media->psz_output != NULL )
+            if( media->psz_output != NULL || media->psz_vod_output != NULL )
             {
                 p_instance->item.ppsz_options = malloc( sizeof( char* ) );
-                asprintf( &p_instance->item.ppsz_options[0], "sout=%s",
-                          media->psz_output );
+                asprintf( &p_instance->item.ppsz_options[0], "sout=%s%s%s",
+                          media->psz_output ? media->psz_output : "",
+                          (media->psz_output && media->psz_vod_output) ?
+                          ":" : media->psz_vod_output ? "#" : "",
+                          media->psz_vod_output ? media->psz_vod_output : "" );
                 p_instance->item.i_options = 1;
             }
 
@@ -1957,6 +1966,56 @@ static char *vlm_Save( vlm_t *vlm )
     return save;
 }
 
+/*****************************************************************************
+ * Manage:
+ *****************************************************************************/
+static int vlm_MediaVodControl( void *p_private, vod_media_t *p_vod_media,
+                                char *psz_id, int i_query, va_list args )
+{
+    vlm_t *vlm = (vlm_t *)p_private;
+    int i, i_ret = VLC_EGENERIC;
+
+    if( !p_private || !p_vod_media ) return VLC_EGENERIC;
+
+    vlc_mutex_lock( &vlm->lock );
+
+    /* Find media */
+    for( i = 0; i < vlm->i_media; i++ )
+    {
+        if( p_vod_media == vlm->media[i]->vod_media ) break;
+    }
+
+    if( i == vlm->i_media )
+    {
+        vlc_mutex_unlock( &vlm->lock );
+        return VLC_EGENERIC;
+    }
+
+    switch( i_query )
+    {
+    case VOD_MEDIA_PLAY:
+        vlm->media[i]->psz_vod_output = (char *)va_arg( args, char * );
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "play", 0 );
+        vlm->media[i]->psz_vod_output = 0;
+        break;
+
+    case VOD_MEDIA_PAUSE:
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "pause", 0 );
+        break;
+
+    case VOD_MEDIA_STOP:
+        i_ret = vlm_MediaControl( vlm, vlm->media[i], psz_id, "stop", 0 );
+        break;
+
+    default:
+        break;
+    }
+
+    vlc_mutex_unlock( &vlm->lock );
+
+    return i_ret;
+}
+
 /*****************************************************************************
  * Manage:
  *****************************************************************************/