| Index: webrtc/test/fake_encoder.cc
|
| diff --git a/webrtc/test/fake_encoder.cc b/webrtc/test/fake_encoder.cc
|
| index 72df40f9a51690f3b81bd0c25f30cab36c23dff0..e3f8b3d0cea64c15b191ec16ca1da822f381ca11 100644
|
| --- a/webrtc/test/fake_encoder.cc
|
| +++ b/webrtc/test/fake_encoder.cc
|
| @@ -203,5 +203,81 @@ int32_t DelayedEncoder::Encode(const VideoFrame& input_image,
|
| SleepMs(delay_ms_);
|
| return FakeEncoder::Encode(input_image, codec_specific_info, frame_types);
|
| }
|
| +
|
| +InternalSourceEncoder::InternalSourceEncoder(Clock* clock,
|
| + uint32_t frame_period_ms,
|
| + uint32_t first_frame_timestamp_ms)
|
| + : test::FakeEncoder(clock),
|
| + thread_(EncoderProcess, this, "InternalSourceEncoderProcess"),
|
| + frame_period_ms_(frame_period_ms),
|
| + current_frame_timestamp_ms_(first_frame_timestamp_ms),
|
| + shutting_down_(false),
|
| + next_frame_type_(kVideoFrameKey) {}
|
| +
|
| +int32_t InternalSourceEncoder::InitEncode(const VideoCodec* config,
|
| + int32_t number_of_cores,
|
| + size_t max_payload_size) {
|
| + int32_t result =
|
| + test::FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
|
| + thread_.Start();
|
| + return result;
|
| +}
|
| +
|
| +bool InternalSourceEncoder::EncoderProcess(void* encoder_void_ptr) {
|
| + InternalSourceEncoder* encoder =
|
| + static_cast<InternalSourceEncoder*>(encoder_void_ptr);
|
| + SleepMs(encoder->frame_period_ms_);
|
| + return encoder->EncodeFrame();
|
| +}
|
| +
|
| +bool InternalSourceEncoder::EncodeFrame() {
|
| + FrameType frame_type;
|
| + {
|
| + rtc::CritScope crit(&lock_);
|
| + if (shutting_down_) {
|
| + return false;
|
| + }
|
| + frame_type = next_frame_type_;
|
| + // Reset the frame type, now that we've consumed a keyframe request (if it
|
| + // was kVideoFrameKey).
|
| + next_frame_type_ = kVideoFrameDelta;
|
| + }
|
| + VideoFrame input_image(rtc::scoped_refptr<webrtc::VideoFrameBuffer>(),
|
| + current_frame_timestamp_ms_ * 90,
|
| + current_frame_timestamp_ms_, kVideoRotation_0);
|
| + current_frame_timestamp_ms_ += frame_period_ms_;
|
| + std::vector<FrameType> frame_types{frame_type};
|
| +
|
| + // Call the base class explicitly, to skip our no-op override.
|
| + test::FakeEncoder::Encode(input_image, nullptr, &frame_types);
|
| + return true;
|
| +}
|
| +
|
| +int32_t InternalSourceEncoder::Release() {
|
| + {
|
| + rtc::CritScope crit(&lock_);
|
| + shutting_down_ = true;
|
| + }
|
| + thread_.Stop();
|
| + return test::FakeEncoder::Release();
|
| +}
|
| +
|
| +int32_t InternalSourceEncoder::Encode(
|
| + const VideoFrame& input_image,
|
| + const CodecSpecificInfo* codec_specific_info,
|
| + const std::vector<FrameType>* frame_types) {
|
| + // Check for keyframe requests.
|
| + if (frame_types) {
|
| + for (FrameType type : *frame_types) {
|
| + if (type == kVideoFrameKey) {
|
| + rtc::CritScope crit(&lock_);
|
| + next_frame_type_ = kVideoFrameKey;
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + return WEBRTC_VIDEO_CODEC_OK;
|
| +}
|
| +
|
| } // namespace test
|
| } // namespace webrtc
|
|
|