[vlc-devel] [RFC PATCH] decoder: add decoder_QueuePicture
Rémi Denis-Courmont
remi at remlab.net
Fri Oct 31 14:26:37 CET 2014
Le 2014-10-31 16:08, Thomas Guillem a écrit :
> This function allow asynchronous decoders to queue a picture from an
> other
> thread. Theses decoders should return NULL in pf_decode callback.
>
> ---
>
> Tested with my patched mediacodec that use one thread for input and
> one
> thread for output. It's working, but still WIP and not ready for
> submission.
>
> include/vlc_codec.h | 2 ++
> src/input/decoder.c | 91
> ++++++++++++++++++++++++++++++++++++-----------------
> 2 files changed, 64 insertions(+), 29 deletions(-)
>
> diff --git a/include/vlc_codec.h b/include/vlc_codec.h
> index 429cfa5..d6ec6ce 100644
> --- a/include/vlc_codec.h
> +++ b/include/vlc_codec.h
> @@ -217,6 +217,8 @@ VLC_API void decoder_LinkPicture( decoder_t *,
> picture_t * );
> */
> VLC_API void decoder_UnlinkPicture( decoder_t *, picture_t * );
>
> +VLC_API int decoder_QueuePicture( decoder_t *, picture_t * );
> +
> /**
> * This function notifies the audio output pipeline of a new audio
> output
> * format (fmt_out.audio). If there is currently no audio output or
> if the
> diff --git a/src/input/decoder.c b/src/input/decoder.c
> index fe8d669..f33b37c 100644
> --- a/src/input/decoder.c
> +++ b/src/input/decoder.c
> @@ -1365,6 +1365,66 @@ static void DecoderPlayVideo( decoder_t
> *p_dec, picture_t *p_picture,
> *pi_lost_sum += i_tmp_lost;
> }
>
> +static int DecoderPreparePlayVideo( decoder_t *p_dec, picture_t
> *p_pic )
> +{
> + decoder_owner_sys_t *p_owner = p_dec->p_owner;
> + vout_thread_t *p_vout = p_owner->p_vout;
> +
> + if( p_owner->i_preroll_end > VLC_TS_INVALID && p_pic->date <
> p_owner->i_preroll_end )
> + {
> + vout_ReleasePicture( p_vout, p_pic );
> + return -1;
> + }
> +
> + if( p_owner->i_preroll_end > VLC_TS_INVALID )
> + {
> + msg_Dbg( p_dec, "End of video preroll" );
> + if( p_vout )
> + vout_Flush( p_vout, VLC_TS_INVALID+1 );
> + /* */
> + p_owner->i_preroll_end = VLC_TS_INVALID;
> + }
> +
> + if( p_dec->pf_get_cc &&
> + ( !p_owner->p_packetizer ||
> !p_owner->p_packetizer->pf_get_cc ) )
> + DecoderGetCc( p_dec, p_dec );
> +
> + return 0;
> +}
> +
> +static void DecoderUpdateStatVideo( decoder_t *p_dec, int i_decoded,
> + int i_lost, int i_displayed )
> +{
> + decoder_owner_sys_t *p_owner = p_dec->p_owner;
> + input_thread_t *p_input = p_owner->p_input;
> +
> + /* Update ugly stat */
> + if( p_input != NULL && (i_decoded > 0 || i_lost > 0 ||
> i_displayed > 0) )
> + {
> + vlc_mutex_lock( &p_input->p->counters.counters_lock );
> + stats_Update( p_input->p->counters.p_decoded_video,
> i_decoded, NULL );
> + stats_Update( p_input->p->counters.p_lost_pictures, i_lost ,
> NULL);
> + stats_Update( p_input->p->counters.p_displayed_pictures,
> + i_displayed, NULL);
> + vlc_mutex_unlock( &p_input->p->counters.counters_lock );
> + }
> +}
> +
> +int decoder_QueuePicture( decoder_t *p_dec, picture_t *p_pic )
> +{
> + int i_lost = 0;
> + int i_displayed = 0;
> +
> + if( DecoderPreparePlayVideo( p_dec, p_pic ) != 0 )
> + return -1;
Does that not break transcode again?
> +
> + DecoderPlayVideo( p_dec, p_pic, &i_displayed, &i_lost );
> +
> + DecoderUpdateStatVideo( p_dec, 1, i_lost, i_displayed );
> +
> + return 0;
> +}
> +
> static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
> {
> decoder_owner_sys_t *p_owner = p_dec->p_owner;
--
Rémi Denis-Courmont
More information about the vlc-devel
mailing list