Commit fd08bdbe authored by Laurent Aimar's avatar Laurent Aimar

* modules/packetizer/mpegvideo.c : cut after a complete picture. (Not

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)
parent 8ec18f34
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ffmpeg.c: video decoder using ffmpeg library * ffmpeg.c: video decoder using ffmpeg library
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -562,6 +562,17 @@ static int ffmpeg_GetFfmpegCodec( vlc_fourcc_t i_fourcc, ...@@ -562,6 +562,17 @@ static int ffmpeg_GetFfmpegCodec( vlc_fourcc_t i_fourcc,
psz_name ="Windows Media Audio 2"; psz_name ="Windows Media Audio 2";
break; break;
#endif #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: default:
i_cat = UNKNOWN_ES; i_cat = UNKNOWN_ES;
i_codec = CODEC_ID_NONE; i_codec = CODEC_ID_NONE;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* ffmpeg_vdec.h: video decoder using ffmpeg library * ffmpeg_vdec.h: video decoder using ffmpeg library
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
...@@ -158,6 +158,11 @@ int E_( GetPESData )( u8 *p_buf, int i_max, pes_packet_t *p_pes ); ...@@ -158,6 +158,11 @@ int E_( GetPESData )( u8 *p_buf, int i_max, pes_packet_t *p_pes );
#define FOURCC_dvc VLC_FOURCC('d','v','c',' ') #define FOURCC_dvc VLC_FOURCC('d','v','c',' ')
#define FOURCC_dvp VLC_FOURCC('d','v','p',' ') #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 * Audio codec fourcc
*****************************************************************************/ *****************************************************************************/
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* mpegvideo.c * mpegvideo.c
***************************************************************************** *****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN * 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> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* Eric Petit <titer@videolan.org> * Eric Petit <titer@videolan.org>
...@@ -215,6 +215,7 @@ static int CopyUntilNextStartCode( packetizer_t *p_pack, ...@@ -215,6 +215,7 @@ static int CopyUntilNextStartCode( packetizer_t *p_pack,
static void PacketizeThread( packetizer_t *p_pack ) static void PacketizeThread( packetizer_t *p_pack )
{ {
sout_buffer_t *p_sout_buffer = NULL; sout_buffer_t *p_sout_buffer = NULL;
vlc_bool_t b_seen_slice = VLC_FALSE;
int32_t i_pos; int32_t i_pos;
int i_skipped; int i_skipped;
mtime_t i_duration; /* of the parsed picture */ mtime_t i_duration; /* of the parsed picture */
...@@ -346,6 +347,11 @@ static void PacketizeThread( packetizer_t *p_pack ) ...@@ -346,6 +347,11 @@ static void PacketizeThread( packetizer_t *p_pack )
i_code = ShowBits( &p_pack->bit_stream, 32 ); i_code = ShowBits( &p_pack->bit_stream, 32 );
if( b_seen_slice && ( i_code < 0x101 || i_code > 0x1af ) )
{
break;
}
if( i_code == 0x1B8 ) /* GOP */ if( i_code == 0x1B8 ) /* GOP */
{ {
/* usefull for bad MPEG-1 : repeat the sequence_header /* usefull for bad MPEG-1 : repeat the sequence_header
...@@ -358,10 +364,11 @@ static void PacketizeThread( packetizer_t *p_pack ) ...@@ -358,10 +364,11 @@ static void PacketizeThread( packetizer_t *p_pack )
i_pos += p_pack->i_sequence_header_length; i_pos += p_pack->i_sequence_header_length;
p_pack->i_last_sequence_header = 0; p_pack->i_last_sequence_header = 0;
} }
#if 1
p_pack->i_last_ref_pts = p_pack->i_last_ref_pts =
p_pack->i_last_dts + p_pack->i_last_dts +
(mtime_t)( 1000000 / p_pack->d_frame_rate); /* FIXME */ (mtime_t)( 1000000 / p_pack->d_frame_rate); /* FIXME */
#endif
CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos ); CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos );
} }
else if( i_code == 0x100 ) /* Picture */ else if( i_code == 0x100 ) /* Picture */
...@@ -374,7 +381,6 @@ static void PacketizeThread( packetizer_t *p_pack ) ...@@ -374,7 +381,6 @@ static void PacketizeThread( packetizer_t *p_pack )
i_temporal_ref = ShowBits( &p_pack->bit_stream, 10 ); i_temporal_ref = ShowBits( &p_pack->bit_stream, 10 );
CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos ); CopyUntilNextStartCode( p_pack, p_sout_buffer, &i_pos );
break;
} }
else if( i_code == 0x1b5 ) else if( i_code == 0x1b5 )
{ {
...@@ -402,6 +408,11 @@ static void PacketizeThread( packetizer_t *p_pack ) ...@@ -402,6 +408,11 @@ static void PacketizeThread( packetizer_t *p_pack )
} }
else else
{ {
if( i_code >= 0x101 && i_code <= 0x1af )
{
b_seen_slice = VLC_TRUE;
}
if( i_code == 0x1B3 ) if( i_code == 0x1B3 )
{ {
p_pack->i_last_sequence_header = 0; p_pack->i_last_sequence_header = 0;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libvlc.h: main libvlc header * libvlc.h: main libvlc header
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2002 VideoLAN * 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> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -302,6 +302,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL }; ...@@ -302,6 +302,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL };
#define SOUT_LONGTEXT N_( \ #define SOUT_LONGTEXT N_( \
"Empty if no stream output.") "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_TEXT N_("enable video stream output")
#define SOUT_VIDEO_LONGTEXT N_( \ #define SOUT_VIDEO_LONGTEXT N_( \
"This allows you to choose if the video stream should be redirected to " \ "This allows you to choose if the video stream should be redirected to " \
...@@ -311,6 +315,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL }; ...@@ -311,6 +315,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL };
#define SOUT_VCODEC_LONGTEXT N_( \ #define SOUT_VCODEC_LONGTEXT N_( \
"This allows you to force video encoding") "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_TEXT N_("enable audio stream output")
#define SOUT_AUDIO_LONGTEXT N_( \ #define SOUT_AUDIO_LONGTEXT N_( \
"This allows you to choose if the video stream should be redirected to " \ "This allows you to choose if the video stream should be redirected to " \
...@@ -320,6 +328,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL }; ...@@ -320,6 +328,10 @@ static char *ppsz_sout_vcodec[] = { "", "mpeg1", "mpeg2", "mpeg4", NULL };
#define SOUT_ACODEC_LONGTEXT N_( \ #define SOUT_ACODEC_LONGTEXT N_( \
"This allows you to force audio encoding") "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_TEXT N_("choose preferred packetizer list")
#define PACKETIZER_LONGTEXT N_( \ #define PACKETIZER_LONGTEXT N_( \
"This allows you to select the order in which VLC will choose its " \ "This allows you to select the order in which VLC will choose its " \
...@@ -536,10 +548,16 @@ vlc_module_begin(); ...@@ -536,10 +548,16 @@ vlc_module_begin();
/* Stream output options */ /* Stream output options */
add_category_hint( N_("Stream output"), NULL, VLC_TRUE ); add_category_hint( N_("Stream output"), NULL, VLC_TRUE );
add_string( "sout", NULL, NULL, SOUT_TEXT, SOUT_LONGTEXT, 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-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_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_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, add_module( "packetizer", "packetizer", NULL, NULL,
PACKETIZER_TEXT, PACKETIZER_LONGTEXT, VLC_TRUE ); PACKETIZER_TEXT, PACKETIZER_LONGTEXT, VLC_TRUE );
add_module( "mux", "sout mux", NULL, NULL, MUX_TEXT, MUX_LONGTEXT, VLC_TRUE ); add_module( "mux", "sout mux", NULL, NULL, MUX_TEXT, MUX_LONGTEXT, VLC_TRUE );
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* stream_output.c : stream output module * stream_output.c : stream output module
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * 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> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -37,7 +37,9 @@ ...@@ -37,7 +37,9 @@
/***************************************************************************** /*****************************************************************************
* Local prototypes * 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 * Generic MRL parser
* *
...@@ -87,7 +89,8 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent, ...@@ -87,7 +89,8 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent,
} }
else 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 ); p_sout->p_stream = sout_stream_new( p_sout, p_sout->psz_chain );
...@@ -1138,16 +1141,65 @@ void sout_stream_delete( sout_stream_t *p_stream ) ...@@ -1138,16 +1141,65 @@ void sout_stream_delete( sout_stream_t *p_stream )
vlc_object_destroy( p_stream ); 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; mrl_t mrl;
char *psz_chain; char *psz_chain, *p;
char *psz_vcodec, *psz_acodec;
mrl_Parse( &mrl, psz_url ); 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 ); return( psz_chain );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment