Chromium Code Reviews| 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..f0b205624a58ad45d966ecae7588ad393c9f680b 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" |
| @@ -64,6 +66,7 @@ FrameGeneratorCapturer::FrameGeneratorCapturer( |
| tick_(EventTimerWrapper::Create()), |
| thread_(FrameGeneratorCapturer::Run, this, "FrameGeneratorCapturer"), |
| frame_generator_(std::move(frame_generator)), |
| + video_adpter_(new cricket::VideoAdapter()), |
| target_fps_(target_fps), |
| first_frame_capture_time_(-1) { |
| RTC_DCHECK(frame_generator_); |
| @@ -87,8 +90,10 @@ bool FrameGeneratorCapturer::Init() { |
| if (frame_generator_.get() == NULL) |
| 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 +105,8 @@ bool FrameGeneratorCapturer::Run(void* obj) { |
| } |
| void FrameGeneratorCapturer::InsertFrame() { |
| + int64_t start_tims_ms = rtc::TimeMillis(); |
| + int64_t sleep_time_ms; |
|
kthelgason
2017/03/14 10:01:20
can this be initialized here, rather than further
sprang_webrtc
2017/03/14 14:15:02
Need to hold the lock then, so made sense to me to
|
| { |
| rtc::CritScope cs(&lock_); |
| if (sending_) { |
| @@ -109,11 +116,40 @@ void FrameGeneratorCapturer::InsertFrame() { |
| if (first_frame_capture_time_ == -1) { |
| first_frame_capture_time_ = frame->ntp_time_ms(); |
| } |
| - if (sink_) |
| - sink_->OnFrame(*frame); |
| + |
| + if (sink_) { |
| + int cropped_width = 0; |
| + int cropped_height = 0; |
|
kthelgason
2017/03/14 10:01:20
these look unused
sprang_webrtc
2017/03/14 14:15:02
They're out params from video_adpter_->AdaptFrameR
|
| + int out_width = 0; |
| + int out_height = 0; |
| + video_adpter_->AdaptFrameResolution( |
| + frame->width(), frame->height(), frame->timestamp_us() * 1000, |
| + &cropped_width, &cropped_height, &out_width, &out_height); |
| + |
| + if (out_height != frame->height() || out_width != frame->width()) { |
| + rtc::scoped_refptr<I420Buffer> scaled_buffer = |
| + I420Buffer::Create(out_width, out_height); |
| + scaled_buffer->ScaleFrom(*frame->video_frame_buffer().get()); |
| + VideoFrame adapted_frame(scaled_buffer, kVideoRotation_0, |
| + frame->timestamp_us()); |
| + sink_->OnFrame(adapted_frame); |
| + } else { |
| + sink_->OnFrame(*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); |
|
kthelgason
2017/03/14 10:01:20
the use of `tick` is behind a lock in `Init` but n
sprang_webrtc
2017/03/14 14:15:02
The lock is for |target_fps_|, not |tick_|.
|
| } |
| void FrameGeneratorCapturer::Start() { |
| @@ -145,6 +181,10 @@ void FrameGeneratorCapturer::AddOrUpdateSink( |
| sink_ = sink; |
| if (sink_wants_observer_) |
| sink_wants_observer_->OnSinkWantsChanged(sink, wants); |
| + |
| + video_adpter_->OnResolutionFramerateRequest( |
| + wants.target_pixel_count, wants.max_pixel_count, rtc::Optional<int>()); |
| + wanted_fps_ = wants.max_framerate_fps; |
| } |
| void FrameGeneratorCapturer::RemoveSink( |