summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorDoris Verria <doris.verria@qt.io>2021-05-23 17:40:22 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-25 06:10:02 +0000
commit454ce528541989e9116df1b7aff49085b5a37274 (patch)
tree5f110200ac87bceb2d8a7e0ee622702c10ca5307 /src/multimedia
parent6bbbd6754de580c67839257e0e98f51ac676b571 (diff)
Fix the remaining failures for tst_qmediaplayerbackend in macOS
Use QTimer to update playback position, fix a crash, and use QTRY_COMPARE when testing the player position. Change-Id: I44840eefb6f90ffc04084fe2743238400ee7a73e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/platform/darwin/avfvideosink.mm5
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm28
-rw-r--r--src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h2
3 files changed, 14 insertions, 21 deletions
diff --git a/src/multimedia/platform/darwin/avfvideosink.mm b/src/multimedia/platform/darwin/avfvideosink.mm
index c7488f8b5..2bae0dc0b 100644
--- a/src/multimedia/platform/darwin/avfvideosink.mm
+++ b/src/multimedia/platform/darwin/avfvideosink.mm
@@ -182,9 +182,10 @@ void AVFVideoSinkInterface::setVideoSink(AVFVideoSink *sink)
return;
m_sink = sink;
- if (m_sink)
+ if (m_sink) {
m_sink->setVideoSinkInterface(this);
- reconfigure();
+ reconfigure();
+ }
}
#include <qdebug.h>
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
index ddd9855fb..57d1d7890 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer.mm
@@ -85,7 +85,6 @@ static void *AVFMediaPlayerObserverCurrentItemDurationObservationContext = &AVFM
- (void) prepareToPlayAsset:(AVURLAsset *)asset withKeys:(NSArray *)requestedKeys;
- (void) assetFailedToPrepareForPlayback:(NSError *)error;
- (void) playerItemDidReachEnd:(NSNotification *)notification;
-- (void) playerItemTimeJumped:(NSNotification *)notification;
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context;
- (void) detatchSession;
@@ -171,9 +170,6 @@ static void *AVFMediaPlayerObserverCurrentItemDurationObservationContext = &AVFM
[[NSNotificationCenter defaultCenter] removeObserver:self
name:AVPlayerItemDidPlayToEndTimeNotification
object:m_playerItem];
- [[NSNotificationCenter defaultCenter] removeObserver:self
- name:AVPlayerItemTimeJumpedNotification
- object:m_playerItem];
m_playerItem = 0;
}
if (m_player) {
@@ -266,11 +262,6 @@ static void *AVFMediaPlayerObserverCurrentItemDurationObservationContext = &AVFM
name:AVPlayerItemDidPlayToEndTimeNotification
object:m_playerItem];
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(playerItemTimeJumped:)
- name:AVPlayerItemTimeJumpedNotification
- object:m_playerItem];
-
//Get a new AVPlayer initialized to play the specified player item.
m_player = [AVPlayer playerWithPlayerItem:m_playerItem];
[m_player retain];
@@ -328,13 +319,6 @@ static void *AVFMediaPlayerObserverCurrentItemDurationObservationContext = &AVFM
QMetaObject::invokeMethod(m_session, "processEOS", Qt::AutoConnection);
}
-- (void) playerItemTimeJumped:(NSNotification *)notification
-{
- Q_UNUSED(notification);
- if (self.session)
- QMetaObject::invokeMethod(m_session, "processPositionChange", Qt::AutoConnection);
-}
-
- (void) observeValueForKeyPath:(NSString*) path
ofObject:(id)object
change:(NSDictionary*)change
@@ -499,6 +483,7 @@ AVFMediaPlayer::AVFMediaPlayer(QMediaPlayer *player)
, m_seekable(false)
{
m_observer = [[AVFMediaPlayerObserver alloc] initWithMediaPlayerSession:this];
+ connect(&m_playbackTimer, &QTimer::timeout, this, &AVFMediaPlayer::processPositionChange);
setVideoOutput(new AVFVideoRendererControl(this));
}
@@ -856,6 +841,7 @@ void AVFMediaPlayer::play()
processLoadStateChange();
Q_EMIT stateChanged(m_state);
+ m_playbackTimer.start(100);
}
void AVFMediaPlayer::pause()
@@ -881,8 +867,9 @@ void AVFMediaPlayer::pause()
if (m_mediaStatus == QMediaPlayer::EndOfMedia)
setPosition(0);
-
+ Q_EMIT positionChanged(position());
Q_EMIT stateChanged(m_state);
+ m_playbackTimer.stop();
}
void AVFMediaPlayer::stop()
@@ -904,8 +891,8 @@ void AVFMediaPlayer::stop()
if (m_mediaStatus == QMediaPlayer::BufferedMedia)
Q_EMIT mediaStatusChanged((m_mediaStatus = QMediaPlayer::LoadedMedia));
- Q_EMIT positionChanged(position());
Q_EMIT stateChanged((m_state = QMediaPlayer::StoppedState));
+ m_playbackTimer.stop();
}
void AVFMediaPlayer::setVolume(int volume)
@@ -1020,6 +1007,7 @@ void AVFMediaPlayer::processLoadStateChange(QMediaPlayer::PlaybackState newState
if (newState == QMediaPlayer::PlayingState && [static_cast<AVFMediaPlayerObserver*>(m_observer) player]) {
// Setting the rate is enough to start playback, no need to call play()
[[static_cast<AVFMediaPlayerObserver*>(m_observer) player] setRate:m_rate];
+ m_playbackTimer.start();
}
}
@@ -1047,8 +1035,10 @@ void AVFMediaPlayer::processBufferStateChange(int bufferProgress)
} else if (status == QMediaPlayer::StalledMedia) {
status = QMediaPlayer::BufferedMedia;
// Resume playback.
- if (m_state == QMediaPlayer::PlayingState)
+ if (m_state == QMediaPlayer::PlayingState) {
[[static_cast<AVFMediaPlayerObserver*>(m_observer) player] setRate:m_rate];
+ m_playbackTimer.start();
+ }
}
if (m_mediaStatus != status)
diff --git a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
index edfa21c7c..605eeef4b 100644
--- a/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
+++ b/src/multimedia/platform/darwin/mediaplayer/avfmediaplayer_p.h
@@ -175,6 +175,8 @@ private:
bool m_seekable;
AVFMediaPlayerObserver *m_observer;
+
+ QTimer m_playbackTimer;
};
QT_END_NAMESPACE