// Copyright 2019 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.

#ifndef MEDIA_GPU_ANDROID_POOLED_SHARED_IMAGE_VIDEO_PROVIDER_H_
#define MEDIA_GPU_ANDROID_POOLED_SHARED_IMAGE_VIDEO_PROVIDER_H_

#include "base/memory/weak_ptr.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;

// Provider class for shared images.
class MEDIA_GPU_EXPORT PooledSharedImageVideoProvider
    : public SharedImageVideoProvider,
      public gpu::RefCountedLockHelperDrDc {
 public:
  // Helper class that processes image returns on the gpu thread.
  class GpuHelper {
   public:
    GpuHelper() = default;

    GpuHelper(const GpuHelper&) = delete;
    GpuHelper& operator=(const GpuHelper&) = delete;

    virtual ~GpuHelper() = default;

    // Called (on the gpu thread) to handle image return.
    virtual void OnImageReturned(
        const gpu::SyncToken& sync_token,
        scoped_refptr<CodecImageHolder> codec_image_holder,
        base::OnceClosure cb,
        scoped_refptr<gpu::RefCountedLock> drdc_lock) = 0;
  };

  // Create a default implementation.  |provider| is the underlying provider to
  // create shared images.
  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;

  // SharedImageVideoProvider
  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;

    // GpuHelper
    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_;
  };

  // Record of on image from |provider|.
  class PooledImage : public base::RefCounted<PooledImage> {
   public:
    PooledImage(const ImageSpec& spec, ImageRecord record);

    ImageSpec spec;
    // The original record, including the original reuse callback.
    ImageRecord record;

   private:
    virtual ~PooledImage();

    friend class base::RefCounted<PooledImage>;
  };

  // One request from the client that's pending an image.
  class PendingRequest {
   public:
    PendingRequest(const ImageSpec& spec, ImageReadyCB cb);
    ~PendingRequest();
    ImageSpec spec;
    ImageReadyCB cb;
  };

  // Called by |provider_| when a new image is created.
  void OnImageCreated(ImageSpec spec, ImageRecord record);

  // Called by our client when it runs the release cb, to notify us that the
  // image is no longer in use.
  void OnImageReturned(scoped_refptr<PooledImage> pooled_image,
                       const gpu::SyncToken& sync_token);

  // Given a free image |pooled_image| that is not in our pool, use it to either
  // fulfill a pending request, add it to the pool, or discard it.
  void ProcessFreePooledImage(scoped_refptr<PooledImage> pooled_image);

  // Underlying provider that we use to construct images.
  std::unique_ptr<SharedImageVideoProvider> provider_;

  // All currently unused images.
  std::list<scoped_refptr<PooledImage>> pool_;

  // Spec for all images in |pool_|.
  ImageSpec pool_spec_;

  std::list<PendingRequest> pending_requests_;

  base::SequenceBound<GpuHelper> gpu_helper_;

  base::WeakPtrFactory<PooledSharedImageVideoProvider> weak_factory_;
};

}  // namespace media

#endif  // MEDIA_GPU_ANDROID_POOLED_SHARED_IMAGE_VIDEO_PROVIDER_H_
