/* only for vod */
vod_media_t *vod_media;
+ char *psz_vod_output;
/* actual input instances */
int i_instance;
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
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;
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;
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;
}
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* );
free( media );
return NULL;
}
+
+ vlm->vod->p_data = vlm;
+ vlm->vod->pf_media_control = vlm_MediaVodControl;
}
if( i_type == VOD_TYPE ) vlm->i_vod++;
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;
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;
}
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:
*****************************************************************************/