[vlc-commits] transcode: unroll the transcode_video_set_conversions() loop
Steve Lhomme
git at videolan.org
Mon Oct 5 14:05:15 CEST 2020
vlc | branch: master | Steve Lhomme <robux4 at 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;
More information about the vlc-commits
mailing list