1
mirror of https://code.videolan.org/videolan/vlc synced 2024-07-29 11:58:24 +02:00

* modules/stream_out/transcode.c:

+ new options to allow forcing an encoder and passing options to it.
     (aenc=foo{optionbar=bar,etc...},venc=foo{optionbar=bar,etc...} where foo is the encoder plugin name).
   + got rid of aopts/vopts which is not needed anymore ;)
This commit is contained in:
Gildas Bazin 2004-04-25 16:35:39 +00:00
parent a6d67949e9
commit e3c6886780

View File

@ -48,10 +48,14 @@
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
#define VENC_TEXT N_("Video encoder")
#define VENC_LONGTEXT N_( \
"Allows you to specify the video encoder to use and its associated " \
"options." )
#define VCODEC_TEXT N_("Destination video codec") #define VCODEC_TEXT N_("Destination video codec")
#define VCODEC_LONGTEXT N_( \ #define VCODEC_LONGTEXT N_( \
"Allows you to pecify the destination video codec used for the streaming "\ "Allows you to specify the destination video codec used for the " \
"output." ) "streaming output." )
#define VB_TEXT N_("Video bitrate") #define VB_TEXT N_("Video bitrate")
#define VB_LONGTEXT N_( \ #define VB_LONGTEXT N_( \
"Allows you to specify the video bitrate used for the streaming " \ "Allows you to specify the video bitrate used for the streaming " \
@ -82,6 +86,10 @@
#define CROPRIGHT_LONGTEXT N_( \ #define CROPRIGHT_LONGTEXT N_( \
"Allows you to specify the right coordinate for the video cropping." ) "Allows you to specify the right coordinate for the video cropping." )
#define AENC_TEXT N_("Audio encoder")
#define AENC_LONGTEXT N_( \
"Allows you to specify the audio encoder to use and its associated " \
"options." )
#define ACODEC_TEXT N_("Destination audio codec") #define ACODEC_TEXT N_("Destination audio codec")
#define ACODEC_LONGTEXT N_( \ #define ACODEC_LONGTEXT N_( \
"Allows you to specify the destination audio codec used for the " \ "Allows you to specify the destination audio codec used for the " \
@ -114,6 +122,8 @@ vlc_module_begin();
add_shortcut( "transcode" ); add_shortcut( "transcode" );
set_callbacks( Open, Close ); set_callbacks( Open, Close );
add_string( SOUT_CFG_PREFIX "venc", NULL, NULL, VENC_TEXT,
VENC_LONGTEXT, VLC_FALSE );
add_string( SOUT_CFG_PREFIX "vcodec", NULL, NULL, VCODEC_TEXT, add_string( SOUT_CFG_PREFIX "vcodec", NULL, NULL, VCODEC_TEXT,
VCODEC_LONGTEXT, VLC_FALSE ); VCODEC_LONGTEXT, VLC_FALSE );
add_integer( SOUT_CFG_PREFIX "vb", 800 * 1000, NULL, VB_TEXT, add_integer( SOUT_CFG_PREFIX "vb", 800 * 1000, NULL, VB_TEXT,
@ -136,6 +146,8 @@ vlc_module_begin();
add_integer( SOUT_CFG_PREFIX "cropright", 0, NULL, CROPRIGHT_TEXT, add_integer( SOUT_CFG_PREFIX "cropright", 0, NULL, CROPRIGHT_TEXT,
CROPRIGHT_LONGTEXT, VLC_TRUE ); CROPRIGHT_LONGTEXT, VLC_TRUE );
add_string( SOUT_CFG_PREFIX "aenc", NULL, NULL, AENC_TEXT,
AENC_LONGTEXT, VLC_FALSE );
add_string( SOUT_CFG_PREFIX "acodec", NULL, NULL, ACODEC_TEXT, add_string( SOUT_CFG_PREFIX "acodec", NULL, NULL, ACODEC_TEXT,
ACODEC_LONGTEXT, VLC_FALSE ); ACODEC_LONGTEXT, VLC_FALSE );
add_integer( SOUT_CFG_PREFIX "ab", 64000, NULL, AB_TEXT, add_integer( SOUT_CFG_PREFIX "ab", 64000, NULL, AB_TEXT,
@ -149,6 +161,12 @@ vlc_module_begin();
THREADS_LONGTEXT, VLC_TRUE ); THREADS_LONGTEXT, VLC_TRUE );
vlc_module_end(); vlc_module_end();
static const char *ppsz_sout_options[] = {
"venc", "vcodec", "vb", "croptop", "cropbottom", "cropleft", "cropright",
"scale", "width", "height", "deinterlace", "threads",
"aenc", "acodec", "ab", "samplerate", "channels", NULL
};
/***************************************************************************** /*****************************************************************************
* Exported prototypes * Exported prototypes
*****************************************************************************/ *****************************************************************************/
@ -179,12 +197,6 @@ static int pi_channels_maps[6] =
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
}; };
static const char *ppsz_sout_options[] = {
"vcodec", "vb", "croptop", "cropbottom", "cropleft", "cropright",
"scale", "width", "height", "deinterlace", "threads",
"acodec", "ab", "samplerate", "channels", NULL
};
#define PICTURE_RING_SIZE 64 #define PICTURE_RING_SIZE 64
struct sout_stream_sys_t struct sout_stream_sys_t
@ -200,12 +212,14 @@ struct sout_stream_sys_t
int i_first_pic, i_last_pic; int i_first_pic, i_last_pic;
vlc_fourcc_t i_acodec; /* codec audio (0 if not transcode) */ vlc_fourcc_t i_acodec; /* codec audio (0 if not transcode) */
char *psz_aenc;
sout_cfg_t *p_audio_cfg; sout_cfg_t *p_audio_cfg;
int i_sample_rate; int i_sample_rate;
int i_channels; int i_channels;
int i_abitrate; int i_abitrate;
vlc_fourcc_t i_vcodec; /* " video " " " " */ vlc_fourcc_t i_vcodec; /* " video " " " " */
char *psz_venc;
sout_cfg_t *p_video_cfg; sout_cfg_t *p_video_cfg;
int i_vbitrate; int i_vbitrate;
double f_scale; double f_scale;
@ -234,7 +248,6 @@ static int Open( vlc_object_t *p_this )
sout_stream_t *p_stream = (sout_stream_t*)p_this; sout_stream_t *p_stream = (sout_stream_t*)p_this;
sout_stream_sys_t *p_sys; sout_stream_sys_t *p_sys;
vlc_value_t val; vlc_value_t val;
char *psz_opts;
p_sys = vlc_object_create( p_this, sizeof( sout_stream_sys_t ) ); p_sys = vlc_object_create( p_this, sizeof( sout_stream_sys_t ) );
@ -249,32 +262,22 @@ static int Open( vlc_object_t *p_this )
p_sys->b_input_has_b_frames = VLC_FALSE; p_sys->b_input_has_b_frames = VLC_FALSE;
p_sys->i_output_pts = 0; p_sys->i_output_pts = 0;
psz_opts = sout_cfg_find_value( p_stream->p_cfg, "aopts" );
p_sys->p_audio_cfg = NULL;
if( psz_opts && *psz_opts )
{
char *psz_name, *psz_next, *psz_tmp;
asprintf( &psz_tmp, "aopts%s", psz_opts );
psz_next = sout_cfg_parser( &psz_name, &p_sys->p_audio_cfg, psz_tmp );
if( psz_next ) free( psz_next );
free( psz_tmp );
}
psz_opts = sout_cfg_find_value( p_stream->p_cfg, "vopts" );
p_sys->p_video_cfg = NULL;
if( psz_opts && *psz_opts )
{
char *psz_name, *psz_next, *psz_tmp;
asprintf( &psz_tmp, "vopts%s", psz_opts );
psz_next = sout_cfg_parser( &psz_name, &p_sys->p_video_cfg, psz_tmp );
if( psz_next ) free( psz_next );
free( psz_tmp );
}
sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options, sout_ParseCfg( p_stream, SOUT_CFG_PREFIX, ppsz_sout_options,
p_stream->p_cfg ); p_stream->p_cfg );
/* Audio transcoding parameters */ /* Audio transcoding parameters */
var_Get( p_stream, SOUT_CFG_PREFIX "aenc", &val );
p_sys->psz_aenc = NULL;
p_sys->p_audio_cfg = NULL;
if( val.psz_string && *val.psz_string )
{
char *psz_next;
psz_next = sout_cfg_parser( &p_sys->psz_aenc, &p_sys->p_audio_cfg,
val.psz_string );
if( psz_next ) free( psz_next );
}
if( val.psz_string ) free( val.psz_string );
var_Get( p_stream, SOUT_CFG_PREFIX "acodec", &val ); var_Get( p_stream, SOUT_CFG_PREFIX "acodec", &val );
p_sys->i_acodec = 0; p_sys->i_acodec = 0;
if( val.psz_string && *val.psz_string ) if( val.psz_string && *val.psz_string )
@ -303,6 +306,18 @@ static int Open( vlc_object_t *p_this )
} }
/* Video transcoding parameters */ /* Video transcoding parameters */
var_Get( p_stream, SOUT_CFG_PREFIX "venc", &val );
p_sys->psz_venc = NULL;
p_sys->p_video_cfg = NULL;
if( val.psz_string && *val.psz_string )
{
char *psz_next;
psz_next = sout_cfg_parser( &p_sys->psz_venc, &p_sys->p_video_cfg,
val.psz_string );
if( psz_next ) free( psz_next );
}
if( val.psz_string ) free( val.psz_string );
var_Get( p_stream, SOUT_CFG_PREFIX "vcodec", &val ); var_Get( p_stream, SOUT_CFG_PREFIX "vcodec", &val );
p_sys->i_vcodec = 0; p_sys->i_vcodec = 0;
if( val.psz_string && *val.psz_string ) if( val.psz_string && *val.psz_string )
@ -381,6 +396,7 @@ static void Close( vlc_object_t * p_this )
p_sys->p_audio_cfg = p_next; p_sys->p_audio_cfg = p_next;
} }
if( p_sys->psz_aenc ) free( p_sys->psz_aenc );
while( p_sys->p_video_cfg != NULL ) while( p_sys->p_video_cfg != NULL )
{ {
@ -394,6 +410,7 @@ static void Close( vlc_object_t * p_this )
p_sys->p_video_cfg = p_next; p_sys->p_video_cfg = p_next;
} }
if( p_sys->psz_venc ) free( p_sys->psz_venc );
vlc_object_destroy( p_sys ); vlc_object_destroy( p_sys );
} }
@ -520,7 +537,8 @@ static sout_stream_id_t * Add( sout_stream_t *p_stream, es_format_t *p_fmt )
} }
else else
{ {
msg_Dbg( p_stream, "not transcoding a stream (fcc=`%4.4s')", (char*)&p_fmt->i_codec ); msg_Dbg( p_stream, "not transcoding a stream (fcc=`%4.4s')",
(char*)&p_fmt->i_codec );
id->id = p_sys->p_out->pf_add( p_sys->p_out, p_fmt ); id->id = p_sys->p_out->pf_add( p_sys->p_out, p_fmt );
id->b_transcode = VLC_FALSE; id->b_transcode = VLC_FALSE;
@ -799,7 +817,8 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream,
id->p_buffer = malloc( id->i_buffer ); id->p_buffer = malloc( id->i_buffer );
/* Sanity check for audio channels */ /* Sanity check for audio channels */
id->f_dst.audio.i_channels = __MIN( id->f_dst.audio.i_channels, id->f_src.audio.i_channels ); id->f_dst.audio.i_channels =
__MIN( id->f_dst.audio.i_channels, id->f_src.audio.i_channels );
/* find encoder */ /* find encoder */
id->p_encoder = vlc_object_create( p_stream, VLC_OBJECT_ENCODER ); id->p_encoder = vlc_object_create( p_stream, VLC_OBJECT_ENCODER );
@ -823,9 +842,11 @@ static int transcode_audio_ffmpeg_new( sout_stream_t *p_stream,
vlc_object_attach( id->p_encoder, p_stream ); vlc_object_attach( id->p_encoder, p_stream );
id->p_encoder->p_module = id->p_encoder->p_module =
module_Need( id->p_encoder, "encoder", NULL, 0 ); module_Need( id->p_encoder, "encoder",
p_stream->p_sys->psz_aenc, VLC_TRUE );
if( !id->p_encoder->p_module ) if( !id->p_encoder->p_module )
{ {
vlc_object_detach( id->p_encoder );
vlc_object_destroy( id->p_encoder ); vlc_object_destroy( id->p_encoder );
msg_Err( p_stream, "cannot open encoder" ); msg_Err( p_stream, "cannot open encoder" );
return VLC_EGENERIC; return VLC_EGENERIC;
@ -1292,10 +1313,11 @@ static int transcode_video_ffmpeg_new( sout_stream_t *p_stream,
vlc_object_attach( id->p_encoder, p_stream ); vlc_object_attach( id->p_encoder, p_stream );
id->p_encoder->p_module = id->p_encoder->p_module =
module_Need( id->p_encoder, "encoder", NULL, 0 ); module_Need( id->p_encoder, "encoder", p_sys->psz_venc, VLC_TRUE );
if( !id->p_encoder->p_module ) if( !id->p_encoder->p_module )
{ {
vlc_object_detach( id->p_encoder );
vlc_object_destroy( id->p_encoder ); vlc_object_destroy( id->p_encoder );
msg_Err( p_stream, "cannot find encoder" ); msg_Err( p_stream, "cannot find encoder" );
return VLC_EGENERIC; return VLC_EGENERIC;
@ -1496,7 +1518,8 @@ static int transcode_video_ffmpeg_process( sout_stream_t *p_stream,
id->p_encoder->fmt_out.p_extra = NULL; id->p_encoder->fmt_out.p_extra = NULL;
id->p_encoder->p_module = id->p_encoder->p_module =
module_Need( id->p_encoder, "encoder", NULL, 0 ); module_Need( id->p_encoder, "encoder",
p_sys->psz_venc, VLC_TRUE );
if( !id->p_encoder->p_module ) if( !id->p_encoder->p_module )
{ {
vlc_object_destroy( id->p_encoder ); vlc_object_destroy( id->p_encoder );