From dd153084fa81d69ec94332d91b64f82590e96c8a Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Wed, 20 Oct 2004 12:01:09 +0000 Subject: [PATCH] * src/misc/vlm.c: added support for the 'mux' option for VOD. This option tells the vod server to send an encapsulated stream. * modules/misc/rtsp.c: support for mp2t (MPEG TS) and mp2p (MPEG PS) mux types. * doc/vlm.txt: update for the mux option. --- doc/vlm.txt | 6 +++++ include/vlc_vlm.h | 1 + modules/misc/rtsp.c | 26 ++++++++++++++++++++-- src/misc/vlm.c | 53 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/doc/vlm.txt b/doc/vlm.txt index 76bb0a0c3e..72e4950c8a 100644 --- a/doc/vlm.txt +++ b/doc/vlm.txt @@ -102,6 +102,12 @@ Note: an element is a media or a schedule. If a media with "loop" option receives the "play" command and finally finishes to play the last input of the list, it will automatically restart to play the input list. + mux (mux_name) + Used for vod only. + Only needs to be specified if you want the elementary streams + to be sent encapsulated instead of raw. The (mux_name) should be + a fourcc describing the encapsulation type (eg. mp2t for MPEG TS, + or mp2t for MPEG PS). Schedule Properties Syntax: enabled|disabled diff --git a/include/vlc_vlm.h b/include/vlc_vlm.h index 255e965942..ed3bacac5a 100644 --- a/include/vlc_vlm.h +++ b/include/vlc_vlm.h @@ -70,6 +70,7 @@ typedef struct /* only for vod */ vod_media_t *vod_media; char *psz_vod_output; + char *psz_mux; /* actual input instances */ int i_instance; diff --git a/modules/misc/rtsp.c b/modules/misc/rtsp.c index 9c079d65be..de6815de29 100644 --- a/modules/misc/rtsp.c +++ b/modules/misc/rtsp.c @@ -127,6 +127,7 @@ struct vod_media_t /* ES list */ int i_es; media_es_t **es; + char *psz_mux; /* RTSP client */ int i_rtsp; @@ -265,6 +266,7 @@ static vod_media_t *MediaNew( vod_t *p_vod, char *psz_name, memset( p_media, 0, sizeof(vod_media_t) ); p_media->es = 0; + p_media->psz_mux = 0; p_media->rtsp = 0; asprintf( &p_media->psz_rtsp_path, "%s%s", p_sys->psz_path, psz_name ); @@ -347,6 +349,7 @@ static int MediaAddES( vod_t *p_vod, vod_media_t *p_media, es_format_t *p_fmt ) char *psz_urlc; memset( p_es, 0, sizeof(media_es_t) ); + p_media->psz_mux = NULL; /* TODO: update SDP, etc... */ asprintf( &psz_urlc, "%s/trackid=%d", @@ -424,6 +427,16 @@ 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', '2', 't' ): + p_media->psz_mux = "ts"; + p_es->i_payload_type = 33; + p_es->psz_rtpmap = strdup( "MP2T/90000" ); + break; + case VLC_FOURCC( 'm', 'p', '2', 'p' ): + p_media->psz_mux = "ps"; + p_es->i_payload_type = p_media->i_payload_type++; + p_es->psz_rtpmap = strdup( "MP2P/90000" ); + break; default: msg_Err( p_vod, "cannot add this stream (unsupported " @@ -648,8 +661,17 @@ static int RtspCallback( httpd_callback_sys_t *p_args, httpd_client_t *cl, i_port_video = p_rtsp->es[i]->i_port; } - asprintf( &psz_output, "rtp{dst=%s,port-video=%i,port-audio=%i}", - ip, i_port_video, i_port_audio ); + if( p_media->psz_mux ) + { + asprintf( &psz_output, "rtp{dst=%s,port=%i,mux=%s}", + ip, i_port_video, p_media->psz_mux ); + } + else + { + 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 ); diff --git a/src/misc/vlm.c b/src/misc/vlm.c index 923b4fa957..6461071b2e 100644 --- a/src/misc/vlm.c +++ b/src/misc/vlm.c @@ -27,6 +27,7 @@ * Preamble *****************************************************************************/ #include /* malloc(), free() */ +#include /* tolower() */ #include @@ -648,6 +649,20 @@ static int ExecuteCommand(vlm_t *vlm, char *command, vlm_message_t **p_message) { vlm_MediaSetup( vlm, media, p_command[i], NULL ); } + else if( i + 1 >= i_command && !strcmp( p_command[i], "mux" ) ) + { + if( media->i_type != VOD_TYPE ) + { + message = vlm_MessageNew( p_command[0], + "mux only available for broadcast" ); + } + else + { + vlm_MediaSetup( vlm, media, p_command[i], + p_command[i+1] ); + i++; + } + } else if( strcmp( p_command[i], "loop" ) == 0 || strcmp( p_command[i], "unloop" ) == 0 ) { @@ -771,6 +786,7 @@ static vlm_media_t *vlm_MediaNew( vlm_t *vlm, char *psz_name, int i_type ) media->b_loop = VLC_FALSE; media->vod_media = NULL; media->psz_vod_output = NULL; + media->psz_mux = NULL; media->i_input = 0; media->input = NULL; media->psz_output = NULL; @@ -824,6 +840,7 @@ static void vlm_MediaDelete( vlm_t *vlm, vlm_media_t *media, char *psz_name ) if( media->input ) free( media->input ); if( media->psz_output ) free( media->psz_output ); + if( media->psz_mux ) free( media->psz_mux ); while( media->i_option-- ) free( media->option[media->i_option] ); if( media->option ) free( media->option ); @@ -852,6 +869,12 @@ static int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, { media->b_enabled = VLC_FALSE; } + else if( strcmp( psz_cmd, "mux" ) == 0 ) + { + if( media->psz_mux ) free( media->psz_mux ); + media->psz_mux = NULL; + if( psz_value ) media->psz_mux = strdup( psz_value ); + } else if( strcmp( psz_cmd, "input" ) == 0 ) { char *input; @@ -941,6 +964,26 @@ static int vlm_MediaSetup( vlm_t *vlm, vlm_media_t *media, char *psz_cmd, } free( psz_output ); + if( media->psz_mux ) + { + input_item_t item; + es_format_t es, *p_es = &es; + char fourcc[5]; + + sprintf( fourcc, "%4.4s", media->psz_mux ); + fourcc[0] = tolower(fourcc[0]); fourcc[1] = tolower(fourcc[1]); + fourcc[2] = tolower(fourcc[2]); fourcc[3] = tolower(fourcc[3]); + + item = media->item; + item.i_es = 1; + item.es = &p_es; + es_format_Init( &es, VIDEO_ES, *((int *)fourcc) ); + + media->vod_media = + vlm->vod->pf_media_new( vlm->vod, media->psz_name, &item ); + return VLC_SUCCESS; + } + media->vod_media = vlm->vod->pf_media_new( vlm->vod, media->psz_name, &media->item ); @@ -1396,6 +1439,10 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, vlm_MessageNew( "loop", media->b_loop ? "yes" : "no" ) ); + if( media->i_type == VOD_TYPE && media->psz_mux ) + vlm_MessageAdd( msg_media, + vlm_MessageNew( "mux", media->psz_mux ) ); + msg_child = vlm_MessageAdd( msg_media, vlm_MessageNew( "inputs", NULL ) ); @@ -1529,7 +1576,7 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, } - else if( psz_filter && strcmp( psz_filter, "media") == 0 ) + else if( psz_filter && strcmp( psz_filter, "media" ) == 0 ) { int i, j; vlm_message_t *msg; @@ -1554,6 +1601,10 @@ static vlm_message_t *vlm_Show( vlm_t *vlm, vlm_media_t *media, vlm_MessageNew( "enabled", m->b_enabled ? "yes" : "no" ) ); + if( m->i_type == VOD_TYPE && m->psz_mux ) + vlm_MessageAdd( msg_media, + vlm_MessageNew( "mux", m->psz_mux ) ); + msg_instance = vlm_MessageAdd( msg_media, vlm_MessageNew( "instances", 0 ) );