OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ | 5 #ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ |
6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ | 6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ |
7 | 7 |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/memory/weak_ptr.h" | 10 #include "base/threading/thread_checker.h" |
11 #include "content/common/content_export.h" | 11 #include "content/common/content_export.h" |
12 #include "content/common/media/video_capture.h" | 12 #include "content/common/media/video_capture.h" |
13 #include "content/public/renderer/media_stream_video_renderer.h" | 13 #include "content/public/renderer/media_stream_video_renderer.h" |
14 #include "content/public/renderer/media_stream_video_sink.h" | 14 #include "content/public/renderer/media_stream_video_sink.h" |
15 #include "media/video/gpu_memory_buffer_video_frame_pool.h" | |
16 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 15 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
17 #include "ui/gfx/geometry/size.h" | 16 #include "ui/gfx/geometry/size.h" |
18 | 17 |
19 namespace base { | 18 namespace base { |
20 class SingleThreadTaskRunner; | 19 class SingleThreadTaskRunner; |
21 class TaskRunner; | 20 class TaskRunner; |
22 } // namespace base | 21 } // namespace base |
23 | 22 |
24 namespace media { | 23 namespace media { |
| 24 class GpuMemoryBufferVideoFramePool; |
25 class GpuVideoAcceleratorFactories; | 25 class GpuVideoAcceleratorFactories; |
26 } // namespace media | 26 } // namespace media |
27 | 27 |
28 namespace content { | 28 namespace content { |
29 | 29 |
30 // MediaStreamVideoRendererSink is a MediaStreamVideoRenderer designed for | 30 // MediaStreamVideoRendererSink is a MediaStreamVideoRenderer designed for |
31 // rendering Video MediaStreamTracks [1], MediaStreamVideoRendererSink | 31 // rendering Video MediaStreamTracks [1], MediaStreamVideoRendererSink |
32 // implements MediaStreamVideoSink in order to render video frames provided from | 32 // implements MediaStreamVideoSink in order to render video frames provided from |
33 // a MediaStreamVideoTrack, to which it connects itself when the | 33 // a MediaStreamVideoTrack, to which it connects itself when the |
34 // MediaStreamVideoRenderer is Start()ed, and disconnects itself when the latter | 34 // MediaStreamVideoRenderer is Start()ed, and disconnects itself when the latter |
35 // is Stop()ed. | 35 // is Stop()ed. |
36 // | 36 // |
37 // [1] http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack | 37 // [1] http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack |
38 // | 38 // |
39 // TODO(wuchengli): Add unit test. See the link below for reference. | 39 // TODO(wuchengli): Add unit test. See the link below for reference. |
40 // http://src.chromium.org/viewvc/chrome/trunk/src/content/renderer/media/rtc_vi | 40 // http://src.chromium.org/viewvc/chrome/trunk/src/content/renderer/media/rtc_vi |
41 // deo_decoder_unittest.cc?revision=180591&view=markup | 41 // deo_decoder_unittest.cc?revision=180591&view=markup |
42 class CONTENT_EXPORT MediaStreamVideoRendererSink | 42 class CONTENT_EXPORT MediaStreamVideoRendererSink |
43 : NON_EXPORTED_BASE(public MediaStreamVideoRenderer), | 43 : NON_EXPORTED_BASE(public MediaStreamVideoRenderer), |
44 NON_EXPORTED_BASE(public MediaStreamVideoSink) { | 44 NON_EXPORTED_BASE(public MediaStreamVideoSink) { |
45 public: | 45 public: |
46 MediaStreamVideoRendererSink( | 46 MediaStreamVideoRendererSink( |
47 const blink::WebMediaStreamTrack& video_track, | 47 const blink::WebMediaStreamTrack& video_track, |
48 const base::Closure& error_cb, | 48 const base::Closure& error_cb, |
49 const MediaStreamVideoRenderer::RepaintCB& repaint_cb, | 49 const MediaStreamVideoRenderer::RepaintCB& repaint_cb, |
| 50 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, |
50 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 51 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, |
51 const scoped_refptr<base::TaskRunner>& worker_task_runner, | 52 const scoped_refptr<base::TaskRunner>& worker_task_runner, |
52 media::GpuVideoAcceleratorFactories* gpu_factories); | 53 media::GpuVideoAcceleratorFactories* gpu_factories); |
53 | 54 |
54 // MediaStreamVideoRenderer implementation. Called on the main thread. | 55 // MediaStreamVideoRenderer implementation. Called on the main thread. |
55 void Start() override; | 56 void Start() override; |
56 void Stop() override; | 57 void Stop() override; |
57 void Resume() override; | 58 void Resume() override; |
58 void Pause() override; | 59 void Pause() override; |
59 | 60 |
60 void SetGpuMemoryBufferVideoForTesting( | |
61 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool); | |
62 | |
63 protected: | 61 protected: |
64 ~MediaStreamVideoRendererSink() override; | 62 ~MediaStreamVideoRendererSink() override; |
65 | 63 |
66 private: | 64 private: |
67 friend class MediaStreamVideoRendererSinkTest; | 65 friend class MediaStreamVideoRendererSinkTest; |
68 enum State { | 66 enum State { |
69 STARTED, | 67 STARTED, |
70 PAUSED, | 68 PAUSED, |
71 STOPPED, | 69 STOPPED, |
72 }; | 70 }; |
73 | 71 |
74 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame, | |
75 base::TimeTicks estimated_capture_time); | |
76 void FrameReady(const scoped_refptr<media::VideoFrame>& frame); | |
77 | |
78 // MediaStreamVideoSink implementation. Called on the main thread. | 72 // MediaStreamVideoSink implementation. Called on the main thread. |
79 void OnReadyStateChanged( | 73 void OnReadyStateChanged( |
80 blink::WebMediaStreamSource::ReadyState state) override; | 74 blink::WebMediaStreamSource::ReadyState state) override; |
81 | 75 |
82 void RenderSignalingFrame(); | 76 // Helper methods used for testing. |
| 77 State GetStateForTesting(); |
| 78 void SetGpuMemoryBufferVideoForTesting( |
| 79 media::GpuMemoryBufferVideoFramePool* gpu_memory_buffer_pool); |
83 | 80 |
84 const base::Closure error_cb_; | 81 const base::Closure error_cb_; |
85 const RepaintCB repaint_cb_; | 82 const RepaintCB repaint_cb_; |
86 | |
87 const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
88 State state_; | |
89 gfx::Size frame_size_; | |
90 const blink::WebMediaStreamTrack video_track_; | 83 const blink::WebMediaStreamTrack video_track_; |
91 | 84 |
92 // Pool of GpuMemoryBuffers and resources used to create hardware frames. | 85 // Inner class used for trampolining received frames from IO thread to |
93 std::unique_ptr<media::GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool_; | 86 // compositor thread. |
| 87 class FrameReceiver; |
| 88 std::unique_ptr<FrameReceiver> frame_receiver_; |
| 89 // Inner class used for transfering frames on compositor thread and running |
| 90 // |repaint_cb_|. |
| 91 class FrameDeliverer; |
| 92 std::unique_ptr<FrameDeliverer> frame_deliverer_; |
| 93 |
| 94 const scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; |
94 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; | 95 const scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; |
| 96 const scoped_refptr<base::TaskRunner> worker_task_runner_; |
| 97 media::GpuVideoAcceleratorFactories* const gpu_factories_; |
95 | 98 |
96 base::WeakPtrFactory<MediaStreamVideoRendererSink> weak_factory_; | 99 base::ThreadChecker main_thread_checker_; |
97 | 100 |
98 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSink); | 101 DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoRendererSink); |
99 }; | 102 }; |
100 | 103 |
101 } // namespace content | 104 } // namespace content |
102 | 105 |
103 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ | 106 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_RENDERER_H_ |
OLD | NEW |