#ifndef MEDIA_GPU_CHROMEOS_IMAGE_PROCESSOR_BACKEND_H_
#define MEDIA_GPU_CHROMEOS_IMAGE_PROCESSOR_BACKEND_H_
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
#include "base/task/sequenced_task_runner.h"
#include "media/base/color_plane_layout.h"
#include "media/base/video_frame.h"
#include "media/gpu/chromeos/fourcc.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace media {
class MEDIA_GPU_EXPORT ImageProcessorBackend {
public:
using FrameReadyCB = base::OnceCallback<void(scoped_refptr<VideoFrame>)>;
using LegacyFrameReadyCB =
base::OnceCallback<void(size_t, scoped_refptr<VideoFrame>)>;
using ErrorCB = base::RepeatingClosure;
enum class OutputMode { ALLOCATE, IMPORT };
struct MEDIA_GPU_EXPORT PortConfig {
PortConfig() = delete;
PortConfig(const PortConfig&);
PortConfig(
Fourcc fourcc,
const gfx::Size& size,
const std::vector<ColorPlaneLayout>& planes,
const gfx::Rect& visible_rect,
const std::vector<VideoFrame::StorageType>& preferred_storage_types);
~PortConfig();
bool operator==(const PortConfig& other) const {
return fourcc == other.fourcc && size == other.size &&
planes == other.planes && visible_rect == other.visible_rect &&
preferred_storage_types == other.preferred_storage_types;
}
bool operator!=(const PortConfig& other) const { return !(*this == other); }
VideoFrame::StorageType storage_type() const {
return preferred_storage_types.empty() ? VideoFrame::STORAGE_UNKNOWN
: preferred_storage_types.front();
}
std::string ToString() const;
const Fourcc fourcc;
const gfx::Size size;
const std::vector<ColorPlaneLayout> planes;
const gfx::Rect visible_rect;
const std::vector<VideoFrame::StorageType> preferred_storage_types;
};
virtual void Process(scoped_refptr<VideoFrame> input_frame,
scoped_refptr<VideoFrame> output_frame,
FrameReadyCB cb) = 0;
virtual void ProcessLegacy(scoped_refptr<VideoFrame> frame,
LegacyFrameReadyCB cb);
virtual void Reset();
const PortConfig& input_config() const { return input_config_; }
const PortConfig& output_config() const { return output_config_; }
OutputMode output_mode() const { return output_mode_; }
virtual bool needs_linear_output_buffers() const;
virtual bool supports_incoherent_buffers() const;
const scoped_refptr<base::SequencedTaskRunner>& task_runner() const {
return backend_task_runner_;
}
virtual std::string type() const = 0;
protected:
friend struct std::default_delete<ImageProcessorBackend>;
ImageProcessorBackend(
const PortConfig& input_config,
const PortConfig& output_config,
OutputMode output_mode,
VideoRotation relative_rotation,
ErrorCB error_cb,
scoped_refptr<base::SequencedTaskRunner> backend_task_runner);
virtual ~ImageProcessorBackend();
virtual void Destroy();
const PortConfig input_config_;
const PortConfig output_config_;
const OutputMode output_mode_;
const VideoRotation relative_rotation_;
const ErrorCB error_cb_;
const scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
SEQUENCE_CHECKER(backend_sequence_checker_);
};
}
namespace std {
template <>
struct MEDIA_GPU_EXPORT default_delete<media::ImageProcessorBackend> {
constexpr default_delete() = default;
template <
typename U,
typename = typename std::enable_if<
std::is_convertible<U*, media::ImageProcessorBackend*>::value>::type>
default_delete(const default_delete<U>& d) {}
void operator()(media::ImageProcessorBackend* ptr) const;
};
}
#endif