[vlc-commits] [Git][videolan/vlc][master] lib/media_player: fix time type/unit used by the timer API
Hugo Beauzée-Luyssen (@chouquette)
gitlab at videolan.org
Fri Aug 12 13:43:03 UTC 2022
Hugo Beauzée-Luyssen pushed to branch master at VideoLAN / VLC
Commits:
95cbcf0e by Thomas Guillem at 2022-08-12T13:01:24+00:00
lib/media_player: fix time type/unit used by the timer API
My bad, libvlc_time_t is in ms. The timer API should use the sane unit
than libvlc_clock(), that is us in int64_t.
Also add missing vlc_tick_t <-> us conversion (no harm since 1 tick = 1
us for now).
- - - - -
2 changed files:
- include/vlc/libvlc_media_player.h
- lib/media_player.c
Changes:
=====================================
include/vlc/libvlc_media_player.h
=====================================
@@ -2671,19 +2671,19 @@ typedef struct libvlc_media_player_time_point_t
double position;
/** Rate of the player */
double rate;
- /** Valid time >= 0 or -1 */
- libvlc_time_t ts;
- /** Valid length >= 1 or 0 */
- libvlc_time_t length;
+ /** Valid time, in us >= 0 or -1 */
+ int64_t ts_us;
+ /** Valid length, in us >= 1 or 0 */
+ int64_t length_us;
/**
- * System date of this record (always valid).
+ * System date, in us, of this record (always valid).
* Based on libvlc_clock(). This date can be in the future or in the past.
* The special value of INT64_MAX mean that the clock was paused when this
* point was updated. In that case,
* libvlc_media_player_time_point_interpolate() will return the current
* ts/pos of this point (there is nothing to interpolate).
* */
- libvlc_time_t system_date;
+ int64_t system_date_us;
} libvlc_media_player_time_point_t;
/**
@@ -2715,13 +2715,13 @@ typedef void (*libvlc_media_player_watch_time_on_update)(
*
* \warning It is forbidden to call any Media Player functions from here..
*
- * \param system_date system date of this event, only valid (> 0) when paused. It
- * can be used to interpolate the last updated point to this date in order
- * to get the last paused ts/position.
+ * \param system_date_us system date, in us, of this event, only valid (> 0)
+ * when paused. It can be used to interpolate the last updated point to this
+ * date in order to get the last paused ts/position.
* \param data opaque pointer set by libvlc_media_player_watch_time()
*/
typedef void (*libvlc_media_player_watch_time_on_discontinuity)(
- libvlc_time_t system_date, void *data);
+ int64_t system_date_us, void *data);
/**
* Watch for times updates
@@ -2731,9 +2731,9 @@ typedef void (*libvlc_media_player_watch_time_on_discontinuity)(
* in-between) will fail.
*
* \param p_mi the media player
- * \param min_period corresponds to the minimum period between each updates,
- * use it to avoid flood from too many source updates, set it to 0 to receive
- * all updates.
+ * \param min_period_us corresponds to the minimum period, in us, between each
+ * updates, use it to avoid flood from too many source updates, set it to 0 to
+ * receive all updates.
* \param on_update callback to listen to update events (must not be NULL)
* \param on_discontinuity callback to listen to discontinuity events (can be
* be NULL)
@@ -2743,7 +2743,7 @@ typedef void (*libvlc_media_player_watch_time_on_discontinuity)(
*/
LIBVLC_API int
libvlc_media_player_watch_time(libvlc_media_player_t *p_mi,
- libvlc_time_t min_period,
+ int64_t min_period_us,
libvlc_media_player_watch_time_on_update on_update,
libvlc_media_player_watch_time_on_discontinuity on_discontinuity,
void *cbs_data);
@@ -2762,9 +2762,8 @@ libvlc_media_player_unwatch_time(libvlc_media_player_t *p_mi);
* \param point time update obtained via the
* libvlc_media_player_watch_time_on_update() callback
- * \param system_now current system date, returned by libvlc_clock()
- * \param out_ts pointer where to set the interpolated ts, subtract this time
- * with VLC_TICK_0 to get the original value.
+ * \param system_now_us current system date, in us, returned by libvlc_clock()
+ * \param out_ts_us pointer where to set the interpolated ts, in us
* \param out_pos pointer where to set the interpolated position
* \return 0 in case of success, -1 if the interpolated ts is negative (could
* happen during the buffering step)
@@ -2772,8 +2771,8 @@ libvlc_media_player_unwatch_time(libvlc_media_player_t *p_mi);
*/
LIBVLC_API int
libvlc_media_player_time_point_interpolate(const libvlc_media_player_time_point_t *point,
- libvlc_time_t system_now,
- libvlc_time_t *out_ts, double *out_pos);
+ int64_t system_now_us,
+ int64_t *out_ts_us, double *out_pos);
/**
* Get the date of the next interval
@@ -2787,20 +2786,20 @@ libvlc_media_player_time_point_interpolate(const libvlc_media_player_time_point_
*
* \param point time update obtained via the
* libvlc_media_player_watch_time_on_update()
- * \param system_now same system date used by
+ * \param system_now_us same system date used by
* libvlc_media_player_time_point_interpolate()
- * \param interpolated_ts ts returned by
+ * \param interpolated_ts_us ts returned by
* libvlc_media_player_time_point_interpolate()
- * \param next_interval next interval
- * \return the absolute system date of the next interval, use libvlc_delay() to
- * get a relative delay.
+ * \param next_interval_us next interval, in us
+ * \return the absolute system date, in us, of the next interval,
+ * use libvlc_delay() to get a relative delay.
* \version LibVLC 4.0.0 or later
*/
-LIBVLC_API libvlc_time_t
+LIBVLC_API int64_t
libvlc_media_player_time_point_get_next_date(const libvlc_media_player_time_point_t *point,
- libvlc_time_t system_now,
- libvlc_time_t interpolated_ts,
- libvlc_time_t next_interval);
+ int64_t system_now_us,
+ int64_t interpolated_ts_us,
+ int64_t next_interval_us);
/** @} libvlc_media_player_watch_time */
=====================================
lib/media_player.c
=====================================
@@ -2212,17 +2212,17 @@ int libvlc_media_player_get_role(libvlc_media_player_t *mp)
#define PLAYER_TIME_CORE_TO_LIB(point) { \
.position = point->position, \
.rate = point->rate, \
- .ts = US_FROM_VLC_TICK(point->ts), \
- .length = US_FROM_VLC_TICK(point->length), \
- .system_date = US_FROM_VLC_TICK(point->system_date), \
+ .ts_us = US_FROM_VLC_TICK(point->ts), \
+ .length_us = US_FROM_VLC_TICK(point->length), \
+ .system_date_us = US_FROM_VLC_TICK(point->system_date), \
}
#define PLAYER_TIME_LIB_TO_CORE(point) { \
.position = point->position, \
.rate = point->rate, \
- .ts = VLC_TICK_FROM_US(point->ts), \
- .length = VLC_TICK_FROM_US(point->length), \
- .system_date = VLC_TICK_FROM_US(point->system_date), \
+ .ts = VLC_TICK_FROM_US(point->ts_us), \
+ .length = VLC_TICK_FROM_US(point->length_us), \
+ .system_date = VLC_TICK_FROM_US(point->system_date_us), \
}
static void player_timer_on_update(const struct vlc_player_timer_point *point,
@@ -2242,12 +2242,13 @@ static void player_timer_on_discontinuity(vlc_tick_t system_date, void *data)
if (p_mi->timer.on_discontinuity == NULL)
return;
- p_mi->timer.on_discontinuity(system_date, p_mi->timer.cbs_data);
+ p_mi->timer.on_discontinuity(US_FROM_VLC_TICK(system_date),
+ p_mi->timer.cbs_data);
}
int
libvlc_media_player_watch_time(libvlc_media_player_t *p_mi,
- libvlc_time_t min_period,
+ int64_t min_period_us,
libvlc_media_player_watch_time_on_update on_update,
libvlc_media_player_watch_time_on_discontinuity on_discontinuity,
void *cbs_data)
@@ -2274,7 +2275,8 @@ libvlc_media_player_watch_time(libvlc_media_player_t *p_mi,
p_mi->timer.on_discontinuity = on_discontinuity;
p_mi->timer.cbs_data = cbs_data;
- p_mi->timer.id = vlc_player_AddTimer(player, min_period, &player_timer_cbs, p_mi);
+ p_mi->timer.id = vlc_player_AddTimer(player, VLC_TICK_FROM_US(min_period_us),
+ &player_timer_cbs, p_mi);
vlc_player_Unlock(player);
if (unlikely(p_mi->timer.id == NULL))
@@ -2299,24 +2301,33 @@ libvlc_media_player_unwatch_time(libvlc_media_player_t *p_mi)
int
libvlc_media_player_time_point_interpolate(const libvlc_media_player_time_point_t *libpoint,
- libvlc_time_t system_now,
- libvlc_time_t *out_ts, double *out_pos)
+ int64_t system_now_us,
+ int64_t *out_ts_us, double *out_pos)
{
const struct vlc_player_timer_point point = PLAYER_TIME_LIB_TO_CORE(libpoint);
- return vlc_player_timer_point_Interpolate(&point, system_now, out_ts, out_pos);
+ vlc_tick_t out_ts;
+ int ret = vlc_player_timer_point_Interpolate(&point,
+ VLC_TICK_FROM_US(system_now_us),
+ &out_ts, out_pos);
+ *out_ts_us = US_FROM_VLC_TICK(out_ts);
+ return ret;
}
-libvlc_time_t
+int64_t
libvlc_media_player_time_point_get_next_date(const libvlc_media_player_time_point_t *libpoint,
- libvlc_time_t system_now,
- libvlc_time_t interpolated_ts,
- libvlc_time_t next_interval)
+ int64_t system_now_us,
+ int64_t interpolated_ts_us,
+ int64_t next_interval_us)
{
const struct vlc_player_timer_point point = PLAYER_TIME_LIB_TO_CORE(libpoint);
- return vlc_player_timer_point_GetNextIntervalDate(&point, system_now,
- interpolated_ts, next_interval);
+ vlc_tick_t date =
+ vlc_player_timer_point_GetNextIntervalDate(&point,
+ VLC_TICK_FROM_US(system_now_us),
+ VLC_TICK_FROM_US(interpolated_ts_us),
+ VLC_TICK_FROM_US(next_interval_us));
+ return US_FROM_VLC_TICK(date);
}
#include <vlc_vout_display.h>
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/95cbcf0e5972d21b8b2a6a9910ad90428dc132ed
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/95cbcf0e5972d21b8b2a6a9910ad90428dc132ed
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list