#ifndef MEDIA_GPU_ANDROID_POOLED_SHARED_IMAGE_VIDEO_PROVIDER_H_
#define MEDIA_GPU_ANDROID_POOLED_SHARED_IMAGE_VIDEO_PROVIDER_H_
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/sequence_bound.h"
#include "gpu/ipc/service/command_buffer_stub.h"
#include "media/gpu/android/shared_image_video_provider.h"
#include "media/gpu/command_buffer_helper.h"
namespace media {
class PooledSharedImageVideoProviderTest;
class MEDIA_GPU_EXPORT PooledSharedImageVideoProvider
: public SharedImageVideoProvider,
public gpu::RefCountedLockHelperDrDc {
public:
class GpuHelper {
public:
GpuHelper() = default;
GpuHelper(const GpuHelper&) = delete;
GpuHelper& operator=(const GpuHelper&) = delete;
virtual ~GpuHelper() = default;
virtual void OnImageReturned(
const gpu::SyncToken& sync_token,
scoped_refptr<CodecImageHolder> codec_image_holder,
base::OnceClosure cb,
scoped_refptr<gpu::RefCountedLock> drdc_lock) = 0;
};
static std::unique_ptr<PooledSharedImageVideoProvider> Create(
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner,
GetStubCB get_stub_cb,
std::unique_ptr<SharedImageVideoProvider> provider,
scoped_refptr<gpu::RefCountedLock> drdc_lock);
PooledSharedImageVideoProvider(const PooledSharedImageVideoProvider&) =
delete;
PooledSharedImageVideoProvider& operator=(
const PooledSharedImageVideoProvider&) = delete;
~PooledSharedImageVideoProvider() override;
void Initialize(GpuInitCB gpu_init_cb) override;
void RequestImage(ImageReadyCB cb, const ImageSpec& spec) override;
private:
friend class PooledSharedImageVideoProviderTest;
PooledSharedImageVideoProvider(
base::SequenceBound<GpuHelper> gpu_helper,
std::unique_ptr<SharedImageVideoProvider> provider,
scoped_refptr<gpu::RefCountedLock> drdc_lock);
class GpuHelperImpl : public GpuHelper {
public:
GpuHelperImpl(GetStubCB get_stub_cb);
~GpuHelperImpl() override;
void OnImageReturned(const gpu::SyncToken& sync_token,
scoped_refptr<CodecImageHolder> codec_image_holder,
base::OnceClosure cb,
scoped_refptr<gpu::RefCountedLock> drdc_lock) override;
private:
void OnSyncTokenCleared(scoped_refptr<CodecImageHolder> codec_image_holder,
base::OnceClosure cb,
scoped_refptr<gpu::RefCountedLock> drdc_lock);
scoped_refptr<CommandBufferHelper> command_buffer_helper_;
base::WeakPtrFactory<GpuHelperImpl> weak_factory_;
};
class PooledImage : public base::RefCounted<PooledImage> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
PooledImage(const ImageSpec& spec, ImageRecord record);
ImageSpec spec;
ImageRecord record;
private:
friend class base::RefCounted<PooledImage>;
virtual ~PooledImage();
};
class PendingRequest {
public:
PendingRequest(const ImageSpec& spec, ImageReadyCB cb);
~PendingRequest();
ImageSpec spec;
ImageReadyCB cb;
};
void OnImageCreated(ImageSpec spec, ImageRecord record);
void OnImageReturned(scoped_refptr<PooledImage> pooled_image,
const gpu::SyncToken& sync_token);
void ProcessFreePooledImage(scoped_refptr<PooledImage> pooled_image);
std::unique_ptr<SharedImageVideoProvider> provider_;
std::list<scoped_refptr<PooledImage>> pool_;
ImageSpec pool_spec_;
std::list<PendingRequest> pending_requests_;
base::SequenceBound<GpuHelper> gpu_helper_;
base::WeakPtrFactory<PooledSharedImageVideoProvider> weak_factory_;
};
}
#endif