VLC  2.1.0-git
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Functions
clock.c File Reference
Include dependency graph for clock.c:

Data Structures

struct  average_t
 This structure holds long term average. More...
struct  clock_point_t
struct  input_clock_t
 This structure is used to manage clock drift and reception jitters. More...

Macros

#define CR_MAX_GAP   (INT64_C(2000000)*100/9)
#define CR_MEAN_PTS_GAP   (300000)
#define CR_BUFFERING_RATE   (48)
#define CR_BUFFERING_TARGET   (100000)
#define INPUT_CLOCK_LATE_COUNT   (3)

Functions

static void AvgInit (average_t *, int i_divider)
static void AvgClean (average_t *)
static void AvgReset (average_t *)
static void AvgUpdate (average_t *, mtime_t i_value)
static mtime_t AvgGet (average_t *)
static void AvgRescale (average_t *, int i_divider)
static clock_point_t clock_point_Create (mtime_t i_stream, mtime_t i_system)
static mtime_t ClockStreamToSystem (input_clock_t *, mtime_t i_stream)
static mtime_t ClockSystemToStream (input_clock_t *, mtime_t i_system)
static mtime_t ClockGetTsOffset (input_clock_t *cl)
 It returns timestamp display offset due to ref/last modfied on rate changes It ensures that currently converted dates are not changed.
input_clock_tinput_clock_New (int i_rate)
 This function creates a new input_clock_t.
void input_clock_Delete (input_clock_t *cl)
 This function destroys a input_clock_t created by input_clock_New.
void input_clock_Update (input_clock_t *cl, vlc_object_t *p_log, bool *pb_late, bool b_can_pace_control, bool b_buffering_allowed, mtime_t i_ck_stream, mtime_t i_ck_system)
 This function will update a input_clock_t with a new clock reference point.
void input_clock_Reset (input_clock_t *cl)
 This function will reset the drift of a input_clock_t.
void input_clock_ChangeRate (input_clock_t *cl, int i_rate)
 This functions allows changing the actual reading speed.
void input_clock_ChangePause (input_clock_t *cl, bool b_paused, mtime_t i_date)
 This function allows changing the pause status.
mtime_t input_clock_GetWakeup (input_clock_t *cl)
 This functions will return a deadline used to control the reading speed.
int input_clock_ConvertTS (input_clock_t *cl, int *pi_rate, mtime_t *pi_ts0, mtime_t *pi_ts1, mtime_t i_ts_bound)
 This function converts a pair of timestamp from stream clock to system clock.
int input_clock_GetRate (input_clock_t *cl)
 This function returns the current rate.
int input_clock_GetState (input_clock_t *cl, mtime_t *pi_stream_start, mtime_t *pi_system_start, mtime_t *pi_stream_duration, mtime_t *pi_system_duration)
 This function returns current clock state or VLC_EGENERIC if there is not a reference point.
void input_clock_ChangeSystemOrigin (input_clock_t *cl, bool b_absolute, mtime_t i_system)
 This function allows rebasing the original system value date (a valid reference point must have been set).
void input_clock_GetSystemOrigin (input_clock_t *cl, mtime_t *pi_system, mtime_t *pi_delay)
 This function returns the original system value date and the delay for the current reference point (a valid reference point must have been set).
void input_clock_SetJitter (input_clock_t *cl, mtime_t i_pts_delay, int i_cr_average)
 This function allows the set the minimal configuration for the jitter estimation algo.
mtime_t input_clock_GetJitter (input_clock_t *cl)
 This function returns an estimation of the pts_delay needed to avoid rebufferization.

Macro Definition Documentation

#define CR_BUFFERING_RATE   (48)

Referenced by input_clock_Update().

#define CR_BUFFERING_TARGET   (100000)

Referenced by input_clock_Update().

#define CR_MAX_GAP   (INT64_C(2000000)*100/9)

Referenced by input_clock_Update().

#define CR_MEAN_PTS_GAP   (300000)

Referenced by input_clock_Update().

#define INPUT_CLOCK_LATE_COUNT   (3)

Function Documentation

static void AvgClean ( average_t p_avg)
static

References VLC_UNUSED.

Referenced by input_clock_Delete().

static mtime_t AvgGet ( average_t p_avg)
static
static void AvgInit ( average_t p_avg,
int  i_divider 
)
static

References AvgReset(), and average_t::i_divider.

Referenced by input_clock_New().

static void AvgRescale ( average_t p_avg,
int  i_divider 
)
static
static void AvgReset ( average_t p_avg)
static
static void AvgUpdate ( average_t p_avg,
mtime_t  i_value 
)
static
static clock_point_t clock_point_Create ( mtime_t  i_stream,
mtime_t  i_system 
)
inlinestatic
static mtime_t ClockGetTsOffset ( input_clock_t cl)
static

It returns timestamp display offset due to ref/last modfied on rate changes It ensures that currently converted dates are not changed.

References input_clock_t::i_pts_delay, input_clock_t::i_rate, and INPUT_RATE_DEFAULT.

Referenced by input_clock_ChangeSystemOrigin(), and input_clock_ConvertTS().

