blob: 472554758163cacdcd308519f562d6594056433b [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 <stddef.h>
#include "base/containers/flat_map.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "media/base/android/android_overlay.h"
#include "media/gpu/media_gpu_export.h"
namespace media {
class AVDACodecAllocator;
class ContentVideoViewOverlayAllocatorTest;
// ContentVideoViewOverlayAllocator lets different instances of CVVOverlay that
// share the same surface ID to be synchronized with respect to each other.
// It also manages synchronous surface destruction.
class MEDIA_GPU_EXPORT ContentVideoViewOverlayAllocator {
class Client : public AndroidOverlay {
// Called when the requested SurfaceView becomes available after a call to
// AllocateSurface()
virtual void OnSurfaceAvailable(bool success) = 0;
// Called when the allocated surface is being destroyed. This must either
// replace the surface with MediaCodec#setSurface, or release the MediaCodec
// it's attached to. The client no longer owns the surface and doesn't
// need to call DeallocateSurface();
virtual void OnSurfaceDestroyed() = 0;
// Return the surface id of the client's ContentVideoView.
virtual int32_t GetSurfaceId() = 0;
~Client() override {}
static ContentVideoViewOverlayAllocator* GetInstance();
// Called synchronously when the given surface is being destroyed on the
// browser UI thread.
void OnSurfaceDestroyed(int32_t surface_id);
// Returns true if the caller now owns the surface, or false if someone else
// owns the surface. |client| will be notified when the surface is available
// via OnSurfaceAvailable().
bool AllocateSurface(Client* client);
// Relinquish ownership of the surface or stop waiting for it to be available.
// The caller must guarantee that when calling this the surface is either no
// longer attached to a MediaCodec, or the MediaCodec it was attached to is
// was released with ReleaseMediaCodec().
void DeallocateSurface(Client* client);
friend class ContentVideoViewOverlayAllocatorTest;
struct OwnerRecord {
Client* owner = nullptr;
Client* waiter = nullptr;
// Indexed by surface id.
using OwnerMap = base::flat_map<int32_t, OwnerRecord>;
OwnerMap surface_owners_;
AVDACodecAllocator* allocator_;
base::ThreadChecker thread_checker_;
} // namespace media