before first slice).
* ffmpeg: use indeo v3 decoder (untested).
* stream_ouput.c,libvlc.h : take care of:
--sout-acodec,--sout-vcodec : use transcoding. (You can specify bitrate
using --sout-abitrate and --sout-vbitrate in kilobits/s).
--sout-display: to display while streaming.
(Btw there is a problem with vout and display, it leads to a ref count = -1)
* ffmpeg.c: video decoder using ffmpeg library
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
- * $Id: ffmpeg.c,v 1.28 2003/03/24 13:50:55 hartman Exp $
+ * $Id: ffmpeg.c,v 1.29 2003/04/16 00:12:36 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
psz_name ="Windows Media Audio 2";
break;
#endif
+
+#if LIBAVCODEC_BUILD >= 4663
+ case FOURCC_IV31:
+ case FOURCC_iv31:
+ case FOURCC_IV32:
+ case FOURCC_iv32:
+ i_cat = VIDEO_ES;
+ i_codec = CODEC_ID_INDEO3;
+ psz_name = "Indeo v3";
+ break;
+#endif
default:
i_cat = UNKNOWN_ES;
i_codec = CODEC_ID_NONE;
* ffmpeg_vdec.h: video decoder using ffmpeg library
*****************************************************************************
* Copyright (C) 2001 VideoLAN
- * $Id: ffmpeg.h,v 1.15 2003/03/24 13:50:55 hartman Exp $
+ * $Id: ffmpeg.h,v 1.16 2003/04/16 00:12:36 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
#define FOURCC_dvc VLC_FOURCC('d','v','c',' ')
#define FOURCC_dvp VLC_FOURCC('d','v','p',' ')
+#define FOURCC_IV31 VLC_FOURCC('I','V','3','1')
+#define FOURCC_iv31 VLC_FOURCC('i','v','3','1')
+#define FOURCC_IV32 VLC_FOURCC('I','V','3','2')
+#define FOURCC_iv32 VLC_FOURCC('i','v','3','2')
+
/*****************************************************************************
* Audio codec fourcc
*****************************************************************************/
* mpegvideo.c
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: mpegvideo.c,v 1.12 2003/04/13 20:00:21 fenrir Exp $
+ * $Id: mpegvideo.c,v 1.13 2003/04/16 00:12:36 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org>
static void PacketizeThread( packetizer_t *p_pack )
{
sout_buffer_t *p_sout_buffer = NULL;
+ vlc_bool_t b_seen_slice = VLC_FALSE;
int32_t i_pos;
int i_skipped;
mtime_t i_duration; /* of the parsed picture */
for( ;; )
{
- uint32_t i_code;
+ uint32_t i_code;
if( p_pack->p_fifo->b_die || p_pack->p_fifo->b_error )
{
break;
i_code = ShowBits( &p_pack->bit_stream, 32 );
+ if( b_seen_slice && ( i_code < 0x101 || i_code > 0x1af ) )
+ {
+ break;
+ }
+
if( i_code == 0x1B8 ) /* GOP */
{
/* usefull for bad MPEG-1 : repeat the sequence_header
i_pos += p_pack->i_sequence_header_length;
p_pack->i_last_sequence_header = 0;
}
-
+#if 1
p_pack->i_last_ref_pts =
p_pack->i_last_dts +
(mtime_t)( 1000000 / p_pack->d_frame_rate); /* FIXME */
+#endif
CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos );
}
else if( i_code == 0x100 ) /* Picture */
i_temporal_ref = ShowBits( &p_pack->bit_stream, 10 );
CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos );
- break;
}
else if( i_code == 0x1b5 )
{
}
else
{
+ if( i_code >= 0x101 && i_code <= 0x1af )
+ {
+ b_seen_slice = VLC_TRUE;
+ }
+
if( i_code == 0x1B3 )
{
p_pack->i_last_sequence_header = 0;
* libvlc.h: main libvlc header
*****************************************************************************
* Copyright (C) 1998-2002 VideoLAN
- * $Id: libvlc.h,v 1.56 2003/04/08 08:35:59 massiot Exp $
+ * $Id: libvlc.h,v 1.57 2003/04/16 00:12:36 fenrir Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org>
#define SOUT_LONGTEXT N_( \
"Empty if no stream output.")
+#define SOUT_DISPLAY_TEXT N_("display while streaming")
+#define SOUT_DISPLAY_LONGTEXT N_( \
+ "This allows you to play the stream while streaming it.")
+
#define SOUT_VIDEO_TEXT N_("enable video stream output")
#define SOUT_VIDEO_LONGTEXT N_( \
"This allows you to choose if the video stream should be redirected to " \
#define SOUT_VCODEC_LONGTEXT N_( \
"This allows you to force video encoding")
+#define SOUT_VBITRATE_TEXT N_("video bitrate encoding (kB/s)" )
+#define SOUT_VBITRATE_LONGTEXT N_( \
+ "This allows you to specify video bitrate in kB/s.")
+
#define SOUT_AUDIO_TEXT N_("enable audio stream output")
#define SOUT_AUDIO_LONGTEXT N_( \
"This allows you to choose if the video stream should be redirected to " \
#define SOUT_ACODEC_LONGTEXT N_( \
"This allows you to force audio encoding")
+#define SOUT_ABITRATE_TEXT N_("audio bitrate encoding (kB/s)" )
+#define SOUT_ABITRATE_LONGTEXT N_( \
+ "This allows you to specify audio bitrate in kB/s.")
+
#define PACKETIZER_TEXT N_("choose preferred packetizer list")
#define PACKETIZER_LONGTEXT N_( \
"This allows you to select the order in which VLC will choose its " \
/* Stream output options */
add_category_hint( N_("Stream output"), NULL, VLC_TRUE );
add_string( "sout", NULL, NULL, SOUT_TEXT, SOUT_LONGTEXT, VLC_TRUE );
+ add_bool( "sout-display", VLC_FALSE, NULL, SOUT_DISPLAY_TEXT, SOUT_DISPLAY_LONGTEXT, VLC_TRUE );
+
add_bool( "sout-audio", 1, NULL, SOUT_AUDIO_TEXT, SOUT_AUDIO_LONGTEXT, VLC_TRUE );
- add_bool( "sout-video", 1, NULL, SOUT_VIDEO_TEXT, SOUT_VIDEO_LONGTEXT, VLC_TRUE );
add_string_from_list( "sout-acodec", "", ppsz_sout_acodec, NULL, SOUT_ACODEC_TEXT, SOUT_ACODEC_LONGTEXT, VLC_TRUE );
+ add_bool( "sout-abitrate", 0, NULL, SOUT_ABITRATE_TEXT, SOUT_ABITRATE_LONGTEXT, VLC_TRUE );
+
+ add_bool( "sout-video", 1, NULL, SOUT_VIDEO_TEXT, SOUT_VIDEO_LONGTEXT, VLC_TRUE );
add_string_from_list( "sout-vcodec", "", ppsz_sout_vcodec, NULL, SOUT_VCODEC_TEXT, SOUT_VCODEC_LONGTEXT, VLC_TRUE );
+ add_bool( "sout-vbitrate", 0, NULL, SOUT_VBITRATE_TEXT, SOUT_VBITRATE_LONGTEXT, VLC_TRUE );
+
add_module( "packetizer", "packetizer", NULL, NULL,
PACKETIZER_TEXT, PACKETIZER_LONGTEXT, VLC_TRUE );
add_module( "mux", "sout mux", NULL, NULL, MUX_TEXT, MUX_LONGTEXT, VLC_TRUE );
* stream_output.c : stream output module
*****************************************************************************
* Copyright (C) 2002 VideoLAN
- * $Id: stream_output.c,v 1.24 2003/04/13 20:00:21 fenrir Exp $
+ * $Id: stream_output.c,v 1.25 2003/04/16 00:12:36 fenrir Exp $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr>
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-static char *sout_stream_chain_to_str( char * );
+#define sout_stream_url_to_chain( p, s ) _sout_stream_url_to_chain( VLC_OBJECT(p), s )
+static char *_sout_stream_url_to_chain( vlc_object_t *, char * );
+
/*
* Generic MRL parser
*
}
else
{
- p_sout->psz_chain = sout_stream_chain_to_str( psz_dest );
+ p_sout->psz_chain = sout_stream_url_to_chain( p_sout, psz_dest );
+ msg_Dbg( p_sout, "using sout chain=`%s'", p_sout->psz_chain );
}
p_sout->p_stream = sout_stream_new( p_sout, p_sout->psz_chain );
vlc_object_destroy( p_stream );
}
-static char *sout_stream_chain_to_str( char *psz_url )
+static char *_sout_stream_url_to_chain( vlc_object_t *p_this, char *psz_url )
{
- mrl_t mrl;
- char *psz_chain;
+ mrl_t mrl;
+ char *psz_chain, *p;
+ char *psz_vcodec, *psz_acodec;
mrl_Parse( &mrl, psz_url );
+ p = psz_chain = malloc( 500 + strlen( mrl.psz_way ) + strlen( mrl.psz_access ) + strlen( mrl.psz_name ) );
- psz_chain = malloc( 100 + strlen( mrl.psz_way ) + strlen( mrl.psz_access ) + strlen( mrl.psz_name ) );
+ psz_vcodec = config_GetPsz( p_this, "sout-vcodec" );
+ if( psz_vcodec && *psz_vcodec == '\0')
+ {
+ FREE( psz_vcodec );
+ }
+ psz_acodec = config_GetPsz( p_this, "sout-acodec" );
+ if( psz_acodec && *psz_acodec == '\0' )
+ {
+ FREE( psz_acodec );
+ }
+ /* set transcoding */
+ if( psz_vcodec || psz_acodec )
+ {
+ p += sprintf( p, "transcode{" );
+ if( psz_vcodec )
+ {
+ int br;
+
+ p += sprintf( p, "vcodec=%s,", psz_vcodec );
+
+ if( ( br = config_GetInt( p_this, "sout-vbitrate" ) ) > 0 )
+ {
+ p += sprintf( p, "vb=%d,", br * 1000 );
+ }
+ free( psz_vcodec );
+ }
+ if( psz_acodec )
+ {
+ int br;
- sprintf( psz_chain, "std{mux=%s,access=%s,url=\"%s\"", mrl.psz_way, mrl.psz_access, mrl.psz_name );
+ p += sprintf( p, "acodec=%s,", psz_acodec );
+ if( ( br = config_GetInt( p_this, "sout-abitrate" ) ) > 0 )
+ {
+ p += sprintf( p, "ab=%d,", br * 1000 );
+ }
+
+ free( psz_acodec );
+ }
+ p += sprintf( p, "}:" );
+ }
+
+
+ if( config_GetInt( p_this, "sout-display" ) )
+ {
+ p += sprintf( p, "duplicate{dst=display,dst=std{mux=%s,access=%s,url=\"%s\"}}", mrl.psz_way, mrl.psz_access, mrl.psz_name );
+ }
+ else
+ {
+ p += sprintf( p, "std{mux=%s,access=%s,url=\"%s\"}", mrl.psz_way, mrl.psz_access, mrl.psz_name );
+ }
return( psz_chain );
}