mirror of https://code.videolan.org/videolan/vlc
* 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:
parent
a6d67949e9
commit
e3c6886780
|
@ -48,10 +48,14 @@
|
|||
/*****************************************************************************
|
||||
* 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_LONGTEXT N_( \
|
||||
"Allows you to pecify the destination video codec used for the streaming "\
|
||||
"output." )
|
||||
"Allows you to specify the destination video codec used for the " \
|
||||
"streaming output." )
|
||||
#define VB_TEXT N_("Video bitrate")
|
||||
#define VB_LONGTEXT N_( \
|
||||
"Allows you to specify the video bitrate used for the streaming " \
|
||||
|
@ -82,6 +86,10 @@
|
|||
#define CROPRIGHT_LONGTEXT N_( \
|
||||
"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_LONGTEXT N_( \
|
||||
"Allows you to specify the destination audio codec used for the " \
|
||||
|
@ -114,6 +122,8 @@ vlc_module_begin();
|
|||
add_shortcut( "transcode" );
|
||||
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,
|
||||
VCODEC_LONGTEXT, VLC_FALSE );
|
||||
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,
|
||||
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,
|
||||
ACODEC_LONGTEXT, VLC_FALSE );
|
||||
add_integer( SOUT_CFG_PREFIX "ab", 64000, NULL, AB_TEXT,
|
||||
|
@ -149,6 +161,12 @@ vlc_module_begin();
|
|||
THREADS_LONGTEXT, VLC_TRUE );
|
||||
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
|
||||
*****************************************************************************/
|
||||
|
@ -179,12 +197,6 @@ static int pi_channels_maps[6] =
|
|||
| 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
|
||||
|
||||
struct sout_stream_sys_t
|
||||
|
@ -200,12 +212,14 @@ struct sout_stream_sys_t
|
|||
int i_first_pic, i_last_pic;
|
||||
|
||||
vlc_fourcc_t i_acodec; /* codec audio (0 if not transcode) */
|
||||
char *psz_aenc;
|
||||
sout_cfg_t *p_audio_cfg;
|
||||
int i_sample_rate;
|
||||
int i_channels;
|
||||
int i_abitrate;
|
||||
|
||||
vlc_fourcc_t i_vcodec; /* " video " " " " */
|
||||
char *psz_venc;
|
||||
sout_cfg_t *p_video_cfg;
|
||||
int i_vbitrate;
|
||||
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_sys_t *p_sys;
|
||||
vlc_value_t val;
|
||||
char *psz_opts;
|
||||
|
||||
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->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,
|
||||
p_stream->p_cfg );
|
||||
|
||||
/* 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 );
|
||||
p_sys->i_acodec = 0;
|
||||
if( val.psz_string && *val.psz_string )
|
||||
|
@ -303,6 +306,18 @@ static int Open( vlc_object_t *p_this )
|
|||
}
|
||||
|
||||
/* 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 );
|
||||
p_sys->i_vcodec = 0;
|
||||
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;
|
||||
}
|
||||
if( p_sys->psz_aenc ) free( p_sys->psz_aenc );
|
||||
|
||||
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;
|
||||
}
|
||||
if( p_sys->psz_venc ) free( p_sys->psz_venc );
|
||||
|
||||
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
|
||||
{
|
||||
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->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 );
|
||||
|
||||
/* 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 */
|
||||
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 );
|
||||
|
||||
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 )
|
||||
{
|
||||
vlc_object_detach( id->p_encoder );
|
||||
vlc_object_destroy( id->p_encoder );
|
||||
msg_Err( p_stream, "cannot open encoder" );
|
||||
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 );
|
||||
|
||||
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 )
|
||||
{
|
||||
vlc_object_detach( id->p_encoder );
|
||||
vlc_object_destroy( id->p_encoder );
|
||||
msg_Err( p_stream, "cannot find encoder" );
|
||||
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->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 )
|
||||
{
|
||||
vlc_object_destroy( id->p_encoder );
|
||||
|
|
Loading…
Reference in New Issue