static mtime_t ClockStreamToSystem ( input_clock_t cl,
mtime_t  i_stream 
)
static
static mtime_t ClockSystemToStream ( input_clock_t cl,
mtime_t  i_system 
)
static
void input_clock_ChangePause ( input_clock_t cl,
bool  b_paused,
mtime_t  i_date 
)
void input_clock_ChangeRate ( input_clock_t cl,
int  i_rate 
)
void input_clock_ChangeSystemOrigin ( input_clock_t ,
bool  b_absolute,
mtime_t  i_system 
)

This function allows rebasing the original system value date (a valid reference point must have been set).

When using the absolute mode, it will create a discontinuity unless called imediatly after a input_clock_Update.

References input_clock_t::b_has_external_clock, input_clock_t::b_has_reference, ClockGetTsOffset(), input_clock_t::i_external_clock, clock_point_t::i_system, input_clock_t::last, input_clock_t::lock, input_clock_t::ref, vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by EsOutControlLocked(), and EsOutDecodersStopBuffering().

int input_clock_ConvertTS ( input_clock_t ,
int *  pi_rate,
mtime_t pi_ts0,
mtime_t pi_ts1,
mtime_t  i_ts_bound 
)

This function converts a pair of timestamp from stream clock to system clock.

If pi_rate is provided it will be filled with the rate value used for the conversion. p_ts0 is a pointer to a timestamp to be converted (in place) and must be non NULL. p_ts1 is a pointer to a timestamp to be converted (in place) and can be NULL.

It will return VLC_EGENERIC if i_ts_bound is not INT64_MAX and if the value *p_ts0 after conversion is not before the deadline mdate() + i_pts_delay + i_ts_bound. It will also return VLC_EGENERIC if the conversion cannot be done successfully. In this case, *p_ts0 and *p_ts1 will hold an invalid timestamp. Otherwise it will return VLC_SUCCESS.

< Unspecified error

< Unspecified error

< No error

References AvgGet(), input_clock_t::b_has_reference, ClockGetTsOffset(), ClockStreamToSystem(), input_clock_t::drift, input_clock_t::i_buffering_duration, input_clock_t::i_pts_delay, input_clock_t::i_rate, input_clock_t::i_ts_max, INPUT_RATE_DEFAULT, input_clock_t::lock, mdate(), VLC_EGENERIC, vlc_mutex_lock(), vlc_mutex_unlock(), VLC_SUCCESS, and VLC_TS_INVALID.

Referenced by DecoderFixTs(), and DecoderGetDisplayDate().

void input_clock_Delete ( input_clock_t cl)

This function destroys a input_clock_t created by input_clock_New.

References AvgClean(), input_clock_t::drift, input_clock_t::lock, and vlc_mutex_destroy().

Referenced by EsOutProgramDel(), and EsOutTerminate().

mtime_t input_clock_GetJitter ( input_clock_t )

This function returns an estimation of the pts_delay needed to avoid rebufferization.

XXX in the current implementation, the pts_delay will never be decreased.

References input_clock_t::i_pts_delay, input_clock_t::late, input_clock_t::lock, input_clock_t::pi_value, vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by EsOutControlLocked().

int input_clock_GetRate ( input_clock_t cl)

This function returns the current rate.

References input_clock_t::i_rate, input_clock_t::lock, vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by DecoderFixTs(), DecoderGetDisplayRate(), and EsOutFrameNext().

int input_clock_GetState ( input_clock_t cl,
mtime_t pi_stream_start,
mtime_t pi_system_start,
mtime_t pi_stream_duration,
mtime_t pi_system_duration 
)

This function returns current clock state or VLC_EGENERIC if there is not a reference point.

< Unspecified error

< No error

References input_clock_t::b_has_reference, clock_point_t::i_stream, clock_point_t::i_system, input_clock_t::last, input_clock_t::lock, input_clock_t::ref, VLC_EGENERIC, vlc_mutex_lock(), vlc_mutex_unlock(), and VLC_SUCCESS.

Referenced by EsOutChangePause(), EsOutDecodersStopBuffering(), EsOutFrameNext(), and EsOutGetBuffering().

void input_clock_GetSystemOrigin ( input_clock_t cl,
mtime_t pi_system,
mtime_t pi_delay 
)

This function returns the original system value date and the delay for the current reference point (a valid reference point must have been set).

References input_clock_t::b_has_reference, input_clock_t::i_pts_delay, clock_point_t::i_system, input_clock_t::lock, input_clock_t::ref, vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by EsOutControlLocked().

mtime_t input_clock_GetWakeup ( input_clock_t cl)
input_clock_t* input_clock_New ( int  i_rate)
void input_clock_Reset ( input_clock_t )
void input_clock_SetJitter ( input_clock_t cl,
mtime_t  i_pts_delay,
int  i_cr_average 
)
void input_clock_Update ( input_clock_t ,
vlc_object_t p_log,
bool *  pb_late,
bool  b_can_pace_control,
bool  b_buffering_allowed,
mtime_t  i_clock,
mtime_t  i_system 
)