[vlc-devel] [PATCH] transcode: encoder: forward video context with format
Steve Lhomme
robux4 at ycbcr.xyz
Mon Jul 20 09:58:13 CEST 2020
LGTM.
You may add a comment in the TODO to explain what you expect to be done
here.
For example, further up in the code there is:
/* TODO id->p_decoder->vctx_out*/
It's wrong now since we don't store the video context there anymore. We
just send an update when it changes (with the matching format) and pass
it in pictures.
On 2020-07-17 10:21, Alexandre Janniaux wrote:
> The video context was correctly forwarded from the beginning of the
> filter chains up to the user filter chain but the output video context
> of the user filter chain was never used.
>
> As we call transcode_encoder_update_format_in only for video, add the
> video context there to forward it too. If the function starts to be used
> in audio too, it could probably be splitted into a different function
> instead.
>
> The code also forward NULL video context after the opening of the
> decoder, but since the video context is now extracted asynchronously
> from the decoder_UpdateVideoOutput call, this part should probably be
> moved to the associated callback instead.
> ---
> modules/stream_out/transcode/encoder/encoder.c | 9 ++++++++-
> modules/stream_out/transcode/encoder/encoder.h | 2 +-
> modules/stream_out/transcode/video.c | 5 +++--
> 3 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/modules/stream_out/transcode/encoder/encoder.c b/modules/stream_out/transcode/encoder/encoder.c
> index 2c893326636..210e04f4cba 100644
> --- a/modules/stream_out/transcode/encoder/encoder.c
> +++ b/modules/stream_out/transcode/encoder/encoder.c
> @@ -124,10 +124,17 @@ 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,
> + struct vlc_video_context *vctx )
> {
> es_format_Clean( &p_enc->p_encoder->fmt_in );
> es_format_Copy( &p_enc->p_encoder->fmt_in, fmt );
> +
> + if( p_enc->p_encoder->vctx_in != NULL )
> + vlc_video_context_Release( p_enc->p_encoder->vctx_in );
> + if( vctx )
> + vlc_video_context_Hold( vctx );
> + p_enc->p_encoder->vctx_in = vctx;
> }
>
> 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..b176c4ad7bc 100644
> --- a/modules/stream_out/transcode/encoder/encoder.h
> +++ b/modules/stream_out/transcode/encoder/encoder.h
> @@ -65,7 +65,7 @@ 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 *, struct vlc_video_context * );
> void transcode_encoder_update_format_out( transcode_encoder_t *, const es_format_t * );
>
> block_t * transcode_encoder_encode( transcode_encoder_t *, void * );
> diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
> index 094c1a357fc..2bb4cc768ca 100644
> --- a/modules/stream_out/transcode/video.c
> +++ b/modules/stream_out/transcode/video.c
> @@ -250,7 +250,7 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt,
> p_enc_owner->enc.cbs = &encoder_video_transcode_cbs;
>
> /* Will use this format as encoder input for now */
> - transcode_encoder_update_format_in( id->encoder, &encoder_tested_fmt_in );
> + transcode_encoder_update_format_in( id->encoder, &encoder_tested_fmt_in, NULL /* TODO */ );
>
> es_format_Clean( &encoder_tested_fmt_in );
>
> @@ -389,11 +389,12 @@ static int transcode_video_filters_init( sout_stream_t *p_stream,
> filter_chain_Reset( id->p_uf_chain, p_src, src_ctx, p_dst );
> filter_chain_AppendFromString( id->p_uf_chain, p_cfg->psz_filters );
> p_src = filter_chain_GetFmtOut( id->p_uf_chain );
> + src_ctx = filter_chain_GetVideoCtxOut( 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, src_ctx );
>
> /* SPU Sources */
> if( p_cfg->video.psz_spu_sources )
> --
> 2.27.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list