diff options
author | Doris Verria <doris.verria@qt.io> | 2021-05-23 17:40:22 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-05-25 06:10:02 +0000 |
commit | 454ce528541989e9116df1b7aff49085b5a37274 (patch) | |
tree | 5f110200ac87bceb2d8a7e0ee622702c10ca5307 /src/multimedia | |
parent | 6bbbd6754de580c67839257e0e98f51ac676b571 (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')
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 |