vlc | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Tue Aug 20 08:29:03 2019 +0200| [076b3647212c2f566dfafea7194614e12efbe914] | committer: Steve Lhomme
transcode: provide the decoder device to use with the encoder It is the same decoder device that will be used by the encoder. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=076b3647212c2f566dfafea7194614e12efbe914 --- modules/stream_out/transcode/video.c | 54 ++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c index efcde3b8cd..9c7795d072 100644 --- a/modules/stream_out/transcode/video.c +++ b/modules/stream_out/transcode/video.c @@ -60,6 +60,12 @@ static const video_format_t* filtered_video_format( sout_stream_id_sys_t *id, return &p_pic->format; } +struct encoder_owner +{ + encoder_t enc; + sout_stream_id_sys_t *id; +}; + static vlc_decoder_device *TranscodeHoldDecoderDevice(vlc_object_t *o, sout_stream_id_sys_t *id) { if (id->dec_dev == NULL) @@ -67,6 +73,24 @@ static vlc_decoder_device *TranscodeHoldDecoderDevice(vlc_object_t *o, sout_stre return id->dec_dev ? vlc_decoder_device_Hold(id->dec_dev) : NULL; } +static inline struct encoder_owner *enc_get_owner( encoder_t *p_enc ) +{ + return container_of( p_enc, struct encoder_owner, enc ); +} + +static vlc_decoder_device *video_get_encoder_device( encoder_t *enc ) +{ + struct encoder_owner *p_owner = enc_get_owner( enc ); + if (p_owner->id->dec_dev == NULL) + p_owner->id->dec_dev = vlc_decoder_device_Create( &enc->obj, NULL ); + + return p_owner->id->dec_dev ? vlc_decoder_device_Hold(p_owner->id->dec_dev) : NULL; +} + +static const struct encoder_owner_callbacks encoder_video_transcode_cbs = { + { video_get_encoder_device, } +}; + static vlc_decoder_device * video_get_decoder_device( decoder_t *p_dec ) { struct decoder_owner *p_owner = dec_get_owner( p_dec ); @@ -220,7 +244,20 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt, es_format_t encoder_tested_fmt_in; es_format_Init( &encoder_tested_fmt_in, id->decoder_out.i_cat, 0 ); - if( transcode_encoder_test( sout_EncoderCreate(p_stream, sizeof(struct encoder_t)), + struct encoder_owner *p_enc_owner = (struct encoder_owner*)sout_EncoderCreate(p_stream, sizeof(struct encoder_owner)); + if ( unlikely(p_enc_owner == NULL)) + { + module_unneed( id->p_decoder, id->p_decoder->p_module ); + id->p_decoder->p_module = NULL; + video_format_Clean( &id->fmt_input_video ); + es_format_Clean( &id->decoder_out ); + es_format_Clean( &encoder_tested_fmt_in ); + return VLC_EGENERIC; + } + p_enc_owner->id = id; + p_enc_owner->enc.cbs = &encoder_video_transcode_cbs; + + if( transcode_encoder_test( &p_enc_owner->enc, id->p_enccfg, &id->p_decoder->fmt_in, id->p_decoder->fmt_out.i_codec, @@ -234,7 +271,17 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt, return VLC_EGENERIC; } - id->encoder = transcode_encoder_new( sout_EncoderCreate(VLC_OBJECT(p_stream), sizeof(encoder_t)), &encoder_tested_fmt_in ); + p_enc_owner = (struct encoder_owner *)sout_EncoderCreate(p_stream, sizeof(struct encoder_owner)); + if ( unlikely(p_enc_owner == NULL)) + { + module_unneed( id->p_decoder, id->p_decoder->p_module ); + id->p_decoder->p_module = NULL; + es_format_Clean( &encoder_tested_fmt_in ); + es_format_Clean( &id->decoder_out ); + return VLC_EGENERIC; + } + + id->encoder = transcode_encoder_new( &p_enc_owner->enc, &encoder_tested_fmt_in ); if( !id->encoder ) { module_unneed( id->p_decoder, id->p_decoder->p_module ); @@ -244,6 +291,9 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt, es_format_Clean( &id->decoder_out ); return VLC_EGENERIC; } + p_enc_owner->id = id; + 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 ); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits