| 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
 | 
| 
 |