From 4fd953bd05771d4c44bf615b146b5e1ef3e35468 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Thu, 28 Aug 2003 21:02:14 +0000 Subject: [PATCH] * standard : - when muxer or access or both are missing try to do a guess (based on the other one or the extention). - if both are still missing -> abort. - it forces asfh when using mmsh - it issues a error message with non working couple (like udp/avi, ...) (but it doesn't fail) --- modules/stream_out/standard.c | 157 +++++++++++++++++++++++++++++----- 1 file changed, 137 insertions(+), 20 deletions(-) diff --git a/modules/stream_out/standard.c b/modules/stream_out/standard.c index d4ef59215c..e002beef80 100644 --- a/modules/stream_out/standard.c +++ b/modules/stream_out/standard.c @@ -2,7 +2,7 @@ * standard.c ***************************************************************************** * Copyright (C) 2001, 2002 VideoLAN - * $Id: standard.c,v 1.12 2003/08/14 20:02:55 zorglub Exp $ + * $Id: standard.c,v 1.13 2003/08/28 21:02:14 fenrir Exp $ * * Authors: Laurent Aimar * @@ -76,27 +76,134 @@ static int Open( vlc_object_t *p_this ) char *psz_url = sout_cfg_find_value( p_stream->p_cfg, "url" ); char *psz_ipv = sout_cfg_find_value( p_stream->p_cfg, "sap_ipv" ); char *psz_v6_scope = sout_cfg_find_value( p_stream->p_cfg, "sap_v6scope" ); - + sout_cfg_t *p_sap_cfg = sout_cfg_find( p_stream->p_cfg, "sap" ); #ifdef HAVE_SLP_H sout_cfg_t *p_slp_cfg = sout_cfg_find( p_stream->p_cfg, "slp" ); #endif - + sout_access_out_t *p_access; - sout_mux_t *p_mux; + sout_mux_t *p_mux; - /* SAP is only valid for UDP or RTP streaming */ - if( psz_access == NULL ) psz_access = "udp"; + char *psz_mux_byext = NULL; - /* Get SAP IP version to use */ - if(psz_ipv == NULL) psz_ipv = "4"; - if(psz_v6_scope == NULL) psz_v6_scope = DEFAULT_IPV6_SCOPE; p_sys->p_sap = NULL; p_sys->p_slp = NULL; msg_Dbg( p_this, "creating `%s/%s://%s'", psz_access, psz_mux, psz_url ); + /* ext -> muxer name */ + if( psz_url && strrchr( psz_url, '.' ) ) + { + /* by extention */ + static struct { char *ext; char *mux; } exttomux[] = + { + { "avi", "avi" }, + { "ogg", "ogg" }, + { "ogm", "ogg" }, + { "mp4", "mp4" }, + { "mov", "mov" }, + { "moov","mov" }, + { "asf", "asf" }, + { "wma", "asf" }, + { "wmv", "asf" }, + { "trp", "ts" }, + { "mpg", "ps" }, + { "mpeg","ps" }, + { "mpeg1","mpeg1" }, + { NULL, NULL } + }; + char *psz_ext = strrchr( psz_url, '.' ) + 1; + int i; + + msg_Dbg( p_this, "extention is %s", psz_ext ); + for( i = 0; exttomux[i].ext != NULL; i++ ) + { + if( !strcasecmp( psz_ext, exttomux[i].ext ) ) + { + psz_mux_byext = exttomux[i].mux; + break; + } + } + msg_Dbg( p_this, "extention -> mux=%s", psz_mux_byext ); + } + + /* We fix access/mux to valid couple */ + + if( ( psz_access == NULL || *psz_access == '\0' )&& + ( psz_mux == NULL || *psz_mux == '\0' ) ) + { + if( psz_mux_byext ) + { + msg_Warn( p_stream, + "no access _and_ no muxer, extention gives file/%s", + psz_mux_byext ); + psz_access = "file"; + psz_mux = psz_mux_byext; + } + else + { + msg_Err( p_stream, "no access _and_ no muxer (fatal error)" ); + return VLC_EGENERIC; + } + } + + if( psz_access && *psz_access && + ( psz_mux == NULL || *psz_mux == '\0' ) ) + { + /* access given, no mux */ + if( !strcmp( psz_access, "mmsh" ) ) + { + psz_mux = "asfh"; + } + else if( !strcmp( psz_access, "udp" ) ) + { + psz_mux = "ts"; + } + else + { + psz_mux = psz_mux_byext; + } + } + else if( psz_mux && *psz_mux && + ( psz_access == NULL || *psz_access == '\0' ) ) + { + /* mux given, no access */ + if( !strcmp( psz_mux, "asfh" ) ) + { + psz_access = "mmsh"; + } + else + { + /* default file */ + psz_access = "file"; + } + } + + /* fix or warm of incompatible couple */ + if( psz_mux && *psz_mux && psz_access && *psz_access ) + { + if( !strcmp( psz_access, "mmsh" ) && strcmp( psz_mux, "asfh" ) ) + { + msg_Warn( p_stream, "fixing to mmsh/asfh" ); + psz_mux = "asfh"; + } + else if( ( !strcmp( psz_access, "rtp" ) || + !strcmp( psz_access, "udp" ) ) && + strncmp( psz_mux, "ts", 2 ) ) + { + msg_Err( p_stream, "for now udp and rtp are only valid with TS" ); + } + else if( strcmp( psz_access, "file" ) && + ( !strcmp( psz_mux, "mov" ) || !strcmp( psz_mux, "mp4" ) ) ) + { + msg_Err( p_stream, "mov and mp4 work only with file output" ); + } + } + + msg_Dbg( p_this, "using `%s/%s://%s'", psz_access, psz_mux, psz_url ); + /* *** find and open appropriate access module *** */ p_access = sout_AccessOutNew( p_sout, psz_access, psz_url ); if( p_access == NULL ) @@ -120,10 +227,20 @@ static int Open( vlc_object_t *p_this ) msg_Dbg( p_stream, "mux opened" ); /* *** Create the SAP Session structure *** */ - if( p_sap_cfg && ( strstr( psz_access, "udp" ) || - strstr( psz_access , "rtp" ) ) ) + if( psz_access && + p_sap_cfg && + ( strstr( psz_access, "udp" ) || strstr( psz_access , "rtp" ) ) ) { msg_Info( p_this, "SAP Enabled"); + + if( psz_ipv == NULL ) + { + psz_ipv = "4"; + } + if( psz_v6_scope == NULL ) + { + psz_v6_scope = DEFAULT_IPV6_SCOPE; + } msg_Dbg( p_sout , "Creating SAP with IPv%i", atoi(psz_ipv) ); p_sys->p_sap = sout_SAPNew( p_sout , psz_url , @@ -132,7 +249,7 @@ static int Open( vlc_object_t *p_this ) if( !p_sys->p_sap ) msg_Err( p_sout,"Unable to initialize SAP. SAP disabled"); - } + } /* *** Register with slp *** */ #ifdef HAVE_SLP_H @@ -140,7 +257,7 @@ static int Open( vlc_object_t *p_this ) strstr( psz_access , "rtp" ) ) ) { msg_Info( p_this, "SLP Enabled"); - if( sout_SLPReg( p_sout, psz_url, + if( sout_SLPReg( p_sout, psz_url, p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url) ) { msg_Warn( p_sout, "SLP Registering failed"); @@ -151,15 +268,15 @@ static int Open( vlc_object_t *p_this ) if(!p_sys->p_slp) { msg_Warn(p_sout,"Out of memory"); - return -1; + return -1; } p_sys->p_slp->psz_url= strdup(psz_url); p_sys->p_slp->psz_name = strdup( p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url); } - } + } #endif - + /* XXX beurk */ p_sout->i_preheader = __MAX( p_sout->i_preheader, p_mux->i_preheader ); @@ -185,19 +302,19 @@ static void Close( vlc_object_t * p_this ) sout_access_out_t *p_access = p_sys->p_mux->p_access; if( p_sys->p_sap ) - sout_SAPDelete( (sout_instance_t *)p_this , p_sys->p_sap ); + sout_SAPDelete( (sout_instance_t *)p_this , p_sys->p_sap ); #ifdef HAVE_SLP_H if( p_sys->p_slp ) { - sout_SLPDereg( (sout_instance_t *)p_this, + sout_SLPDereg( (sout_instance_t *)p_this, p_sys->p_slp->psz_url, p_sys->p_slp->psz_name); free( p_sys->p_slp); } #endif - - + + sout_MuxDelete( p_sys->p_mux ); sout_AccessOutDelete( p_access ); -- 2.20.1