Commit 086ac012 authored by Paul Adenot's avatar Paul Adenot
Browse files

Bug 1833981 - When converting a TimeUnit to another base approximately, round...

Bug 1833981 - When converting a TimeUnit to another base approximately, round instead of flooring. r=media-playback-reviewers,azebrowski

Differential Revision: https://phabricator.services.mozilla.com/D179355
parent 3aa1bf7b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ TimeUnit TimeUnit::ToBase(int64_t aTargetBase, double& aOutError) const {
                  static_cast<double>(aTargetBase) / static_cast<double>(mBase);
  double integer;
  aOutError = modf(approx, &integer);
  return TimeUnit(AssertedCast<int64_t>(approx), aTargetBase);
  return TimeUnit(AssertedCast<int64_t>(std::round(approx)), aTargetBase);
}

bool TimeUnit::IsValid() const { return mTicks.isValid(); }
+24 −1
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ TEST(TimeUnit, BasicArithmetic)
    TimeUnit c = TimeUnit(9001, 90000);
    TimeUnit d = (b - c).ToBase(90000);
    EXPECT_EQ(d.mBase, 90000);
    EXPECT_EQ(d.mTicks.value(), 530998);
    EXPECT_EQ(d.mTicks.value(), 530999);
  }
}

@@ -238,3 +238,26 @@ TEST(TimeUnit, InfinityMath)
  EXPECT_EQ(finite + negInf, negInf);
  EXPECT_EQ(finite - negInf, posInf);
}

TEST(TimeUnit, BaseConversion)
{
  const int64_t packetSize = 1024;  // typical for AAC
  int64_t sampleRates[] = {16000, 44100, 48000, 88200, 96000};
  const double hnsPerSeconds = 10000000.;
  for (auto sampleRate : sampleRates) {
    int64_t frameCount = 0;
    TimeUnit pts;
    do {
      // Compute a time in hundreds of nanoseconds based of frame count, typical
      // on Windows platform, checking that it round trips properly.
      int64_t hns = AssertedCast<int64_t>(
          std::round(hnsPerSeconds * static_cast<double>(frameCount) /
                     static_cast<double>(sampleRate)));
      pts = TimeUnit::FromHns(hns, sampleRate);
      EXPECT_EQ(
          AssertedCast<int64_t>(std::round(pts.ToSeconds() * hnsPerSeconds)),
          hns);
      frameCount += packetSize;
    } while (pts.ToSeconds() < 36000);
  }
}