[vlc-devel] [PATCH] vout: include static filter chain in render delay calculation

Steve Lhomme robux4 at ycbcr.xyz
Tue Jan 14 07:36:29 CET 2020


Looks OK, although you could have done it in 
ThreadDisplayPreparePicture() around the ThreadDisplayPreparePicture() 
calls. Then it becomes a sys->prepare_chrono and handled in the same 
part of the code as sys->render.

On 2020-01-13 17:27, Thomas Guillem wrote:
> The static filter chain delay (used by deinterlace and postproc) was not taken
> into account for the calculation of the render delay.
> 
> Therefore, if the static filter chain took more than VOUT_MWAIT_TOLERANCE (4ms)
> to complete, the next ThreadDisplayPreparePicture() could be called too late,
> causing a frame drop.
> 
> This commit fixes this issue by adding a vout_chrono_t for the static filter
> chain.
> ---
>   src/video_output/video_output.c  | 10 +++++++++-
>   src/video_output/vout_internal.h |  1 +
>   2 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 659ede546ba..c21ee8b5371 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -867,6 +867,8 @@ static void ThreadChangeFilters(vout_thread_t *vout,
>           vout->p->filter.configuration = filters ? strdup(filters) : NULL;
>       }
>   
> +    vout_chrono_Reset(&vout->p->static_filter_chrono);
> +
>       if (!is_locked)
>           vlc_mutex_unlock(&vout->p->filter.lock);
>   }
> @@ -951,7 +953,9 @@ static int ThreadDisplayPreparePicture(vout_thread_t *vout, bool reuse,
>           vout->p->displayed.timestamp     = decoded->date;
>           vout->p->displayed.is_interlaced = !decoded->b_progressive;
>   
> +        vout_chrono_Start(&vout->p->static_filter_chrono);
>           picture = filter_chain_VideoFilter(vout->p->filter.chain_static, decoded);
> +        vout_chrono_Stop(&vout->p->static_filter_chrono);
>       }
>   
>       vlc_mutex_unlock(&vout->p->filter.lock);
> @@ -1290,7 +1294,9 @@ static int ThreadDisplayPicture(vout_thread_t *vout, vlc_tick_t *deadline)
>               ;
>   
>       const vlc_tick_t system_now = vlc_tick_now();
> -    const vlc_tick_t render_delay = vout_chrono_GetHigh(&sys->render) + VOUT_MWAIT_TOLERANCE;
> +    const vlc_tick_t render_delay = vout_chrono_GetHigh(&sys->render)
> +                                  + vout_chrono_GetHigh(&sys->static_filter_chrono)
> +                                  + VOUT_MWAIT_TOLERANCE;
>   
>       bool drop_next_frame = frame_by_frame;
>       vlc_tick_t date_next = VLC_TICK_INVALID;
> @@ -1823,6 +1829,7 @@ void vout_Close(vout_thread_t *vout)
>       vout_snapshot_End(sys->snapshot);
>       vout_control_Dead(&sys->control);
>       vout_chrono_Clean(&sys->render);
> +    vout_chrono_Clean(&sys->static_filter_chrono);
>   
>       if (sys->spu)
>           spu_Destroy(sys->spu);
> @@ -1963,6 +1970,7 @@ vout_thread_t *vout_Create(vlc_object_t *object)
>   
>       /* Arbitrary initial time */
>       vout_chrono_Init(&sys->render, 5, VLC_TICK_FROM_MS(10));
> +    vout_chrono_Init(&sys->static_filter_chrono, 5, VLC_TICK_FROM_MS(5));
>   
>       /* */
>       atomic_init(&sys->refs, 0);
> diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
> index 0ca81871fee..2000d1e4ad5 100644
> --- a/src/video_output/vout_internal.h
> +++ b/src/video_output/vout_internal.h
> @@ -188,6 +188,7 @@ struct vout_thread_sys_t
>       picture_pool_t  *display_pool;
>       picture_fifo_t  *decoder_fifo;
>       vout_chrono_t   render;           /**< picture render time estimator */
> +    vout_chrono_t   static_filter_chrono; /**< static filter time estimator */
>   
>       atomic_uintptr_t refs;
>   };
> -- 
> 2.20.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list