[vlc-devel] [PATCH 07/19] fps: implement draining of extra pictures

Rémi Denis-Courmont remi at remlab.net
Tue Oct 13 18:29:47 CEST 2020


Le tiistaina 13. lokakuuta 2020, 16.51.50 EEST Steve Lhomme a écrit :
> We no longer return pictures chained using vlc_picture_chain_AppendChain().
> 
> p_previous_pic is the picture being filtered.
> 
> drain_pic holds a reference on the picture that was previously returned and
> is released once all the draining for that picture is done.
> ---
>  modules/video_filter/fps.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/modules/video_filter/fps.c b/modules/video_filter/fps.c
> index 64dd1c1fdc4..418fd9aee9a 100644
> --- a/modules/video_filter/fps.c
> +++ b/modules/video_filter/fps.c
> @@ -110,24 +110,28 @@ static picture_t *Filter( filter_t *p_filter,
> picture_t *p_picture) date_Increment( &p_sys->next_output_pts, 1 );
> 
>      picture_t *last_pic = p_sys->p_previous_pic;
> +    p_sys->p_previous_pic = p_picture;
> +    return last_pic;
> +}
> +
> +static picture_t *Drain( filter_t *p_filter )
> +{
> +    filter_sys_t *p_sys = p_filter->p_sys;
> +    picture_t *p_picture = p_sys->p_previous_pic;
> +
>      /* Duplicating pictures are not that effective and framerate increase
>          should be avoided, it's only here as filter should work in that
> direction too*/ -    while( unlikely( (date_Get( &p_sys->next_output_pts )
> + p_sys->i_output_frame_interval ) < p_picture->date ) ) +    if( unlikely(
> (date_Get( &p_sys->next_output_pts ) + p_sys->i_output_frame_interval ) <
> p_picture->date ) ) {
>          picture_t *p_tmp = NULL;
>          p_tmp = picture_NewFromFormat( &p_filter->fmt_out.video );
> 
>          picture_Copy( p_tmp, p_sys->p_previous_pic);
>          p_tmp->date = date_Get( &p_sys->next_output_pts );
> -
> -        vlc_picture_chain_AppendChain( last_pic, p_tmp );
> -        last_pic = p_tmp;
>          date_Increment( &p_sys->next_output_pts, 1 );
> +        return p_tmp;
>      }
> -
> -    last_pic = p_sys->p_previous_pic;
> -    p_sys->p_previous_pic = p_picture;
> -    return last_pic;
> +    return NULL;
>  }

That does not seem right. If the rate is actually increased, filter_video would 
presumably have to inject pictures occasionally, not just drain_video.

> 
>  static void Close( filter_t *p_filter )
> @@ -153,7 +157,7 @@ static void Flush( filter_t *p_filter )
> 
>  static const struct vlc_filter_operations filter_ops =
>  {
> -    .filter_video = Filter, .close = Close,
> +    .filter_video = Filter, .drain_video = Drain, .close = Close,
>      .flush = Flush,
>  };


-- 
レミ・デニ-クールモン
http://www.remlab.net/





More information about the vlc-devel mailing list