diff options
author | tom <tom@flavoursys.com> | 2014-01-24 11:54:43 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-24 13:33:01 +0100 |
commit | d26fcf043db5afba9c38653531794b6cf8f13e54 (patch) | |
tree | 3525bf1a83c9fecf4065a65a6c6a6b02651d0996 /src | |
parent | 819f30df336ec58ec487f19919ade198d016826d (diff) |
Fixes mediaplayer crashes on OSX
Fixes the "libqavfmediaplayer.dylib 0x0000000110fa7c8c -[AVFMediaPlayerSessionObserver unloadMedia]" crash on Macs.
The problem was: writing to memory that had already been released. If not sure, one should always check if the objects exist before deleting it.
Solution tested on OSX 10.7, 10.8, 10.9
[ChangeLog][qtmultimedia][avfmediaplayersession]
Task-number: QTBUG-34213
Change-Id: Iac108711851c348e96e73542b4e71653007eeb54
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index bb2bc75cb..cf2ad307e 100644 --- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm +++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm @@ -134,15 +134,17 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe - (void) unloadMedia { [m_player setRate:0.0]; - [m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY]; + if (m_playerItem) { + [m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY]; - [[NSNotificationCenter defaultCenter] removeObserver:self + [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:m_playerItem]; - [[NSNotificationCenter defaultCenter] removeObserver:self + [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemTimeJumpedNotification object:m_playerItem]; - m_playerItem = 0; + m_playerItem = 0; + } } - (void) prepareToPlayAsset:(AVURLAsset *)asset @@ -232,8 +234,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; [m_player release]; m_player = 0; - [m_playerLayer release]; - m_playerLayer = 0; //Will have been released + + if (m_playerLayer) { + [m_playerLayer release]; + m_playerLayer = 0; //Will have been released + } } //Get a new AVPlayer initialized to play the specified player item. @@ -398,14 +403,21 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe #ifdef QT_DEBUG_AVF qDebug() << Q_FUNC_INFO; #endif - [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY]; - [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; - [m_player release]; + if (m_player) { + [m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY]; + [m_player removeObserver:self forKeyPath:AVF_RATE_KEY]; + [m_player release]; + } - [m_playerLayer release]; + if (m_playerLayer) { + [m_playerLayer release]; + } [self unloadMedia]; - [m_URL release]; + + if (m_URL) { + [m_URL release]; + } [super dealloc]; } |