vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Sun Jul 1 16:21:18 2018 +0200| [bd14a129249529fb14a08b6de19631bc86cf827a] | committer: Francois Cartegnie
transcode: audio: refactor encoder and filters config > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bd14a129249529fb14a08b6de19631bc86cf827a --- modules/stream_out/transcode/audio.c | 86 +++++++++++------------ modules/stream_out/transcode/transcode.c | 117 ++++++++++++++++--------------- modules/stream_out/transcode/transcode.h | 19 ++--- 3 files changed, 113 insertions(+), 109 deletions(-) diff --git a/modules/stream_out/transcode/audio.c b/modules/stream_out/transcode/audio.c index 818a03d3af..fd872dc9ad 100644 --- a/modules/stream_out/transcode/audio.c +++ b/modules/stream_out/transcode/audio.c @@ -76,17 +76,17 @@ static int audio_update_format( decoder_t *p_dec ) } static int transcode_audio_filters_init( sout_stream_t *p_stream, + const sout_filters_config_t *p_cfg, const audio_format_t *p_dec_out, const audio_format_t *p_enc_in, aout_filters_t **pp_chain ) { - sout_stream_sys_t *p_sys = p_stream->p_sys; /* Load user specified audio filters */ /* XXX: These variable names come kinda out of nowhere... */ var_Create( p_stream, "audio-time-stretch", VLC_VAR_BOOL ); var_Create( p_stream, "audio-filter", VLC_VAR_STRING ); - if( p_sys->psz_af ) - var_SetString( p_stream, "audio-filter", p_sys->psz_af ); + if( p_cfg->psz_filters ) + var_SetString( p_stream, "audio-filter", p_cfg->psz_filters ); *pp_chain = aout_FiltersNew( p_stream, p_dec_out, p_enc_in, NULL, NULL ); var_Destroy( p_stream, "audio-filter" ); var_Destroy( p_stream, "audio-time-stretch" ); @@ -97,14 +97,15 @@ static int transcode_audio_encoder_open( sout_stream_t *p_stream, sout_stream_id { sout_stream_sys_t *p_sys = p_stream->p_sys; - id->p_encoder->p_module = module_need( id->p_encoder, "encoder", p_sys->psz_aenc, true ); + id->p_encoder->p_module = module_need( id->p_encoder, "encoder", + p_sys->aenc_cfg.psz_name, true ); /* p_sys->i_acodec = 0 if there isn't acodec defined */ if( !id->p_encoder->p_module ) { msg_Err( p_stream, "cannot find audio encoder (module:%s fourcc:%4.4s). " "Take a look few lines earlier to see possible reason.", - p_sys->psz_aenc ? p_sys->psz_aenc : "any", - (char *)&p_sys->i_acodec ); + p_sys->aenc_cfg.psz_name ? p_sys->aenc_cfg.psz_name : "any", + (char *)&p_sys->aenc_cfg.i_codec ); return VLC_EGENERIC; } @@ -123,23 +124,24 @@ static int transcode_audio_encoder_open( sout_stream_t *p_stream, sout_stream_id return VLC_SUCCESS; } -static int transcode_audio_encoder_configure( sout_stream_t *p_stream, +static int transcode_audio_encoder_configure( vlc_object_t *p_obj, + const sout_encoder_config_t *p_cfg, const audio_format_t *p_dec_out, encoder_t *p_encoder ) { - sout_stream_sys_t *p_sys = p_stream->p_sys; + VLC_UNUSED(p_obj); audio_format_t *p_enc_in = &p_encoder->fmt_in.audio; audio_format_t *p_enc_out = &p_encoder->fmt_out.audio; /* Complete destination format */ - p_encoder->fmt_out.i_codec = p_sys->i_acodec; - p_encoder->fmt_out.audio.i_format = p_sys->i_acodec; - p_encoder->fmt_out.i_bitrate = p_sys->i_abitrate; - p_enc_out->i_rate = p_sys->i_sample_rate ? p_sys->i_sample_rate - : p_dec_out->i_rate; + p_encoder->fmt_out.i_codec = p_cfg->i_codec; + p_encoder->fmt_out.audio.i_format = p_cfg->i_codec; + p_encoder->fmt_out.i_bitrate = p_cfg->audio.i_bitrate; + p_enc_out->i_rate = p_cfg->audio.i_sample_rate ? p_cfg->audio.i_sample_rate + : p_dec_out->i_rate; p_enc_out->i_bitspersample = p_dec_out->i_bitspersample; - p_enc_out->i_channels = p_sys->i_channels ? p_sys->i_channels - : p_dec_out->i_channels; + p_enc_out->i_channels = p_cfg->audio.i_channels ? p_cfg->audio.i_channels + : p_dec_out->i_channels; aout_FormatPrepare( p_enc_out ); assert(p_enc_out->i_channels > 0); if( p_enc_out->i_channels >= ARRAY_SIZE(pi_channels_maps) ) @@ -155,7 +157,7 @@ static int transcode_audio_encoder_configure( sout_stream_t *p_stream, p_enc_in->i_physical_channels = p_enc_out->i_physical_channels; aout_FormatPrepare( p_enc_in ); - p_encoder->p_cfg = p_sys->p_audio_cfg; + p_encoder->p_cfg = p_cfg->p_config_chain; /* Fix input format */ p_enc_in->i_format = p_encoder->fmt_in.i_codec; @@ -169,20 +171,18 @@ static int transcode_audio_encoder_configure( sout_stream_t *p_stream, return VLC_SUCCESS; } -static int transcode_audio_encoder_test( sout_stream_t *p_stream, - const audio_format_t *p_dec_in, +static int transcode_audio_encoder_test( vlc_object_t *p_obj, const audio_format_t *p_dec_out, vlc_fourcc_t i_codec_in, - config_chain_t *p_cfg, + const sout_encoder_config_t *p_cfg, const es_format_t *p_enc_fmtout, es_format_t *p_enc_wanted_in ) { - sout_stream_sys_t *p_sys = p_stream->p_sys; - encoder_t *p_encoder = sout_EncoderCreate( p_stream ); + encoder_t *p_encoder = sout_EncoderCreate( p_obj ); if( !p_encoder ) return VLC_EGENERIC; - p_encoder->p_cfg = p_cfg; + p_encoder->p_cfg = p_cfg->p_config_chain; es_format_Init( &p_encoder->fmt_in, AUDIO_ES, i_codec_in ); p_encoder->fmt_in.audio = *p_dec_out; @@ -191,34 +191,29 @@ static int transcode_audio_encoder_test( sout_stream_t *p_stream, audio_format_t *p_afmt_out = &p_encoder->fmt_out.audio; + if( transcode_audio_encoder_configure( p_obj, p_cfg, p_dec_out, p_encoder ) ) + { + es_format_Clean( &p_encoder->fmt_in ); + es_format_Clean( &p_encoder->fmt_out ); + vlc_object_release( p_encoder ); + return VLC_EGENERIC; + } + p_encoder->fmt_in.audio.i_format = i_codec_in; - p_encoder->fmt_out.i_codec = p_afmt_out->i_format = p_sys->i_acodec; - p_encoder->fmt_out.i_bitrate = p_sys->i_abitrate; - p_afmt_out->i_rate = FIRSTVALID( p_sys->i_sample_rate, p_dec_out->i_rate, p_dec_in->i_rate ); - p_afmt_out->i_channels = p_sys->i_channels ? p_sys->i_channels - : p_dec_out->i_channels; if( p_afmt_out->i_channels == 0 ) { p_afmt_out->i_channels = 2; p_afmt_out->i_physical_channels = AOUT_CHANS_STEREO; } - else - { - if( p_afmt_out->i_physical_channels ) - p_afmt_out->i_physical_channels = p_afmt_out->i_physical_channels; - else - p_afmt_out->i_physical_channels = p_dec_out->i_physical_channels; - } - aout_FormatPrepare( p_afmt_out ); - module_t *p_module = module_need( p_encoder, "encoder", p_sys->psz_aenc, true ); + module_t *p_module = module_need( p_encoder, "encoder", p_cfg->psz_name, true ); if( !p_module ) { - msg_Err( p_stream, "cannot find audio encoder (module:%s fourcc:%4.4s). " + msg_Err( p_obj, "cannot find audio encoder (module:%s fourcc:%4.4s). " "Take a look few lines earlier to see possible reason.", - p_sys->psz_aenc ? p_sys->psz_aenc : "any", - (char *)&p_sys->i_acodec ); + p_cfg->psz_name ? p_cfg->psz_name : "any", + (char *)&p_cfg->i_codec ); } else { @@ -321,10 +316,10 @@ static int transcode_audio_new( sout_stream_t *p_stream, * This should be enough to initialize the encoder for the first time (it * will be reloaded when all informations from the decoder are available). * */ - if( transcode_audio_encoder_test( p_stream, &id->p_decoder->fmt_in.audio, + if( transcode_audio_encoder_test( VLC_OBJECT(p_stream), &id->audio_dec_out, id->p_decoder->fmt_out.i_codec, - p_sys->p_audio_cfg, + &p_sys->aenc_cfg, &id->p_encoder->fmt_out, &id->encoder_tested_fmt_in ) != VLC_SUCCESS ) { @@ -397,7 +392,8 @@ int transcode_audio_process( sout_stream_t *p_stream, { if( id->p_encoder->p_module == NULL ) { - transcode_audio_encoder_configure( p_stream, &id->audio_dec_out, id->p_encoder ); + transcode_audio_encoder_configure( VLC_OBJECT(p_stream), &p_sys->aenc_cfg, + &id->audio_dec_out, id->p_encoder ); id->fmt_input_audio.i_rate = id->audio_dec_out.i_rate; id->fmt_input_audio.i_physical_channels = id->audio_dec_out.i_physical_channels; @@ -413,7 +409,9 @@ int transcode_audio_process( sout_stream_t *p_stream, } } - if( transcode_audio_filters_init( p_stream, &id->audio_dec_out, + if( transcode_audio_filters_init( p_stream, + &p_sys->afilters_cfg, + &id->audio_dec_out, &id->p_encoder->fmt_in.audio, &id->p_af_chain ) ) { @@ -496,7 +494,7 @@ bool transcode_audio_add( sout_stream_t *p_stream, const es_format_t *p_fmt, msg_Dbg( p_stream, "creating audio transcoding from fcc=`%4.4s' to fcc=`%4.4s'", - (char*)&p_fmt->i_codec, (char*)&p_sys->i_acodec ); + (char*)&p_fmt->i_codec, (char*)&p_sys->aenc_cfg.i_codec ); id->fifo.audio.first = NULL; id->fifo.audio.last = &id->fifo.audio.first; diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c index 4cb2931e24..e2cf0cf17c 100644 --- a/modules/stream_out/transcode/transcode.c +++ b/modules/stream_out/transcode/transcode.c @@ -235,6 +235,56 @@ static void *Add( sout_stream_t *, const es_format_t * ); static void Del( sout_stream_t *, void * ); static int Send( sout_stream_t *, void *, block_t * ); +static void SetAudioEncoderConfig( sout_stream_t *p_stream, sout_encoder_config_t *p_cfg ) +{ + char *psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "aenc" ); + if( psz_string && *psz_string ) + { + char *psz_next = config_ChainCreate( &p_cfg->psz_name, + &p_cfg->p_config_chain, + psz_string ); + free( psz_next ); + } + free( psz_string ); + + psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "acodec" ); + p_cfg->i_codec = 0; + if( psz_string && *psz_string ) + { + char fcc[5] = " \0"; + memcpy( fcc, psz_string, __MIN( strlen( psz_string ), 4 ) ); + p_cfg->i_codec = vlc_fourcc_GetCodecFromString( AUDIO_ES, fcc ); + msg_Dbg( p_stream, "Checking codec mapping for %s got %4.4s ", + fcc, (char*)&p_cfg->i_codec); + } + free( psz_string ); + + p_cfg->audio.i_bitrate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "ab" ); + if( p_cfg->audio.i_bitrate < 4000 ) + p_cfg->audio.i_bitrate *= 1000; + + p_cfg->audio.i_sample_rate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "samplerate" ); + p_cfg->audio.i_channels = var_GetInteger( p_stream, SOUT_CFG_PREFIX "channels" ); + + if( p_cfg->i_codec ) + { + if( ( p_cfg->i_codec == VLC_CODEC_MP3 || + p_cfg->i_codec == VLC_CODEC_MP2 || + p_cfg->i_codec == VLC_CODEC_MPGA ) && + p_cfg->audio.i_channels > 2 ) + { + msg_Warn( p_stream, "%d channels invalid for mp2/mp3, forcing to 2", + p_cfg->audio.i_channels ); + p_cfg->audio.i_channels = 2; + } + msg_Dbg( p_stream, "codec audio=%4.4s %dHz %d channels %dKb/s", + (char *)&p_cfg->i_codec, p_cfg->audio.i_sample_rate, + p_cfg->audio.i_channels, p_cfg->audio.i_bitrate / 1000 ); + } + + p_cfg->psz_lang = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "alang" ); +} + static void SetVideoEncoderConfig( sout_stream_t *p_stream, sout_encoder_config_t *p_cfg ) { char *psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "venc" ); @@ -304,59 +354,17 @@ static int Open( vlc_object_t *p_this ) p_stream->p_cfg ); /* Audio transcoding parameters */ - psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "aenc" ); - p_sys->psz_aenc = NULL; - p_sys->p_audio_cfg = NULL; - if( psz_string && *psz_string ) - { - char *psz_next; - psz_next = config_ChainCreate( &p_sys->psz_aenc, &p_sys->p_audio_cfg, - psz_string ); - free( psz_next ); - } - free( psz_string ); - - psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "acodec" ); - p_sys->i_acodec = 0; - if( psz_string && *psz_string ) - { - char fcc[5] = " \0"; - memcpy( fcc, psz_string, __MIN( strlen( psz_string ), 4 ) ); - p_sys->i_acodec = vlc_fourcc_GetCodecFromString( AUDIO_ES, fcc ); - msg_Dbg( p_stream, "Checking codec mapping for %s got %4.4s ", fcc, (char*)&p_sys->i_acodec); - } - free( psz_string ); + sout_encoder_config_init( &p_sys->aenc_cfg ); + SetAudioEncoderConfig( p_stream, &p_sys->aenc_cfg ); - p_sys->psz_alang = var_GetNonEmptyString( p_stream, SOUT_CFG_PREFIX "alang" ); - - p_sys->i_abitrate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "ab" ); - if( p_sys->i_abitrate < 4000 ) p_sys->i_abitrate *= 1000; - - p_sys->i_sample_rate = var_GetInteger( p_stream, SOUT_CFG_PREFIX "samplerate" ); - - p_sys->i_channels = var_GetInteger( p_stream, SOUT_CFG_PREFIX "channels" ); - - if( p_sys->i_acodec ) - { - if( ( p_sys->i_acodec == VLC_CODEC_MP3 || - p_sys->i_acodec == VLC_CODEC_MP2 || - p_sys->i_acodec == VLC_CODEC_MPGA ) && p_sys->i_channels > 2 ) - { - msg_Warn( p_stream, "%d channels invalid for mp2/mp3, forcing to 2", - p_sys->i_channels ); - p_sys->i_channels = 2; - } - msg_Dbg( p_stream, "codec audio=%4.4s %dHz %d channels %dKb/s", - (char *)&p_sys->i_acodec, p_sys->i_sample_rate, - p_sys->i_channels, p_sys->i_abitrate / 1000 ); - } + /* Audio Filter Parameters */ + sout_filters_config_init( &p_sys->afilters_cfg ); psz_string = var_GetString( p_stream, SOUT_CFG_PREFIX "afilter" ); if( psz_string && *psz_string ) - p_sys->psz_af = strdup( psz_string ); + p_sys->afilters_cfg.psz_filters = psz_string; else - p_sys->psz_af = NULL; - free( psz_string ); + free( psz_string ); /* Video transcoding parameters */ sout_encoder_config_init( &p_sys->venc_cfg ); @@ -457,11 +465,8 @@ static void Close( vlc_object_t * p_this ) sout_encoder_config_clean( &p_sys->venc_cfg ); sout_filters_config_clean( &p_sys->vfilters_cfg ); - free( p_sys->psz_af ); - - config_ChainDestroy( p_sys->p_audio_cfg ); - free( p_sys->psz_aenc ); - free( p_sys->psz_alang ); + sout_encoder_config_clean( &p_sys->aenc_cfg ); + sout_filters_config_clean( &p_sys->afilters_cfg ); config_ChainDestroy( p_sys->p_spu_cfg ); free( p_sys->psz_senc ); @@ -533,14 +538,14 @@ static void *Add( sout_stream_t *p_stream, const es_format_t *p_fmt ) id->p_encoder->fmt_out.i_id = p_fmt->i_id; id->p_encoder->fmt_out.i_group = p_fmt->i_group; - if( p_sys->psz_alang ) - id->p_encoder->fmt_out.psz_language = strdup( p_sys->psz_alang ); + if( p_sys->aenc_cfg.psz_lang ) + id->p_encoder->fmt_out.psz_language = strdup( p_sys->aenc_cfg.psz_lang ); else if( p_fmt->psz_language ) id->p_encoder->fmt_out.psz_language = strdup( p_fmt->psz_language ); bool success; - if( p_fmt->i_cat == AUDIO_ES && p_sys->i_acodec ) + if( p_fmt->i_cat == AUDIO_ES && p_sys->aenc_cfg.i_codec ) success = transcode_audio_add(p_stream, p_fmt, id); else if( p_fmt->i_cat == VIDEO_ES && p_sys->venc_cfg.i_codec ) success = transcode_video_add(p_stream, p_fmt, id); diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h index 4c0c67e462..cc62dfaa8a 100644 --- a/modules/stream_out/transcode/transcode.h +++ b/modules/stream_out/transcode/transcode.h @@ -42,6 +42,7 @@ typedef struct { vlc_fourcc_t i_codec; /* (0 if not transcode) */ char *psz_name; + char *psz_lang; config_chain_t *p_config_chain; union { @@ -60,6 +61,12 @@ typedef struct uint32_t pool_size; } threads; } video; + struct + { + unsigned int i_bitrate; + uint32_t i_sample_rate; + uint32_t i_channels; + } audio; }; } sout_encoder_config_t; @@ -73,6 +80,7 @@ static inline void sout_encoder_config_clean( sout_encoder_config_t *p_cfg ) { free( p_cfg->psz_name ); + free( p_cfg->psz_lang ); config_ChainDestroy( p_cfg->p_config_chain ); } @@ -81,15 +89,8 @@ typedef struct sout_stream_id_sys_t *id_video; /* Audio */ - vlc_fourcc_t i_acodec; /* codec audio (0 if not transcode) */ - char *psz_aenc; - char *psz_alang; - config_chain_t *p_audio_cfg; - uint32_t i_sample_rate; - uint32_t i_channels; - int i_abitrate; - - char *psz_af; + sout_encoder_config_t aenc_cfg; + sout_filters_config_t afilters_cfg; /* Video */ sout_encoder_config_t venc_cfg; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits