| Index: webrtc/test/frame_generator_capturer.cc
|
| diff --git a/webrtc/test/frame_generator_capturer.cc b/webrtc/test/frame_generator_capturer.cc
|
| index 00efbc8b40b467e2248169349ac498997b8de3d2..e12f48527dc5bf31f9449b9279f6764a33028581 100644
|
| --- a/webrtc/test/frame_generator_capturer.cc
|
| +++ b/webrtc/test/frame_generator_capturer.cc
|
| @@ -10,8 +10,10 @@
|
|
|
| #include "webrtc/test/frame_generator_capturer.h"
|
|
|
| +#include "webrtc/api/video/i420_buffer.h"
|
| #include "webrtc/base/criticalsection.h"
|
| #include "webrtc/base/platform_thread.h"
|
| +#include "webrtc/media/base/videoadapter.h"
|
| #include "webrtc/system_wrappers/include/clock.h"
|
| #include "webrtc/system_wrappers/include/event_wrapper.h"
|
| #include "webrtc/system_wrappers/include/sleep.h"
|
| @@ -25,14 +27,12 @@ FrameGeneratorCapturer* FrameGeneratorCapturer::Create(int width,
|
| int height,
|
| int target_fps,
|
| Clock* clock) {
|
| - FrameGeneratorCapturer* capturer = new FrameGeneratorCapturer(
|
| - clock, FrameGenerator::CreateSquareGenerator(width, height), target_fps);
|
| - if (!capturer->Init()) {
|
| - delete capturer;
|
| - return NULL;
|
| - }
|
| + std::unique_ptr<FrameGeneratorCapturer> capturer(new FrameGeneratorCapturer(
|
| + clock, FrameGenerator::CreateSquareGenerator(width, height), target_fps));
|
| + if (!capturer->Init())
|
| + return nullptr;
|
|
|
| - return capturer;
|
| + return capturer.release();
|
| }
|
|
|
| FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile(
|
| @@ -41,16 +41,15 @@ FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile(
|
| size_t height,
|
| int target_fps,
|
| Clock* clock) {
|
| - FrameGeneratorCapturer* capturer = new FrameGeneratorCapturer(
|
| - clock, FrameGenerator::CreateFromYuvFile(
|
| - std::vector<std::string>(1, file_name), width, height, 1),
|
| - target_fps);
|
| - if (!capturer->Init()) {
|
| - delete capturer;
|
| - return NULL;
|
| - }
|
| -
|
| - return capturer;
|
| + std::unique_ptr<FrameGeneratorCapturer> capturer(new FrameGeneratorCapturer(
|
| + clock,
|
| + FrameGenerator::CreateFromYuvFile(std::vector<std::string>(1, file_name),
|
| + width, height, 1),
|
| + target_fps));
|
| + if (!capturer->Init())
|
| + return nullptr;
|
| +
|
| + return capturer.release();
|
| }
|
|
|
| FrameGeneratorCapturer::FrameGeneratorCapturer(
|
| @@ -72,7 +71,6 @@ FrameGeneratorCapturer::FrameGeneratorCapturer(
|
|
|
| FrameGeneratorCapturer::~FrameGeneratorCapturer() {
|
| Stop();
|
| -
|
| thread_.Stop();
|
| }
|
|
|
| @@ -84,11 +82,13 @@ void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) {
|
| bool FrameGeneratorCapturer::Init() {
|
| // This check is added because frame_generator_ might be file based and should
|
| // not crash because a file moved.
|
| - if (frame_generator_.get() == NULL)
|
| + if (frame_generator_.get() == nullptr)
|
| return false;
|
|
|
| - if (!tick_->StartTimer(true, 1000 / target_fps_))
|
| - return false;
|
| + {
|
| + rtc::CritScope cs(&lock_);
|
| + RTC_DCHECK(tick_->StartTimer(false, 1000 / target_fps_));
|
| + }
|
| thread_.Start();
|
| thread_.SetPriority(rtc::kHighPriority);
|
| return true;
|
| @@ -100,6 +100,8 @@ bool FrameGeneratorCapturer::Run(void* obj) {
|
| }
|
|
|
| void FrameGeneratorCapturer::InsertFrame() {
|
| + int64_t start_tims_ms = rtc::TimeMillis();
|
| + int64_t sleep_time_ms;
|
| {
|
| rtc::CritScope cs(&lock_);
|
| if (sending_) {
|
| @@ -109,11 +111,25 @@ void FrameGeneratorCapturer::InsertFrame() {
|
| if (first_frame_capture_time_ == -1) {
|
| first_frame_capture_time_ = frame->ntp_time_ms();
|
| }
|
| - if (sink_)
|
| - sink_->OnFrame(*frame);
|
| +
|
| + if (sink_) {
|
| + rtc::Optional<VideoFrame> out_frame = AdaptFrame(*frame);
|
| + if (out_frame)
|
| + sink_->OnFrame(*out_frame);
|
| + }
|
| + }
|
| +
|
| + if (wanted_fps_) {
|
| + sleep_time_ms = 1000 / *wanted_fps_;
|
| + } else {
|
| + sleep_time_ms = 1000 / target_fps_;
|
| }
|
| }
|
| - tick_->Wait(WEBRTC_EVENT_INFINITE);
|
| +
|
| + int64_t correction_delta = rtc::TimeMillis() - start_tims_ms;
|
| + sleep_time_ms -= correction_delta;
|
| + if (sleep_time_ms > 0)
|
| + tick_->Wait(sleep_time_ms);
|
| }
|
|
|
| void FrameGeneratorCapturer::Start() {
|
| @@ -145,6 +161,15 @@ void FrameGeneratorCapturer::AddOrUpdateSink(
|
| sink_ = sink;
|
| if (sink_wants_observer_)
|
| sink_wants_observer_->OnSinkWantsChanged(sink, wants);
|
| +
|
| + // Handle framerate within this class, just pass on resolution for possible
|
| + // adaptation.
|
| + rtc::VideoSinkWants resolution_wants = wants;
|
| + resolution_wants.max_framerate_fps = std::numeric_limits<int>::max();
|
| + VideoCapturer::AddOrUpdateSink(sink, resolution_wants);
|
| +
|
| + if (wants.max_framerate_fps < target_fps_)
|
| + wanted_fps_.emplace(wants.max_framerate_fps);
|
| }
|
|
|
| void FrameGeneratorCapturer::RemoveSink(
|
|
|