summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-20 22:41:41 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-20 23:11:02 +0100
commitd04483a5c13b6b5ac463f2a8d584839eab9aeede (patch)
tree042c340ea1265a9f3931c6d92c0fef8c9cb5edc1 /src/plugins/avfoundation
parent950e9b472890478f0460a060ae08cc16a06ac659 (diff)
parenta3fb242676055355deb68788199ae59abe58ca41 (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')
-rw-r--r--src/plugins/avfoundation/camera/avfcamerautility.mm2
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h2
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm41
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)