diff options
author | Liang Qi <liang.qi@qt.io> | 2018-01-20 22:41:41 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2018-01-20 23:11:02 +0100 |
commit | d04483a5c13b6b5ac463f2a8d584839eab9aeede (patch) | |
tree | 042c340ea1265a9f3931c6d92c0fef8c9cb5edc1 /src/plugins/avfoundation | |
parent | 950e9b472890478f0460a060ae08cc16a06ac659 (diff) | |
parent | a3fb242676055355deb68788199ae59abe58ca41 (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts:
src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
Change-Id: Ic43fb2a805ed9f0f2ea48993d47859716f1f11b4
Diffstat (limited to 'src/plugins/avfoundation')
3 files changed, 32 insertions, 13 deletions
diff --git a/src/plugins/avfoundation/camera/avfcamerautility.mm b/src/plugins/avfoundation/camera/avfcamerautility.mm index 22713d613..8a2254c2e 100644 --- a/src/plugins/avfoundation/camera/avfcamerautility.mm +++ b/src/plugins/avfoundation/camera/avfcamerautility.mm @@ -540,12 +540,14 @@ void qt_set_framerate_limits(AVCaptureDevice *captureDevice, qreal minFPS, qreal void qt_set_framerate_limits(AVCaptureDevice *captureDevice, AVCaptureConnection *videoConnection, qreal minFPS, qreal maxFPS) { + Q_UNUSED(videoConnection); Q_ASSERT(captureDevice); qt_set_framerate_limits(captureDevice, minFPS, maxFPS); } AVFPSRange qt_current_framerates(AVCaptureDevice *captureDevice, AVCaptureConnection *videoConnection) { + Q_UNUSED(videoConnection); Q_ASSERT(captureDevice); AVFPSRange fps; diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h index 1e4311140..e20f4a1ec 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h @@ -108,6 +108,8 @@ public Q_SLOTS: void processBufferStateChange(int bufferStatus); + void processDurationChange(qint64 duration); + Q_SIGNALS: void positionChanged(qint64 position); void durationChanged(qint64 duration); diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index 923aeabe6..06fb71ef8 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -56,13 +56,15 @@ static NSString* const AVF_STATUS_KEY = @"status"; static NSString* const AVF_BUFFER_LIKELY_KEEP_UP_KEY = @"playbackLikelyToKeepUp"; //AVPlayer keys -static NSString* const AVF_RATE_KEY = @"rate"; -static NSString* const AVF_CURRENT_ITEM_KEY = @"currentItem"; +static NSString* const AVF_RATE_KEY = @"rate"; +static NSString* const AVF_CURRENT_ITEM_KEY = @"currentItem"; +static NSString* const AVF_CURRENT_ITEM_DURATION_KEY = @"currentItem.duration"; static void *AVFMediaPlayerSessionObserverRateObservationContext = &AVFMediaPlayerSessionObserverRateObservationContext; static void *AVFMediaPlayerSessionObserverStatusObservationContext = &AVFMediaPlayerSessionObserverStatusObservationContext; static void *AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext = &AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext; static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMediaPlayerSessionObserverCurrentItemObservationContext; +static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext = &AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext; @interface AVFMediaPlayerSessionObserver : NSObject { @@ -155,6 +157,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe } if (m_player) { [m_player setRate:0.0]; + [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_DURATION_KEY]; [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY]; [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; [m_player release]; @@ -271,6 +274,12 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVFMediaPlayerSessionObserverRateObservationContext]; + //Observe the duration for getting the buffer state + [m_player addObserver:self + forKeyPath:AVF_CURRENT_ITEM_DURATION_KEY + options:0 + context:AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext]; + } -(void) assetFailedToPrepareForPlayback:(NSError *)error @@ -362,6 +371,13 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe if (m_playerItem != newPlayerItem) m_playerItem = newPlayerItem; } + else if (context == AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext) + { + const CMTime time = [m_playerItem duration]; + const qint64 duration = static_cast<qint64>(float(time.value) / float(time.timescale) * 1000.0f); + if (self.session) + QMetaObject::invokeMethod(m_session, "processDurationChange", Qt::AutoConnection, Q_ARG(qint64, duration)); + } else { [super observeValueForKeyPath:path ofObject:object change:change context:context]; @@ -535,13 +551,7 @@ qint64 AVFMediaPlayerSession::duration() const #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - AVPlayerItem *playerItem = [(AVFMediaPlayerSessionObserver*)m_observer playerItem]; - - if (!playerItem) - return 0; - - CMTime time = [playerItem duration]; - return static_cast<quint64>(float(time.value) / float(time.timescale) * 1000.0f); + return m_duration; } int AVFMediaPlayerSession::bufferStatus() const @@ -875,10 +885,6 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState) } } - qint64 currentDuration = duration(); - if (m_duration != currentDuration) - Q_EMIT durationChanged(m_duration = currentDuration); - if (m_requestedPosition != -1) { setPosition(m_requestedPosition); m_requestedPosition = -1; @@ -920,6 +926,15 @@ void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus) Q_EMIT bufferStatusChanged(bufferStatus); } +void AVFMediaPlayerSession::processDurationChange(qint64 duration) +{ + if (duration == m_duration) + return; + + m_duration = duration; + Q_EMIT durationChanged(duration); +} + void AVFMediaPlayerSession::processPositionChange() { if (m_state == QMediaPlayer::StoppedState) |