#ifndef MEDIA_GPU_ANDROID_CODEC_SURFACE_BUNDLE_H_
#define MEDIA_GPU_ANDROID_CODEC_SURFACE_BUNDLE_H_
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_delete_on_sequence.h"
#include "gpu/command_buffer/service/texture_owner.h"
#include "media/base/android/android_overlay.h"
#include "media/gpu/android/codec_buffer_wait_coordinator.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gl/android/scoped_java_surface.h"
namespace gpu {
class RefCountedLock;
}
namespace media {
class MEDIA_GPU_EXPORT CodecSurfaceBundle
: public base::RefCountedDeleteOnSequence<CodecSurfaceBundle> {
public:
using ScheduleLayoutCB = base::RepeatingCallback<void(const gfx::Rect&)>;
CodecSurfaceBundle();
explicit CodecSurfaceBundle(std::unique_ptr<AndroidOverlay> overlay);
explicit CodecSurfaceBundle(scoped_refptr<gpu::TextureOwner> texture_owner,
scoped_refptr<gpu::RefCountedLock> drdc_lock);
CodecSurfaceBundle(const CodecSurfaceBundle&) = delete;
CodecSurfaceBundle& operator=(const CodecSurfaceBundle&) = delete;
const base::android::JavaRef<jobject>& GetJavaSurface() const;
ScheduleLayoutCB GetScheduleLayoutCB();
scoped_refptr<CodecBufferWaitCoordinator> codec_buffer_wait_coordinator()
const {
return codec_buffer_wait_coordinator_;
}
AndroidOverlay* overlay() const { return overlay_.get(); }
private:
~CodecSurfaceBundle();
friend class base::RefCountedDeleteOnSequence<CodecSurfaceBundle>;
friend class base::DeleteHelper<CodecSurfaceBundle>;
void ScheduleLayout(const gfx::Rect& rect);
std::unique_ptr<AndroidOverlay> overlay_;
scoped_refptr<CodecBufferWaitCoordinator> codec_buffer_wait_coordinator_;
gl::ScopedJavaSurface texture_owner_surface_;
gfx::Rect layout_rect_;
base::WeakPtrFactory<CodecSurfaceBundle> weak_factory_{this};
};
}
#endif