blob: 9a4702fe7a37f2cbc124e5f0c604f7fbea9b8ef9 [file] [log] [blame]
// Copyright 2017 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 "media/gpu/content_video_view_overlay.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gpu/ipc/common/gpu_surface_lookup.h"
namespace media {
// static
std::unique_ptr<AndroidOverlay> ContentVideoViewOverlay::Create(
int surface_id,
AndroidOverlayConfig config) {
return base::MakeUnique<ContentVideoViewOverlay>(surface_id,
std::move(config));
}
ContentVideoViewOverlay::ContentVideoViewOverlay(int surface_id,
AndroidOverlayConfig config)
: surface_id_(surface_id), config_(std::move(config)), weak_factory_(this) {
if (ContentVideoViewOverlayAllocator::GetInstance()->AllocateSurface(this)) {
// We have the surface -- post a callback to our OnSurfaceAvailable.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&ContentVideoViewOverlay::OnSurfaceAvailable,
weak_factory_.GetWeakPtr(), true));
}
}
ContentVideoViewOverlay::~ContentVideoViewOverlay() {
// Deallocate the surface. It's okay if we don't own it.
// Note that this only happens once any codec is done with us.
ContentVideoViewOverlayAllocator::GetInstance()->DeallocateSurface(this);
}
void ContentVideoViewOverlay::ScheduleLayout(const gfx::Rect& rect) {}
const base::android::JavaRef<jobject>& ContentVideoViewOverlay::GetJavaSurface()
const {
return surface_.j_surface();
}
void ContentVideoViewOverlay::OnSurfaceAvailable(bool success) {
if (!success) {
// Notify that the surface won't be available.
config_.is_failed(this);
// |this| may be deleted.
return;
}
// Get the surface and notify our client.
surface_ =
gpu::GpuSurfaceLookup::GetInstance()->AcquireJavaSurface(surface_id_);
// If no surface was returned, then fail instead.
if (surface_.IsEmpty()) {
config_.is_failed(this);
// |this| may be deleted.
return;
}
config_.is_ready(this);
}
void ContentVideoViewOverlay::OnSurfaceDestroyed() {
RunSurfaceDestroyedCallbacks();
// |this| may be deleted, or deletion might be posted elsewhere.
}
int32_t ContentVideoViewOverlay::GetSurfaceId() {
return surface_id_;
}
} // namespace media