Index: media/gpu/avda_shared_state.cc |
diff --git a/media/gpu/avda_shared_state.cc b/media/gpu/avda_shared_state.cc |
index 1309dabe2385dc409b8c3a7c395257a1b5bba9c1..17e403f6413233d7af2adfde9a10cffdb3146ae8 100644 |
--- a/media/gpu/avda_shared_state.cc |
+++ b/media/gpu/avda_shared_state.cc |
@@ -61,7 +61,8 @@ class AVDASharedState::OnFrameAvailableHandler |
DISALLOW_COPY_AND_ASSIGN(OnFrameAvailableHandler); |
}; |
-AVDASharedState::AVDASharedState() |
+AVDASharedState::AVDASharedState( |
+ scoped_refptr<AVDASurfaceBundle> surface_bundle) |
: frame_available_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
base::WaitableEvent::InitialState::NOT_SIGNALED), |
@@ -70,13 +71,27 @@ AVDASharedState::AVDASharedState() |
0, 1, 0, 0, // matrix on the first call. Will be Y-flipped later. |
0, 0, 1, 0, // |
0, 0, 0, 1, // Comment preserves 4x4 formatting. |
- } {} |
+ }, |
+ surface_bundle_(surface_bundle), |
+ weak_this_factory_(this) { |
+ // If the surface bundle has a surface texture, then register to receive |
+ // OnFrameAvailable notifications. |
+ if (surface_texture()) { |
+ on_frame_available_handler_ = |
+ new OnFrameAvailableHandler(this, surface_texture()); |
+ } |
-AVDASharedState::~AVDASharedState() { |
- if (!surface_texture_) |
- return; |
+ // If we're holding a reference to an overlay, then register to drop it if the |
+ // overlay's surface is destroyed. |
+ if (overlay()) { |
+ overlay()->AddSurfaceDestroyedCallback(base::Bind( |
+ &AVDASharedState::OnSurfaceDestroyed, weak_this_factory_.GetWeakPtr())); |
+ } |
+} |
- on_frame_available_handler_->ClearListener(); |
+AVDASharedState::~AVDASharedState() { |
+ if (on_frame_available_handler_) |
+ on_frame_available_handler_->ClearListener(); |
} |
void AVDASharedState::SignalFrameAvailable() { |
@@ -113,14 +128,6 @@ void AVDASharedState::WaitForFrameAvailable() { |
} |
} |
-void AVDASharedState::SetSurfaceTexture( |
- scoped_refptr<SurfaceTextureGLOwner> surface_texture) { |
- DCHECK(surface_texture); |
- surface_texture_ = surface_texture; |
- on_frame_available_handler_ = |
- new OnFrameAvailableHandler(this, surface_texture_.get()); |
-} |
- |
void AVDASharedState::RenderCodecBufferToSurfaceTexture( |
MediaCodecBridge* codec, |
int codec_buffer_index) { |
@@ -131,13 +138,18 @@ void AVDASharedState::RenderCodecBufferToSurfaceTexture( |
} |
void AVDASharedState::UpdateTexImage() { |
- surface_texture_->UpdateTexImage(); |
+ surface_texture()->UpdateTexImage(); |
// Helpfully, this is already column major. |
- surface_texture_->GetTransformMatrix(gl_matrix_); |
+ surface_texture()->GetTransformMatrix(gl_matrix_); |
} |
void AVDASharedState::GetTransformMatrix(float matrix[16]) const { |
memcpy(matrix, gl_matrix_, sizeof(gl_matrix_)); |
} |
+void AVDASharedState::OnSurfaceDestroyed(AndroidOverlay* overlay_raw) { |
+ if (surface_bundle_ && overlay() == overlay_raw) |
+ surface_bundle_ = nullptr; |
+} |
+ |
} // namespace media |