Bug 1715947 - Don't call callback after GeckoHlsPlayer is released. r=jolin

`GeckoHlsPlayer.release()` releases `ExoPlayer` object on player thread. But it
doesn't wait for whether it calls stop and callback is released. But
`HLSDecoder` calls `GeckoHLSResourceWrapper.destroy()` then dispose JNI
callback object immediately. So `GeckoHlsPlayer` may calls callback even if
callback is disposed.

We should check `mReleasing` before calling callback.

Differential Revision: https://phabricator.services.mozilla.com/D117505
This commit is contained in:
Makoto Kato 2021-06-14 02:17:57 +00:00
parent a8cb28ae2c
commit 714e4c72eb

View File

@ -210,18 +210,21 @@ public class GeckoHlsPlayer implements BaseHlsPlayer, ExoPlayer.EventListener {
final LoadEventInfo loadEventInfo,
final MediaLoadData mediaLoadData) {
assertTrue(isPlayerThread());
if (mediaLoadData.dataType != C.DATA_TYPE_MEDIA) {
// Don't report non-media URLs.
return;
}
if (mResourceCallbacks == null || loadEventInfo.uri == null) {
return;
}
if (DEBUG) {
Log.d(LOGTAG, "on-load: url=" + loadEventInfo.uri);
synchronized (GeckoHlsPlayer.this) {
if (mediaLoadData.dataType != C.DATA_TYPE_MEDIA) {
// Don't report non-media URLs.
return;
}
if (mResourceCallbacks == null || loadEventInfo.uri == null || mReleasing) {
return;
}
if (DEBUG) {
Log.d(LOGTAG, "on-load: url=" + loadEventInfo.uri);
}
mResourceCallbacks.onLoad(loadEventInfo.uri.toString());
}
mResourceCallbacks.onLoad(loadEventInfo.uri.toString());
}
}
@ -269,8 +272,11 @@ public class GeckoHlsPlayer implements BaseHlsPlayer, ExoPlayer.EventListener {
if (!mIsPlayerInitDone) {
return;
}
mTracksInfo.onDataArrived(trackType);
mResourceCallbacks.onDataArrived();
if (!mReleasing) {
mResourceCallbacks.onDataArrived();
}
checkInitDone();
}
}
@ -432,6 +438,9 @@ public class GeckoHlsPlayer implements BaseHlsPlayer, ExoPlayer.EventListener {
Log.e(LOGTAG, "playerFailed" , e);
}
mIsPlayerInitDone = false;
if (mReleasing) {
return;
}
if (mResourceCallbacks != null) {
mResourceCallbacks.onError(ResourceError.PLAYER.code());
}
@ -844,6 +853,9 @@ public class GeckoHlsPlayer implements BaseHlsPlayer, ExoPlayer.EventListener {
assertTrue(startTime != Long.MAX_VALUE && startTime != Long.MIN_VALUE);
mPlayer.seekTo(positionUs / 1000 - startTime / 1000);
} catch (final Exception e) {
if (mReleasing) {
return false;
}
if (mDemuxerCallbacks != null) {
mDemuxerCallbacks.onError(DemuxerError.UNKNOWN.code());
}