Release surfaces created to wrap SurfaceTextures

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=136163292
This commit is contained in:
klampert 2016-10-14 09:15:13 -07:00 committed by Oliver Woodman
parent 6acf59c4fc
commit dca4d16bef

View File

@ -108,6 +108,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
private Format audioFormat; private Format audioFormat;
private Surface surface; private Surface surface;
private boolean ownsSurface;
private SurfaceHolder surfaceHolder; private SurfaceHolder surfaceHolder;
private TextureView textureView; private TextureView textureView;
private TextRenderer.Output textOutput; private TextRenderer.Output textOutput;
@ -206,7 +207,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
*/ */
public void setVideoSurface(Surface surface) { public void setVideoSurface(Surface surface) {
removeSurfaceCallbacks(); removeSurfaceCallbacks();
setVideoSurfaceInternal(surface); setVideoSurfaceInternal(surface, false);
} }
/** /**
@ -219,9 +220,9 @@ public final class SimpleExoPlayer implements ExoPlayer {
removeSurfaceCallbacks(); removeSurfaceCallbacks();
this.surfaceHolder = surfaceHolder; this.surfaceHolder = surfaceHolder;
if (surfaceHolder == null) { if (surfaceHolder == null) {
setVideoSurfaceInternal(null); setVideoSurfaceInternal(null, false);
} else { } else {
setVideoSurfaceInternal(surfaceHolder.getSurface()); setVideoSurfaceInternal(surfaceHolder.getSurface(), false);
surfaceHolder.addCallback(componentListener); surfaceHolder.addCallback(componentListener);
} }
} }
@ -246,13 +247,13 @@ public final class SimpleExoPlayer implements ExoPlayer {
removeSurfaceCallbacks(); removeSurfaceCallbacks();
this.textureView = textureView; this.textureView = textureView;
if (textureView == null) { if (textureView == null) {
setVideoSurfaceInternal(null); setVideoSurfaceInternal(null, true);
} else { } else {
if (textureView.getSurfaceTextureListener() != null) { if (textureView.getSurfaceTextureListener() != null) {
Log.w(TAG, "Replacing existing SurfaceTextureListener."); Log.w(TAG, "Replacing existing SurfaceTextureListener.");
} }
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
setVideoSurfaceInternal(surfaceTexture == null ? null : new Surface(surfaceTexture)); setVideoSurfaceInternal(surfaceTexture == null ? null : new Surface(surfaceTexture), true);
textureView.setSurfaceTextureListener(componentListener); textureView.setSurfaceTextureListener(componentListener);
} }
} }
@ -468,6 +469,12 @@ public final class SimpleExoPlayer implements ExoPlayer {
public void release() { public void release() {
player.release(); player.release();
removeSurfaceCallbacks(); removeSurfaceCallbacks();
if (surface != null) {
if (ownsSurface) {
surface.release();
}
surface = null;
}
} }
@Override @Override
@ -618,7 +625,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
} }
} }
private void setVideoSurfaceInternal(Surface surface) { private void setVideoSurfaceInternal(Surface surface, boolean ownsSurface) {
// Note: We don't turn this method into a no-op if the surface is being replaced with itself // Note: We don't turn this method into a no-op if the surface is being replaced with itself
// so as to ensure onRenderedFirstFrame callbacks are still called in this case. // so as to ensure onRenderedFirstFrame callbacks are still called in this case.
ExoPlayerMessage[] messages = new ExoPlayerMessage[videoRendererCount]; ExoPlayerMessage[] messages = new ExoPlayerMessage[videoRendererCount];
@ -629,12 +636,17 @@ public final class SimpleExoPlayer implements ExoPlayer {
} }
} }
if (this.surface != null && this.surface != surface) { if (this.surface != null && this.surface != surface) {
// If we created this surface, we are responsible for releasing it.
if (this.ownsSurface) {
this.surface.release();
}
// We're replacing a surface. Block to ensure that it's not accessed after the method returns. // We're replacing a surface. Block to ensure that it's not accessed after the method returns.
player.blockingSendMessages(messages); player.blockingSendMessages(messages);
} else { } else {
player.sendMessages(messages); player.sendMessages(messages);
} }
this.surface = surface; this.surface = surface;
this.ownsSurface = ownsSurface;
} }
private final class ComponentListener implements VideoRendererEventListener, private final class ComponentListener implements VideoRendererEventListener,
@ -783,7 +795,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
setVideoSurfaceInternal(holder.getSurface()); setVideoSurfaceInternal(holder.getSurface(), false);
} }
@Override @Override
@ -793,14 +805,14 @@ public final class SimpleExoPlayer implements ExoPlayer {
@Override @Override
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
setVideoSurfaceInternal(null); setVideoSurfaceInternal(null, false);
} }
// TextureView.SurfaceTextureListener implementation // TextureView.SurfaceTextureListener implementation
@Override @Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
setVideoSurfaceInternal(new Surface(surfaceTexture)); setVideoSurfaceInternal(new Surface(surfaceTexture), true);
} }
@Override @Override
@ -810,7 +822,7 @@ public final class SimpleExoPlayer implements ExoPlayer {
@Override @Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
setVideoSurface(null); setVideoSurfaceInternal(null, true);
return true; return true;
} }