[vlc-devel] [PATCH 5/6] demux: add control calls to read the demuxer title/seekpoint
Rémi Denis-Courmont
remi at remlab.net
Thu Jun 9 20:13:25 CEST 2016
On Tuesday 07 June 2016 11:15:17 Steve Lhomme wrote:
> this will become handy with the demux filters
TBH, to handle asynchronous updates correctly, event callbacks would be
required; this is especially true for pf_demux-less/threaded demuxers.
> ---
> include/vlc_demux.h | 5 ++++
> src/input/demux.c | 68
> ++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 70
> insertions(+), 3 deletions(-)
>
> diff --git a/include/vlc_demux.h b/include/vlc_demux.h
> index f4baeea..9a74908 100644
> --- a/include/vlc_demux.h
> +++ b/include/vlc_demux.h
> @@ -187,6 +187,11 @@ enum demux_query_e
> * arg1= int */
> DEMUX_SET_SEEKPOINT, /* arg1= int can fail */
>
> + DEMUX_GET_UPDATE_FLAGS, /* arg1= int* can fail */
> + DEMUX_CLEAR_UPDATE_FLAGS, /* arg1= const int* can fail */
> + DEMUX_GET_TITLE, /* arg1= int* can fail */
> + DEMUX_GET_SEEKPOINT, /* arg1= int* can fail */
> +
> /* I. Common queries to access_demux and demux */
> /* POSITION double between 0.0 and 1.0 */
> DEMUX_GET_POSITION = 0x300, /* arg1= double * res= */
> diff --git a/src/input/demux.c b/src/input/demux.c
> index baf1880..9178928 100644
> --- a/src/input/demux.c
> +++ b/src/input/demux.c
> @@ -416,6 +416,58 @@ int demux_vaControl( demux_t *demux, int query, va_list
> args ) }
> }
>
> + switch( query )
> + {
> + case DEMUX_GET_UPDATE_FLAGS:
> + {
> + int ret;
> + va_list ap;
> +
> + va_copy( ap, args );
Why? Ditto below.
> + ret = demux->pf_control( demux, query, args );
> + if (ret != VLC_SUCCESS)
> + *va_arg( ap, int * ) = demux->info.i_update;
> + va_end( ap );
> + return VLC_SUCCESS;
> + }
> + case DEMUX_CLEAR_UPDATE_FLAGS:
> + {
> + int ret;
> + va_list ap;
> +
> + va_copy( ap, args );
> + ret = demux->pf_control( demux, query, args );
> + if (ret != VLC_SUCCESS)
> + demux->info.i_update &= ~(*va_arg( ap, const int * ));
> + va_end( ap );
> + return VLC_SUCCESS;
> + }
> + case DEMUX_GET_TITLE:
> + {
> + int ret;
> + va_list ap;
> +
> + va_copy( ap, args );
> + ret = demux->pf_control( demux, query, args );
> + if (ret != VLC_SUCCESS)
> + *va_arg( ap, int * ) = demux->info.i_title;
> + va_end( ap );
> + return VLC_SUCCESS;
> + }
> + case DEMUX_GET_SEEKPOINT:
> + {
> + int ret;
> + va_list ap;
> +
> + va_copy( ap, args );
> + ret = demux->pf_control( demux, query, args );
> + if (ret != VLC_SUCCESS)
> + *va_arg( ap, int * ) = demux->info.i_seekpoint;
> + va_end( ap );
> + return VLC_SUCCESS;
> + }
> + }
> +
> return demux->pf_control( demux, query, args );
> }
>
> @@ -658,20 +710,30 @@ static bool SkipAPETag( demux_t *p_demux )
>
> int demux_GetUpdateFlags( demux_t *p_demux )
> {
> + int i_update;
> + if ( demux_Control( p_demux, DEMUX_GET_UPDATE_FLAGS, &i_update ) ==
> VLC_SUCCESS )
> + return i_update;
> return p_demux->info.i_update;
> }
>
> void demux_ResetUpdateFlags( demux_t *p_demux, int i_flags )
> {
> - p_demux->info.i_update &= ~i_flags;
> + if ( demux_Control( p_demux, DEMUX_CLEAR_UPDATE_FLAGS, &i_flags ) !=
> VLC_SUCCESS )
> + p_demux->info.i_update &= ~i_flags;
> }
>
> int demux_GetTitle( demux_t *p_demux )
> {
> - return p_demux->info.i_title;
> + int i_title;
> + if ( demux_Control( p_demux, DEMUX_GET_TITLE, &i_title ) == VLC_SUCCESS
> ) + return i_title;
> + return 0;
> }
>
> int demux_GetSeekpoint( demux_t *p_demux )
> {
> - return p_demux->info.i_seekpoint;
> + int i_seekpoint;
> + if ( demux_Control( p_demux, DEMUX_GET_SEEKPOINT, &i_seekpoint ) ==
> VLC_SUCCESS )
> + return i_seekpoint;
> + return 0;
> }
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list