#ifndef REMOTING_CLIENT_SOFTWARE_VIDEO_RENDERER_H_
#define REMOTING_CLIENT_SOFTWARE_VIDEO_RENDERER_H_
#include <stdint.h>
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "remoting/protocol/video_renderer.h"
#include "remoting/protocol/video_stub.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace webrtc {
class DesktopFrame;
}
namespace remoting {
class VideoDecoder;
namespace protocol {
class FrameConsumer;
struct FrameStats;
class FrameStatsConsumer;
}
class SoftwareVideoRenderer : public protocol::VideoRenderer,
public protocol::VideoStub {
public:
explicit SoftwareVideoRenderer(protocol::FrameConsumer* consumer);
explicit SoftwareVideoRenderer(
std::unique_ptr<protocol::FrameConsumer> consumer);
SoftwareVideoRenderer(const SoftwareVideoRenderer&) = delete;
SoftwareVideoRenderer& operator=(const SoftwareVideoRenderer&) = delete;
~SoftwareVideoRenderer() override;
bool Initialize(const ClientContext& client_context,
protocol::FrameStatsConsumer* stats_consumer) override;
void OnSessionConfig(const protocol::SessionConfig& config) override;
protocol::VideoStub* GetVideoStub() override;
protocol::FrameConsumer* GetFrameConsumer() override;
protocol::FrameStatsConsumer* GetFrameStatsConsumer() override;
void ProcessVideoPacket(std::unique_ptr<VideoPacket> packet,
base::OnceClosure done) override;
private:
void RenderFrame(std::unique_ptr<protocol::FrameStats> stats,
base::OnceClosure done,
std::unique_ptr<webrtc::DesktopFrame> frame);
void OnFrameRendered(std::unique_ptr<protocol::FrameStats> stats,
base::OnceClosure done);
scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner_;
std::unique_ptr<protocol::FrameConsumer> owned_consumer_;
const raw_ptr<protocol::FrameConsumer> consumer_;
raw_ptr<protocol::FrameStatsConsumer> stats_consumer_ = nullptr;
std::unique_ptr<VideoDecoder> decoder_;
webrtc::DesktopSize source_size_;
webrtc::DesktopVector source_dpi_;
base::ThreadChecker thread_checker_;
base::WeakPtrFactory<SoftwareVideoRenderer> weak_factory_{this};
};
}
#endif