[vlc-devel] [PATCH] sout: add operations structure

Jean-Baptiste Kempf jb at videolan.org
Mon Apr 20 09:13:53 CEST 2020


No objection.

On Sun, Apr 19, 2020, at 13:27, RĂ©mi Denis-Courmont wrote:
> ---
>  include/vlc_sout.h                | 42 ++++++++++++++++++++++++++-----
>  src/stream_output/stream_output.c |  1 +
>  2 files changed, 37 insertions(+), 6 deletions(-)
> 
> diff --git a/include/vlc_sout.h b/include/vlc_sout.h
> index 9b9c898cfc..a6fcf2b028 100644
> --- a/include/vlc_sout.h
> +++ b/include/vlc_sout.h
> @@ -188,6 +188,14 @@ enum sout_stream_query_e {
>      SOUT_STREAM_ID_SPU_HIGHLIGHT,  /* arg1=void *, arg2=const 
> vlc_spu_highlight_t *, res=can fail */
>  };
>  
> +struct sout_stream_operations {
> +    void *(*add)(sout_stream_t *, const es_format_t *);
> +    void (*del)(sout_stream_t *, void *);
> +    int (*send)(sout_stream_t *, void *, block_t *);
> +    int (*control)( sout_stream_t *, int, va_list );
> +    void (*flush)( sout_stream_t *, void *);
> +};
> +
>  struct sout_stream_t
>  {
>      struct vlc_object_t obj;
> @@ -199,6 +207,8 @@ struct sout_stream_t
>      config_chain_t    *p_cfg;
>      sout_stream_t     *p_next;
>  
> +    const struct sout_stream_operations *ops;
> +
>      /* add, remove a stream */
>      void             *(*pf_add)( sout_stream_t *, const es_format_t * 
> );
>      void              (*pf_del)( sout_stream_t *, void * );
> @@ -218,31 +228,51 @@ VLC_API sout_stream_t 
> *sout_StreamChainNew(sout_instance_t *p_sout,
>  static inline void *sout_StreamIdAdd( sout_stream_t *s,
>                                        const es_format_t *fmt )
>  {
> -    return s->pf_add( s, fmt );
> +    if (s->ops == NULL)
> +        return s->pf_add(s, fmt);
> +    return s->ops->add(s, fmt);
>  }
>  
>  static inline void sout_StreamIdDel( sout_stream_t *s,
>                                       void *id )
>  {
> -    s->pf_del( s, id );
> +    if (s->ops == NULL) {
> +        s->pf_del(s, id);
> +        return;
> +    }
> +    s->ops->del(s, id);
>  }
>  
>  static inline int sout_StreamIdSend( sout_stream_t *s,
>                                       void *id, block_t *b )
>  {
> -    return s->pf_send( s, id, b );
> +    if (s->ops == NULL)
> +        return s->pf_send(s, id, b);
> +    return s->ops->send(s, id, b);
>  }
>  
>  static inline void sout_StreamFlush( sout_stream_t *s,
>                                       void *id )
>  {
> -    if (s->pf_flush)
> -        s->pf_flush( s, id );
> +    if (s->ops == NULL) {
> +        if (s->pf_flush != NULL)
> +            s->pf_flush(s, id);
> +        return;
> +   }
> +   if (s->ops->flush != NULL)
> +        s->ops->flush(s, id);
>  }
>  
>  static inline int sout_StreamControlVa( sout_stream_t *s, int i_query, 
> va_list args )
>  {
> -    return s->pf_control ? s->pf_control( s, i_query, args ) : 
> VLC_EGENERIC;
> +    if (s->ops == NULL) {
> +        if (s->pf_control == NULL)
> +            return VLC_EGENERIC;
> +        return s->pf_control(s, i_query, args);
> +    }
> +    if (s->ops->control == NULL)
> +        return VLC_EGENERIC;
> +    return s->ops->control(s, i_query, args);
>  }
>  
>  static inline int sout_StreamControl( sout_stream_t *s, int i_query, 
> ... )
> diff --git a/src/stream_output/stream_output.c 
> b/src/stream_output/stream_output.c
> index a89b6601c5..524b1a65ca 100644
> --- a/src/stream_output/stream_output.c
> +++ b/src/stream_output/stream_output.c
> @@ -810,6 +810,7 @@ static sout_stream_t *sout_StreamNew( 
> sout_instance_t *p_sout, char *psz_name,
>      p_stream->psz_name = psz_name;
>      p_stream->p_cfg    = p_cfg;
>      p_stream->p_next   = p_next;
> +    p_stream->ops = NULL;
>      p_stream->pf_flush = NULL;
>      p_stream->pf_control = NULL;
>      p_stream->pace_nocontrol = false;
> -- 
> 2.26.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Jean-Baptiste Kempf -  President
+33 672 704 734


More information about the vlc-devel mailing list