Chromium Code Reviews| Index: content/common/gpu/media/avda_codec_image.cc |
| diff --git a/content/common/gpu/media/avda_codec_image.cc b/content/common/gpu/media/avda_codec_image.cc |
| index 8f3595a69c91496dd01dbfc098f03a543b8b08b7..7302bd1cbccd0f1d8588a6f19a496dbb9e7785be 100644 |
| --- a/content/common/gpu/media/avda_codec_image.cc |
| +++ b/content/common/gpu/media/avda_codec_image.cc |
| @@ -111,10 +111,8 @@ bool AVDACodecImage::ScheduleOverlayPlane(gfx::AcceleratedWidget widget, |
| return false; |
| } |
| - if (codec_buffer_index_ != kInvalidCodecBufferIndex) { |
| - media_codec_->ReleaseOutputBuffer(codec_buffer_index_, true); |
| - codec_buffer_index_ = kInvalidCodecBufferIndex; |
| - } |
| + ReleaseOutputBuffer(ReleaseMode::RENDER_ONLY); |
|
liberato (no reviews please)
2016/04/22 00:51:06
RENDER_AND_UPDATE, else it will try to wait for fr
DaleCurtis
2016/04/22 01:33:58
Done.
|
| + codec_buffer_index_ = kInvalidCodecBufferIndex; |
| return true; |
| } |
| @@ -125,19 +123,11 @@ void AVDACodecImage::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, |
| void AVDACodecImage::UpdateSurfaceTexture(RestoreBindingsMode mode) { |
| DCHECK(surface_texture_); |
| - // Render via the media codec if needed. |
| if (!IsCodecBufferOutstanding()) |
| return; |
| - // The decoder buffer is still pending. |
| - // This must be synchronous, so wait for OnFrameAvailable. |
| - media_codec_->ReleaseOutputBuffer(codec_buffer_index_, true); |
| - { |
| - SCOPED_UMA_HISTOGRAM_TIMER("Media.AvdaCodecImage.WaitTimeForFrame"); |
| - shared_state_->WaitForFrameAvailable(); |
| - } |
| - |
| - // Don't bother to check if we're rendered again. |
| + ReleaseOutputBuffer(ReleaseMode::RENDER_ONLY); |
| + DCHECK_EQ(codec_buffer_index_, kUpdateOnly); |
| codec_buffer_index_ = kInvalidCodecBufferIndex; |
| // Swap the rendered image to the front. |
| @@ -166,17 +156,73 @@ void AVDACodecImage::SetMediaCodecBufferIndex(int buffer_index) { |
| codec_buffer_index_ = buffer_index; |
| } |
| -int AVDACodecImage::GetMediaCodecBufferIndex() const { |
| - return codec_buffer_index_; |
| -} |
| - |
| void AVDACodecImage::SetSize(const gfx::Size& size) { |
| size_ = size; |
| } |
| +void AVDACodecImage::ReleaseOutputBuffer(ReleaseMode release_mode) { |
| + if (!IsCodecBufferOutstanding()) |
| + return; |
| + |
| + DCHECK_NE(codec_buffer_index_, kInvalidCodecBufferIndex); |
| + |
| + if (release_mode == ReleaseMode::SKIP_RENDER) { |
| + if (codec_buffer_index_ != kUpdateOnly) |
| + media_codec_->ReleaseOutputBuffer(codec_buffer_index_, false); |
| + codec_buffer_index_ = kInvalidCodecBufferIndex; |
| + return; |
| + } |
| + |
| + if (release_mode == ReleaseMode::RENDER_ONLY) { |
|
liberato (no reviews please)
2016/04/22 00:51:06
DCHECK(surface_texture_)
DaleCurtis
2016/04/22 01:33:58
Done.
|
| + if (codec_buffer_index_ == kUpdateOnly) |
| + return; |
| + |
| + media_codec_->ReleaseOutputBuffer(codec_buffer_index_, true); |
| + codec_buffer_index_ = kUpdateOnly; |
| + |
| + // This must be synchronous, so wait for OnFrameAvailable. |
| + SCOPED_UMA_HISTOGRAM_TIMER("Media.AvdaCodecImage.WaitTimeForFrame"); |
| + shared_state_->WaitForFrameAvailable(); |
| + return; |
| + } |
| + |
| + DCHECK(release_mode == ReleaseMode::RENDER_AND_UPDATE); |
| + |
| + if (!surface_texture_) { |
| + DCHECK_NE(codec_buffer_index_, kUpdateOnly); |
| + media_codec_->ReleaseOutputBuffer(codec_buffer_index_, true); |
| + codec_buffer_index_ = kInvalidCodecBufferIndex; |
| + return; |
| + } |
| + |
| + // Surface texture is already attached, so just update it. |
| + if (shared_state_->surface_texture_is_attached()) { |
| + // Warning: This will cause reentrancy to this function. |
| + UpdateSurfaceTexture(kDoRestoreBindings); |
|
liberato (no reviews please)
2016/04/22 00:51:06
i think that this can be simplified to avoid the m
DaleCurtis
2016/04/22 01:33:58
I agree the recursion is nasty, will think on it s
liberato (no reviews please)
2016/04/22 02:16:43
the public api would be UpdateSurface(). i agree
|
| + return; |
| + } |
| + |
| + // Don't attach the surface texture permanently. Perhaps we should just |
| + // attach the surface texture in avda and be done with it. |
| + GLuint service_id = 0; |
| + glGenTextures(1, &service_id); |
| + GLint bound_service_id = 0; |
| + glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &bound_service_id); |
| + glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id); |
| + AttachSurfaceTextureToContext(); |
| + |
| + // Warning: This will cause reentrancy to this function. |
| + UpdateSurfaceTexture(kDontRestoreBindings); |
| + |
| + // Detach the surface texture, which deletes the generated texture. |
| + surface_texture_->DetachFromGLContext(); |
| + shared_state_->DidDetachSurfaceTexture(); |
| + glBindTexture(GL_TEXTURE_EXTERNAL_OES, bound_service_id); |
| +} |
| + |
| void AVDACodecImage::SetMediaCodec(media::MediaCodecBridge* codec) { |
| media_codec_ = codec; |
| - codec_buffer_index_ = -1; |
| + codec_buffer_index_ = kInvalidCodecBufferIndex; |
| } |
| void AVDACodecImage::SetTexture(gpu::gles2::Texture* texture) { |
| @@ -214,28 +260,8 @@ std::unique_ptr<ui::ScopedMakeCurrent> AVDACodecImage::MakeCurrentIfNeeded() { |
| } |
| void AVDACodecImage::GetTextureMatrix(float matrix[16]) { |
| - if (IsCodecBufferOutstanding() && shared_state_ && surface_texture_) { |
| - // Our current matrix may be stale. Update it if possible. |
| - if (!shared_state_->surface_texture_is_attached()) { |
| - // Don't attach the surface texture permanently. Perhaps we should |
| - // just attach the surface texture in avda and be done with it. |
| - GLuint service_id = 0; |
| - glGenTextures(1, &service_id); |
| - GLint bound_service_id = 0; |
| - glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &bound_service_id); |
| - glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id); |
| - AttachSurfaceTextureToContext(); |
| - UpdateSurfaceTexture(kDontRestoreBindings); |
| - // Detach the surface texture, which deletes the generated texture. |
| - surface_texture_->DetachFromGLContext(); |
| - shared_state_->DidDetachSurfaceTexture(); |
| - glBindTexture(GL_TEXTURE_EXTERNAL_OES, bound_service_id); |
| - } else { |
| - // Surface texture is already attached, so just update it. |
| - UpdateSurfaceTexture(kDoRestoreBindings); |
| - } |
| - } |
| - |
| + // Our current matrix may be stale. Update it if possible. |
| + ReleaseOutputBuffer(ReleaseMode::RENDER_AND_UPDATE); |
|
liberato (no reviews please)
2016/04/22 00:51:06
this eats the check for |surface_texture_|. shoul
DaleCurtis
2016/04/22 01:33:58
Done.
|
| memcpy(matrix, gl_matrix_, sizeof(gl_matrix_)); |
| } |