Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1364)

Unified Diff: content/common/gpu/media/avda_codec_image.cc

Issue 1882373004: Migrate content/common/gpu/media code to media/gpu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Squash and rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index d4a30fe34b744ef19e7fa0ebfb532b3a75a6e5ad..0000000000000000000000000000000000000000
--- a/content/common/gpu/media/avda_codec_image.cc
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/common/gpu/media/avda_codec_image.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "base/metrics/histogram_macros.h"
-#include "content/common/gpu/media/avda_shared_state.h"
-#include "gpu/command_buffer/service/context_group.h"
-#include "gpu/command_buffer/service/context_state.h"
-#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
-#include "gpu/command_buffer/service/texture_manager.h"
-#include "ui/gl/android/surface_texture.h"
-#include "ui/gl/gl_context.h"
-#include "ui/gl/scoped_make_current.h"
-
-namespace content {
-
-AVDACodecImage::AVDACodecImage(
- int picture_buffer_id,
- const scoped_refptr<AVDASharedState>& shared_state,
- media::VideoCodecBridge* codec,
- const base::WeakPtr<gpu::gles2::GLES2Decoder>& decoder,
- const scoped_refptr<gfx::SurfaceTexture>& surface_texture)
- : shared_state_(shared_state),
- codec_buffer_index_(kInvalidCodecBufferIndex),
- media_codec_(codec),
- decoder_(decoder),
- surface_texture_(surface_texture),
- detach_surface_texture_on_destruction_(false),
- texture_(0),
- picture_buffer_id_(picture_buffer_id) {
- // Default to a sane guess of "flip Y", just in case we can't get
- // the matrix on the first call.
- memset(gl_matrix_, 0, sizeof(gl_matrix_));
- gl_matrix_[0] = gl_matrix_[10] = gl_matrix_[15] = 1.0f;
- gl_matrix_[5] = -1.0f;
- shared_state_->SetImageForPicture(picture_buffer_id_, this);
-}
-
-AVDACodecImage::~AVDACodecImage() {
- shared_state_->SetImageForPicture(picture_buffer_id_, nullptr);
-}
-
-void AVDACodecImage::Destroy(bool have_context) {}
-
-gfx::Size AVDACodecImage::GetSize() {
- return size_;
-}
-
-unsigned AVDACodecImage::GetInternalFormat() {
- return GL_RGBA;
-}
-
-bool AVDACodecImage::BindTexImage(unsigned target) {
- return false;
-}
-
-void AVDACodecImage::ReleaseTexImage(unsigned target) {}
-
-bool AVDACodecImage::CopyTexImage(unsigned target) {
- if (!surface_texture_)
- return false;
-
- if (target != GL_TEXTURE_EXTERNAL_OES)
- return false;
-
- GLint bound_service_id = 0;
- glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &bound_service_id);
- // We insist that the currently bound texture is the right one. We could
- // make a new glimage from a 2D image.
- if (bound_service_id != shared_state_->surface_texture_service_id())
- return false;
-
- // If the surface texture isn't attached yet, then attach it. Note that this
- // will be to the texture in |shared_state_|, because of the checks above.
- if (!shared_state_->surface_texture_is_attached())
- AttachSurfaceTextureToContext();
-
- // Make sure that we have the right image in the front buffer. Note that the
- // bound_service_id is guaranteed to be equal to the surface texture's client
- // texture id, so we can skip preserving it if the right context is current.
- UpdateSurfaceInternal(UpdateMode::RENDER_TO_FRONT_BUFFER,
- kDontRestoreBindings);
-
- // By setting image state to UNBOUND instead of COPIED we ensure that
- // CopyTexImage() is called each time the surface texture is used for drawing.
- // It would be nice if we could do this via asking for the currently bound
- // Texture, but the active unit never seems to change.
- texture_->SetLevelStreamTextureImage(GL_TEXTURE_EXTERNAL_OES, 0, this,
- gpu::gles2::Texture::UNBOUND);
-
- return true;
-}
-
-bool AVDACodecImage::CopyTexSubImage(unsigned target,
- const gfx::Point& offset,
- const gfx::Rect& rect) {
- return false;
-}
-
-bool AVDACodecImage::ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
- int z_order,
- gfx::OverlayTransform transform,
- const gfx::Rect& bounds_rect,
- const gfx::RectF& crop_rect) {
- // This should only be called when we're rendering to a SurfaceView.
- if (surface_texture_) {
- DVLOG(1) << "Invalid call to ScheduleOverlayPlane; this image is "
- "SurfaceTexture backed.";
- return false;
- }
-
- UpdateSurface(UpdateMode::RENDER_TO_FRONT_BUFFER);
- return true;
-}
-
-void AVDACodecImage::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
- uint64_t process_tracing_id,
- const std::string& dump_name) {}
-
-void AVDACodecImage::UpdateSurfaceTexture(RestoreBindingsMode mode) {
- DCHECK(surface_texture_);
- DCHECK_EQ(codec_buffer_index_, kUpdateOnly);
- codec_buffer_index_ = kInvalidCodecBufferIndex;
-
- // Swap the rendered image to the front.
- std::unique_ptr<ui::ScopedMakeCurrent> scoped_make_current =
- MakeCurrentIfNeeded();
-
- // If we changed contexts, then we always want to restore it, since the caller
- // doesn't know that we're switching contexts.
- if (scoped_make_current)
- mode = kDoRestoreBindings;
-
- // Save the current binding if requested.
- GLint bound_service_id = 0;
- if (mode == kDoRestoreBindings)
- glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &bound_service_id);
-
- surface_texture_->UpdateTexImage();
- if (mode == kDoRestoreBindings)
- glBindTexture(GL_TEXTURE_EXTERNAL_OES, bound_service_id);
-
- // Helpfully, this is already column major.
- surface_texture_->GetTransformMatrix(gl_matrix_);
-}
-
-void AVDACodecImage::SetMediaCodecBufferIndex(int buffer_index) {
- codec_buffer_index_ = buffer_index;
-}
-
-void AVDACodecImage::SetSize(const gfx::Size& size) {
- size_ = size;
-}
-
-void AVDACodecImage::UpdateSurface(UpdateMode update_mode) {
- UpdateSurfaceInternal(update_mode, kDoRestoreBindings);
-}
-
-void AVDACodecImage::CodecChanged(media::MediaCodecBridge* codec) {
- media_codec_ = codec;
- codec_buffer_index_ = kInvalidCodecBufferIndex;
-}
-
-void AVDACodecImage::SetTexture(gpu::gles2::Texture* texture) {
- texture_ = texture;
-}
-
-void AVDACodecImage::UpdateSurfaceInternal(
- UpdateMode update_mode,
- RestoreBindingsMode attached_bindings_mode) {
- if (!IsCodecBufferOutstanding())
- return;
-
- ReleaseOutputBuffer(update_mode);
-
- // SurfaceViews are updated implicitly, so no further steps are necessary.
- if (!surface_texture_) {
- DCHECK(update_mode != UpdateMode::RENDER_TO_BACK_BUFFER);
- return;
- }
-
- // If front buffer rendering hasn't been requested, exit early.
- if (update_mode != UpdateMode::RENDER_TO_FRONT_BUFFER)
- return;
-
- // Surface texture is already attached, so just update it.
- if (shared_state_->surface_texture_is_attached()) {
- UpdateSurfaceTexture(attached_bindings_mode);
- 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();
- 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::ReleaseOutputBuffer(UpdateMode update_mode) {
- DCHECK(IsCodecBufferOutstanding());
-
- // In case of discard, simply discard and clear our codec buffer index.
- if (update_mode == UpdateMode::DISCARD_CODEC_BUFFER) {
- if (codec_buffer_index_ != kUpdateOnly)
- media_codec_->ReleaseOutputBuffer(codec_buffer_index_, false);
- codec_buffer_index_ = kInvalidCodecBufferIndex;
- return;
- }
-
- DCHECK(update_mode == UpdateMode::RENDER_TO_BACK_BUFFER ||
- update_mode == UpdateMode::RENDER_TO_FRONT_BUFFER);
-
- // If we've already released to the back buffer, there's nothing left to do.
- if (codec_buffer_index_ == kUpdateOnly)
- return;
-
- media_codec_->ReleaseOutputBuffer(codec_buffer_index_, true);
- codec_buffer_index_ = kUpdateOnly;
-
- // If we're using a SurfaceView we're done!
- if (!surface_texture_) {
- codec_buffer_index_ = kInvalidCodecBufferIndex;
- return;
- }
-
- // This must be synchronous, so wait for OnFrameAvailable.
- SCOPED_UMA_HISTOGRAM_TIMER("Media.AvdaCodecImage.WaitTimeForFrame");
- shared_state_->WaitForFrameAvailable();
-}
-
-void AVDACodecImage::AttachSurfaceTextureToContext() {
- DCHECK(surface_texture_);
-
- // We assume that the currently bound texture is the intended one.
-
- // Attach the surface texture to the first context we're bound on, so that
- // no context switch is needed later.
- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
- // The surface texture is already detached, so just attach it.
- // We could do this earlier, but SurfaceTexture has context affinity, and we
- // don't want to require a context switch.
- surface_texture_->AttachToGLContext();
- shared_state_->DidAttachSurfaceTexture();
-}
-
-std::unique_ptr<ui::ScopedMakeCurrent> AVDACodecImage::MakeCurrentIfNeeded() {
- DCHECK(shared_state_->context());
- std::unique_ptr<ui::ScopedMakeCurrent> scoped_make_current;
- if (!shared_state_->context()->IsCurrent(NULL)) {
- scoped_make_current.reset(new ui::ScopedMakeCurrent(
- shared_state_->context(), shared_state_->surface()));
- }
-
- return scoped_make_current;
-}
-
-void AVDACodecImage::GetTextureMatrix(float matrix[16]) {
- // Our current matrix may be stale. Update it if possible.
- if (surface_texture_)
- UpdateSurface(UpdateMode::RENDER_TO_FRONT_BUFFER);
- memcpy(matrix, gl_matrix_, sizeof(gl_matrix_));
-}
-
-bool AVDACodecImage::IsCodecBufferOutstanding() const {
- return codec_buffer_index_ != kInvalidCodecBufferIndex && media_codec_;
-}
-
-} // namespace content

Powered by Google App Engine
This is Rietveld 408576698