vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Aug 29 15:36:50 2018 +0200| [2e5bc0cc650278fc8c35bb4d3fd993eda67d9b0a] | committer: Francois Cartegnie
sout: transcode: refactor drain > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2e5bc0cc650278fc8c35bb4d3fd993eda67d9b0a --- modules/stream_out/transcode/audio.c | 6 +----- modules/stream_out/transcode/encoder/audio.c | 10 +++++++++ modules/stream_out/transcode/encoder/encoder.c | 18 ++++++++++++++++ modules/stream_out/transcode/encoder/encoder.h | 1 + .../stream_out/transcode/encoder/encoder_priv.h | 3 +++ modules/stream_out/transcode/encoder/video.c | 25 ++++++++++++++++++++++ modules/stream_out/transcode/video.c | 18 ++++------------ 7 files changed, 62 insertions(+), 19 deletions(-) diff --git a/modules/stream_out/transcode/audio.c b/modules/stream_out/transcode/audio.c index 47d9f3062a..ae357c30f9 100644 --- a/modules/stream_out/transcode/audio.c +++ b/modules/stream_out/transcode/audio.c @@ -354,11 +354,7 @@ error: /* Drain encoder */ if( unlikely( !id->b_error && in == NULL ) && transcode_encoder_opened( id->encoder ) ) { - block_t *p_block; - do { - p_block = transcode_encoder_encode( id->encoder, NULL ); - block_ChainAppend( out, p_block ); - } while( p_block ); + transcode_encoder_drain( id->encoder, out ); } return id->b_error ? VLC_EGENERIC : VLC_SUCCESS; diff --git a/modules/stream_out/transcode/encoder/audio.c b/modules/stream_out/transcode/encoder/audio.c index 47e76bcbde..6b2f72c518 100644 --- a/modules/stream_out/transcode/encoder/audio.c +++ b/modules/stream_out/transcode/encoder/audio.c @@ -201,3 +201,13 @@ block_t * transcode_encoder_audio_encode( transcode_encoder_t *p_enc, block_t *p { return p_enc->p_encoder->pf_encode_audio( p_enc->p_encoder, p_block ); } + +int transcode_encoder_audio_drain( transcode_encoder_t *p_enc, block_t **out ) +{ + block_t *p_block; + do { + p_block = transcode_encoder_audio_encode( p_enc, NULL ); + block_ChainAppend( out, p_block ); + } while( p_block ); + return VLC_SUCCESS; +} diff --git a/modules/stream_out/transcode/encoder/encoder.c b/modules/stream_out/transcode/encoder/encoder.c index 3a2aca1f2f..ac50cb062a 100644 --- a/modules/stream_out/transcode/encoder/encoder.c +++ b/modules/stream_out/transcode/encoder/encoder.c @@ -201,6 +201,24 @@ int transcode_encoder_open( transcode_encoder_t *p_enc, } } +int transcode_encoder_drain( transcode_encoder_t *p_enc, block_t **out ) +{ + if( !transcode_encoder_opened( p_enc ) ) + return VLC_EGENERIC; + + switch( p_enc->p_encoder->fmt_in.i_cat ) + { + case VIDEO_ES: + return transcode_encoder_video_drain( p_enc, out ); + case AUDIO_ES: + return transcode_encoder_audio_drain( p_enc, out ); + case SPU_ES: + return VLC_SUCCESS; + default: + return VLC_EGENERIC; + } +} + int transcode_encoder_test( vlc_object_t *p_obj, const transcode_encoder_config_t *p_cfg, const es_format_t *p_dec_fmtin, diff --git a/modules/stream_out/transcode/encoder/encoder.h b/modules/stream_out/transcode/encoder/encoder.h index 888ad91dc5..b6030aa31a 100644 --- a/modules/stream_out/transcode/encoder/encoder.h +++ b/modules/stream_out/transcode/encoder/encoder.h @@ -76,6 +76,7 @@ void transcode_encoder_close( transcode_encoder_t * ); bool transcode_encoder_opened( const transcode_encoder_t * ); int transcode_encoder_open( transcode_encoder_t *, const transcode_encoder_config_t * ); +int transcode_encoder_drain( transcode_encoder_t *, block_t ** ); int transcode_encoder_test( vlc_object_t *p_obj, const transcode_encoder_config_t *p_cfg, diff --git a/modules/stream_out/transcode/encoder/encoder_priv.h b/modules/stream_out/transcode/encoder/encoder_priv.h index 8fb16294fd..2875ae71a4 100644 --- a/modules/stream_out/transcode/encoder/encoder_priv.h +++ b/modules/stream_out/transcode/encoder/encoder_priv.h @@ -46,6 +46,9 @@ block_t * transcode_encoder_video_encode( transcode_encoder_t *p_enc, picture_t block_t * transcode_encoder_audio_encode( transcode_encoder_t *p_enc, block_t *p_block ); block_t * transcode_encoder_spu_encode( transcode_encoder_t *p_enc, subpicture_t *p_spu ); +int transcode_encoder_audio_drain( transcode_encoder_t *p_enc, block_t **out ); +int transcode_encoder_video_drain( transcode_encoder_t *p_enc, block_t **out ); + int transcode_encoder_video_test( vlc_object_t *p_obj, const transcode_encoder_config_t *p_cfg, const es_format_t *p_dec_fmtin, diff --git a/modules/stream_out/transcode/encoder/video.c b/modules/stream_out/transcode/encoder/video.c index 9bb1e7af17..0b84cb8d57 100644 --- a/modules/stream_out/transcode/encoder/video.c +++ b/modules/stream_out/transcode/encoder/video.c @@ -373,6 +373,31 @@ static void* EncoderThread( void *obj ) return NULL; } +int transcode_encoder_video_drain( transcode_encoder_t *p_enc, block_t **out ) +{ + if( !p_enc->b_threaded ) + { + block_t *p_block; + do { + p_block = transcode_encoder_encode( p_enc, NULL ); + block_ChainAppend( out, p_block ); + } while( p_block ); + } + else + { + if( p_enc->b_threaded && !p_enc->b_abort ) + { + vlc_mutex_lock( &p_enc->lock_out ); + p_enc->b_abort = true; + vlc_cond_signal( &p_enc->cond ); + vlc_mutex_unlock( &p_enc->lock_out ); + vlc_join( p_enc->thread, NULL ); + } + block_ChainAppend( out, transcode_encoder_get_output_async( p_enc ) ); + } + return VLC_SUCCESS; +} + void transcode_encoder_video_close( transcode_encoder_t *p_enc ) { if( p_enc->b_threaded && !p_enc->b_abort ) diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c index 58591859f3..00dddbd9ad 100644 --- a/modules/stream_out/transcode/video.c +++ b/modules/stream_out/transcode/video.c @@ -578,21 +578,11 @@ error: /* Drain encoder */ if( unlikely( !id->b_error && in == NULL ) && transcode_encoder_opened( id->encoder ) ) { - if( id->p_enccfg->video.threads.i_count == 0 ) - { - block_t *p_block; - do { - p_block = transcode_encoder_encode( id->encoder, NULL ); - block_ChainAppend( out, p_block ); - } while( p_block ); - } - else - { - msg_Dbg( p_stream, "Flushing thread and waiting that"); - transcode_encoder_close( id->encoder ); - block_ChainAppend( out, transcode_encoder_get_output_async( id->encoder ) ); + msg_Dbg( p_stream, "Flushing thread and waiting that"); + if( transcode_encoder_drain( id->encoder, out ) == VLC_SUCCESS ) msg_Dbg( p_stream, "Flushing done"); - } + else + msg_Warn( p_stream, "Flushing failed"); } return id->b_error ? VLC_EGENERIC : VLC_SUCCESS; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
