vlc | branch: master | Thomas Guillem <[email protected]> | Tue Jul 17 09:57:36 2018 +0200| [1e511f370e43362a50a7a0c0bf2e1749a93ea9d0] | committer: Thomas Guillem
es_out: add ES_OUT_VOUT_ADD_OVERLAY This control allow demuxers to send subpicture_t directly to the vout of the video es. This will be used by the bluray demuxer. ES_OUT_VOUT_FLUSH allow to clear any subpictures previously sent via ES_OUT_VOUT_ADD_OVERLAY. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1e511f370e43362a50a7a0c0bf2e1749a93ea9d0 --- include/vlc_es_out.h | 7 +++++++ src/input/decoder.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/input/decoder.h | 3 +++ src/input/es_out.c | 17 +++++++++++++++++ src/input/es_out_timeshift.c | 15 +++++++++++++++ 5 files changed, 84 insertions(+) diff --git a/include/vlc_es_out.h b/include/vlc_es_out.h index 6fc28115bc..cad9d0567f 100644 --- a/include/vlc_es_out.h +++ b/include/vlc_es_out.h @@ -102,6 +102,13 @@ enum es_out_query_e arg2=vlc_mouse_event, arg3=void *(user_data), res=can fail */ + ES_OUT_VOUT_ADD_OVERLAY, /* arg1= es_out_id_t* (video es), + * arg2= subpicture_t *, + * arg3= int * (channel id), res= can fail */ + + ES_OUT_VOUT_FLUSH_OVERLAY, /* arg1= es_out_id_t* (video es), + * arg2= int (channel id), res= can fail */ + /* First value usable for private control */ ES_OUT_PRIVATE_START = 0x10000, }; diff --git a/src/input/decoder.c b/src/input/decoder.c index 9d066a4aff..4d9d42d36c 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -2481,3 +2481,45 @@ void input_DecoderSetVoutMouseEvent( decoder_t *dec, vlc_mouse_event mouse_event vlc_mutex_unlock( &owner->mouse_lock ); } + +int input_DecoderAddVoutOverlay( decoder_t *dec, subpicture_t *sub, + int *channel ) +{ + struct decoder_owner *owner = dec_get_owner( dec ); + assert( dec->fmt_out.i_cat == VIDEO_ES ); + assert( sub && channel ); + + vlc_mutex_lock( &owner->lock ); + + if( !owner->p_vout ) + { + vlc_mutex_unlock( &owner->lock ); + return VLC_EGENERIC; + } + sub->i_start = sub->i_stop = vlc_tick_now(); + sub->i_channel = *channel = vout_RegisterSubpictureChannel( owner->p_vout ); + sub->i_order = 0; + sub->b_ephemer = true; + vout_PutSubpicture( owner->p_vout, sub ); + + vlc_mutex_unlock( &owner->lock ); + return VLC_SUCCESS; +} + +int input_DecoderFlushVoutOverlay( decoder_t *dec, int channel ) +{ + struct decoder_owner *owner = dec_get_owner( dec ); + assert( dec->fmt_out.i_cat == VIDEO_ES ); + + vlc_mutex_lock( &owner->lock ); + + if( !owner->p_vout ) + { + vlc_mutex_unlock( &owner->lock ); + return VLC_EGENERIC; + } + vout_FlushSubpictureChannel( owner->p_vout, channel ); + + vlc_mutex_unlock( &owner->lock ); + return VLC_SUCCESS; +} diff --git a/src/input/decoder.h b/src/input/decoder.h index acf5ba7617..2da6eb78a2 100644 --- a/src/input/decoder.h +++ b/src/input/decoder.h @@ -119,4 +119,7 @@ void input_DecoderGetObjects( decoder_t *, vout_thread_t **, audio_output_t ** ) void input_DecoderSetVoutMouseEvent( decoder_t *, vlc_mouse_event, void * ); +int input_DecoderAddVoutOverlay( decoder_t *, subpicture_t *, int * ); +int input_DecoderFlushVoutOverlay( decoder_t *, int ); + #endif diff --git a/src/input/es_out.c b/src/input/es_out.c index d437dd1b07..cc1ddb53c2 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -2941,6 +2941,23 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args ) return VLC_SUCCESS; } + case ES_OUT_VOUT_ADD_OVERLAY: + { + es_out_id_t *p_es = va_arg( args, es_out_id_t * ); + subpicture_t *sub = va_arg( args, subpicture_t * ); + int *channel = va_arg( args, int * ); + if( p_es && p_es->fmt.i_cat == VIDEO_ES && p_es->p_dec ) + return input_DecoderAddVoutOverlay( p_es->p_dec, sub, channel ); + return VLC_EGENERIC; + } + case ES_OUT_VOUT_FLUSH_OVERLAY: + { + es_out_id_t *p_es = va_arg( args, es_out_id_t * ); + int channel = va_arg( args, int ); + if( p_es && p_es->fmt.i_cat == VIDEO_ES && p_es->p_dec ) + return input_DecoderFlushVoutOverlay( p_es->p_dec, channel ); + return VLC_EGENERIC; + } default: msg_Err( p_sys->p_input, "unknown query 0x%x in %s", i_query, diff --git a/src/input/es_out_timeshift.c b/src/input/es_out_timeshift.c index 3795ac9d05..42d8584b2e 100644 --- a/src/input/es_out_timeshift.c +++ b/src/input/es_out_timeshift.c @@ -661,6 +661,21 @@ static int ControlLocked( es_out_t *p_out, int i_query, va_list args ) return es_out_Control( p_sys->p_out, ES_OUT_VOUT_SET_MOUSE_EVENT, p_es->p_es, cb, user_data ); } + case ES_OUT_VOUT_ADD_OVERLAY: + { + es_out_id_t *p_es = va_arg( args, es_out_id_t * ); + subpicture_t *sub = va_arg( args, subpicture_t * ); + int *channel = va_arg( args, int * ); + return es_out_Control( p_sys->p_out, ES_OUT_VOUT_ADD_OVERLAY, + p_es->p_es, sub, channel ); + } + case ES_OUT_VOUT_FLUSH_OVERLAY: + { + es_out_id_t *p_es = va_arg( args, es_out_id_t * ); + int channel = va_arg( args, int ); + return es_out_Control( p_sys->p_out, ES_OUT_VOUT_FLUSH_OVERLAY, + p_es->p_es, channel ); + } /* Special internal input control */ case ES_OUT_GET_EMPTY: { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
