// Copyright 2016 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.

#include <lib/media/cpp/timeline_function.h>

#include <limits>
#include <utility>

namespace media {

// static
int64_t TimelineFunction::Apply(int64_t subject_time, int64_t reference_time,
                                TimelineRate rate,  // subject_delta / reference_delta
                                int64_t reference_input) {
  return rate.Scale(reference_input - reference_time) + subject_time;
}

// static
TimelineFunction TimelineFunction::Compose(const TimelineFunction& bc, const TimelineFunction& ab,
                                           bool exact) {
  // TODO(dalesat): Improve this implementation.
  // This particular approach to composing two timeline functions compromises
  // range and accuracy (in some cases) for simplicity. It should be replaced
  // with something that provides maximum range and accuracy without adding a
  // lot of runtime cost.
  return TimelineFunction(bc.Apply(ab.subject_time()), ab.reference_time(),
                          TimelineRate::Product(ab.rate(), bc.rate(), exact));
}

}  // namespace media
