summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/mediaplayer
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/avfoundation/mediaplayer')
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm1
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h4
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm34
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm8
4 files changed, 44 insertions, 3 deletions
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
index 5f7bae1c8..bf7ebb4a0 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayercontrol.mm
@@ -60,6 +60,7 @@ void AVFMediaPlayerControl::setSession(AVFMediaPlayerSession *session)
connect(m_session, SIGNAL(positionChanged(qint64)), this, SIGNAL(positionChanged(qint64)));
connect(m_session, SIGNAL(durationChanged(qint64)), this, SIGNAL(durationChanged(qint64)));
+ connect(m_session, SIGNAL(bufferStatusChanged(int)), this, SIGNAL(bufferStatusChanged(int)));
connect(m_session, SIGNAL(stateChanged(QMediaPlayer::State)),
this, SIGNAL(stateChanged(QMediaPlayer::State)));
connect(m_session, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
index 9a55b7b74..e20f4a1ec 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
@@ -106,12 +106,15 @@ public Q_SLOTS:
void processLoadStateChange();
void processLoadStateFailure();
+ void processBufferStateChange(int bufferStatus);
+
void processDurationChange(qint64 duration);
Q_SIGNALS:
void positionChanged(qint64 position);
void durationChanged(qint64 duration);
void stateChanged(QMediaPlayer::State newState);
+ void bufferStatusChanged(int bufferStatus);
void mediaStatusChanged(QMediaPlayer::MediaStatus status);
void volumeChanged(int volume);
void mutedChanged(bool muted);
@@ -179,6 +182,7 @@ private:
qint64 m_requestedPosition;
qint64 m_duration;
+ int m_bufferStatus;
bool m_videoAvailable;
bool m_audioAvailable;
bool m_seekable;
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index b6fe01053..06fb71ef8 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -52,7 +52,8 @@ static NSString* const AVF_TRACKS_KEY = @"tracks";
static NSString* const AVF_PLAYABLE_KEY = @"playable";
//AVPlayerItem keys
-static NSString* const AVF_STATUS_KEY = @"status";
+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";
@@ -61,6 +62,7 @@ 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;
@@ -72,6 +74,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
AVPlayerItem *m_playerItem;
AVPlayerLayer *m_playerLayer;
NSURL *m_URL;
+ BOOL m_bufferIsLikelyToKeepUp;
}
@property (readonly, getter=player) AVPlayer* m_player;
@@ -102,6 +105,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
return nil;
self->m_session = session;
+ self->m_bufferIsLikelyToKeepUp = FALSE;
return self;
}
@@ -141,6 +145,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
{
if (m_playerItem) {
[m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY];
+ [m_playerItem removeObserver:self forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:AVPlayerItemDidPlayToEndTimeNotification
@@ -219,6 +224,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
context:AVFMediaPlayerSessionObserverStatusObservationContext];
+ [m_playerItem addObserver:self
+ forKeyPath:AVF_BUFFER_LIKELY_KEEP_UP_KEY
+ options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
+ context:AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext];
+
//When the player item has played to its end time we'll toggle
//the movie controller Pause button to be the Play button
[[NSNotificationCenter defaultCenter] addObserver:self
@@ -338,6 +348,15 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
break;
}
}
+ else if (context == AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext)
+ {
+ const bool isPlaybackLikelyToKeepUp = [m_playerItem isPlaybackLikelyToKeepUp];
+ if (isPlaybackLikelyToKeepUp != m_bufferIsLikelyToKeepUp) {
+ m_bufferIsLikelyToKeepUp = isPlaybackLikelyToKeepUp;
+ QMetaObject::invokeMethod(m_session, "processBufferStateChange", Qt::AutoConnection,
+ Q_ARG(int, isPlaybackLikelyToKeepUp ? 100 : 0));
+ }
+ }
//AVPlayer "rate" property value observer.
else if (context == AVFMediaPlayerSessionObserverRateObservationContext)
{
@@ -402,6 +421,7 @@ AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QOb
, m_rate(1.0)
, m_requestedPosition(-1)
, m_duration(0)
+ , m_bufferStatus(0)
, m_videoAvailable(false)
, m_audioAvailable(false)
, m_seekable(false)
@@ -536,11 +556,10 @@ qint64 AVFMediaPlayerSession::duration() const
int AVFMediaPlayerSession::bufferStatus() const
{
- //BUG: bufferStatus may be relevant?
#ifdef QT_DEBUG_AVF
qDebug() << Q_FUNC_INFO;
#endif
- return 100;
+ return m_bufferStatus;
}
int AVFMediaPlayerSession::volume() const
@@ -898,6 +917,15 @@ void AVFMediaPlayerSession::processLoadStateFailure()
Q_EMIT stateChanged((m_state = QMediaPlayer::StoppedState));
}
+void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus)
+{
+ if (bufferStatus == m_bufferStatus)
+ return;
+
+ m_bufferStatus = bufferStatus;
+ Q_EMIT bufferStatusChanged(bufferStatus);
+}
+
void AVFMediaPlayerSession::processDurationChange(qint64 duration)
{
if (duration == m_duration)
diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
index 4952551dc..5727cb0f4 100644
--- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
@@ -41,6 +41,14 @@
#include <AVFoundation/AVFoundation.h>
+#if QT_HAS_INCLUDE(<AppKit/AppKit.h>)
+#include <AppKit/AppKit.h>
+#endif
+
+#if QT_HAS_INCLUDE(<UIKit/UIKit.h>)
+#include <UIKit/UIKit.h>
+#endif
+
QT_USE_NAMESPACE
AVFVideoWindowControl::AVFVideoWindowControl(QObject *parent)