| Index: mojo/services/media/common/cpp/ratio.cc
|
| diff --git a/mojo/services/media/common/cpp/ratio.cc b/mojo/services/media/common/cpp/ratio.cc
|
| deleted file mode 100644
|
| index 56a3f51a7808a92d884e9e6a7387f526ffa4657d..0000000000000000000000000000000000000000
|
| --- a/mojo/services/media/common/cpp/ratio.cc
|
| +++ /dev/null
|
| @@ -1,228 +0,0 @@
|
| -// Copyright 2016 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.
|
| -
|
| -#include <limits>
|
| -#include <utility>
|
| -
|
| -#include "mojo/public/cpp/environment/logging.h"
|
| -#include "mojo/services/media/common/cpp/ratio.h"
|
| -
|
| -namespace mojo {
|
| -namespace media {
|
| -
|
| -namespace {
|
| -
|
| -// Calculates the greatest common denominator (factor) of two values.
|
| -template <typename T>
|
| -T BinaryGcd(T a, T b) {
|
| - if (a == 0) {
|
| - return b;
|
| - }
|
| -
|
| - if (b == 0) {
|
| - return a;
|
| - }
|
| -
|
| - // Remove and count the common factors of 2.
|
| - uint8_t twos;
|
| - for (twos = 0; ((a | b) & 1) == 0; ++twos) {
|
| - a >>= 1;
|
| - b >>= 1;
|
| - }
|
| -
|
| - // Get rid of the non-common factors of 2 in a. a is non-zero, so this
|
| - // terminates.
|
| - while ((a & 1) == 0) {
|
| - a >>= 1;
|
| - }
|
| -
|
| - do {
|
| - // Get rid of the non-common factors of 2 in b. b is non-zero, so this
|
| - // terminates.
|
| - while ((b & 1) == 0) {
|
| - b >>= 1;
|
| - }
|
| -
|
| - // Apply the Euclid subtraction method.
|
| - if (a > b) {
|
| - std::swap(a, b);
|
| - }
|
| -
|
| - b = b - a;
|
| - } while (b != 0);
|
| -
|
| - // Multiply in the common factors of two.
|
| - return a << twos;
|
| -}
|
| -
|
| -// Reduces the ration of *numerator and *denominator.
|
| -template <typename T>
|
| -void ReduceRatio(T* numerator, T* denominator) {
|
| - MOJO_DCHECK(numerator != nullptr);
|
| - MOJO_DCHECK(denominator != nullptr);
|
| - MOJO_DCHECK(*denominator != 0);
|
| -
|
| - T gcd = BinaryGcd(*numerator, *denominator);
|
| -
|
| - if (gcd == 0) {
|
| - *denominator = 1;
|
| - return;
|
| - }
|
| -
|
| - if (gcd == 1) {
|
| - return;
|
| - }
|
| -
|
| - *numerator = *numerator / gcd;
|
| - *denominator = *denominator / gcd;
|
| -}
|
| -
|
| -template void ReduceRatio<uint64_t>(uint64_t* numerator, uint64_t* denominator);
|
| -template void ReduceRatio<uint32_t>(uint32_t* numerator, uint32_t* denominator);
|
| -
|
| -// Scales a uint64_t value by the ratio of two uint32_t values. If round_up is
|
| -// 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,
|
| - bool round_up,
|
| - bool* overflow) {
|
| - MOJO_DCHECK(denominator != 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
|
| - // (respectively) of value.
|
| - uint64_t high = numerator * (value >> 32u);
|
| - uint64_t low = numerator * (value & kLow32Bits);
|
| - // Ignoring overflow and remainder, the result we want is:
|
| - // ((high << 32) + low) / denominator.
|
| -
|
| - // 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.
|
| -
|
| - // When we divide high by denominator, there'll be a remainder. Make
|
| - // that the high end of low, which is currently all zeroes.
|
| - low |= (high % denominator) << 32u;
|
| -
|
| - // Determine if we need to round up when we're done:
|
| - round_up = round_up && (low % denominator) != 0;
|
| -
|
| - // Do the division.
|
| - high /= denominator;
|
| - low /= denominator;
|
| -
|
| - // If high's top 32 bits aren't all zero, we have overflow.
|
| - if (high & kHigh32Bits) {
|
| - *overflow = true;
|
| - return 0;
|
| - }
|
| -
|
| - uint64_t result = (high << 32u) | low;
|
| - if (round_up) {
|
| - if (result == std::numeric_limits<int64_t>::max()) {
|
| - *overflow = true;
|
| - return 0;
|
| - }
|
| - ++result;
|
| - }
|
| -
|
| - *overflow = false;
|
| - return result;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// static
|
| -void Ratio::Reduce(uint32_t* numerator, uint32_t* denominator) {
|
| - ReduceRatio(numerator, denominator);
|
| -}
|
| -
|
| -// 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()) {
|
| - MOJO_DCHECK(!exact);
|
| -
|
| - do {
|
| - numerator >>= 1;
|
| - denominator >>= 1;
|
| - } while (numerator > std::numeric_limits<uint32_t>::max() ||
|
| - denominator > std::numeric_limits<uint32_t>::max());
|
| -
|
| - if (denominator == 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;
|
| - return;
|
| - }
|
| - }
|
| -
|
| - *product_numerator = static_cast<uint32_t>(numerator);
|
| - *product_denominator = static_cast<uint32_t>(denominator);
|
| -}
|
| -
|
| -// static
|
| -int64_t Ratio::Scale(int64_t value, uint32_t numerator, uint32_t denominator) {
|
| - static constexpr uint64_t abs_of_min_int64 =
|
| - static_cast<uint64_t>(std::numeric_limits<int64_t>::max()) + 1;
|
| -
|
| - MOJO_DCHECK(denominator != 0u);
|
| -
|
| - bool overflow;
|
| -
|
| - uint64_t abs_result;
|
| -
|
| - if (value >= 0) {
|
| - abs_result = ScaleUInt64(static_cast<uint64_t>(value), numerator,
|
| - denominator, false, &overflow);
|
| - } else if (value == std::numeric_limits<int64_t>::min()) {
|
| - abs_result = ScaleUInt64(abs_of_min_int64, numerator, denominator,
|
| - true, &overflow);
|
| - } else {
|
| - abs_result = ScaleUInt64(static_cast<uint64_t>(-value), numerator,
|
| - denominator, true, &overflow);
|
| - }
|
| -
|
| - if (overflow) {
|
| - return Ratio::kOverflow;
|
| - }
|
| -
|
| - // Make sure we won't overflow when we cast to int64_t.
|
| - if (abs_result > static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) {
|
| - if (value < 0 && abs_result == abs_of_min_int64) {
|
| - return std::numeric_limits<int64_t>::min();
|
| - }
|
| - return Ratio::kOverflow;
|
| - }
|
| -
|
| - return value >= 0 ? static_cast<int64_t>(abs_result)
|
| - : -static_cast<int64_t>(abs_result);
|
| -}
|
| -
|
| -} // namespace media
|
| -} // namespace mojo
|
|
|