#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,
VideoRotation relative_rotation,
ErrorCB error_cb);
static std::unique_ptr<ImageProcessorBackend> CreateWithTaskRunner(
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
VideoRotation relative_rotation,
ErrorCB error_cb,
scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
LibYUVImageProcessorBackend(const LibYUVImageProcessorBackend&) = delete;
LibYUVImageProcessorBackend& operator=(const LibYUVImageProcessorBackend&) =
delete;
void Process(scoped_refptr<VideoFrame> input_frame,
scoped_refptr<VideoFrame> output_frame,
FrameReadyCB 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<VideoFrame> intermediate_frame,
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
VideoRotation relative_rotation,
ErrorCB error_cb,
scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
~LibYUVImageProcessorBackend() override;
void NotifyError();
int DoConversion(const VideoFrame* const input, VideoFrame* 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<VideoFrame> intermediate_frame_;
};
}
#endif