void DirectShowPlayerService::doSetRate(QMutexLocker *locker) { if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { // Cache current values as we can't query IMediaSeeking during a seek due to the // possibility of a deadlock when flushing the VideoSurfaceFilter. LONGLONG currentPosition = 0; seeking->GetCurrentPosition(¤tPosition); m_position = currentPosition / qt_directShowTimeScale; LONGLONG minimum = 0; LONGLONG maximum = 0; m_playbackRange = SUCCEEDED(seeking->GetAvailable(&minimum, &maximum)) ? QMediaTimeRange(minimum / qt_directShowTimeScale, maximum / qt_directShowTimeScale) : QMediaTimeRange(); locker->unlock(); HRESULT hr = seeking->SetRate(m_rate); locker->relock(); if (!SUCCEEDED(hr)) { double rate = 0.0; m_rate = seeking->GetRate(&rate) ? rate : 1.0; } seeking->Release(); } else if (m_rate != 1.0) { m_rate = 1.0; } QCoreApplication::postEvent(this, new QEvent(QEvent::Type(RateChange))); }
void DirectShowPlayerService::doSeek(QMutexLocker *locker) { if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { LONGLONG seekPosition = LONGLONG(m_position) * qt_directShowTimeScale; // Cache current values as we can't query IMediaSeeking during a seek due to the // possibility of a deadlock when flushing the VideoSurfaceFilter. LONGLONG currentPosition = 0; seeking->GetCurrentPosition(¤tPosition); m_position = currentPosition / qt_directShowTimeScale; LONGLONG minimum = 0; LONGLONG maximum = 0; m_playbackRange = SUCCEEDED(seeking->GetAvailable(&minimum, &maximum)) ? QMediaTimeRange( minimum / qt_directShowTimeScale, maximum / qt_directShowTimeScale) : QMediaTimeRange(); locker->unlock(); seeking->SetPositions( &seekPosition, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning); locker->relock(); seeking->GetCurrentPosition(¤tPosition); m_position = currentPosition / qt_directShowTimeScale; seeking->Release(); } else { m_position = 0; } QCoreApplication::postEvent(this, new QEvent(QEvent::Type(PositionChange))); }
void QAndroidMediaPlayerControl::updateAvailablePlaybackRanges() { if (mBuffering) { const qint64 pos = position(); const qint64 end = (duration() / 100) * mBufferPercent; mAvailablePlaybackRange.addInterval(pos, end); } else if (mSeekable) { mAvailablePlaybackRange = QMediaTimeRange(0, duration()); } else { mAvailablePlaybackRange = QMediaTimeRange(); } Q_EMIT availablePlaybackRangesChanged(mAvailablePlaybackRange); }
/*------------------------------------------------------------------------------ | OpenMAXILPlayerControl::availablePlaybackRanges +-----------------------------------------------------------------------------*/ QMediaTimeRange OpenMAXILPlayerControl::availablePlaybackRanges() const { log_debug_func; // TODO: Implement. return QMediaTimeRange(); }
void tst_QMediaTimeRange::testAssignment() { QMediaTimeRange x; // Range Assignment x = QMediaTimeRange(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 20); // Interval Assignment x = QMediaTimeInterval(30, 40); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 40); // Shared Data Check QMediaTimeRange y; y = x; y.addInterval(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 30); QVERIFY(x.latestTime() == 40); }
void QAndroidMediaPlayerControl::resetBufferingProgress() { mBuffering = false; mBufferPercent = 0; mAvailablePlaybackRange = QMediaTimeRange(); Q_EMIT bufferStatusChanged(mBufferPercent); }
/*------------------------------------------------------------------------------ | OpenMAXILPlayerControl::availablePlaybackRanges +-----------------------------------------------------------------------------*/ QMediaTimeRange OpenMAXILPlayerControl::availablePlaybackRanges() const { LOG_DEBUG(LOG_TAG, "%s", Q_FUNC_INFO); // TODO: Implement. return QMediaTimeRange(); }
/*------------------------------------------------------------------------------ | OpenMAXILPlayerControl::play +-----------------------------------------------------------------------------*/ void OpenMAXILPlayerControl::play() { logi_debug_func; m_mediaProcessor->play(); // FIXME: This should be removed. emit availablePlaybackRangesChanged(QMediaTimeRange(0, duration())); }
QMediaTimeRange DirectShowPlayerService::availablePlaybackRanges() const { QMutexLocker locker(const_cast<QMutex *>(&m_mutex)); if (m_graphStatus == Loaded) { if (m_executingTask == Seek || m_executingTask == SetRate || (m_pendingTasks & Seek)) { return m_playbackRange; } else if (IMediaSeeking *seeking = com_cast<IMediaSeeking>(m_graph, IID_IMediaSeeking)) { LONGLONG minimum = 0; LONGLONG maximum = 0; HRESULT hr = seeking->GetAvailable(&minimum, &maximum); seeking->Release(); if (SUCCEEDED(hr)) return QMediaTimeRange(minimum, maximum); } } return QMediaTimeRange(); }
void tst_QMediaTimeRange::testClear() { QMediaTimeRange x; // Clear Nothing x.clear(); QVERIFY(x.isEmpty()); // Clear Single x = QMediaTimeRange(10, 20); x.clear(); QVERIFY(x.isEmpty()); // Clear Multiple x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.clear(); QVERIFY(x.isEmpty()); }
QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); }
QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(_seekRange.first, _seekRange.second); }
void tst_QMediaTimeRange::testAddInterval() { // All intervals Overlap QMediaTimeRange x; x.addInterval(10, 40); x.addInterval(30, 50); x.addInterval(20, 60); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // 1 adjacent interval, 1 encompassed interval x = QMediaTimeRange(); x.addInterval(10, 40); x.addInterval(20, 30); x.addInterval(41, 50); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 50); // 1 overlapping interval, 1 disjoint interval x = QMediaTimeRange(); x.addInterval(10, 30); x.addInterval(20, 40); x.addInterval(50, 60); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 40); QVERIFY(x.intervals()[1].start() == 50); QVERIFY(x.intervals()[1].end() == 60); // Identical Add x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(10, 20); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 20); // Multi-Merge x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.addInterval(50, 60); x.addInterval(15, 55); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // Interval Parameter - All intervals Overlap x = QMediaTimeRange(); x.addInterval(QMediaTimeInterval(10, 40)); x.addInterval(QMediaTimeInterval(30, 50)); x.addInterval(QMediaTimeInterval(20, 60)); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 60); // Interval Parameter - Abnormal Interval x = QMediaTimeRange(); x.addInterval(QMediaTimeInterval(20, 10)); QVERIFY(x.isEmpty()); }
QMediaTimeRange BbMediaPlayerControl::availablePlaybackRanges() const { // We can't get this information from the mmrenderer API yet, so pretend we can seek everywhere return QMediaTimeRange(0, m_metaData.duration()); }
void tst_QMediaTimeRange::testAddTimeRange() { // Add Time Range uses Add Interval internally, // so in this test the focus is on combinations of number // of intervals added, rather than the different types of // merges which can occur. QMediaTimeRange a, b; // Add Single into Single a = QMediaTimeRange(10, 30); b = QMediaTimeRange(20, 40); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 40); // Add Multiple into Single a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 60); b = QMediaTimeRange(20, 50); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 60); // Add Single into Multiple a = QMediaTimeRange(20, 50); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 60); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 60); // Add Multiple into Multiple a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 70); a.addInterval(80, 100); b = QMediaTimeRange(); b.addInterval(20, 50); b.addInterval(60, 90); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 100); // Add Nothing to Single a = QMediaTimeRange(); b = QMediaTimeRange(10, 20); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Add Single to Nothing a = QMediaTimeRange(10, 20); b = QMediaTimeRange(); b.addTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Add Nothing to Nothing a = QMediaTimeRange(); b = QMediaTimeRange(); b.addTimeRange(a); QVERIFY(b.isEmpty()); }
/*! \fn operator-(const QMediaTimeRange &r1, const QMediaTimeRange &r2) Returns a time range containing \a r2 subtracted from \a r1. \since 1.0 */ QMediaTimeRange operator-(const QMediaTimeRange &r1, const QMediaTimeRange &r2) { return (QMediaTimeRange(r1) -= r2); }
void tst_QMediaTimeRange::testArithmetic() { QMediaTimeRange a(10, 20), b(20, 30); // Test += a += b; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 30); // Test -= a -= b; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 19); // Test += and -= on intervals a -= QMediaTimeInterval(10, 20); a += QMediaTimeInterval(40, 50); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 40); QVERIFY(a.latestTime() == 50); // Test Interval + Interval a = QMediaTimeInterval(10, 20) + QMediaTimeInterval(20, 30); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 30); // Test Range + Interval a = a + QMediaTimeInterval(30, 40); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 40); // Test Interval + Range a = QMediaTimeInterval(40, 50) + a; QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 50); // Test Range + Range a = a + QMediaTimeRange(50, 60); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 60); // Test Range - Interval a = a - QMediaTimeInterval(50, 60); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 49); // Test Range - Range a = a - QMediaTimeRange(40, 50); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 39); // Test Interval - Range b = QMediaTimeInterval(0, 20) - a; QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 0); QVERIFY(b.latestTime() == 9); // Test Interval - Interval a = QMediaTimeInterval(10, 20) - QMediaTimeInterval(15, 30); QVERIFY(a.isContinuous()); QVERIFY(a.earliestTime() == 10); QVERIFY(a.latestTime() == 14); }
void tst_QMediaTimeRange::testRemoveInterval() { // Removing an interval, causing a split QMediaTimeRange x; x.addInterval(10, 50); x.removeInterval(20, 40); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 19); QVERIFY(x.intervals()[1].start() == 41); QVERIFY(x.intervals()[1].end() == 50); // Removing an interval, causing a deletion x = QMediaTimeRange(); x.addInterval(20, 30); x.removeInterval(10, 40); QVERIFY(x.isEmpty()); // Removing an interval, causing a tail trim x = QMediaTimeRange(); x.addInterval(20, 40); x.removeInterval(30, 50); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 20); QVERIFY(x.latestTime() == 29); // Removing an interval, causing a head trim x = QMediaTimeRange(); x.addInterval(20, 40); x.removeInterval(10, 30); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 31); QVERIFY(x.latestTime() == 40); // Identical Remove x = QMediaTimeRange(); x.addInterval(10, 20); x.removeInterval(10, 20); QVERIFY(x.isEmpty()); // Multi-Trim x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.removeInterval(15, 35); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 14); QVERIFY(x.intervals()[1].start() == 36); QVERIFY(x.intervals()[1].end() == 40); // Multi-Delete x = QMediaTimeRange(); x.addInterval(10, 20); x.addInterval(30, 40); x.addInterval(50, 60); x.removeInterval(10, 60); QVERIFY(x.isEmpty()); // Interval Parameter - Removing an interval, causing a split x = QMediaTimeRange(); x.addInterval(10, 50); x.removeInterval(QMediaTimeInterval(20, 40)); QVERIFY(!x.isEmpty()); QVERIFY(!x.isContinuous()); QVERIFY(x.intervals().count() == 2); QVERIFY(x.intervals()[0].start() == 10); QVERIFY(x.intervals()[0].end() == 19); QVERIFY(x.intervals()[1].start() == 41); QVERIFY(x.intervals()[1].end() == 50); // Interval Parameter - Abnormal Interval x = QMediaTimeRange(); x.addInterval(10, 40); x.removeInterval(QMediaTimeInterval(30, 20)); QVERIFY(!x.isEmpty()); QVERIFY(x.isContinuous()); QVERIFY(x.earliestTime() == 10); QVERIFY(x.latestTime() == 40); }
void tst_QMediaTimeRange::testRemoveTimeRange() { // Remove Time Range uses Remove Interval internally, // so in this test the focus is on combinations of number // of intervals removed, rather than the different types of // deletions which can occur. QMediaTimeRange a, b; // Remove Single from Single a = QMediaTimeRange(10, 30); b = QMediaTimeRange(20, 40); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 31); QVERIFY(b.latestTime() == 40); // Remove Multiple from Single a = QMediaTimeRange(); a.addInterval(10, 30); a.addInterval(40, 60); b = QMediaTimeRange(20, 50); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 31); QVERIFY(b.latestTime() == 39); // Remove Single from Multiple a = QMediaTimeRange(20, 50); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 60); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(!b.isContinuous()); QVERIFY(b.intervals().count() == 2); QVERIFY(b.intervals()[0].start() == 10); QVERIFY(b.intervals()[0].end() == 19); QVERIFY(b.intervals()[1].start() == 51); QVERIFY(b.intervals()[1].end() == 60); // Remove Multiple from Multiple a = QMediaTimeRange(); a.addInterval(20, 50); a.addInterval(50, 90); b = QMediaTimeRange(); b.addInterval(10, 30); b.addInterval(40, 70); b.addInterval(80, 100); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(!b.isContinuous()); QVERIFY(b.intervals().count() == 2); QVERIFY(b.intervals()[0].start() == 10); QVERIFY(b.intervals()[0].end() == 19); QVERIFY(b.intervals()[1].start() == 91); QVERIFY(b.intervals()[1].end() == 100); // Remove Nothing from Single a = QMediaTimeRange(); b = QMediaTimeRange(10, 20); b.removeTimeRange(a); QVERIFY(!b.isEmpty()); QVERIFY(b.isContinuous()); QVERIFY(b.earliestTime() == 10); QVERIFY(b.latestTime() == 20); // Remove Single from Nothing a = QMediaTimeRange(10, 20); b = QMediaTimeRange(); b.removeTimeRange(a); QVERIFY(b.isEmpty()); // Remove Nothing from Nothing a = QMediaTimeRange(); b = QMediaTimeRange(); b.removeTimeRange(a); QVERIFY(b.isEmpty()); }