summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/mediaplayer
diff options
context:
space:
mode:
authortom <tom@flavoursys.com>2014-01-24 11:54:43 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-24 13:33:01 +0100
commitd26fcf043db5afba9c38653531794b6cf8f13e54 (patch)
tree3525bf1a83c9fecf4065a65a6c6a6b02651d0996 /src/plugins/avfoundation/mediaplayer
parent819f30df336ec58ec487f19919ade198d016826d (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/plugins/avfoundation/mediaplayer')
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm34
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];
}