MockSampleBox::MockSampleBox(ArrayBuffer* data) : MockBox(data) { ASSERT(m_length == 29); RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength()); int32_t timeScale = view->get<int32_t>(8, true); int32_t timeValue = view->get<int32_t>(12, true); m_presentationTimestamp = MediaTime(timeValue, timeScale); timeValue = view->get<int32_t>(16, true); m_decodeTimestamp = MediaTime(timeValue, timeScale); timeValue = view->get<int32_t>(20, true); m_duration = MediaTime(timeValue, timeScale); m_trackID = view->get<int32_t>(24, true); m_flags = view->get<uint8_t>(28, true); }
MediaTime MediaTime::createWithDouble(double doubleTime, int32_t timeScale) { if (doubleTime != doubleTime) return invalidTime(); if (isinf(doubleTime)) return signbit(doubleTime) ? negativeInfiniteTime() : positiveInfiniteTime(); if (doubleTime > numeric_limits<int64_t>::max()) return positiveInfiniteTime(); if (doubleTime < numeric_limits<int64_t>::min()) return negativeInfiniteTime(); while (doubleTime * timeScale > numeric_limits<int64_t>::max()) timeScale /= 2; return MediaTime(static_cast<int64_t>(doubleTime * timeScale), timeScale, Valid); }
MediaTime MediaTime::createWithFloat(float floatTime, int32_t timeScale) { if (floatTime != floatTime) return invalidTime(); if (std::isinf(floatTime)) return std::signbit(floatTime) ? negativeInfiniteTime() : positiveInfiniteTime(); if (floatTime > std::numeric_limits<int64_t>::max()) return positiveInfiniteTime(); if (floatTime < std::numeric_limits<int64_t>::min()) return negativeInfiniteTime(); while (floatTime * timeScale > std::numeric_limits<int64_t>::max()) timeScale /= 2; return MediaTime(static_cast<int64_t>(floatTime * timeScale), timeScale, Valid); }
void MockSourceBufferPrivate::enqueueSample(PassRefPtr<MediaSample> sample, AtomicString) { if (!m_mediaSource || !sample) return; PlatformSample platformSample = sample->platformSample(); if (platformSample.type != PlatformSample::MockSampleBoxType) return; MockSampleBox* box = platformSample.sample.mockSampleBox; if (!box) return; m_mediaSource->incrementTotalVideoFrames(); if (box->isCorrupted()) m_mediaSource->incrementCorruptedFrames(); if (box->isDropped()) m_mediaSource->incrementDroppedFrames(); if (box->isDelayed()) m_mediaSource->incrementTotalFrameDelayBy(MediaTime(1, 1)); }
MockInitializationBox::MockInitializationBox(ArrayBuffer* data) : MockBox(data) { ASSERT(m_length >= 13); RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength()); int32_t timeValue = view->get<int32_t>(8, true); int32_t timeScale = view->get<int32_t>(12, true); m_duration = MediaTime(timeValue, timeScale); size_t offset = 16; while (offset < m_length) { RefPtr<ArrayBuffer> subBuffer = data->slice(offset); if (MockBox::peekType(subBuffer.get()) != MockTrackBox::type()) break; MockTrackBox trackBox(subBuffer.get()); offset += trackBox.length(); m_tracks.append(trackBox); } }
void MockSourceBufferPrivate::enqueueSample(Ref<MediaSample>&& sample, const AtomicString&) { if (!m_mediaSource) return; PlatformSample platformSample = sample->platformSample(); if (platformSample.type != PlatformSample::MockSampleBoxType) return; auto* box = platformSample.sample.mockSampleBox; if (!box) return; m_mediaSource->incrementTotalVideoFrames(); if (box->isCorrupted()) m_mediaSource->incrementCorruptedFrames(); if (box->isDropped()) m_mediaSource->incrementDroppedFrames(); if (box->isDelayed()) m_mediaSource->incrementTotalFrameDelayBy(MediaTime(1, 1)); m_enqueuedSamples.append(toString(sample.get())); }
TEST(WTF, MediaTime) { // Comparison Operators EXPECT_EQ(MediaTime::positiveInfiniteTime() > MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() == MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::positiveInfiniteTime() == MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::invalidTime() == MediaTime::invalidTime(), true); EXPECT_EQ(MediaTime::invalidTime() > MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::invalidTime() > MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::invalidTime(), true); EXPECT_EQ(MediaTime::positiveInfiniteTime() < MediaTime::invalidTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() == MediaTime::indefiniteTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() > MediaTime::negativeInfiniteTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() < MediaTime::positiveInfiniteTime(), true); EXPECT_EQ(MediaTime::negativeInfiniteTime() < MediaTime::indefiniteTime(), true); EXPECT_EQ(MediaTime::positiveInfiniteTime() > MediaTime::indefiniteTime(), true); EXPECT_EQ(MediaTime(1, 1) < MediaTime::indefiniteTime(), true); EXPECT_EQ(MediaTime::indefiniteTime() > MediaTime(1, 1), true); EXPECT_EQ(MediaTime(1, 1) < MediaTime(2, 1), true); EXPECT_EQ(MediaTime(2, 1) > MediaTime(1, 1), true); EXPECT_EQ(MediaTime(2, 1) == MediaTime(2, 1), true); EXPECT_EQ(MediaTime(2, 1) == MediaTime(4, 2), true); // Addition Operators EXPECT_EQ(MediaTime::positiveInfiniteTime() + MediaTime::positiveInfiniteTime(), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::negativeInfiniteTime() + MediaTime::negativeInfiniteTime(), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::positiveInfiniteTime() + MediaTime::negativeInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::negativeInfiniteTime() + MediaTime::positiveInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() + MediaTime::positiveInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() + MediaTime::negativeInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() + MediaTime::invalidTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() + MediaTime(1, 1), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::indefiniteTime() + MediaTime::positiveInfiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() + MediaTime::negativeInfiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() + MediaTime::indefiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() + MediaTime(1, 1), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime(1, 1) + MediaTime(1, 1), MediaTime(2, 1)); EXPECT_EQ(MediaTime(1, 2) + MediaTime(1, 3), MediaTime(5, 6)); EXPECT_EQ(MediaTime(1, numeric_limits<int32_t>::max()-1) + MediaTime(1, numeric_limits<int32_t>::max()-2), MediaTime(2, numeric_limits<int32_t>::max())); // Subtraction Operators EXPECT_EQ(MediaTime::positiveInfiniteTime() - MediaTime::positiveInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::negativeInfiniteTime() - MediaTime::negativeInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::positiveInfiniteTime() - MediaTime::negativeInfiniteTime(), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::negativeInfiniteTime() - MediaTime::positiveInfiniteTime(), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::invalidTime() - MediaTime::positiveInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() - MediaTime::negativeInfiniteTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() - MediaTime::invalidTime(), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::invalidTime() - MediaTime(1, 1), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::indefiniteTime() - MediaTime::positiveInfiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() - MediaTime::negativeInfiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() - MediaTime::indefiniteTime(), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime::indefiniteTime() - MediaTime(1, 1), MediaTime::indefiniteTime()); EXPECT_EQ(MediaTime(3, 1) - MediaTime(2, 1), MediaTime(1, 1)); EXPECT_EQ(MediaTime(1, 2) - MediaTime(1, 3), MediaTime(1, 6)); EXPECT_EQ(MediaTime(2, numeric_limits<int32_t>::max()-1) - MediaTime(1, numeric_limits<int32_t>::max()-2), MediaTime(1, numeric_limits<int32_t>::max())); // Constants EXPECT_EQ(MediaTime::zeroTime(), MediaTime(0, 1)); EXPECT_EQ(MediaTime::invalidTime(), MediaTime(-1, 1, 0)); EXPECT_EQ(MediaTime::positiveInfiniteTime(), MediaTime(0, 1, MediaTime::PositiveInfinite)); EXPECT_EQ(MediaTime::negativeInfiniteTime(), MediaTime(0, 1, MediaTime::NegativeInfinite)); EXPECT_EQ(MediaTime::indefiniteTime(), MediaTime(0, 1, MediaTime::Indefinite)); // Absolute Functions EXPECT_EQ(abs(MediaTime::positiveInfiniteTime()), MediaTime::positiveInfiniteTime()); EXPECT_EQ(abs(MediaTime::negativeInfiniteTime()), MediaTime::positiveInfiniteTime()); EXPECT_EQ(abs(MediaTime::invalidTime()), MediaTime::invalidTime()); EXPECT_EQ(abs(MediaTime(1, 1)), MediaTime(1, 1)); EXPECT_EQ(abs(MediaTime(-1, 1)), MediaTime(1, 1)); EXPECT_EQ(abs(MediaTime(-1, -1)), MediaTime(-1, -1)); EXPECT_EQ(abs(MediaTime(1, -1)), MediaTime(-1, -1)); // Floating Point Functions EXPECT_EQ(MediaTime::createWithFloat(1.0f), MediaTime(1, 1)); EXPECT_EQ(MediaTime::createWithFloat(1.5f), MediaTime(3, 2)); EXPECT_EQ(MediaTime::createWithDouble(1.0), MediaTime(1, 1)); EXPECT_EQ(MediaTime::createWithDouble(1.5), MediaTime(3, 2)); EXPECT_EQ(MediaTime(1, 1).toFloat(), 1.0f); EXPECT_EQ(MediaTime(3, 2).toFloat(), 1.5f); EXPECT_EQ(MediaTime(1, 1).toDouble(), 1.0); EXPECT_EQ(MediaTime(3, 2).toDouble(), 1.5); EXPECT_EQ(MediaTime(1, 1 << 16).toFloat(), 1 / pow(2.0f, 16.0f)); EXPECT_EQ(MediaTime(1, 1 << 30).toDouble(), 1 / pow(2.0, 30.0)); EXPECT_EQ(MediaTime::createWithDouble(M_PI, 1 << 30), MediaTime(3373259426U, 1 << 30)); EXPECT_EQ(MediaTime::createWithFloat(INFINITY), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::createWithFloat(-INFINITY), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::createWithFloat(NAN), MediaTime::invalidTime()); EXPECT_EQ(MediaTime::createWithDouble(INFINITY), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::createWithDouble(-INFINITY), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::createWithDouble(NAN), MediaTime::invalidTime()); // Floating Point Round Trip EXPECT_EQ(10.0123456789f, MediaTime::createWithFloat(10.0123456789f).toFloat()); EXPECT_EQ(10.0123456789, MediaTime::createWithDouble(10.0123456789).toDouble()); // Floating Point Math EXPECT_EQ(1.5 + 3.3, (MediaTime::createWithDouble(1.5) + MediaTime::createWithDouble(3.3)).toDouble()); EXPECT_EQ(1.5 - 3.3, (MediaTime::createWithDouble(1.5) - MediaTime::createWithDouble(3.3)).toDouble()); EXPECT_EQ(-3.3, (-MediaTime::createWithDouble(3.3)).toDouble()); EXPECT_EQ(3.3 * 2, (MediaTime::createWithDouble(3.3) * 2).toDouble()); // Floating Point and non-Floating Point math EXPECT_EQ(2.0, (MediaTime::createWithDouble(1.5) + MediaTime(1, 2)).toDouble()); EXPECT_EQ(1.0, (MediaTime::createWithDouble(1.5) - MediaTime(1, 2)).toDouble()); // Overflow Behavior EXPECT_EQ(MediaTime::createWithFloat(pow(2.0f, 64.0f)), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::createWithFloat(-pow(2.0f, 64.0f)), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::createWithFloat(pow(2.0f, 63.0f), 2).timeScale(), 1); EXPECT_EQ(MediaTime::createWithFloat(pow(2.0f, 63.0f), 3).timeScale(), 1); EXPECT_EQ(MediaTime::createWithDouble(pow(2.0, 64.0)), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime::createWithDouble(-pow(2.0, 64.0)), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime::createWithDouble(pow(2.0, 63.0), 2).timeScale(), 1); EXPECT_EQ(MediaTime::createWithDouble(pow(2.0, 63.0), 3).timeScale(), 1); EXPECT_EQ((MediaTime(numeric_limits<int64_t>::max(), 2) + MediaTime(numeric_limits<int64_t>::max(), 2)).timeScale(), 1); EXPECT_EQ((MediaTime(numeric_limits<int64_t>::min(), 2) - MediaTime(numeric_limits<int64_t>::max(), 2)).timeScale(), 1); EXPECT_EQ(MediaTime(numeric_limits<int64_t>::max(), 1) + MediaTime(numeric_limits<int64_t>::max(), 1), MediaTime::positiveInfiniteTime()); EXPECT_EQ(MediaTime(numeric_limits<int64_t>::min(), 1) + MediaTime(numeric_limits<int64_t>::min(), 1), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime(numeric_limits<int64_t>::min(), 1) - MediaTime(numeric_limits<int64_t>::max(), 1), MediaTime::negativeInfiniteTime()); EXPECT_EQ(MediaTime(numeric_limits<int64_t>::max(), 1) - MediaTime(numeric_limits<int64_t>::min(), 1), MediaTime::positiveInfiniteTime()); }