| Index: mojo/services/media/common/cpp/timeline_rate.cc
|
| diff --git a/mojo/services/media/common/cpp/ratio.cc b/mojo/services/media/common/cpp/timeline_rate.cc
|
| similarity index 57%
|
| rename from mojo/services/media/common/cpp/ratio.cc
|
| rename to mojo/services/media/common/cpp/timeline_rate.cc
|
| index 56a3f51a7808a92d884e9e6a7387f526ffa4657d..a450e101c2a17c2536cffc80eaf7d6abeca82d08 100644
|
| --- a/mojo/services/media/common/cpp/ratio.cc
|
| +++ b/mojo/services/media/common/cpp/timeline_rate.cc
|
| @@ -6,7 +6,7 @@
|
| #include <utility>
|
|
|
| #include "mojo/public/cpp/environment/logging.h"
|
| -#include "mojo/services/media/common/cpp/ratio.h"
|
| +#include "mojo/services/media/common/cpp/timeline_rate.h"
|
|
|
| namespace mojo {
|
| namespace media {
|
| @@ -56,7 +56,7 @@ T BinaryGcd(T a, T b) {
|
| return a << twos;
|
| }
|
|
|
| -// Reduces the ration of *numerator and *denominator.
|
| +// Reduces the ratio of *numerator and *denominator.
|
| template <typename T>
|
| void ReduceRatio(T* numerator, T* denominator) {
|
| MOJO_DCHECK(numerator != nullptr);
|
| @@ -85,39 +85,40 @@ template void ReduceRatio<uint32_t>(uint32_t* numerator, uint32_t* denominator);
|
| // true, the result is rounded up rather than down. overflow is set to indicate
|
| // overflow.
|
| uint64_t ScaleUInt64(uint64_t value,
|
| - uint32_t numerator,
|
| - uint32_t denominator,
|
| + uint32_t subject_delta,
|
| + uint32_t reference_delta,
|
| bool round_up,
|
| bool* overflow) {
|
| - MOJO_DCHECK(denominator != 0u);
|
| + MOJO_DCHECK(reference_delta != 0u);
|
| MOJO_DCHECK(overflow != nullptr);
|
|
|
| constexpr uint64_t kLow32Bits = 0xffffffffu;
|
| constexpr uint64_t kHigh32Bits = kLow32Bits << 32u;
|
|
|
| - // high and low are the product of the numerator and the high and low halves
|
| + // high and low are the product of the subject_delta and the high and low
|
| + // halves
|
| // (respectively) of value.
|
| - uint64_t high = numerator * (value >> 32u);
|
| - uint64_t low = numerator * (value & kLow32Bits);
|
| + uint64_t high = subject_delta * (value >> 32u);
|
| + uint64_t low = subject_delta * (value & kLow32Bits);
|
| // Ignoring overflow and remainder, the result we want is:
|
| - // ((high << 32) + low) / denominator.
|
| + // ((high << 32) + low) / reference_delta.
|
|
|
| // Move the high end of low into the low end of high.
|
| high += low >> 32u;
|
| low = low & kLow32Bits;
|
| // Ignoring overflow and remainder, the result we want is still:
|
| - // ((high << 32) + low) / denominator.
|
| + // ((high << 32) + low) / reference_delta.
|
|
|
| - // When we divide high by denominator, there'll be a remainder. Make
|
| + // When we divide high by reference_delta, there'll be a remainder. Make
|
| // that the high end of low, which is currently all zeroes.
|
| - low |= (high % denominator) << 32u;
|
| + low |= (high % reference_delta) << 32u;
|
|
|
| // Determine if we need to round up when we're done:
|
| - round_up = round_up && (low % denominator) != 0;
|
| + round_up = round_up && (low % reference_delta) != 0;
|
|
|
| // Do the division.
|
| - high /= denominator;
|
| - low /= denominator;
|
| + high /= reference_delta;
|
| + low /= reference_delta;
|
|
|
| // If high's top 32 bits aren't all zero, we have overflow.
|
| if (high & kHigh32Bits) {
|
| @@ -141,75 +142,79 @@ uint64_t ScaleUInt64(uint64_t value,
|
| } // namespace
|
|
|
| // static
|
| -void Ratio::Reduce(uint32_t* numerator, uint32_t* denominator) {
|
| - ReduceRatio(numerator, denominator);
|
| +void TimelineRate::Reduce(uint32_t* subject_delta, uint32_t* reference_delta) {
|
| + ReduceRatio(subject_delta, reference_delta);
|
| }
|
|
|
| // static
|
| -void Ratio::Product(uint32_t a_numerator,
|
| - uint32_t a_denominator,
|
| - uint32_t b_numerator,
|
| - uint32_t b_denominator,
|
| - uint32_t* product_numerator,
|
| - uint32_t* product_denominator,
|
| - bool exact) {
|
| - MOJO_DCHECK(a_denominator != 0);
|
| - MOJO_DCHECK(b_denominator != 0);
|
| - MOJO_DCHECK(product_numerator != nullptr);
|
| - MOJO_DCHECK(product_denominator != nullptr);
|
| -
|
| - uint64_t numerator = static_cast<uint64_t>(a_numerator) * b_numerator;
|
| - uint64_t denominator = static_cast<uint64_t>(a_denominator) * b_denominator;
|
| -
|
| - ReduceRatio(&numerator, &denominator);
|
| -
|
| - if (numerator > std::numeric_limits<uint32_t>::max() ||
|
| - denominator > std::numeric_limits<uint32_t>::max()) {
|
| +void TimelineRate::Product(uint32_t a_subject_delta,
|
| + uint32_t a_reference_delta,
|
| + uint32_t b_subject_delta,
|
| + uint32_t b_reference_delta,
|
| + uint32_t* product_subject_delta,
|
| + uint32_t* product_reference_delta,
|
| + bool exact) {
|
| + MOJO_DCHECK(a_reference_delta != 0);
|
| + MOJO_DCHECK(b_reference_delta != 0);
|
| + MOJO_DCHECK(product_subject_delta != nullptr);
|
| + MOJO_DCHECK(product_reference_delta != nullptr);
|
| +
|
| + uint64_t subject_delta =
|
| + static_cast<uint64_t>(a_subject_delta) * b_subject_delta;
|
| + uint64_t reference_delta =
|
| + static_cast<uint64_t>(a_reference_delta) * b_reference_delta;
|
| +
|
| + ReduceRatio(&subject_delta, &reference_delta);
|
| +
|
| + if (subject_delta > std::numeric_limits<uint32_t>::max() ||
|
| + reference_delta > std::numeric_limits<uint32_t>::max()) {
|
| MOJO_DCHECK(!exact);
|
|
|
| do {
|
| - numerator >>= 1;
|
| - denominator >>= 1;
|
| - } while (numerator > std::numeric_limits<uint32_t>::max() ||
|
| - denominator > std::numeric_limits<uint32_t>::max());
|
| + subject_delta >>= 1;
|
| + reference_delta >>= 1;
|
| + } while (subject_delta > std::numeric_limits<uint32_t>::max() ||
|
| + reference_delta > std::numeric_limits<uint32_t>::max());
|
|
|
| - if (denominator == 0) {
|
| + if (reference_delta == 0) {
|
| // Product is larger than we can represent. Return the largest value we
|
| // can represent.
|
| - *product_numerator = std::numeric_limits<uint32_t>::max();
|
| - *product_denominator = 1;
|
| + *product_subject_delta = std::numeric_limits<uint32_t>::max();
|
| + *product_reference_delta = 1;
|
| return;
|
| }
|
| }
|
|
|
| - *product_numerator = static_cast<uint32_t>(numerator);
|
| - *product_denominator = static_cast<uint32_t>(denominator);
|
| + *product_subject_delta = static_cast<uint32_t>(subject_delta);
|
| + *product_reference_delta = static_cast<uint32_t>(reference_delta);
|
| }
|
|
|
| // static
|
| -int64_t Ratio::Scale(int64_t value, uint32_t numerator, uint32_t denominator) {
|
| +int64_t TimelineRate::Scale(int64_t value,
|
| + uint32_t subject_delta,
|
| + uint32_t reference_delta) {
|
| static constexpr uint64_t abs_of_min_int64 =
|
| static_cast<uint64_t>(std::numeric_limits<int64_t>::max()) + 1;
|
|
|
| - MOJO_DCHECK(denominator != 0u);
|
| + MOJO_DCHECK(reference_delta != 0u);
|
|
|
| bool overflow;
|
|
|
| uint64_t abs_result;
|
|
|
| if (value >= 0) {
|
| - abs_result = ScaleUInt64(static_cast<uint64_t>(value), numerator,
|
| - denominator, false, &overflow);
|
| + abs_result = ScaleUInt64(static_cast<uint64_t>(value), subject_delta,
|
| + reference_delta, false, &overflow);
|
| } else if (value == std::numeric_limits<int64_t>::min()) {
|
| - abs_result = ScaleUInt64(abs_of_min_int64, numerator, denominator,
|
| + abs_result = ScaleUInt64(abs_of_min_int64, subject_delta, reference_delta,
|
| true, &overflow);
|
| } else {
|
| - abs_result = ScaleUInt64(static_cast<uint64_t>(-value), numerator,
|
| - denominator, true, &overflow);
|
| + abs_result = ScaleUInt64(static_cast<uint64_t>(-value), subject_delta,
|
| + reference_delta, true, &overflow);
|
| }
|
|
|
| if (overflow) {
|
| - return Ratio::kOverflow;
|
| + return TimelineRate::kOverflow;
|
| }
|
|
|
| // Make sure we won't overflow when we cast to int64_t.
|
| @@ -217,7 +222,7 @@ int64_t Ratio::Scale(int64_t value, uint32_t numerator, uint32_t denominator) {
|
| if (value < 0 && abs_result == abs_of_min_int64) {
|
| return std::numeric_limits<int64_t>::min();
|
| }
|
| - return Ratio::kOverflow;
|
| + return TimelineRate::kOverflow;
|
| }
|
|
|
| return value >= 0 ? static_cast<int64_t>(abs_result)
|
|
|