#ifndef MEDIA_GPU_VAAPI_VAAPI_JPEG_ENCODE_ACCELERATOR_H_
#define MEDIA_GPU_VAAPI_VAAPI_JPEG_ENCODE_ACCELERATOR_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
#include "components/chromeos_camera/jpeg_encode_accelerator.h"
#include "media/base/bitstream_buffer.h"
#include "media/gpu/media_gpu_export.h"
#include "media/gpu/vaapi/vaapi_wrapper.h"
namespace base {
class SingleThreadTaskRunner;
class SequencedTaskRunner;
}
namespace media {
class MEDIA_GPU_EXPORT VaapiJpegEncodeAccelerator
: public chromeos_camera::JpegEncodeAccelerator {
public:
explicit VaapiJpegEncodeAccelerator(
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
VaapiJpegEncodeAccelerator(const VaapiJpegEncodeAccelerator&) = delete;
VaapiJpegEncodeAccelerator& operator=(const VaapiJpegEncodeAccelerator&) =
delete;
~VaapiJpegEncodeAccelerator() override;
void InitializeAsync(
chromeos_camera::JpegEncodeAccelerator::Client* client,
chromeos_camera::JpegEncodeAccelerator::InitCB init_cb) override;
size_t GetMaxCodedBufferSize(const gfx::Size& picture_size) override;
void Encode(scoped_refptr<VideoFrame> video_frame,
int quality,
BitstreamBuffer* exif_buffer,
BitstreamBuffer output_buffer) override;
void EncodeWithDmaBuf(scoped_refptr<VideoFrame> input_frame,
scoped_refptr<VideoFrame> output_frame,
int quality,
int32_t task_id,
BitstreamBuffer* exif_buffer) override;
private:
struct EncodeRequest {
EncodeRequest(int32_t task_id,
scoped_refptr<VideoFrame> video_frame,
base::WritableSharedMemoryMapping exif_mapping,
base::WritableSharedMemoryMapping output_mapping,
int quality);
EncodeRequest(const EncodeRequest&) = delete;
EncodeRequest& operator=(const EncodeRequest&) = delete;
~EncodeRequest();
int32_t task_id;
scoped_refptr<VideoFrame> video_frame;
base::WritableSharedMemoryMapping exif_mapping;
base::WritableSharedMemoryMapping output_mapping;
int quality;
};
class Encoder;
void NotifyError(int32_t task_id, Status status);
void VideoFrameReady(int32_t task_id, size_t encoded_picture_size);
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
raw_ptr<Client> client_ = nullptr;
scoped_refptr<base::SequencedTaskRunner> encoder_task_runner_;
std::unique_ptr<Encoder> encoder_;
base::WeakPtr<VaapiJpegEncodeAccelerator> weak_this_;
base::WeakPtrFactory<VaapiJpegEncodeAccelerator> weak_this_factory_;
};
}
#endif