[vlc-devel] [PATCH 1/8] transcode: split loop transcode_video_set_conversions()

Steve Lhomme robux4 at ycbcr.xyz
Thu Sep 24 11:50:20 CEST 2020


Rather than a loop doing things differently in both passes.
---
 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 315c5173a0d..e462d3727d5 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 dc07278e11b..a2e0efa3359 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;
-- 
2.26.2



More information about the vlc-devel mailing list