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 MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ | 5 #ifndef MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ |
6 #define MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ | 6 #define MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 | 9 |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
11 #include "base/synchronization/condition_variable.h" | 11 #include "base/synchronization/condition_variable.h" |
12 #include "base/synchronization/lock.h" | 12 #include "base/synchronization/lock.h" |
13 #include "base/threading/platform_thread.h" | 13 #include "base/threading/platform_thread.h" |
14 #include "media/base/demuxer_stream.h" | |
14 #include "media/base/pipeline_status.h" | 15 #include "media/base/pipeline_status.h" |
15 #include "media/base/video_decoder.h" | 16 #include "media/base/video_decoder.h" |
16 #include "media/base/video_frame.h" | 17 #include "media/base/video_frame.h" |
17 #include "media/base/video_renderer.h" | 18 #include "media/base/video_renderer.h" |
18 | 19 |
19 namespace media { | 20 namespace media { |
20 | 21 |
21 // VideoRendererBase creates its own thread for the sole purpose of timing frame | 22 // VideoRendererBase creates its own thread for the sole purpose of timing frame |
22 // presentation. It handles reading from the decoder and stores the results in | 23 // presentation. It handles reading from the decoder and stores the results in |
23 // a queue of decoded frames and executing a callback when a frame is ready for | 24 // a queue of decoded frames and executing a callback when a frame is ready for |
(...skipping 19 matching lines...) Expand all Loading... | |
43 // | 44 // |
44 // Setting |drop_frames_| to true causes the renderer to drop expired frames. | 45 // Setting |drop_frames_| to true causes the renderer to drop expired frames. |
45 // | 46 // |
46 // TODO(scherkus): pass the VideoFrame* to this callback and remove | 47 // TODO(scherkus): pass the VideoFrame* to this callback and remove |
47 // Get/PutCurrentFrame() http://crbug.com/108435 | 48 // Get/PutCurrentFrame() http://crbug.com/108435 |
48 VideoRendererBase(const base::Closure& paint_cb, | 49 VideoRendererBase(const base::Closure& paint_cb, |
49 const SetOpaqueCB& set_opaque_cb, | 50 const SetOpaqueCB& set_opaque_cb, |
50 bool drop_frames); | 51 bool drop_frames); |
51 | 52 |
52 // VideoRenderer implementation. | 53 // VideoRenderer implementation. |
53 virtual void Initialize(const scoped_refptr<VideoDecoder>& decoder, | 54 virtual void Initialize(const scoped_refptr<DemuxerStream>& stream, |
55 const VideoDecoderList& decoders, | |
54 const PipelineStatusCB& init_cb, | 56 const PipelineStatusCB& init_cb, |
55 const StatisticsCB& statistics_cb, | 57 const StatisticsCB& statistics_cb, |
56 const TimeCB& max_time_cb, | 58 const TimeCB& max_time_cb, |
57 const NaturalSizeChangedCB& size_changed_cb, | 59 const NaturalSizeChangedCB& size_changed_cb, |
58 const base::Closure& ended_cb, | 60 const base::Closure& ended_cb, |
59 const PipelineStatusCB& error_cb, | 61 const PipelineStatusCB& error_cb, |
60 const TimeDeltaCB& get_time_cb, | 62 const TimeDeltaCB& get_time_cb, |
61 const TimeDeltaCB& get_duration_cb) OVERRIDE; | 63 const TimeDeltaCB& get_duration_cb) OVERRIDE; |
62 virtual void Play(const base::Closure& callback) OVERRIDE; | 64 virtual void Play(const base::Closure& callback) OVERRIDE; |
63 virtual void Pause(const base::Closure& callback) OVERRIDE; | 65 virtual void Pause(const base::Closure& callback) OVERRIDE; |
64 virtual void Flush(const base::Closure& callback) OVERRIDE; | 66 virtual void Flush(const base::Closure& callback) OVERRIDE; |
65 virtual void Preroll(base::TimeDelta time, | 67 virtual void Preroll(base::TimeDelta time, |
66 const PipelineStatusCB& cb) OVERRIDE; | 68 const PipelineStatusCB& cb) OVERRIDE; |
67 virtual void Stop(const base::Closure& callback) OVERRIDE; | 69 virtual void Stop(const base::Closure& callback) OVERRIDE; |
68 virtual void SetPlaybackRate(float playback_rate) OVERRIDE; | 70 virtual void SetPlaybackRate(float playback_rate) OVERRIDE; |
69 virtual bool HasEnded() OVERRIDE; | 71 virtual bool HasEnded() OVERRIDE; |
72 virtual void PrepareForShutdownHack() OVERRIDE; | |
70 | 73 |
71 // PlatformThread::Delegate implementation. | 74 // PlatformThread::Delegate implementation. |
72 virtual void ThreadMain() OVERRIDE; | 75 virtual void ThreadMain() OVERRIDE; |
73 | 76 |
74 // Clients of this class (painter/compositor) should use GetCurrentFrame() | 77 // Clients of this class (painter/compositor) should use GetCurrentFrame() |
75 // obtain ownership of VideoFrame, it should always relinquish the ownership | 78 // obtain ownership of VideoFrame, it should always relinquish the ownership |
76 // by use PutCurrentFrame(). Current frame is not guaranteed to be non-NULL. | 79 // by use PutCurrentFrame(). Current frame is not guaranteed to be non-NULL. |
77 // It expects clients to use color-fill the background if current frame | 80 // It expects clients to use color-fill the background if current frame |
78 // is NULL. This could happen before pipeline is pre-rolled or during | 81 // is NULL. This could happen before pipeline is pre-rolled or during |
79 // pause/flush/preroll. | 82 // pause/flush/preroll. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
113 // Helper function that flushes the buffers when a Stop() or error occurs. | 116 // Helper function that flushes the buffers when a Stop() or error occurs. |
114 void DoStopOrError_Locked(); | 117 void DoStopOrError_Locked(); |
115 | 118 |
116 // Return the number of frames currently held by this class. | 119 // Return the number of frames currently held by this class. |
117 int NumFrames_Locked() const; | 120 int NumFrames_Locked() const; |
118 | 121 |
119 // Updates |current_frame_| to the next frame on |ready_frames_| and calls | 122 // Updates |current_frame_| to the next frame on |ready_frames_| and calls |
120 // |size_changed_cb_| if the natural size changes. | 123 // |size_changed_cb_| if the natural size changes. |
121 void SetCurrentFrameToNextReadyFrame(); | 124 void SetCurrentFrameToNextReadyFrame(); |
122 | 125 |
126 // Pops the front of |decoders_|, assigns it to |decoder_| and then | |
127 // calls initialize on the new decoder. | |
128 void InitializeNextDecoder(); | |
129 | |
130 // Called when |decoder_| initialization completes. | |
131 void OnDecoderInitDone(PipelineStatus status); | |
132 | |
123 // Used for accessing data members. | 133 // Used for accessing data members. |
124 base::Lock lock_; | 134 base::Lock lock_; |
125 | 135 |
136 // List of candidate decoders to try during initialization. | |
137 VideoDecoderList decoders_; | |
Ami GONE FROM CHROMIUM
2012/08/09 20:30:18
This is only used during initialization, so could
acolwell GONE FROM CHROMIUM
2012/08/09 22:23:32
Done.
| |
138 | |
139 scoped_refptr<DemuxerStream> demuxer_stream_; | |
Ami GONE FROM CHROMIUM
2012/08/09 20:30:18
ditto
acolwell GONE FROM CHROMIUM
2012/08/09 22:23:32
Done.
| |
126 scoped_refptr<VideoDecoder> decoder_; | 140 scoped_refptr<VideoDecoder> decoder_; |
127 | 141 |
128 // Queue of incoming frames as well as the current frame since the last time | 142 // Queue of incoming frames as well as the current frame since the last time |
129 // OnFrameAvailable() was called. | 143 // OnFrameAvailable() was called. |
130 typedef std::deque<scoped_refptr<VideoFrame> > VideoFrameQueue; | 144 typedef std::deque<scoped_refptr<VideoFrame> > VideoFrameQueue; |
131 VideoFrameQueue ready_frames_; | 145 VideoFrameQueue ready_frames_; |
132 | 146 |
133 // The current frame available to subclasses for rendering via | 147 // The current frame available to subclasses for rendering via |
134 // GetCurrentFrame(). |current_frame_| can only be altered when | 148 // GetCurrentFrame(). |current_frame_| can only be altered when |
135 // |pending_paint_| is false. | 149 // |pending_paint_| is false. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 | 218 |
205 bool drop_frames_; | 219 bool drop_frames_; |
206 | 220 |
207 float playback_rate_; | 221 float playback_rate_; |
208 | 222 |
209 // Playback operation callbacks. | 223 // Playback operation callbacks. |
210 base::Closure flush_cb_; | 224 base::Closure flush_cb_; |
211 PipelineStatusCB preroll_cb_; | 225 PipelineStatusCB preroll_cb_; |
212 | 226 |
213 // Event callbacks. | 227 // Event callbacks. |
228 PipelineStatusCB init_cb_; | |
214 StatisticsCB statistics_cb_; | 229 StatisticsCB statistics_cb_; |
215 TimeCB max_time_cb_; | 230 TimeCB max_time_cb_; |
216 NaturalSizeChangedCB size_changed_cb_; | 231 NaturalSizeChangedCB size_changed_cb_; |
217 base::Closure ended_cb_; | 232 base::Closure ended_cb_; |
218 PipelineStatusCB error_cb_; | 233 PipelineStatusCB error_cb_; |
219 TimeDeltaCB get_time_cb_; | 234 TimeDeltaCB get_time_cb_; |
220 TimeDeltaCB get_duration_cb_; | 235 TimeDeltaCB get_duration_cb_; |
221 | 236 |
222 base::TimeDelta preroll_timestamp_; | 237 base::TimeDelta preroll_timestamp_; |
223 | 238 |
(...skipping 10 matching lines...) Expand all Loading... | |
234 | 249 |
235 // The last natural size |size_changed_cb_| was called with. | 250 // The last natural size |size_changed_cb_| was called with. |
236 gfx::Size last_natural_size_; | 251 gfx::Size last_natural_size_; |
237 | 252 |
238 DISALLOW_COPY_AND_ASSIGN(VideoRendererBase); | 253 DISALLOW_COPY_AND_ASSIGN(VideoRendererBase); |
239 }; | 254 }; |
240 | 255 |
241 } // namespace media | 256 } // namespace media |
242 | 257 |
243 #endif // MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ | 258 #endif // MEDIA_FILTERS_VIDEO_RENDERER_BASE_H_ |
OLD | NEW |