diff --git a/talk/app/webrtc/objc/RTCVideoRendererAdapter.h b/talk/app/webrtc/objc/RTCVideoRendererAdapter.h index 77198608b6..117347ff9a 100644 --- a/talk/app/webrtc/objc/RTCVideoRendererAdapter.h +++ b/talk/app/webrtc/objc/RTCVideoRendererAdapter.h @@ -33,7 +33,7 @@ @property(nonatomic, readonly) id videoRenderer; @property(nonatomic, readonly) - webrtc::VideoRendererInterface* nativeVideoRenderer; + rtc::VideoSinkInterface *nativeVideoRenderer; - (instancetype)initWithVideoRenderer:(id)videoRenderer; diff --git a/talk/app/webrtc/objc/RTCVideoRendererAdapter.mm b/talk/app/webrtc/objc/RTCVideoRendererAdapter.mm index b0b21291b9..a7f7e95d05 100644 --- a/talk/app/webrtc/objc/RTCVideoRendererAdapter.mm +++ b/talk/app/webrtc/objc/RTCVideoRendererAdapter.mm @@ -36,15 +36,16 @@ namespace webrtc { -class RTCVideoRendererNativeAdapter : public VideoRendererInterface { +class RTCVideoRendererNativeAdapter + : public rtc::VideoSinkInterface { public: RTCVideoRendererNativeAdapter(RTCVideoRendererAdapter* adapter) { _adapter = adapter; _size = CGSizeZero; } - void RenderFrame(const cricket::VideoFrame* videoFrame) override { - const cricket::VideoFrame* frame = videoFrame->GetCopyWithRotationApplied(); + void OnFrame(const cricket::VideoFrame& videoFrame) override { + const cricket::VideoFrame* frame = videoFrame.GetCopyWithRotationApplied(); CGSize currentSize = CGSizeMake(frame->GetWidth(), frame->GetHeight()); if (!CGSizeEqualToSize(_size, currentSize)) { _size = currentSize; @@ -74,7 +75,7 @@ class RTCVideoRendererNativeAdapter : public VideoRendererInterface { return self; } -- (webrtc::VideoRendererInterface*)nativeVideoRenderer { +- (rtc::VideoSinkInterface *)nativeVideoRenderer { return _adapter.get(); } diff --git a/talk/app/webrtc/objc/RTCVideoTrack.mm b/talk/app/webrtc/objc/RTCVideoTrack.mm index b32f05f35e..877e92eb02 100644 --- a/talk/app/webrtc/objc/RTCVideoTrack.mm +++ b/talk/app/webrtc/objc/RTCVideoTrack.mm @@ -78,7 +78,7 @@ - (void)dealloc { for (RTCVideoRendererAdapter *adapter in _adapters) { - self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); + self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer); } } @@ -91,7 +91,8 @@ RTCVideoRendererAdapter* adapter = [[RTCVideoRendererAdapter alloc] initWithVideoRenderer:renderer]; [_adapters addObject:adapter]; - self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer); + self.nativeVideoTrack->AddOrUpdateSink(adapter.nativeVideoRenderer, + rtc::VideoSinkWants()); } - (void)removeRenderer:(id)renderer { @@ -107,7 +108,7 @@ if (indexToRemove == NSNotFound) { return; } - self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); + self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer); [_adapters removeObjectAtIndex:indexToRemove]; } diff --git a/webrtc/api/java/android/org/webrtc/SurfaceViewRenderer.java b/webrtc/api/java/android/org/webrtc/SurfaceViewRenderer.java index dbd620868f..e20f67dc32 100644 --- a/webrtc/api/java/android/org/webrtc/SurfaceViewRenderer.java +++ b/webrtc/api/java/android/org/webrtc/SurfaceViewRenderer.java @@ -31,7 +31,7 @@ import javax.microedition.khronos.egl.EGLContext; * renderFrame() is asynchronous to avoid blocking the calling thread. * This class is thread safe and handles access from potentially four different threads: * Interaction from the main app in init, release, setMirror, and setScalingtype. - * Interaction from C++ webrtc::VideoRendererInterface in renderFrame and canApplyRotation. + * Interaction from C++ rtc::VideoSinkInterface in renderFrame. * Interaction from the Activity lifecycle in surfaceCreated, surfaceChanged, and surfaceDestroyed. * Interaction with the layout framework in onMeasure and onSizeChanged. */ diff --git a/webrtc/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc index 5a323cd8cf..e93fe19bf4 100644 --- a/webrtc/api/java/jni/peerconnection_jni.cc +++ b/webrtc/api/java/jni/peerconnection_jni.cc @@ -106,7 +106,6 @@ using webrtc::SetSessionDescriptionObserver; using webrtc::StatsObserver; using webrtc::StatsReport; using webrtc::StatsReports; -using webrtc::VideoRendererInterface; using webrtc::VideoTrackSourceInterface; using webrtc::VideoTrackInterface; using webrtc::VideoTrackVector; @@ -731,32 +730,10 @@ class StatsObserverWrapper : public StatsObserver { const jmethodID j_value_ctor_; }; -// Adapter presenting a cricket::VideoRenderer as a -// webrtc::VideoRendererInterface. -class VideoRendererWrapper : public VideoRendererInterface { - public: - static VideoRendererWrapper* Create(cricket::VideoRenderer* renderer) { - if (renderer) - return new VideoRendererWrapper(renderer); - return NULL; - } - - virtual ~VideoRendererWrapper() {} - - void RenderFrame(const cricket::VideoFrame* video_frame) override { - ScopedLocalRefFrame local_ref_frame(AttachCurrentThreadIfNeeded()); - renderer_->RenderFrame(video_frame->GetCopyWithRotationApplied()); - } - - private: - explicit VideoRendererWrapper(cricket::VideoRenderer* renderer) - : renderer_(renderer) {} - scoped_ptr renderer_; -}; - -// Wrapper dispatching webrtc::VideoRendererInterface to a Java VideoRenderer +// Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer // instance. -class JavaVideoRendererWrapper : public VideoRendererInterface { +class JavaVideoRendererWrapper + : public rtc::VideoSinkInterface { public: JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) : j_callbacks_(jni, j_callbacks), @@ -776,11 +753,11 @@ class JavaVideoRendererWrapper : public VideoRendererInterface { virtual ~JavaVideoRendererWrapper() {} - void RenderFrame(const cricket::VideoFrame* video_frame) override { + void OnFrame(const cricket::VideoFrame& video_frame) override { ScopedLocalRefFrame local_ref_frame(jni()); - jobject j_frame = (video_frame->GetNativeHandle() != nullptr) - ? CricketToJavaTextureFrame(video_frame) - : CricketToJavaI420Frame(video_frame); + jobject j_frame = (video_frame.GetNativeHandle() != nullptr) + ? CricketToJavaTextureFrame(&video_frame) + : CricketToJavaI420Frame(&video_frame); // |j_callbacks_| is responsible for releasing |j_frame| with // VideoRenderer.renderFrameDone(). jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); @@ -1997,15 +1974,20 @@ JOW(jboolean, MediaStreamTrack_nativeSetEnabled)( JOW(void, VideoTrack_nativeAddRenderer)( JNIEnv* jni, jclass, jlong j_video_track_pointer, jlong j_renderer_pointer) { - reinterpret_cast(j_video_track_pointer)->AddRenderer( - reinterpret_cast(j_renderer_pointer)); + reinterpret_cast(j_video_track_pointer) + ->AddOrUpdateSink( + reinterpret_cast*>( + j_renderer_pointer), + rtc::VideoSinkWants()); } JOW(void, VideoTrack_nativeRemoveRenderer)( JNIEnv* jni, jclass, jlong j_video_track_pointer, jlong j_renderer_pointer) { - reinterpret_cast(j_video_track_pointer)->RemoveRenderer( - reinterpret_cast(j_renderer_pointer)); + reinterpret_cast(j_video_track_pointer) + ->RemoveSink( + reinterpret_cast*>( + j_renderer_pointer)); } JOW(jlong, CallSessionFileRotatingLogSink_nativeAddSink)( diff --git a/webrtc/api/java/src/org/webrtc/VideoRenderer.java b/webrtc/api/java/src/org/webrtc/VideoRenderer.java index e33a6abe8f..1b40b3a586 100644 --- a/webrtc/api/java/src/org/webrtc/VideoRenderer.java +++ b/webrtc/api/java/src/org/webrtc/VideoRenderer.java @@ -13,7 +13,7 @@ package org.webrtc; import java.nio.ByteBuffer; /** - * Java version of VideoRendererInterface. In addition to allowing clients to + * Java version of VideoSinkInterface. In addition to allowing clients to * define their own rendering behavior (by passing in a Callbacks object), this * class also provides a createGui() method for creating a GUI-rendering window * on various platforms. @@ -106,7 +106,7 @@ public class VideoRenderer { public static native void nativeCopyPlane(ByteBuffer src, int width, int height, int srcStride, ByteBuffer dst, int dstStride); - /** The real meat of VideoRendererInterface. */ + /** The real meat of VideoSinkInterface. */ public static interface Callbacks { // |frame| might have pending rotation and implementation of Callbacks // should handle that by applying rotation during rendering. The callee diff --git a/webrtc/api/mediastreaminterface.h b/webrtc/api/mediastreaminterface.h index a1ab675ab0..47460b4421 100644 --- a/webrtc/api/mediastreaminterface.h +++ b/webrtc/api/mediastreaminterface.h @@ -99,26 +99,6 @@ class MediaStreamTrackInterface : public rtc::RefCountInterface, virtual ~MediaStreamTrackInterface() {} }; -// Interface for rendering VideoFrames from a VideoTrack -class VideoRendererInterface - : public rtc::VideoSinkInterface { - public: - // |frame| may have pending rotation. For clients which can't apply rotation, - // |frame|->GetCopyWithRotationApplied() will return a frame that has the - // rotation applied. - virtual void RenderFrame(const cricket::VideoFrame* frame) = 0; - // Intended to replace RenderFrame. - void OnFrame(const cricket::VideoFrame& frame) override { - RenderFrame(&frame); - } - - protected: - // The destructor is protected to prevent deletion via the interface. - // This is so that we allow reference counted classes, where the destructor - // should never be public, to implement the interface. - virtual ~VideoRendererInterface() {} -}; - // VideoTrackSourceInterface is a reference counted source used for VideoTracks. // The same source can be used in multiple VideoTracks. class VideoTrackSourceInterface @@ -157,16 +137,6 @@ class VideoTrackInterface : public MediaStreamTrackInterface, public rtc::VideoSourceInterface { public: - // AddRenderer and RemoveRenderer are for backwards compatibility - // only. They are obsoleted by the methods of - // rtc::VideoSourceInterface. - virtual void AddRenderer(VideoRendererInterface* renderer) { - AddOrUpdateSink(renderer, rtc::VideoSinkWants()); - } - virtual void RemoveRenderer(VideoRendererInterface* renderer) { - RemoveSink(renderer); - } - // Register a video sink for this track. void AddOrUpdateSink(rtc::VideoSinkInterface* sink, const rtc::VideoSinkWants& wants) override{}; diff --git a/webrtc/api/mediastreamtrackproxy.h b/webrtc/api/mediastreamtrackproxy.h index 676ba70982..7b059b17bf 100644 --- a/webrtc/api/mediastreamtrackproxy.h +++ b/webrtc/api/mediastreamtrackproxy.h @@ -46,8 +46,6 @@ BEGIN_PROXY_MAP(VideoTrack) PROXY_METHOD1(bool, set_enabled, bool) PROXY_METHOD1(bool, set_state, TrackState) - PROXY_METHOD1(void, AddRenderer, VideoRendererInterface*) - PROXY_METHOD1(void, RemoveRenderer, VideoRendererInterface*) PROXY_METHOD2(void, AddOrUpdateSink, rtc::VideoSinkInterface*, diff --git a/webrtc/api/objc/RTCVideoRendererAdapter+Private.h b/webrtc/api/objc/RTCVideoRendererAdapter+Private.h index c181b9b41c..f0e0c6c0ad 100644 --- a/webrtc/api/objc/RTCVideoRendererAdapter+Private.h +++ b/webrtc/api/objc/RTCVideoRendererAdapter+Private.h @@ -26,12 +26,12 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly) id videoRenderer; /** - * The native VideoRendererInterface surface exposed by this adapter. Calls made + * The native VideoSinkInterface surface exposed by this adapter. Calls made * to this interface will be adapted and passed to the RTCVideoRenderer supplied * during construction. This pointer is unsafe and owned by this class. */ @property(nonatomic, readonly) - webrtc::VideoRendererInterface *nativeVideoRenderer; + rtc::VideoSinkInterface *nativeVideoRenderer; /** Initialize an RTCVideoRendererAdapter with an RTCVideoRenderer. */ - (instancetype)initWithNativeRenderer:(id)videoRenderer diff --git a/webrtc/api/objc/RTCVideoRendererAdapter.h b/webrtc/api/objc/RTCVideoRendererAdapter.h index 434a61b2bd..b0b6f04488 100644 --- a/webrtc/api/objc/RTCVideoRendererAdapter.h +++ b/webrtc/api/objc/RTCVideoRendererAdapter.h @@ -13,8 +13,8 @@ NS_ASSUME_NONNULL_BEGIN /* - * Creates a webrtc::VideoRendererInterface surface for an RTCVideoRenderer. The - * webrtc::VideoRendererInterface is used by WebRTC rendering code - this + * Creates a rtc::VideoSinkInterface surface for an RTCVideoRenderer. The + * rtc::VideoSinkInterface is used by WebRTC rendering code - this * adapter adapts calls made to that interface to the RTCVideoRenderer supplied * during construction. */ diff --git a/webrtc/api/objc/RTCVideoRendererAdapter.mm b/webrtc/api/objc/RTCVideoRendererAdapter.mm index fdaba68b9d..c4f1ed858c 100644 --- a/webrtc/api/objc/RTCVideoRendererAdapter.mm +++ b/webrtc/api/objc/RTCVideoRendererAdapter.mm @@ -15,16 +15,17 @@ namespace webrtc { -class VideoRendererAdapter : public VideoRendererInterface { +class VideoRendererAdapter + : public rtc::VideoSinkInterface { public: VideoRendererAdapter(RTCVideoRendererAdapter* adapter) { adapter_ = adapter; size_ = CGSizeZero; } - void RenderFrame(const cricket::VideoFrame *nativeVideoFrame) override { + void OnFrame(const cricket::VideoFrame& nativeVideoFrame) override { const cricket::VideoFrame *frame = - nativeVideoFrame->GetCopyWithRotationApplied(); + nativeVideoFrame.GetCopyWithRotationApplied(); CGSize current_size = CGSizeMake(frame->GetWidth(), frame->GetHeight()); if (!CGSizeEqualToSize(size_, current_size)) { size_ = current_size; @@ -56,7 +57,7 @@ class VideoRendererAdapter : public VideoRendererInterface { return self; } -- (webrtc::VideoRendererInterface *)nativeVideoRenderer { +- (rtc::VideoSinkInterface *)nativeVideoRenderer { return _adapter.get(); } diff --git a/webrtc/api/objc/RTCVideoTrack.mm b/webrtc/api/objc/RTCVideoTrack.mm index 5834af761b..a32ea7bc7c 100644 --- a/webrtc/api/objc/RTCVideoTrack.mm +++ b/webrtc/api/objc/RTCVideoTrack.mm @@ -52,7 +52,7 @@ - (void)dealloc { for (RTCVideoRendererAdapter *adapter in _adapters) { - self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); + self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer); } } @@ -79,7 +79,8 @@ RTCVideoRendererAdapter* adapter = [[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer]; [_adapters addObject:adapter]; - self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer); + self.nativeVideoTrack->AddOrUpdateSink(adapter.nativeVideoRenderer, + rtc::VideoSinkWants()); } - (void)removeRenderer:(id)renderer { @@ -97,7 +98,7 @@ } RTCVideoRendererAdapter *adapterToRemove = [_adapters objectAtIndex:indexToRemove]; - self.nativeVideoTrack->RemoveRenderer(adapterToRemove.nativeVideoRenderer); + self.nativeVideoTrack->RemoveSink(adapterToRemove.nativeVideoRenderer); [_adapters removeObjectAtIndex:indexToRemove]; } diff --git a/webrtc/api/test/fakevideotrackrenderer.h b/webrtc/api/test/fakevideotrackrenderer.h index 312cf64804..a1ce0f9721 100644 --- a/webrtc/api/test/fakevideotrackrenderer.h +++ b/webrtc/api/test/fakevideotrackrenderer.h @@ -44,33 +44,6 @@ class FakeVideoTrackRenderer rtc::scoped_refptr video_track_; }; -// Similar class, testing the deprecated AddRenderer/RemoveRenderer methods. -class FakeVideoTrackRendererOld : public VideoRendererInterface { - public: - FakeVideoTrackRendererOld(VideoTrackInterface* video_track) - : video_track_(video_track) { - video_track_->AddRenderer(this); - } - ~FakeVideoTrackRendererOld() { video_track_->RemoveRenderer(this); } - - virtual void RenderFrame(const cricket::VideoFrame* video_frame) override { - fake_renderer_.RenderFrame(video_frame); - } - - int errors() const { return fake_renderer_.errors(); } - int width() const { return fake_renderer_.width(); } - int height() const { return fake_renderer_.height(); } - bool black_frame() const { return fake_renderer_.black_frame(); } - - int num_rendered_frames() const { - return fake_renderer_.num_rendered_frames(); - } - - private: - cricket::FakeVideoRenderer fake_renderer_; - rtc::scoped_refptr video_track_; -}; - } // namespace webrtc #endif // WEBRTC_API_TEST_FAKEVIDEOTRACKRENDERER_H_ diff --git a/webrtc/api/videotrack_unittest.cc b/webrtc/api/videotrack_unittest.cc index 0df8679ddc..d35bcdb2a0 100644 --- a/webrtc/api/videotrack_unittest.cc +++ b/webrtc/api/videotrack_unittest.cc @@ -20,7 +20,6 @@ #include "webrtc/media/engine/webrtcvideoframe.h" using webrtc::FakeVideoTrackRenderer; -using webrtc::FakeVideoTrackRendererOld; using webrtc::MediaSourceInterface; using webrtc::MediaStreamTrackInterface; using webrtc::VideoTrackSource; @@ -74,30 +73,6 @@ TEST_F(VideoTrackTest, RenderVideo) { EXPECT_EQ(2, renderer_2->num_rendered_frames()); } -// Test adding renderers to a video track and render to them by -// providing frames to the source. Uses the old VideoTrack interface -// with AddRenderer and RemoveRenderer. -TEST_F(VideoTrackTest, RenderVideoOld) { - // FakeVideoTrackRenderer register itself to |video_track_| - rtc::scoped_ptr renderer_1( - new FakeVideoTrackRendererOld(video_track_.get())); - - capturer_.CaptureFrame(); - EXPECT_EQ(1, renderer_1->num_rendered_frames()); - - // FakeVideoTrackRenderer register itself to |video_track_| - rtc::scoped_ptr renderer_2( - new FakeVideoTrackRenderer(video_track_.get())); - - capturer_.CaptureFrame(); - EXPECT_EQ(2, renderer_1->num_rendered_frames()); - EXPECT_EQ(1, renderer_2->num_rendered_frames()); - - renderer_1.reset(nullptr); - capturer_.CaptureFrame(); - EXPECT_EQ(2, renderer_2->num_rendered_frames()); -} - // Test that disabling the track results in blacked out frames. TEST_F(VideoTrackTest, DisableTrackBlackout) { rtc::scoped_ptr renderer( diff --git a/webrtc/examples/peerconnection/client/linux/main_wnd.h b/webrtc/examples/peerconnection/client/linux/main_wnd.h index a7eb25e9b1..e756fc98c4 100644 --- a/webrtc/examples/peerconnection/client/linux/main_wnd.h +++ b/webrtc/examples/peerconnection/client/linux/main_wnd.h @@ -77,9 +77,8 @@ class GtkMainWnd : public MainWindow { webrtc::VideoTrackInterface* track_to_render); virtual ~VideoRenderer(); - // VideoRendererInterface implementation - virtual void SetSize(int width, int height); - virtual void OnFrame(const cricket::VideoFrame& frame); + // VideoSinkInterface implementation + void OnFrame(const cricket::VideoFrame& frame) override; const uint8_t* image() const { return image_.get(); } @@ -92,6 +91,7 @@ class GtkMainWnd : public MainWindow { } protected: + void SetSize(int width, int height); rtc::scoped_ptr image_; int width_; int height_; diff --git a/webrtc/examples/peerconnection/client/main_wnd.cc b/webrtc/examples/peerconnection/client/main_wnd.cc index 72f85b9eb2..608e6dfe91 100644 --- a/webrtc/examples/peerconnection/client/main_wnd.cc +++ b/webrtc/examples/peerconnection/client/main_wnd.cc @@ -576,11 +576,11 @@ MainWnd::VideoRenderer::VideoRenderer( bmi_.bmiHeader.biHeight = -height; bmi_.bmiHeader.biSizeImage = width * height * (bmi_.bmiHeader.biBitCount >> 3); - rendered_track_->AddRenderer(this); + rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants()); } MainWnd::VideoRenderer::~VideoRenderer() { - rendered_track_->RemoveRenderer(this); + rendered_track_->RemoveSink(this); ::DeleteCriticalSection(&buffer_lock_); } @@ -598,16 +598,14 @@ void MainWnd::VideoRenderer::SetSize(int width, int height) { image_.reset(new uint8_t[bmi_.bmiHeader.biSizeImage]); } -void MainWnd::VideoRenderer::RenderFrame( - const cricket::VideoFrame* video_frame) { - if (!video_frame) - return; +void MainWnd::VideoRenderer::OnFrame( + const cricket::VideoFrame& video_frame) { { AutoLock lock(this); const cricket::VideoFrame* frame = - video_frame->GetCopyWithRotationApplied(); + video_frame.GetCopyWithRotationApplied(); SetSize(static_cast(frame->GetWidth()), static_cast(frame->GetHeight())); diff --git a/webrtc/examples/peerconnection/client/main_wnd.h b/webrtc/examples/peerconnection/client/main_wnd.h index 5cf38df8d7..0e7f796843 100644 --- a/webrtc/examples/peerconnection/client/main_wnd.h +++ b/webrtc/examples/peerconnection/client/main_wnd.h @@ -102,7 +102,7 @@ class MainWnd : public MainWindow { HWND handle() const { return wnd_; } - class VideoRenderer : public webrtc::VideoRendererInterface { + class VideoRenderer : public rtc::VideoSinkInterface { public: VideoRenderer(HWND wnd, int width, int height, webrtc::VideoTrackInterface* track_to_render); @@ -116,14 +116,15 @@ class MainWnd : public MainWindow { ::LeaveCriticalSection(&buffer_lock_); } - // VideoRendererInterface implementation - virtual void SetSize(int width, int height); - virtual void RenderFrame(const cricket::VideoFrame* frame); + // VideoSinkInterface implementation + void OnFrame(const cricket::VideoFrame& frame) override; const BITMAPINFO& bmi() const { return bmi_; } const uint8_t* image() const { return image_.get(); } protected: + void SetSize(int width, int height); + enum { SET_SIZE, RENDER_FRAME,