* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
/*****************************************************************************
|
|
|
|
|
* standard.c: standard stream output module
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
*****************************************************************************
|
|
|
|
|
* Copyright (C) 2003-2004 VideoLAN
|
|
|
|
|
* $Id$
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
*
|
|
|
|
|
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Preamble
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <unistd.h>
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
|
|
|
|
|
#include <vlc/vlc.h>
|
|
|
|
|
#include <vlc/sout.h>
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
#include "announce.h"
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
#include "network.h"
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Module descriptor
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
*****************************************************************************/
|
|
|
|
|
#define ACCESS_TEXT N_("Output access method")
|
|
|
|
|
#define ACCESS_LONGTEXT N_( \
|
|
|
|
|
"Allows you to pecify the output access method used for the streaming " \
|
|
|
|
|
"output." )
|
|
|
|
|
#define MUX_TEXT N_("Output muxer")
|
|
|
|
|
#define MUX_LONGTEXT N_( \
|
|
|
|
|
"Allows you to pecify the output muxer method used for the streaming " \
|
|
|
|
|
"output." )
|
|
|
|
|
#define URL_TEXT N_("Output URL")
|
|
|
|
|
#define URL_LONGTEXT N_( \
|
|
|
|
|
"Allows you to pecify the output URL used for the streaming output." )
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
static int Open ( vlc_object_t * );
|
|
|
|
|
static void Close ( vlc_object_t * );
|
|
|
|
|
|
|
|
|
|
#define SOUT_CFG_PREFIX "sout-standard-"
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
|
|
|
|
|
vlc_module_begin();
|
|
|
|
|
set_description( _("Standard stream output") );
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
set_capability( "sout stream", 50 );
|
|
|
|
|
add_shortcut( "standard" );
|
|
|
|
|
add_shortcut( "std" );
|
|
|
|
|
|
|
|
|
|
add_string( SOUT_CFG_PREFIX "access", "", NULL, ACCESS_TEXT,
|
|
|
|
|
ACCESS_LONGTEXT, VLC_FALSE );
|
|
|
|
|
add_string( SOUT_CFG_PREFIX "mux", "", NULL, MUX_TEXT,
|
|
|
|
|
MUX_LONGTEXT, VLC_FALSE );
|
|
|
|
|
add_string( SOUT_CFG_PREFIX "url", "", NULL, URL_TEXT,
|
|
|
|
|
URL_LONGTEXT, VLC_FALSE );
|
|
|
|
|
|
|
|
|
|
add_bool( SOUT_CFG_PREFIX "sap", 0, NULL, "sap", "", VLC_TRUE );
|
|
|
|
|
add_string( SOUT_CFG_PREFIX "sap-name", "", NULL, "sap name", "", VLC_TRUE );
|
|
|
|
|
add_bool( SOUT_CFG_PREFIX "sap-ipv6", 0, NULL, "sap ipv6", "", VLC_TRUE );
|
|
|
|
|
|
|
|
|
|
add_bool( SOUT_CFG_PREFIX "slp", 0, NULL, "slp", "", VLC_TRUE );
|
|
|
|
|
add_string( SOUT_CFG_PREFIX "slp-name", "", NULL, "slp name", "", VLC_TRUE );
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
set_callbacks( Open, Close );
|
|
|
|
|
vlc_module_end();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Exported prototypes
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
static const char *ppsz_sout_options[] = {
|
|
|
|
|
"access", "mux", "url",
|
|
|
|
|
"sap", "sap-name", "sap-ipv6",
|
|
|
|
|
"slp", "slp-name",
|
|
|
|
|
NULL
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define DEFAULT_IPV6_SCOPE '8'
|
|
|
|
|
#define DEFAULT_PORT 1234
|
|
|
|
|
|
|
|
|
|
static sout_stream_id_t *Add ( sout_stream_t *, es_format_t * );
|
|
|
|
|
static int Del ( sout_stream_t *, sout_stream_id_t * );
|
|
|
|
|
static int Send( sout_stream_t *, sout_stream_id_t *, block_t* );
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
struct sout_stream_sys_t
|
|
|
|
|
{
|
|
|
|
|
sout_mux_t *p_mux;
|
|
|
|
|
slp_session_t *p_slp;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
session_descriptor_t *p_session;
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Open:
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
static int Open( vlc_object_t *p_this )
|
|
|
|
|
{
|
|
|
|
|
sout_stream_t *p_stream = (sout_stream_t*)p_this;
|
|
|
|
|
sout_instance_t *p_sout = p_stream->p_sout;
|
|
|
|
|
slp_session_t *p_slp = NULL;
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
|
|
|
|
|
char *psz_mux;
|
|
|
|
|
char *psz_access;
|
|
|
|
|
char *psz_url;
|
|
|
|
|
|
|
|
|
|
vlc_value_t val;
|
|
|
|
|
|
|
|
|
|
sout_access_out_t *p_access;
|
|
|
|
|
sout_mux_t *p_mux;
|
|
|
|
|
|
|
|
|
|
char *psz_mux_byext = NULL;
|
|
|
|
|
|
|
|
|
|
sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, p_stream->p_cfg );
|
|
|
|
|
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "access", &val );
|
|
|
|
|
psz_access = *val.psz_string ? val.psz_string : NULL;
|
|
|
|
|
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "mux", &val );
|
|
|
|
|
psz_mux = *val.psz_string ? val.psz_string : NULL;
|
|
|
|
|
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "url", &val );
|
|
|
|
|
psz_url = *val.psz_string ? val.psz_string : NULL;
|
|
|
|
|
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
p_stream->p_sys = malloc( sizeof( sout_stream_sys_t) );
|
|
|
|
|
p_stream->p_sys->p_session = 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" },
|
|
|
|
|
{ "ts", "ts" },
|
|
|
|
|
{ "mpg", "ps" },
|
|
|
|
|
{ "mpeg","ps" },
|
|
|
|
|
{ "ps", "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_mux == NULL )
|
|
|
|
|
{
|
|
|
|
|
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_mux == NULL )
|
|
|
|
|
{
|
|
|
|
|
/* access given, no mux */
|
|
|
|
|
if( !strncmp( psz_access, "mmsh", 4 ) )
|
|
|
|
|
{
|
|
|
|
|
psz_mux = "asfh";
|
|
|
|
|
}
|
|
|
|
|
else if( !strncmp( psz_access, "udp", 3 ) )
|
|
|
|
|
{
|
|
|
|
|
psz_mux = "ts";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
psz_mux = psz_mux_byext;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if( psz_mux && psz_access == NULL )
|
|
|
|
|
{
|
|
|
|
|
/* mux given, no access */
|
|
|
|
|
if( !strncmp( psz_mux, "asfh", 4 ) )
|
|
|
|
|
{
|
|
|
|
|
psz_access = "mmsh";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* default file */
|
|
|
|
|
psz_access = "file";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* fix or warm of incompatible couple */
|
|
|
|
|
if( psz_mux && psz_access )
|
|
|
|
|
{
|
|
|
|
|
if( !strncmp( psz_access, "mmsh", 4 ) && strncmp( psz_mux, "asfh", 4 ) )
|
|
|
|
|
{
|
|
|
|
|
char *p = strchr( psz_mux,'{' );
|
|
|
|
|
|
|
|
|
|
msg_Warn( p_stream, "fixing to mmsh/asfh" );
|
|
|
|
|
if( p )
|
|
|
|
|
{
|
|
|
|
|
/* -> a little memleak but ... */
|
|
|
|
|
psz_mux = malloc( strlen( "asfh" ) + strlen( p ) + 1);
|
|
|
|
|
sprintf( psz_mux, "asfh%s", p );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
psz_mux = "asfh";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if( ( !strncmp( psz_access, "rtp", 3 ) ||
|
|
|
|
|
!strncmp( psz_access, "udp", 3 ) ) &&
|
|
|
|
|
strncmp( psz_mux, "ts", 2 ) )
|
|
|
|
|
{
|
|
|
|
|
msg_Err( p_stream, "for now udp and rtp are only valid with TS" );
|
|
|
|
|
}
|
|
|
|
|
else if( strncmp( psz_access, "file", 4 ) &&
|
|
|
|
|
( !strncmp( psz_mux, "mov", 3 ) ||
|
|
|
|
|
!strncmp( psz_mux, "mp4", 3 ) ) )
|
|
|
|
|
{
|
|
|
|
|
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 );
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
/* *** find and open appropriate access module *** */
|
|
|
|
|
p_access = sout_AccessOutNew( p_sout, psz_access, psz_url );
|
|
|
|
|
if( p_access == NULL )
|
|
|
|
|
{
|
|
|
|
|
msg_Err( p_stream, "no suitable sout access module for `%s/%s://%s'",
|
|
|
|
|
psz_access, psz_mux, psz_url );
|
|
|
|
|
return( VLC_EGENERIC );
|
|
|
|
|
}
|
|
|
|
|
msg_Dbg( p_stream, "access opened" );
|
|
|
|
|
|
|
|
|
|
/* *** find and open appropriate mux module *** */
|
|
|
|
|
p_mux = sout_MuxNew( p_sout, psz_mux, p_access );
|
|
|
|
|
if( p_mux == NULL )
|
|
|
|
|
{
|
|
|
|
|
msg_Err( p_stream, "no suitable sout mux module for `%s/%s://%s'",
|
|
|
|
|
psz_access, psz_mux, psz_url );
|
|
|
|
|
|
|
|
|
|
sout_AccessOutDelete( p_access );
|
|
|
|
|
return( VLC_EGENERIC );
|
|
|
|
|
}
|
|
|
|
|
msg_Dbg( p_stream, "mux opened" );
|
|
|
|
|
|
|
|
|
|
/* *** Create the SAP Session structure *** */
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "sap", &val );
|
|
|
|
|
if( val.b_bool &&
|
|
|
|
|
( strstr( psz_access, "udp" ) || strstr( psz_access , "rtp" ) ) )
|
|
|
|
|
{
|
|
|
|
|
session_descriptor_t *p_session = sout_AnnounceSessionCreate();
|
|
|
|
|
announce_method_t *p_method =
|
|
|
|
|
sout_AnnounceMethodCreate( METHOD_TYPE_SAP );
|
|
|
|
|
vlc_url_t url;
|
|
|
|
|
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "sap-name", &val );
|
|
|
|
|
if( *val.psz_string )
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
{
|
|
|
|
|
p_session->psz_name = val.psz_string;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
free( val.psz_string );
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
p_session->psz_name = strdup( psz_url );
|
|
|
|
|
}
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "sap-ipv6", &val );
|
|
|
|
|
p_method->i_ip_version = val.b_bool ? 6 : 4;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
/* Now, parse the URL to extract host and port */
|
|
|
|
|
vlc_UrlParse( &url, psz_url , 0);
|
|
|
|
|
|
|
|
|
|
if( url.psz_host )
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
{
|
|
|
|
|
if( url.i_port == 0 )
|
|
|
|
|
{
|
|
|
|
|
url.i_port = DEFAULT_PORT;
|
|
|
|
|
}
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
p_session->psz_uri = url.psz_host;
|
|
|
|
|
p_session->i_port = url.i_port;
|
|
|
|
|
p_session->psz_sdp = NULL;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
p_session->i_ttl = config_GetInt( p_sout, "ttl" );
|
|
|
|
|
p_session->i_payload = 33;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
msg_Info( p_this, "SAP Enabled");
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
sout_AnnounceRegister( p_sout, p_session, p_method );
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
/* FIXME: Free p_method */
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
|
|
|
|
|
p_stream->p_sys->p_session = p_session;
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
}
|
|
|
|
|
vlc_UrlClean( &url );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* *** Register with slp *** */
|
|
|
|
|
#ifdef HAVE_SLP_H
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "slp", &val );
|
|
|
|
|
if( val.b_bool &&
|
|
|
|
|
( strstr( psz_access, "udp" ) || strstr( psz_access , "rtp" ) ) )
|
|
|
|
|
{
|
|
|
|
|
int i_ret;
|
|
|
|
|
|
|
|
|
|
msg_Info( p_this, "SLP Enabled");
|
|
|
|
|
var_Get( p_stream, SOUT_CFG_PREFIX "sap-name", &val );
|
|
|
|
|
if( *val.psz_string )
|
|
|
|
|
{
|
|
|
|
|
i_ret = sout_SLPReg( p_sout, psz_url, val.psz_string );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
i_ret = sout_SLPReg( p_sout, psz_url, psz_url );
|
|
|
|
|
}
|
|
|
|
|
free( val.psz_string );
|
|
|
|
|
|
|
|
|
|
if( i_ret )
|
|
|
|
|
{
|
|
|
|
|
msg_Warn( p_sout, "SLP Registering failed");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
p_slp = malloc(sizeof(slp_session_t));
|
|
|
|
|
p_slp->psz_url= strdup(psz_url);
|
|
|
|
|
p_slp->psz_name = strdup(
|
|
|
|
|
p_slp_cfg->psz_value ? p_slp_cfg->psz_value : psz_url);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
p_stream->pf_add = Add;
|
|
|
|
|
p_stream->pf_del = Del;
|
|
|
|
|
p_stream->pf_send = Send;
|
|
|
|
|
|
|
|
|
|
p_stream->p_sys->p_mux = p_mux;
|
|
|
|
|
p_stream->p_sys->p_slp = p_slp;
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
return VLC_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
|
* Close:
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
static void Close( vlc_object_t * p_this )
|
|
|
|
|
{
|
|
|
|
|
sout_stream_t *p_stream = (sout_stream_t*)p_this;
|
|
|
|
|
sout_stream_sys_t *p_sys = p_stream->p_sys;
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
sout_access_out_t *p_access = p_sys->p_mux->p_access;
|
|
|
|
|
|
* ALL: Better announce system
- The SAP handler now runs in a separate thread.
- RTP sessions can be announced with sap (sdp=sap://,name=...)
TODO: Make this more configurable
- Better SDP generation (the timestamp problem is not resolved)
About this, there is a problem : as, for a RTP session, the URI
is the complete SDP, if the session is recreated, as the URI has
changed, a new item is added to the playlist
- Experimental flow control algorithm :
It does not follow the "Recommended" implementation, as it needs
to count the sessions (to achieve this, we should make this work
together with the SAP listener)
It is disabled by default (use --sap-flow-control to enable).
When it is disabled, sap announcement interval is set by --sap-interval
* src/misc/net.c : created net_ReadNonBlock
* sap.c : Fixed memory problem
23 years ago
|
|
|
if( p_sys->p_session != NULL )
|
|
|
|
|
{
|
|
|
|
|
sout_AnnounceUnRegister( p_stream->p_sout, p_sys->p_session );
|
|
|
|
|
}
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
|
|
|
|
|
#ifdef HAVE_SLP_H
|
|
|
|
|
if( p_sys->p_slp )
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
sout_MuxDelete( p_sys->p_mux );
|
|
|
|
|
sout_AccessOutDelete( p_access );
|
|
|
|
|
|
|
|
|
|
free( p_sys );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct sout_stream_id_t
|
|
|
|
|
{
|
|
|
|
|
sout_input_t *p_input;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
{
|
|
|
|
|
sout_stream_sys_t *p_sys = p_stream->p_sys;
|
|
|
|
|
sout_stream_id_t *id;
|
|
|
|
|
|
|
|
|
|
id = malloc( sizeof( sout_stream_id_t ) );
|
|
|
|
|
if( ( id->p_input = sout_MuxAddStream( p_sys->p_mux, p_fmt ) ) == NULL )
|
|
|
|
|
{
|
|
|
|
|
free( id );
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int Del( sout_stream_t *p_stream, sout_stream_id_t *id )
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
{
|
|
|
|
|
sout_stream_sys_t *p_sys = p_stream->p_sys;
|
|
|
|
|
|
|
|
|
|
sout_MuxDeleteStream( p_sys->p_mux, id->p_input );
|
|
|
|
|
|
|
|
|
|
free( id );
|
|
|
|
|
|
|
|
|
|
return VLC_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int Send( sout_stream_t *p_stream, sout_stream_id_t *id,
|
|
|
|
|
block_t *p_buffer )
|
* all: new sout scheme. Now a chain of module are created that can
modify/apply on all streams, --sout has the same behavour expect when
starting with a '#'.
With a starting '#' you can specify a chain of modules, it's still
unstable but a lot more powerfull.
You have access to duplicate(that duplicate all stream), transcode
(using only ffmpeg), standard/std and es (that apply muxers and access),
and display. You could chain them with ':' and specify options with
{option1=value,option2=value[,...]}.
ex: * to stream and see the stream to udp/ts:ip
--sout '#duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
* to transcode,see and stream
--sout '#transcode{acodec=mpga}:duplicate{dst=display,dst=std{access=udp,mux=ts,url=ip}}'
Without a starting '#', the url is converted into '#std{acces=,mux=,url}'
Test and report bugs :)
24 years ago
|
|
|
{
|
|
|
|
|
sout_stream_sys_t *p_sys = p_stream->p_sys;
|
|
|
|
|
|
|
|
|
|
sout_MuxSendBuffer( p_sys->p_mux, id->p_input, p_buffer );
|
|
|
|
|
|
|
|
|
|
return VLC_SUCCESS;
|
|
|
|
|
}
|