1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ 6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ 7 8 #include "base/callback.h" 9 #include "base/memory/weak_ptr.h" 10 #include "content/common/content_export.h" 11 #include "content/common/media/video_capture.h" 12 #include "content/public/renderer/media_stream_video_sink.h" 13 #include "content/renderer/media/video_frame_provider.h" 14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 15 #include "ui/gfx/size.h" 16 17 namespace base { 18 class MessageLoopProxy; 19 } 20 21 namespace content { 22 23 // RTCVideoRenderer is a VideoFrameProvider designed for rendering 24 // Video MediaStreamTracks, 25 // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack 26 // RTCVideoRenderer implements VideoTrackSink in order to render 27 // video frames provided from a VideoTrack. 28 // RTCVideoRenderer register itself as a sink to the VideoTrack when the 29 // VideoFrameProvider is started and deregisters itself when it is stopped. 30 // TODO(wuchengli): Add unit test. See the link below for reference. 31 // http://src.chromium.org/viewvc/chrome/trunk/src/content/renderer/media/rtc_vi 32 // deo_decoder_unittest.cc?revision=180591&view=markup 33 class CONTENT_EXPORT RTCVideoRenderer 34 : NON_EXPORTED_BASE(public VideoFrameProvider), 35 NON_EXPORTED_BASE(public MediaStreamVideoSink) { 36 public: 37 RTCVideoRenderer(const blink::WebMediaStreamTrack& video_track, 38 const base::Closure& error_cb, 39 const RepaintCB& repaint_cb); 40 41 // VideoFrameProvider implementation. Called on the main thread. 42 virtual void Start() OVERRIDE; 43 virtual void Stop() OVERRIDE; 44 virtual void Play() OVERRIDE; 45 virtual void Pause() OVERRIDE; 46 47 protected: 48 virtual ~RTCVideoRenderer(); 49 50 private: 51 enum State { 52 STARTED, 53 PAUSED, 54 STOPPED, 55 }; 56 57 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, 58 const media::VideoCaptureFormat& format, 59 const base::TimeTicks& estimated_capture_time); 60 61 // VideoTrackSink implementation. Called on the main thread. 62 virtual void OnReadyStateChanged( 63 blink::WebMediaStreamSource::ReadyState state) OVERRIDE; 64 65 void RenderSignalingFrame(); 66 67 base::Closure error_cb_; 68 RepaintCB repaint_cb_; 69 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 70 State state_; 71 gfx::Size frame_size_; 72 blink::WebMediaStreamTrack video_track_; 73 base::WeakPtrFactory<RTCVideoRenderer> weak_factory_; 74 75 DISALLOW_COPY_AND_ASSIGN(RTCVideoRenderer); 76 }; 77 78 } // namespace content 79 80 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ 81