#pragma once
#include <atomic>
#include <cstdint>
#include <memory>
#include <mutex>
#include "api/video/encoded_image.h"
#include "api/video/video_frame_buffer.h"
namespace livekit {
enum class EncodedVideoCodec {
kH264,
kH265,
kVP8,
kVP9,
kAV1,
};
enum class EncodedFrameType {
kKey,
kDelta,
};
struct EncodedRateControlRequest {
bool has_request = false;
uint64_t target_bitrate_bps = 0;
double framerate_fps = 0.0;
};
class EncodedRateControlState {
public:
void Store(uint64_t target_bitrate_bps, double framerate_fps);
EncodedRateControlRequest Take();
private:
std::mutex mutex_;
EncodedRateControlRequest request_;
};
class EncodedVideoFrameBuffer : public webrtc::VideoFrameBuffer {
public:
EncodedVideoFrameBuffer(
int width,
int height,
EncodedVideoCodec codec,
EncodedFrameType frame_type,
webrtc::scoped_refptr<webrtc::EncodedImageBuffer> payload,
std::shared_ptr<std::atomic<bool>> keyframe_request_flag = nullptr,
std::shared_ptr<EncodedRateControlState> rate_control_state = nullptr);
~EncodedVideoFrameBuffer() override = default;
Type type() const override;
int width() const override;
int height() const override;
webrtc::scoped_refptr<webrtc::I420BufferInterface> ToI420() override;
webrtc::scoped_refptr<webrtc::VideoFrameBuffer> CropAndScale(
int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) override;
EncodedVideoCodec codec() const { return codec_; }
EncodedFrameType frame_type() const { return frame_type_; }
webrtc::scoped_refptr<webrtc::EncodedImageBuffer> encoded_data() const {
return payload_;
}
const uint8_t* payload_data() const { return payload_->data(); }
size_t payload_size() const { return payload_->size(); }
void request_keyframe() const;
void set_rate_control_request(uint64_t target_bitrate_bps,
double framerate_fps) const;
static EncodedVideoFrameBuffer* FromNative(webrtc::VideoFrameBuffer* buffer);
private:
int width_;
int height_;
EncodedVideoCodec codec_;
EncodedFrameType frame_type_;
webrtc::scoped_refptr<webrtc::EncodedImageBuffer> payload_;
std::shared_ptr<std::atomic<bool>> keyframe_request_flag_;
std::shared_ptr<EncodedRateControlState> rate_control_state_;
};
}