#ifndef MEDIA_GPU_CHROMEOS_LIBYUV_IMAGE_PROCESSOR_BACKEND_H_
#define MEDIA_GPU_CHROMEOS_LIBYUV_IMAGE_PROCESSOR_BACKEND_H_
#include <memory>
#include <vector>
#include "base/task/sequenced_task_runner.h"
#include "media/gpu/chromeos/fourcc.h"
#include "media/gpu/chromeos/image_processor_backend.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gfx/geometry/rect.h"
namespace media {
class VideoFrameMapper;
class MEDIA_GPU_EXPORT LibYUVImageProcessorBackend
: public ImageProcessorBackend {
public:
static std::unique_ptr<ImageProcessorBackend> Create(
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
ErrorCB error_cb);
static std::unique_ptr<ImageProcessorBackend> CreateWithTaskRunner(
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
ErrorCB error_cb,
scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
LibYUVImageProcessorBackend(const LibYUVImageProcessorBackend&) = delete;
LibYUVImageProcessorBackend& operator=(const LibYUVImageProcessorBackend&) =
delete;
void ProcessFrame(scoped_refptr<FrameResource> input_frame,
scoped_refptr<FrameResource> output_frame,
FrameResourceReadyCB cb) override;
bool needs_linear_output_buffers() const override;
static std::vector<Fourcc> GetSupportedOutputFormats(Fourcc input_format);
bool supports_incoherent_buffers() const override;
std::string type() const override;
private:
LibYUVImageProcessorBackend(
std::unique_ptr<VideoFrameMapper> input_frame_mapper,
std::unique_ptr<VideoFrameMapper> output_frame_mapper,
scoped_refptr<FrameResource> intermediate_frame,
scoped_refptr<FrameResource> crop_intermediate_frame,
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
ErrorCB error_cb,
scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
~LibYUVImageProcessorBackend() override;
void NotifyError();
int DoConversion(const FrameResource* const input,
FrameResource* const output);
const gfx::Rect input_visible_rect_;
const gfx::Rect output_visible_rect_;
const std::unique_ptr<VideoFrameMapper> input_frame_mapper_;
const std::unique_ptr<VideoFrameMapper> output_frame_mapper_;
scoped_refptr<FrameResource> intermediate_frame_;
scoped_refptr<FrameResource> crop_intermediate_frame_;
};
}
#endif