[vlc-devel] [PATCH 5/6] transcode: update the encoder input format after we know the last filter output

Steve Lhomme robux4 at ycbcr.xyz
Thu Jan 14 13:54:27 UTC 2021


This is done before the actual encoder that will be used is created.
---
 modules/stream_out/transcode/encoder/encoder.c | 11 ++++++++++-
 modules/stream_out/transcode/encoder/encoder.h |  6 +++++-
 modules/stream_out/transcode/encoder/video.c   | 15 +++++++++++++++
 modules/stream_out/transcode/video.c           |  4 ++--
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/modules/stream_out/transcode/encoder/encoder.c b/modules/stream_out/transcode/encoder/encoder.c
index 2c893326636..6958a8dc724 100644
--- a/modules/stream_out/transcode/encoder/encoder.c
+++ b/modules/stream_out/transcode/encoder/encoder.c
@@ -124,10 +124,19 @@ const es_format_t *transcode_encoder_format_out( const transcode_encoder_t *p_en
     return &p_enc->p_encoder->fmt_out;
 }
 
-void transcode_encoder_update_format_in( transcode_encoder_t *p_enc, const es_format_t *fmt )
+void transcode_encoder_update_format_in( transcode_encoder_t *p_enc, const es_format_t *fmt,
+                                         const transcode_encoder_config_t *p_cfg )
 {
     es_format_Clean( &p_enc->p_encoder->fmt_in );
     es_format_Copy( &p_enc->p_encoder->fmt_in, fmt );
+    switch (fmt->i_cat)
+    {
+        case VIDEO_ES:
+            transcode_encoder_video_set_src(p_enc->p_encoder, &fmt->video, p_cfg);
+            break;
+        default:
+            break;
+    }
 }
 
 void transcode_encoder_update_format_out( transcode_encoder_t *p_enc, const es_format_t *fmt )
diff --git a/modules/stream_out/transcode/encoder/encoder.h b/modules/stream_out/transcode/encoder/encoder.h
index 30a83547702..22b1d7d1b2c 100644
--- a/modules/stream_out/transcode/encoder/encoder.h
+++ b/modules/stream_out/transcode/encoder/encoder.h
@@ -65,7 +65,8 @@ void transcode_encoder_config_clean( transcode_encoder_config_t * );
 
 const es_format_t *transcode_encoder_format_in( const transcode_encoder_t * );
 const es_format_t *transcode_encoder_format_out( const transcode_encoder_t * );
-void transcode_encoder_update_format_in( transcode_encoder_t *, const es_format_t * );
+void transcode_encoder_update_format_in( transcode_encoder_t *, const es_format_t *,
+                                         const transcode_encoder_config_t * );
 void transcode_encoder_update_format_out( transcode_encoder_t *, const es_format_t * );
 
 block_t * transcode_encoder_encode( transcode_encoder_t *, void * );
@@ -91,6 +92,9 @@ void transcode_encoder_video_configure( vlc_object_t *p_obj,
                                         vlc_video_context *vctx_in,
                                         transcode_encoder_t *p_enc );
 
+void transcode_encoder_video_set_src( encoder_t *, const video_format_t *,
+                                      const transcode_encoder_config_t * );
+
 void transcode_video_framerate_apply( const video_format_t *p_src,
                                             video_format_t *p_dst );
 void transcode_video_sar_apply( const video_format_t *p_src,
diff --git a/modules/stream_out/transcode/encoder/video.c b/modules/stream_out/transcode/encoder/video.c
index 2ba109a1af0..683d9031af5 100644
--- a/modules/stream_out/transcode/encoder/video.c
+++ b/modules/stream_out/transcode/encoder/video.c
@@ -209,6 +209,21 @@ static void transcode_video_size_config_apply( vlc_object_t *p_obj,
     }
 }
 
+void transcode_encoder_video_set_src(encoder_t *p_encoder, const video_format_t *p_src,
+                                     const transcode_encoder_config_t *p_cfg)
+{
+    video_format_t *p_enc_in = &p_encoder->fmt_in.video;
+    if( p_cfg->video.fps.num )
+    {
+        p_enc_in->i_frame_rate = p_cfg->video.fps.num;
+        p_enc_in->i_frame_rate_base = __MAX(p_cfg->video.fps.den, 1);
+    }
+    p_enc_in->orientation = ORIENT_NORMAL;
+
+    /* Modify to requested sizes/scale */
+    transcode_video_size_config_apply( VLC_OBJECT(p_encoder), p_src, p_cfg, p_enc_in );
+}
+
 void transcode_encoder_video_configure( vlc_object_t *p_obj,
                                         const video_format_t *p_dec_out,
                                         const transcode_encoder_config_t *p_cfg,
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 1eb26cc292f..079ab4ada68 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -316,10 +316,10 @@ static int transcode_video_filters_init( sout_stream_t *p_stream,
         filter_chain_AppendFromString( id->p_uf_chain, p_cfg->psz_filters );
         p_src = filter_chain_GetFmtOut( id->p_uf_chain );
         debug_format( p_stream, p_src );
-   }
+    }
 
     /* Update encoder so it matches filters output */
-    transcode_encoder_update_format_in( id->encoder, p_src );
+    transcode_encoder_update_format_in( id->encoder, p_src, id->p_enccfg );
 
     /* SPU Sources */
     if( p_cfg->video.psz_spu_sources )
-- 
2.29.2



More information about the vlc-devel mailing list