[vlc-commits] transcode: video: append converter before encoder if needed

Alexandre Janniaux git at videolan.org
Thu Feb 13 12:03:36 CET 2020


vlc | branch: master | Alexandre Janniaux <ajanni at videolabs.io> | Thu Jan 30 13:25:51 2020 +0100| [1b414b5c87734b675bf9f5aae0a4e38319315404] | committer: Jean-Baptiste Kempf

transcode: video: append converter before encoder if needed

The encoder is able to override its input format, especially to change
the input chroma. The semantic is that the encoder user should either
change the input format or refuse the module probing.

The transcode video pipeline had a dedicated filter_chain to handle such
conversion but it was never initialized.

Store encoder input format before it is initialized, and initialize the
final filter chain if the format is different from what the encoder
requested.

Fix #22703

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1b414b5c87734b675bf9f5aae0a4e38319315404
---

 modules/stream_out/transcode/video.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 8453fb70f0..592aaf54e9 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -623,8 +623,15 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
                     goto error;
             }
 
+            /* Store the current encoder input chroma to detect whether we need
+             * a converter in p_final_conv_static. The encoder will override it
+             * if it needs any different format or chroma. */
+            es_format_t filter_fmt_out;
+            es_format_Copy( &filter_fmt_out, transcode_encoder_format_in( id->encoder ) );
+            bool is_encoder_open = transcode_encoder_opened( id->encoder );
+
             /* Start missing encoder */
-            if( !transcode_encoder_opened( id->encoder ) &&
+            if( !is_encoder_open &&
                 transcode_encoder_open( id->encoder, id->p_enccfg ) != VLC_SUCCESS )
             {
                 msg_Err( p_stream, "cannot find video encoder (module:%s fourcc:%4.4s). "
@@ -634,6 +641,26 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
                 goto error;
             }
 
+            /* The fmt_in may have been overriden by the encoder. */
+            const es_format_t *encoder_fmt_in = transcode_encoder_format_in( id->encoder );
+
+            /* In case the encoder wasn't open yet, check if we need to add
+             * a converter between last user filter and encoder. */
+            if( !is_encoder_open &&
+                filter_fmt_out.i_codec != encoder_fmt_in->i_codec )
+            {
+                if ( !id->p_final_conv_static )
+                    id->p_final_conv_static =
+                        filter_chain_NewVideo( p_stream, false, NULL );
+                filter_chain_Reset( id->p_final_conv_static,
+                                    &filter_fmt_out,
+                                    //encoder_vctx_in,
+                                    NULL,
+                                    encoder_fmt_in );
+                filter_chain_AppendConverter( id->p_final_conv_static, NULL );
+            }
+            es_format_Clean(&filter_fmt_out);
+
             msg_Dbg( p_stream, "destination (after video filters) %ux%u",
                                transcode_encoder_format_in( id->encoder )->video.i_width,
                                transcode_encoder_format_in( id->encoder )->video.i_height );



More information about the vlc-commits mailing list