| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| [DartPackage="mojo_services"] |
| module mojo.media; |
| |
| // TimelineQuad |
| // TODO(dalesat): Rename reference -> presentation. |
| // TODO(dalesat): Rename target -> reference. |
| // |
| // A structure which holds the four numbers needed to define a linear |
| // relationship between the points in two different timelines. The relationship |
| // is expressed using 4 integers in order to facilitate compositions of multiple |
| // transformations (A->B can be composed with B->C to produce the transformation |
| // from A->C), and to minimize rounding and scaling errors when mapping points |
| // between timelines which do not have an integer scaling relationship between |
| // each other. |
| // |
| // These values are used to define the following functions which map from |
| // points from the reference timeline to the target timeline, and back again. |
| // |
| // Let r be a point in the reference timeline. |
| // Let t be a point in the target timeline timeline. |
| // Let ref and tgt be abbreviations for reference and target in equations below. |
| // |
| // Given that r and t represent the same instant in time (in a single frame of |
| // reference) |
| // |
| // t = f(r) = (((r - ref_offset) * tgt_delta) / ref_delta) + tgt_offset |
| // r = F(t) = (((t - tgt_offset) * ref_delta) / tgt_delta) + ref_offset |
| // |
| // See also... |
| // mojo/services/media/common/linear_transform.h |
| // |
| struct TimelineQuad { |
| int64 reference_offset = 0; |
| int64 target_offset = 0; |
| int32 reference_delta = 0; |
| uint32 target_delta = 1; |
| }; |
| |
| // TimelineTransform |
| // TODO(dalesat): Rename reference -> presentation. |
| // TODO(dalesat): Rename target -> reference. |
| // |
| // A structure which holds both a timeline quad, and a pair of identifiers which |
| // define the specific timelines which are the reference and target timelines. |
| struct TimelineTransform { |
| // TODO: These constants should probably defined by a central time management |
| // service, not here. |
| const uint32 kLocalTimeID = 0xFFFFFFFF; |
| const uint32 kContextual = 0xFFFFFFFE; |
| |
| TimelineQuad quad; |
| uint32 reference_timeline_id = kContextual; |
| uint32 target_timeline_id = kLocalTimeID; |
| }; |
| |
| // RateControl |
| // |
| // An interface typically exposed by media renderers which allow producers of |
| // media to specify how the presentation time stamps of the media queued to the |
| // renderer relate to real time. Users may initialize the transformation with a |
| // specific Quad, change the rate immediately in a first order contiguous |
| // fashion, or schedule ranges in the rate at points in time on either the |
| // reference or target timelines. |
| interface RateControl { |
| // Get the current quad which describes the transformation between the |
| // reference and target timelines. |
| GetCurrentTransform() => (TimelineTransform trans); |
| |
| // Immediately, explicitly set the quad which describes the mapping from |
| // reference to target timeline. It is understood that this can cause |
| // discontinuities and should only be used in situations which are already |
| // fundamentally discontinuous (startup/seeking, for example) |
| SetCurrentQuad(TimelineQuad quad); |
| |
| // Configure the target timeline ID. Note, the reference timeline ID will |
| // always be contextual. |
| SetTargetTimelineID(uint32 id); |
| |
| // Immediately change the rate of the existing transformation in a fashion |
| // which is first order continuous with the current transformation. |
| SetRate(int32 reference_delta, uint32 target_delta); |
| |
| // Schedule a first order continuous rate change at the specified reference |
| // time. |
| SetRateAtReferenceTime(int32 reference_delta, |
| uint32 target_delta, |
| int64 reference_time); |
| |
| // Schedule a first order continuous rate change at the specified target time. |
| SetRateAtTargetTime(int32 reference_delta, |
| uint32 target_delta, |
| int64 target_time); |
| |
| // Cancel any pending rate changes |
| CancelPendingChanges(); |
| }; |