diff --git a/webrtc/DEPS b/webrtc/DEPS index 292c99685b..aebafa72ab 100644 --- a/webrtc/DEPS +++ b/webrtc/DEPS @@ -44,4 +44,7 @@ specific_include_rules = { "video_frame\.h": [ "+webrtc/common_video", ], + "video_renderer\.h": [ + "+webrtc/media/base", + ], } diff --git a/webrtc/call/call_perf_tests.cc b/webrtc/call/call_perf_tests.cc index beb05a047d..7501ada956 100644 --- a/webrtc/call/call_perf_tests.cc +++ b/webrtc/call/call_perf_tests.cc @@ -88,8 +88,7 @@ class VideoRtcpAndSyncObserver : public test::RtpRtcpObserver, first_time_in_sync_(-1), receive_stream_(nullptr) {} - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { VideoReceiveStream::Stats stats; { rtc::CritScope lock(&crit_); @@ -129,8 +128,6 @@ class VideoRtcpAndSyncObserver : public test::RtpRtcpObserver, } } - bool IsTextureSupported() const override { return false; } - void set_receive_stream(VideoReceiveStream* receive_stream) { rtc::CritScope lock(&crit_); receive_stream_ = receive_stream; @@ -377,8 +374,7 @@ void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, nullptr, this, test::PacketTransport::kReceiver, net_config_); } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { rtc::CritScope lock(&crit_); if (video_frame.ntp_time_ms() <= 0) { // Haven't got enough RTCP SR in order to calculate the capture ntp @@ -417,8 +413,6 @@ void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config, EXPECT_TRUE(std::abs(time_offset_ms) < threshold_ms_); } - bool IsTextureSupported() const override { return false; } - virtual Action OnSendRtp(const uint8_t* packet, size_t length) { rtc::CritScope lock(&crit_); RTPHeader header; diff --git a/webrtc/media/engine/fakewebrtccall.cc b/webrtc/media/engine/fakewebrtccall.cc index 3277e75a64..5b2f0a73c4 100644 --- a/webrtc/media/engine/fakewebrtccall.cc +++ b/webrtc/media/engine/fakewebrtccall.cc @@ -202,9 +202,8 @@ bool FakeVideoReceiveStream::IsReceiving() const { return receiving_; } -void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame, - int time_to_render_ms) { - config_.renderer->RenderFrame(frame, time_to_render_ms); +void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame) { + config_.renderer->OnFrame(frame); } webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const { diff --git a/webrtc/media/engine/fakewebrtccall.h b/webrtc/media/engine/fakewebrtccall.h index 41a92dfac0..cf96cc53f6 100644 --- a/webrtc/media/engine/fakewebrtccall.h +++ b/webrtc/media/engine/fakewebrtccall.h @@ -159,7 +159,7 @@ class FakeVideoReceiveStream final : public webrtc::VideoReceiveStream { bool IsReceiving() const; - void InjectFrame(const webrtc::VideoFrame& frame, int time_to_render_ms); + void InjectFrame(const webrtc::VideoFrame& frame); void SetStats(const webrtc::VideoReceiveStream::Stats& stats); diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc index 2d8cf00de2..395dcb5737 100644 --- a/webrtc/media/engine/webrtcvideoengine2.cc +++ b/webrtc/media/engine/webrtcvideoengine2.cc @@ -2358,9 +2358,8 @@ void WebRtcVideoChannel2::WebRtcVideoReceiveStream::ClearDecoders( allocated_decoders->clear(); } -void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RenderFrame( - const webrtc::VideoFrame& frame, - int time_to_render_ms) { +void WebRtcVideoChannel2::WebRtcVideoReceiveStream::OnFrame( + const webrtc::VideoFrame& frame) { rtc::CritScope crit(&sink_lock_); if (first_frame_timestamp_ < 0) @@ -2387,10 +2386,6 @@ void WebRtcVideoChannel2::WebRtcVideoReceiveStream::RenderFrame( sink_->OnFrame(render_frame); } -bool WebRtcVideoChannel2::WebRtcVideoReceiveStream::IsTextureSupported() const { - return true; -} - bool WebRtcVideoChannel2::WebRtcVideoReceiveStream::SmoothsRenderedFrames() const { return disable_prerenderer_smoothing_; diff --git a/webrtc/media/engine/webrtcvideoengine2.h b/webrtc/media/engine/webrtcvideoengine2.h index 171f26ab39..27eadb299a 100644 --- a/webrtc/media/engine/webrtcvideoengine2.h +++ b/webrtc/media/engine/webrtcvideoengine2.h @@ -417,9 +417,7 @@ class WebRtcVideoChannel2 : public VideoMediaChannel, public webrtc::Transport { webrtc::RtcpMode rtcp_mode); void SetRecvParameters(const ChangedRecvParameters& recv_params); - void RenderFrame(const webrtc::VideoFrame& frame, - int time_to_render_ms) override; - bool IsTextureSupported() const override; + void OnFrame(const webrtc::VideoFrame& frame) override; bool SmoothsRenderedFrames() const override; bool IsDefaultStream() const; diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc index 21c4fd20ce..81f0e5b168 100644 --- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc +++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc @@ -2068,7 +2068,7 @@ TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeCorrectly) { video_frame.set_timestamp(kInitialTimestamp); // Initial NTP time is not available on the first frame, but should still be // able to be estimated. - stream->InjectFrame(video_frame, 0); + stream->InjectFrame(video_frame); EXPECT_EQ(1, renderer.num_rendered_frames()); @@ -2077,7 +2077,7 @@ TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeCorrectly) { // here. video_frame.set_timestamp(kFrameOffsetMs * 90 - 1); video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs); - stream->InjectFrame(video_frame, 0); + stream->InjectFrame(video_frame); EXPECT_EQ(2, renderer.num_rendered_frames()); diff --git a/webrtc/test/gl/gl_renderer.cc b/webrtc/test/gl/gl_renderer.cc index ff87d9999a..8ce373b1c1 100644 --- a/webrtc/test/gl/gl_renderer.cc +++ b/webrtc/test/gl/gl_renderer.cc @@ -69,8 +69,7 @@ void GlRenderer::ResizeVideo(size_t width, size_t height) { GL_UNSIGNED_INT_8_8_8_8, static_cast(buffer_)); } -void GlRenderer::RenderFrame(const webrtc::VideoFrame& frame, - int /*render_delay_ms*/) { +void GlRenderer::OnFrame(const webrtc::VideoFrame& frame) { assert(is_init_); if (static_cast(frame.width()) != width_ || diff --git a/webrtc/test/gl/gl_renderer.h b/webrtc/test/gl/gl_renderer.h index 7682d3c918..01dc18db65 100644 --- a/webrtc/test/gl/gl_renderer.h +++ b/webrtc/test/gl/gl_renderer.h @@ -26,8 +26,7 @@ namespace test { class GlRenderer : public VideoRenderer { public: - void RenderFrame(const webrtc::VideoFrame& frame, - int time_to_render_ms) override; + void OnFrame(const webrtc::VideoFrame& frame) override; protected: GlRenderer(); diff --git a/webrtc/test/linux/glx_renderer.cc b/webrtc/test/linux/glx_renderer.cc index c5071dea91..d6979c8a58 100644 --- a/webrtc/test/linux/glx_renderer.cc +++ b/webrtc/test/linux/glx_renderer.cc @@ -144,8 +144,7 @@ void GlxRenderer::Resize(size_t width, size_t height) { XConfigureWindow(display_, window_, CWWidth | CWHeight, &wc); } -void GlxRenderer::RenderFrame(const webrtc::VideoFrame& frame, - int /*render_delay_ms*/) { +void GlxRenderer::OnFrame(const webrtc::VideoFrame& frame) { if (static_cast(frame.width()) != width_ || static_cast(frame.height()) != height_) { Resize(static_cast(frame.width()), @@ -168,7 +167,7 @@ void GlxRenderer::RenderFrame(const webrtc::VideoFrame& frame, } } - GlRenderer::RenderFrame(frame, 0); + GlRenderer::OnFrame(frame); glXSwapBuffers(display_, window_); if (!glXMakeCurrent(display_, None, NULL)) { diff --git a/webrtc/test/linux/glx_renderer.h b/webrtc/test/linux/glx_renderer.h index c117281cf1..4a758db0e8 100644 --- a/webrtc/test/linux/glx_renderer.h +++ b/webrtc/test/linux/glx_renderer.h @@ -26,8 +26,7 @@ class GlxRenderer : public GlRenderer { size_t height); virtual ~GlxRenderer(); - void RenderFrame(const webrtc::VideoFrame& frame, int delta) override; - bool IsTextureSupported() const override { return false; } + void OnFrame(const webrtc::VideoFrame& frame) override; private: GlxRenderer(size_t width, size_t height); diff --git a/webrtc/test/mac/video_renderer_mac.h b/webrtc/test/mac/video_renderer_mac.h index 7baf794744..702f5ae267 100644 --- a/webrtc/test/mac/video_renderer_mac.h +++ b/webrtc/test/mac/video_renderer_mac.h @@ -27,8 +27,7 @@ class MacRenderer : public GlRenderer { bool Init(const char* window_title, int width, int height); // Implements GlRenderer. - void RenderFrame(const VideoFrame& frame, int delta) override; - bool IsTextureSupported() const override { return false; } + void OnFrame(const VideoFrame& frame) override; private: CocoaWindow* window_; diff --git a/webrtc/test/mac/video_renderer_mac.mm b/webrtc/test/mac/video_renderer_mac.mm index 9cde95a982..f79aecf916 100644 --- a/webrtc/test/mac/video_renderer_mac.mm +++ b/webrtc/test/mac/video_renderer_mac.mm @@ -125,9 +125,9 @@ bool MacRenderer::Init(const char* window_title, int width, int height) { return true; } -void MacRenderer::RenderFrame(const VideoFrame& frame, int /*delta*/) { +void MacRenderer::OnFrame(const VideoFrame& frame) { [window_ makeCurrentContext]; - GlRenderer::RenderFrame(frame, 0); + GlRenderer::OnFrame(frame); } } // test diff --git a/webrtc/test/video_renderer.cc b/webrtc/test/video_renderer.cc index c7b60e5949..1af1ff8c1b 100644 --- a/webrtc/test/video_renderer.cc +++ b/webrtc/test/video_renderer.cc @@ -17,9 +17,7 @@ namespace webrtc { namespace test { class NullRenderer : public VideoRenderer { - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override {} - bool IsTextureSupported() const override { return false; } + void OnFrame(const VideoFrame& video_frame) override {} }; VideoRenderer* VideoRenderer::Create(const char* window_title, diff --git a/webrtc/test/win/d3d_renderer.cc b/webrtc/test/win/d3d_renderer.cc index 86900e93dd..e09b32d28e 100644 --- a/webrtc/test/win/d3d_renderer.cc +++ b/webrtc/test/win/d3d_renderer.cc @@ -191,8 +191,7 @@ void D3dRenderer::Resize(size_t width, size_t height) { vertex_buffer_->Unlock(); } -void D3dRenderer::RenderFrame(const webrtc::VideoFrame& frame, - int /*render_delay_ms*/) { +void D3dRenderer::OnFrame(const webrtc::VideoFrame& frame) { if (static_cast(frame.width()) != width_ || static_cast(frame.height()) != height_) { Resize(static_cast(frame.width()), diff --git a/webrtc/test/win/d3d_renderer.h b/webrtc/test/win/d3d_renderer.h index cf2319edc4..575d9c7f5d 100644 --- a/webrtc/test/win/d3d_renderer.h +++ b/webrtc/test/win/d3d_renderer.h @@ -27,8 +27,7 @@ class D3dRenderer : public VideoRenderer { size_t height); virtual ~D3dRenderer(); - void RenderFrame(const webrtc::VideoFrame& frame, int delta) override; - bool IsTextureSupported() const override { return false; } + void OnFrame(const webrtc::VideoFrame& frame) override; private: D3dRenderer(size_t width, size_t height); diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 812c38e57b..b86b2c9d30 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -127,12 +127,7 @@ TEST_F(EndToEndTest, RendersSingleDelayedFrame) { public: Renderer() : event_(false, false) {} - void RenderFrame(const VideoFrame& video_frame, - int /*time_to_render_ms*/) override { - event_.Set(); - } - - bool IsTextureSupported() const override { return false; } + void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } bool Wait() { return event_.Wait(kDefaultTimeoutMs); } @@ -195,11 +190,7 @@ TEST_F(EndToEndTest, TransmitsFirstFrame) { public: Renderer() : event_(false, false) {} - void RenderFrame(const VideoFrame& video_frame, - int /*time_to_render_ms*/) override { - event_.Set(); - } - bool IsTextureSupported() const override { return false; } + void OnFrame(const VideoFrame& video_frame) override { event_.Set(); } bool Wait() { return event_.Wait(kDefaultTimeoutMs); } @@ -272,15 +263,12 @@ TEST_F(EndToEndTest, SendsAndReceivesVP9) { (*receive_configs)[0].decoders[0].decoder = decoder_.get(); } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { const int kRequiredFrames = 500; if (++frame_counter_ == kRequiredFrames) observation_complete_.Set(); } - bool IsTextureSupported() const override { return false; } - private: std::unique_ptr encoder_; std::unique_ptr decoder_; @@ -328,15 +316,12 @@ TEST_F(EndToEndTest, SendsAndReceivesH264) { (*receive_configs)[0].decoders[0].decoder = decoder_.get(); } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { const int kRequiredFrames = 500; if (++frame_counter_ == kRequiredFrames) observation_complete_.Set(); } - bool IsTextureSupported() const override { return false; } - private: std::unique_ptr encoder_; std::unique_ptr decoder_; @@ -521,8 +506,7 @@ TEST_F(EndToEndTest, CanReceiveFec) { return SEND_PACKET; } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { rtc::CritScope lock(&crit_); // Rendering frame with timestamp of packet that was dropped -> FEC // protection worked. @@ -530,8 +514,6 @@ TEST_F(EndToEndTest, CanReceiveFec) { observation_complete_.Set(); } - bool IsTextureSupported() const override { return false; } - enum { kFirstPacket, kDropEveryOtherPacketUntilFec, @@ -850,16 +832,13 @@ TEST_F(EndToEndTest, UsesFrameCallbacks) { public: Renderer() : event_(false, false) {} - void RenderFrame(const VideoFrame& video_frame, - int /*time_to_render_ms*/) override { + void OnFrame(const VideoFrame& video_frame) override { EXPECT_EQ(0, *video_frame.buffer(kYPlane)) << "Rendered frame should have zero luma which is applied by the " "pre-render callback."; event_.Set(); } - bool IsTextureSupported() const override { return false; } - bool Wait() { return event_.Wait(kDefaultTimeoutMs); } rtc::Event event_; } renderer; @@ -997,8 +976,7 @@ void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) { return SEND_PACKET; } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { rtc::CritScope lock(&crit_); if (received_pli_ && video_frame.timestamp() > highest_dropped_timestamp_) { @@ -1008,8 +986,6 @@ void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) { frames_to_drop_ = kPacketsToDrop; } - bool IsTextureSupported() const override { return false; } - void ModifyVideoConfigs( VideoSendStream::Config* send_config, std::vector* receive_configs, @@ -1323,8 +1299,7 @@ TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { frame_generator_(frame_generator), done_(false, false) {} - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { EXPECT_EQ(settings_.width, video_frame.width()); EXPECT_EQ(settings_.height, video_frame.height()); (*frame_generator_)->Stop(); @@ -1333,8 +1308,6 @@ TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) { uint32_t Ssrc() { return ssrc_; } - bool IsTextureSupported() const override { return false; } - bool Wait() { return done_.Wait(kDefaultTimeoutMs); } private: diff --git a/webrtc/video/replay.cc b/webrtc/video/replay.cc index 52b6ff6075..3bfa7ff949 100644 --- a/webrtc/video/replay.cc +++ b/webrtc/video/replay.cc @@ -152,10 +152,9 @@ class FileRenderPassthrough : public VideoRenderer { } private: - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { if (renderer_ != nullptr) - renderer_->RenderFrame(video_frame, time_to_render_ms); + renderer_->OnFrame(video_frame); if (basename_.empty()) return; if (last_width_ != video_frame.width() || @@ -182,8 +181,6 @@ class FileRenderPassthrough : public VideoRenderer { PrintVideoFrame(video_frame, file_); } - bool IsTextureSupported() const override { return false; } - const std::string basename_; VideoRenderer* const renderer_; FILE* file_; diff --git a/webrtc/video/video_capture_input.cc b/webrtc/video/video_capture_input.cc index 18decb2a88..e355a74f48 100644 --- a/webrtc/video/video_capture_input.cc +++ b/webrtc/video/video_capture_input.cc @@ -47,7 +47,7 @@ void VideoCaptureInput::IncomingCapturedFrame(const VideoFrame& video_frame) { // TODO(pbos): Remove local rendering, it should be handled by the client code // if required. if (local_renderer_) - local_renderer_->RenderFrame(video_frame, 0); + local_renderer_->OnFrame(video_frame); stats_proxy_->OnIncomingFrame(video_frame.width(), video_frame.height()); diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc index 8dfbc79749..e2eb913199 100644 --- a/webrtc/video/video_quality_test.cc +++ b/webrtc/video/video_quality_test.cc @@ -205,8 +205,7 @@ class VideoAnalyzer : public PacketReceiver, encoded_frame_size_.AddSample(frame.length_); } - void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) override { + void OnFrame(const VideoFrame& video_frame) override { int64_t render_time_ms = Clock::GetRealTimeClock()->CurrentNtpInMilliseconds(); @@ -246,8 +245,6 @@ class VideoAnalyzer : public PacketReceiver, last_rendered_frame_ = video_frame; } - bool IsTextureSupported() const override { return false; } - void Wait() { // Frame comparisons can be very expensive. Wait for test to be done, but // at time-out check if frames_processed is going up. If so, give it more diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc index 6cc2794190..cb2515bec1 100644 --- a/webrtc/video/video_receive_stream.cc +++ b/webrtc/video/video_receive_stream.cc @@ -388,14 +388,8 @@ int VideoReceiveStream::RenderFrame(const uint32_t /*stream_id*/, if (vie_sync_.GetStreamSyncOffsetInMs(video_frame, &sync_offset_ms)) stats_proxy_.OnSyncOffsetUpdated(sync_offset_ms); - // TODO(pbos): Wire up config_.render->IsTextureSupported() and convert if not - // supported. Or provide methods for converting a texture frame in - // VideoFrame. - if (config_.renderer != nullptr) - config_.renderer->RenderFrame( - video_frame, - video_frame.render_time_ms() - clock_->TimeInMilliseconds()); + config_.renderer->OnFrame(video_frame); stats_proxy_.OnRenderedFrame(video_frame); diff --git a/webrtc/video_renderer.h b/webrtc/video_renderer.h index 7cb9ed1aa5..85c4ac58e4 100644 --- a/webrtc/video_renderer.h +++ b/webrtc/video_renderer.h @@ -11,20 +11,14 @@ #ifndef WEBRTC_VIDEO_RENDERER_H_ #define WEBRTC_VIDEO_RENDERER_H_ +#include "webrtc/media/base/videosinkinterface.h" + namespace webrtc { class VideoFrame; -class VideoRenderer { +class VideoRenderer : public rtc::VideoSinkInterface { public: - // This function should return as soon as possible and not block until it's - // time to render the frame. - // TODO(mflodman) Remove time_to_render_ms when VideoFrame contains NTP. - virtual void RenderFrame(const VideoFrame& video_frame, - int time_to_render_ms) = 0; - - virtual bool IsTextureSupported() const = 0; - // This function returns true if WebRTC should not delay frames for // smoothness. In general, this case means the renderer can schedule frames to // optimize smoothness.