diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h index 1c99f6c012..8e5ffc98ec 100644 --- a/include/vlc_input_item.h +++ b/include/vlc_input_item.h @@ -520,6 +520,7 @@ struct input_stats_t /* Vout */ int64_t i_displayed_pictures; + int64_t i_late_pictures; int64_t i_lost_pictures; /* Aout */ diff --git a/src/input/decoder.c b/src/input/decoder.c index 99c5f12e12..5aa8ead4ba 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1080,13 +1080,14 @@ static void ModuleThread_UpdateStatVideo( vlc_input_decoder_t *p_owner, { unsigned displayed = 0; unsigned vout_lost = 0; + unsigned vout_late = 0; if( p_owner->p_vout != NULL ) { - vout_GetResetStatistic( p_owner->p_vout, &displayed, &vout_lost ); + vout_GetResetStatistic( p_owner->p_vout, &displayed, &vout_lost, &vout_late ); } if (lost) vout_lost++; - decoder_Notify(p_owner, on_new_video_stats, 1, vout_lost, displayed); + decoder_Notify(p_owner, on_new_video_stats, 1, vout_lost, displayed, vout_late); } static void ModuleThread_QueueVideo( decoder_t *p_dec, picture_t *p_pic ) diff --git a/src/input/decoder.h b/src/input/decoder.h index b5a05e232e..f8dede8417 100644 --- a/src/input/decoder.h +++ b/src/input/decoder.h @@ -39,7 +39,7 @@ struct vlc_input_decoder_callbacks { void *userdata); void (*on_new_video_stats)(vlc_input_decoder_t *decoder, unsigned decoded, - unsigned lost, unsigned displayed, + unsigned lost, unsigned displayed, unsigned late, void *userdata); void (*on_new_audio_stats)(vlc_input_decoder_t *decoder, unsigned decoded, unsigned lost, unsigned played, void *userdata); diff --git a/src/input/es_out.c b/src/input/es_out.c index 2ad863021c..89d819b4c5 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -344,7 +344,7 @@ decoder_on_thumbnail_ready(vlc_input_decoder_t *decoder, picture_t *pic, void *u static void decoder_on_new_video_stats(vlc_input_decoder_t *decoder, unsigned decoded, unsigned lost, - unsigned displayed, void *userdata) + unsigned displayed, unsigned late, void *userdata) { (void) decoder; @@ -365,6 +365,8 @@ decoder_on_new_video_stats(vlc_input_decoder_t *decoder, unsigned decoded, unsig memory_order_relaxed); atomic_fetch_add_explicit(&stats->displayed_pictures, displayed, memory_order_relaxed); + atomic_fetch_add_explicit(&stats->late_pictures, late, + memory_order_relaxed); } static void diff --git a/src/input/input_internal.h b/src/input/input_internal.h index 1391571eea..f99e6805eb 100644 --- a/src/input/input_internal.h +++ b/src/input/input_internal.h @@ -729,6 +729,7 @@ struct input_stats { atomic_uintmax_t played_abuffers; atomic_uintmax_t lost_abuffers; atomic_uintmax_t displayed_pictures; + atomic_uintmax_t late_pictures; atomic_uintmax_t lost_pictures; }; diff --git a/src/input/stats.c b/src/input/stats.c index b294a59e98..bd41a34d75 100644 --- a/src/input/stats.c +++ b/src/input/stats.c @@ -66,6 +66,7 @@ struct input_stats *input_stats_Create(void) atomic_init(&stats->played_abuffers, 0); atomic_init(&stats->lost_abuffers, 0); atomic_init(&stats->displayed_pictures, 0); + atomic_init(&stats->late_pictures, 0); atomic_init(&stats->lost_pictures, 0); return stats; } @@ -106,6 +107,8 @@ void input_stats_Compute(struct input_stats *stats, input_stats_t *st) memory_order_relaxed); st->i_displayed_pictures = atomic_load_explicit(&stats->displayed_pictures, memory_order_relaxed); + st->i_late_pictures = atomic_load_explicit(&stats->late_pictures, + memory_order_relaxed); st->i_lost_pictures = atomic_load_explicit(&stats->lost_pictures, memory_order_relaxed); } diff --git a/src/video_output/statistic.h b/src/video_output/statistic.h index a3fc6ed2c7..54ee775cf0 100644 --- a/src/video_output/statistic.h +++ b/src/video_output/statistic.h @@ -30,12 +30,14 @@ typedef struct { atomic_uint displayed; atomic_uint lost; + atomic_uint late; } vout_statistic_t; static inline void vout_statistic_Init(vout_statistic_t *stat) { atomic_init(&stat->displayed, 0); atomic_init(&stat->lost, 0); + atomic_init(&stat->late, 0); } static inline void vout_statistic_Clean(vout_statistic_t *stat) @@ -45,11 +47,13 @@ static inline void vout_statistic_Clean(vout_statistic_t *stat) static inline void vout_statistic_GetReset(vout_statistic_t *stat, unsigned *restrict displayed, - unsigned *restrict lost) + unsigned *restrict lost, + unsigned *restrict late) { *displayed = atomic_exchange_explicit(&stat->displayed, 0, memory_order_relaxed); *lost = atomic_exchange_explicit(&stat->lost, 0, memory_order_relaxed); + *late = atomic_exchange_explicit(&stat->late, 0, memory_order_relaxed); } static inline void vout_statistic_AddDisplayed(vout_statistic_t *stat, @@ -64,4 +68,9 @@ static inline void vout_statistic_AddLost(vout_statistic_t *stat, int lost) atomic_fetch_add_explicit(&stat->lost, lost, memory_order_relaxed); } +static inline void vout_statistic_AddLate(vout_statistic_t *stat, int late) +{ + atomic_fetch_add_explicit(&stat->late, late, memory_order_relaxed); +} + #endif diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index ea24ad6a15..6cf7a42667 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -347,11 +347,11 @@ static void vout_UpdateWindowSizeLocked(vout_thread_sys_t *vout) /* */ void vout_GetResetStatistic(vout_thread_t *vout, unsigned *restrict displayed, - unsigned *restrict lost) + unsigned *restrict lost, unsigned *restrict late) { vout_thread_sys_t *sys = VOUT_THREAD_TO_SYS(vout); assert(!sys->dummy); - vout_statistic_GetReset( &sys->statistic, displayed, lost ); + vout_statistic_GetReset( &sys->statistic, displayed, lost, late ); } bool vout_IsEmpty(vout_thread_t *vout) @@ -1083,6 +1083,7 @@ static int ThreadDisplayPreparePicture(vout_thread_sys_t *vout, bool reuse, continue; } else if (late > 0) { msg_Dbg(&vout->obj, "picture might be displayed late (missing %"PRId64" ms)", MS_FROM_VLC_TICK(late)); + vout_statistic_AddLate(&sys->statistic, 1); } } vlc_video_context *pic_vctx = picture_GetVideoContext(decoded); diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h index 9dbed09709..3f5a81c98e 100644 --- a/src/video_output/vout_internal.h +++ b/src/video_output/vout_internal.h @@ -176,7 +176,7 @@ void vout_MouseState(vout_thread_t *, const vlc_mouse_t *); * This function will return and reset internal statistics. */ void vout_GetResetStatistic( vout_thread_t *p_vout, unsigned *pi_displayed, - unsigned *pi_lost ); + unsigned *pi_lost, unsigned *pi_late ); /** * This function will force to display the next picture while paused