vlc | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Thu Sep 24 10:35:18 2020 +0200| [6575fa69155c03c49af987c3032f61a143123c77] | committer: Steve Lhomme
transcode: unroll the transcode_video_set_conversions() loop Rather than a loop doing things differently in both passes. No functional changes. Add some more comments on the different filter chains. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6575fa69155c03c49af987c3032f61a143123c77 --- modules/stream_out/transcode/transcode.h | 4 +-- modules/stream_out/transcode/video.c | 44 +++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h index 315c5173a0..e462d3727d 100644 --- a/modules/stream_out/transcode/transcode.h +++ b/modules/stream_out/transcode/transcode.h @@ -121,11 +121,11 @@ struct sout_stream_id_sys_t { struct { - filter_chain_t *p_f_chain; /**< Video filters */ + filter_chain_t *p_f_chain; /**< deinterlace & fps video filters */ filter_chain_t *p_conv_nonstatic; filter_chain_t *p_conv_static; filter_chain_t *p_uf_chain; /**< User-specified video filters */ - filter_chain_t *p_final_conv_static; + filter_chain_t *p_final_conv_static; /**< converter to adapt filtered pics to the encoder */ vlc_blender_t *p_spu_blender; spu_t *p_spu; vlc_decoder_device *dec_dev; diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c index dc07278e11..a2e0efa335 100644 --- a/modules/stream_out/transcode/video.c +++ b/modules/stream_out/transcode/video.c @@ -284,7 +284,49 @@ static int transcode_video_set_conversions( sout_stream_t *p_stream, STEP_NONSTATIC = 0, STEP_STATIC, }; - for( int step = STEP_NONSTATIC; step <= STEP_STATIC; step++ ) + int step = STEP_NONSTATIC; + { + const bool b_do_scale = (*pp_src)->video.i_width != p_dst->video.i_width || + (*pp_src)->video.i_height != p_dst->video.i_height; + const bool b_do_chroma = (*pp_src)->video.i_chroma != p_dst->video.i_chroma; + const bool b_do_orient = ((*pp_src)->video.orientation != ORIENT_NORMAL) && b_reorient; + + if( step == STEP_STATIC && b_do_orient ) + return VLC_EGENERIC; + + const es_format_t *p_tmpdst = p_dst; + + if( ! (b_do_scale || b_do_chroma || b_do_orient) ) + return VLC_SUCCESS; + + es_format_t tmpdst; + if( b_do_orient ) + { + es_format_Init( &tmpdst, VIDEO_ES, p_dst->video.i_chroma ); + video_format_ApplyRotation( &tmpdst.video, &p_dst->video ); + p_tmpdst = &tmpdst; + } + + msg_Dbg( p_stream, "adding (scale %d,chroma %d, orient %d) converters", + b_do_scale, b_do_chroma, b_do_orient ); + + filter_chain_t **pp_chain = (step == STEP_NONSTATIC) + ? &id->p_conv_nonstatic + : &id->p_conv_static; + + *pp_chain = filter_chain_NewVideo( p_stream, step == STEP_NONSTATIC, &owner ); + if( !*pp_chain ) + return VLC_EGENERIC; + filter_chain_Reset( *pp_chain, *pp_src, *pp_src_vctx, p_tmpdst ); + + if( filter_chain_AppendConverter( *pp_chain, p_tmpdst ) != VLC_SUCCESS ) + return VLC_EGENERIC; + + *pp_src = filter_chain_GetFmtOut( *pp_chain ); + *pp_src_vctx = filter_chain_GetVideoCtxOut( *pp_chain ); + debug_format( p_stream, *pp_src ); + } + step = STEP_STATIC; { const bool b_do_scale = (*pp_src)->video.i_width != p_dst->video.i_width || (*pp_src)->video.i_height != p_dst->video.i_height; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits