#ifndef MEDIA_CAST_ENCODING_VPX_ENCODER_H_
#define MEDIA_CAST_ENCODING_VPX_ENCODER_H_
#include <stdint.h>
#include "base/memory/raw_ref.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "media/base/feedback_signal_accumulator.h"
#include "media/cast/cast_config.h"
#include "media/cast/common/frame_id.h"
#include "media/cast/encoding/software_video_encoder.h"
#include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h"
#include "ui/gfx/geometry/size.h"
namespace media {
class VideoEncoderMetricsProvider;
class VideoFrame;
namespace cast {
class VpxEncoder final : public SoftwareVideoEncoder {
public:
VpxEncoder(const FrameSenderConfig& video_config,
std::unique_ptr<VideoEncoderMetricsProvider> metrics_provider);
~VpxEncoder() final;
VpxEncoder(const VpxEncoder&) = delete;
VpxEncoder& operator=(const VpxEncoder&) = delete;
VpxEncoder(VpxEncoder&&) = delete;
VpxEncoder& operator=(VpxEncoder&&) = delete;
void Initialize() final;
void Encode(scoped_refptr<media::VideoFrame> video_frame,
base::TimeTicks reference_time,
SenderEncodedFrame* encoded_frame) final;
void UpdateRates(uint32_t new_bitrate) final;
void GenerateKeyFrame() final;
private:
bool is_initialized() const {
return config_.g_timebase.den != 0;
}
void ConfigureForNewFrameSize(const gfx::Size& frame_size);
const FrameSenderConfig cast_config_;
const raw_ref<const VideoCodecParams> codec_params_;
const double target_encoder_utilization_;
const std::unique_ptr<VideoEncoderMetricsProvider> metrics_provider_;
vpx_codec_enc_cfg_t config_;
vpx_codec_ctx_t encoder_;
bool key_frame_requested_;
int bitrate_kbit_;
base::TimeDelta last_frame_timestamp_;
FrameId next_frame_id_;
THREAD_CHECKER(thread_checker_);
FeedbackSignalAccumulator<base::TimeDelta> encoding_speed_acc_;
int encoding_speed_;
};
}
}
#endif