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,6 +134,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
|
|||||||
- (void) unloadMedia
|
- (void) unloadMedia
|
||||||
{
|
{
|
||||||
[m_player setRate:0.0];
|
[m_player setRate:0.0];
|
||||||
|
if (m_playerItem) {
|
||||||
[m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY];
|
[m_playerItem removeObserver:self forKeyPath:AVF_STATUS_KEY];
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self
|
[[NSNotificationCenter defaultCenter] removeObserver:self
|
||||||
@@ -144,6 +145,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
|
|||||||
object:m_playerItem];
|
object:m_playerItem];
|
||||||
m_playerItem = 0;
|
m_playerItem = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) prepareToPlayAsset:(AVURLAsset *)asset
|
- (void) prepareToPlayAsset:(AVURLAsset *)asset
|
||||||
withKeys:(NSArray *)requestedKeys
|
withKeys:(NSArray *)requestedKeys
|
||||||
@@ -232,9 +234,12 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
|
|||||||
[m_player removeObserver:self forKeyPath:AVF_RATE_KEY];
|
[m_player removeObserver:self forKeyPath:AVF_RATE_KEY];
|
||||||
[m_player release];
|
[m_player release];
|
||||||
m_player = 0;
|
m_player = 0;
|
||||||
|
|
||||||
|
if (m_playerLayer) {
|
||||||
[m_playerLayer release];
|
[m_playerLayer release];
|
||||||
m_playerLayer = 0; //Will have been released
|
m_playerLayer = 0; //Will have been released
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Get a new AVPlayer initialized to play the specified player item.
|
//Get a new AVPlayer initialized to play the specified player item.
|
||||||
m_player = [AVPlayer playerWithPlayerItem:m_playerItem];
|
m_player = [AVPlayer playerWithPlayerItem:m_playerItem];
|
||||||
@@ -398,14 +403,21 @@ static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMe
|
|||||||
#ifdef QT_DEBUG_AVF
|
#ifdef QT_DEBUG_AVF
|
||||||
qDebug() << Q_FUNC_INFO;
|
qDebug() << Q_FUNC_INFO;
|
||||||
#endif
|
#endif
|
||||||
|
if (m_player) {
|
||||||
[m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY];
|
[m_player removeObserver:self forKeyPath:AVF_CURRENT_ITEM_KEY];
|
||||||
[m_player removeObserver:self forKeyPath:AVF_RATE_KEY];
|
[m_player removeObserver:self forKeyPath:AVF_RATE_KEY];
|
||||||
[m_player release];
|
[m_player release];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_playerLayer) {
|
||||||
[m_playerLayer release];
|
[m_playerLayer release];
|
||||||
|
}
|
||||||
|
|
||||||
[self unloadMedia];
|
[self unloadMedia];
|
||||||
|
|
||||||
|
if (m_URL) {
|
||||||
[m_URL release];
|
[m_URL release];
|
||||||
|
}
|
||||||
|
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user