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>
This commit is contained in:
@@ -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];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user