| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fuchsia.media; |
| |
| // A TimelineFunction represents a relationship between a subject timeline and a |
| // reference timeline with a linear relation. |
| // |
| // For example, consider a common use case in which reference time is the |
| // monotonic clock of a system and subject time is intended presentation time |
| // for some media such as a video. |
| // |
| // |reference_time| is the value of the monotonic clock at the beginning of |
| // playback. |subject_time| is 0 assuming playback starts at the beginning of |
| // the media. We then choose a |reference_delta| and |subject_delta| so that |
| // |subject_delta| / |reference_delta| represents the desired playback rate, |
| // e.g. 0/1 for paused and 1/1 for normal playback. |
| // |
| // ## Formulas |
| // |
| // With a function we can determine the subject timeline value |s| in terms of |
| // reference timeline value |r| with this formula (where |reference_delta| > 0): |
| // |
| // s = (r - reference_time) * (subject_delta / reference_delta) + subject_time |
| // |
| // And similarly we can find the reference timeline value |r| in terms of |
| // subject timeline value |s| with this formula (where |subject_delta| > 0): |
| // |
| // r = (s - subject_time) * (reference_delta / subject_delta) + referenc_time |
| // |
| // ## Choosing time values |
| // |
| // Time values can be arbitrary and our linear relation will of course be the |
| // same, but we can use them to represent the bounds of pieces in a piecewise |
| // linear relation. |
| // |
| // For example, if a user performs skip-chapter, we might want to describe |
| // this with a TimelineFunction whose |subject_time| is the time to skip to, |
| // |reference_time| is now plus some epsilon, and delta ratio is 1/1 for normal |
| // playback rate. |
| struct TimelineFunction { |
| // A value from the subject timeline that correlates to reference_time. |
| int64 subject_time = 0; |
| |
| // A value from the reference timeline that correlates to subject_time. |
| int64 reference_time = 0; |
| |
| // The change in the subject timeline corresponding to reference_delta. |
| uint32 subject_delta = 0; |
| |
| // The change in the reference timeline corresponding to subject_delta. |
| // Cannot be zero. |
| uint32 reference_delta = 1; |
| }; |