mirror of
https://github.com/androidx/media.git
synced 2025-05-17 12:39:52 +08:00
Release surfaces created to wrap SurfaceTextures
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=136163292
This commit is contained in:
parent
6acf59c4fc
commit
dca4d16bef
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user