#ifndef MEDIA_GPU_VAAPI_VAAPI_MJPEG_DECODE_ACCELERATOR_H_
#define MEDIA_GPU_VAAPI_VAAPI_MJPEG_DECODE_ACCELERATOR_H_
#include <stdint.h>
#include <memory>
#include "base/containers/span.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
#include "components/chromeos_camera/mjpeg_decode_accelerator.h"
#include "media/gpu/chromeos/image_processor_backend.h"
#include "media/gpu/media_gpu_export.h"
#include "media/gpu/vaapi/vaapi_jpeg_decoder.h"
namespace base {
class SingleThreadTaskRunner;
class SequencedTaskRunner;
}
namespace media {
class BitstreamBuffer;
class VideoFrame;
class MEDIA_GPU_EXPORT VaapiMjpegDecodeAccelerator
: public chromeos_camera::MjpegDecodeAccelerator {
public:
VaapiMjpegDecodeAccelerator(
const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
VaapiMjpegDecodeAccelerator(const VaapiMjpegDecodeAccelerator&) = delete;
VaapiMjpegDecodeAccelerator& operator=(const VaapiMjpegDecodeAccelerator&) =
delete;
~VaapiMjpegDecodeAccelerator() override;
void InitializeAsync(
chromeos_camera::MjpegDecodeAccelerator::Client* client,
chromeos_camera::MjpegDecodeAccelerator::InitCB init_cb) override;
void Decode(BitstreamBuffer bitstream_buffer,
scoped_refptr<VideoFrame> video_frame) override;
void Decode(int32_t task_id,
base::ScopedFD src_dmabuf_fd,
size_t src_size,
off_t src_offset,
scoped_refptr<VideoFrame> dst_frame) override;
bool IsSupported() override;
private:
class Decoder;
void NotifyError(int32_t task_id, Error error);
void VideoFrameReady(int32_t task_id);
const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
raw_ptr<chromeos_camera::MjpegDecodeAccelerator::Client> client_ = nullptr;
std::unique_ptr<Decoder> decoder_;
scoped_refptr<base::SequencedTaskRunner> decoder_task_runner_;
base::WeakPtrFactory<VaapiMjpegDecodeAccelerator> weak_this_factory_;
};
}
#endif