#ifndef REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
#define REMOTING_CODEC_VIDEO_ENCODER_VPX_H_
#include "base/containers/heap_array.h"
#include "base/memory/raw_ptr.h"
#include "base/time/default_tick_clock.h"
#include "base/time/time.h"
#include "remoting/codec/scoped_vpx_codec.h"
#include "remoting/codec/video_encoder.h"
#include "remoting/codec/video_encoder_helper.h"
typedef struct vpx_image vpx_image_t;
namespace webrtc {
class DesktopRegion;
class DesktopSize;
}
namespace remoting {
class VideoEncoderVpx : public VideoEncoder {
public:
static std::unique_ptr<VideoEncoderVpx> CreateForVP8();
static std::unique_ptr<VideoEncoderVpx> CreateForVP9();
VideoEncoderVpx(const VideoEncoderVpx&) = delete;
VideoEncoderVpx& operator=(const VideoEncoderVpx&) = delete;
~VideoEncoderVpx() override;
void SetTickClockForTests(const base::TickClock* tick_clock);
void SetLosslessColor(bool want_lossless) override;
std::unique_ptr<VideoPacket> Encode(
const webrtc::DesktopFrame& frame) override;
private:
explicit VideoEncoderVpx(bool use_vp9);
void Configure(const webrtc::DesktopSize& size);
void PrepareImage(const webrtc::DesktopFrame& frame,
webrtc::DesktopRegion* updated_region);
void SetActiveMapFromRegion(const webrtc::DesktopRegion& updated_region);
void UpdateRegionFromActiveMap(webrtc::DesktopRegion* updated_region);
const bool use_vp9_;
bool lossless_color_ = false;
ScopedVpxCodec codec_;
base::TimeTicks timestamp_base_;
std::unique_ptr<vpx_image_t> image_;
base::HeapArray<uint8_t> image_buffer_;
base::HeapArray<uint8_t> active_map_;
webrtc::DesktopSize active_map_size_;
bool encode_unchanged_frame_;
VideoEncoderHelper helper_;
raw_ptr<const base::TickClock> clock_;
};
}
#endif