From d26fcf043db5afba9c38653531794b6cf8f13e54 Mon Sep 17 00:00:00 2001 From: tom Date: Fri, 24 Jan 2014 11:54:43 +0100 Subject: [PATCH] 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 --- .../mediaplayer/avfmediaplayersession.mm | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm index bb2bc75c..cf2ad307 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]; }