blob: 6f0b9d0ec7cf40f2c81be5d626b84dbf9205b443 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_PROTOCOL_WEBRTC_VIDEO_FRAME_ADAPTER_H_
#define REMOTING_PROTOCOL_WEBRTC_VIDEO_FRAME_ADAPTER_H_
#include <memory>
#include "remoting/codec/webrtc_video_encoder.h"
#include "third_party/webrtc/api/video/video_frame.h"
#include "third_party/webrtc/api/video/video_frame_buffer.h"
#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
namespace remoting::protocol {
// Adapter class to wrap a DesktopFrame produced by the capturer, and provide
// it as a VideoFrame to the WebRTC video sink. The encoder will extract the
// captured DesktopFrame from VideoFrame::video_frame_buffer().
class WebrtcVideoFrameAdapter : public webrtc::VideoFrameBuffer {
public:
WebrtcVideoFrameAdapter(
std::unique_ptr<webrtc::DesktopFrame> frame,
std::unique_ptr<WebrtcVideoEncoder::FrameStats> frame_stats);
~WebrtcVideoFrameAdapter() override;
WebrtcVideoFrameAdapter(const WebrtcVideoFrameAdapter&) = delete;
WebrtcVideoFrameAdapter& operator=(const WebrtcVideoFrameAdapter&) = delete;
// Returns a VideoFrame that wraps the provided DesktopFrame.
static webrtc::VideoFrame CreateVideoFrame(
std::unique_ptr<webrtc::DesktopFrame> desktop_frame,
std::unique_ptr<WebrtcVideoEncoder::FrameStats> frame_stats);
// Used by the encoder. After this returns, the adapter no longer wraps a
// DesktopFrame.
std::unique_ptr<webrtc::DesktopFrame> TakeDesktopFrame();
// Called by the encoder to transfer the frame stats out of this adapter
// into the EncodedFrame. The encoder will also set the encode start/end
// times.
std::unique_ptr<WebrtcVideoEncoder::FrameStats> TakeFrameStats();
// webrtc::VideoFrameBuffer overrides.
Type type() const override;
int width() const override;
int height() const override;
rtc::scoped_refptr<webrtc::I420BufferInterface> ToI420() override;
private:
std::unique_ptr<webrtc::DesktopFrame> frame_;
webrtc::DesktopSize frame_size_;
std::unique_ptr<WebrtcVideoEncoder::FrameStats> frame_stats_;
};
} // namespace remoting::protocol
#endif // REMOTING_PROTOCOL_WEBRTC_VIDEO_FRAME_ADAPTER_H_