OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 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 #include "webkit/glue/webmediaplayer_proxy.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/message_loop.h" |
| 9 #include "media/base/pipeline_status.h" |
| 10 #include "media/filters/chunk_demuxer.h" |
| 11 #include "webkit/glue/media/web_video_renderer.h" |
| 12 #include "webkit/glue/webmediaplayer_impl.h" |
| 13 |
| 14 using media::PipelineStatus; |
| 15 |
| 16 namespace webkit_glue { |
| 17 |
| 18 // Limits the maximum outstanding repaints posted on render thread. |
| 19 // This number of 50 is a guess, it does not take too much memory on the task |
| 20 // queue but gives up a pretty good latency on repaint. |
| 21 static const int kMaxOutstandingRepaints = 50; |
| 22 |
| 23 WebMediaPlayerProxy::WebMediaPlayerProxy(MessageLoop* render_loop, |
| 24 WebMediaPlayerImpl* webmediaplayer) |
| 25 : render_loop_(render_loop), |
| 26 webmediaplayer_(webmediaplayer), |
| 27 outstanding_repaints_(0) { |
| 28 DCHECK(render_loop_); |
| 29 DCHECK(webmediaplayer_); |
| 30 } |
| 31 |
| 32 WebMediaPlayerProxy::~WebMediaPlayerProxy() { |
| 33 Detach(); |
| 34 } |
| 35 |
| 36 void WebMediaPlayerProxy::Repaint() { |
| 37 base::AutoLock auto_lock(lock_); |
| 38 if (outstanding_repaints_ < kMaxOutstandingRepaints) { |
| 39 ++outstanding_repaints_; |
| 40 |
| 41 render_loop_->PostTask(FROM_HERE, |
| 42 NewRunnableMethod(this, &WebMediaPlayerProxy::RepaintTask)); |
| 43 } |
| 44 } |
| 45 |
| 46 void WebMediaPlayerProxy::SetVideoRenderer( |
| 47 scoped_refptr<WebVideoRenderer> video_renderer) { |
| 48 video_renderer_ = video_renderer; |
| 49 } |
| 50 |
| 51 WebDataSourceBuildObserverHack* WebMediaPlayerProxy::GetBuildObserver() { |
| 52 if (!build_observer_.get()) |
| 53 build_observer_.reset(NewCallback(this, |
| 54 &WebMediaPlayerProxy::AddDataSource)); |
| 55 return build_observer_.get(); |
| 56 } |
| 57 |
| 58 void WebMediaPlayerProxy::Paint(SkCanvas* canvas, const gfx::Rect& dest_rect) { |
| 59 DCHECK(MessageLoop::current() == render_loop_); |
| 60 if (video_renderer_) { |
| 61 video_renderer_->Paint(canvas, dest_rect); |
| 62 } |
| 63 } |
| 64 |
| 65 void WebMediaPlayerProxy::SetSize(const gfx::Rect& rect) { |
| 66 DCHECK(MessageLoop::current() == render_loop_); |
| 67 if (video_renderer_) { |
| 68 video_renderer_->SetRect(rect); |
| 69 } |
| 70 } |
| 71 |
| 72 bool WebMediaPlayerProxy::HasSingleOrigin() { |
| 73 DCHECK(MessageLoop::current() == render_loop_); |
| 74 |
| 75 base::AutoLock auto_lock(data_sources_lock_); |
| 76 |
| 77 for (DataSourceList::iterator itr = data_sources_.begin(); |
| 78 itr != data_sources_.end(); |
| 79 itr++) { |
| 80 if (!(*itr)->HasSingleOrigin()) |
| 81 return false; |
| 82 } |
| 83 return true; |
| 84 } |
| 85 |
| 86 void WebMediaPlayerProxy::AbortDataSources() { |
| 87 DCHECK(MessageLoop::current() == render_loop_); |
| 88 base::AutoLock auto_lock(data_sources_lock_); |
| 89 |
| 90 for (DataSourceList::iterator itr = data_sources_.begin(); |
| 91 itr != data_sources_.end(); |
| 92 itr++) { |
| 93 (*itr)->Abort(); |
| 94 } |
| 95 } |
| 96 |
| 97 void WebMediaPlayerProxy::Detach() { |
| 98 DCHECK(MessageLoop::current() == render_loop_); |
| 99 webmediaplayer_ = NULL; |
| 100 video_renderer_ = NULL; |
| 101 |
| 102 { |
| 103 base::AutoLock auto_lock(data_sources_lock_); |
| 104 data_sources_.clear(); |
| 105 } |
| 106 } |
| 107 |
| 108 void WebMediaPlayerProxy::PipelineInitializationCallback( |
| 109 PipelineStatus status) { |
| 110 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 111 this, &WebMediaPlayerProxy::PipelineInitializationTask, status)); |
| 112 } |
| 113 |
| 114 void WebMediaPlayerProxy::PipelineSeekCallback(PipelineStatus status) { |
| 115 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 116 this, &WebMediaPlayerProxy::PipelineSeekTask, status)); |
| 117 } |
| 118 |
| 119 void WebMediaPlayerProxy::PipelineEndedCallback(PipelineStatus status) { |
| 120 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 121 this, &WebMediaPlayerProxy::PipelineEndedTask, status)); |
| 122 } |
| 123 |
| 124 void WebMediaPlayerProxy::PipelineErrorCallback(PipelineStatus error) { |
| 125 DCHECK_NE(error, media::PIPELINE_OK); |
| 126 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 127 this, &WebMediaPlayerProxy::PipelineErrorTask, error)); |
| 128 } |
| 129 |
| 130 void WebMediaPlayerProxy::NetworkEventCallback(PipelineStatus status) { |
| 131 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 132 this, &WebMediaPlayerProxy::NetworkEventTask, status)); |
| 133 } |
| 134 |
| 135 void WebMediaPlayerProxy::AddDataSource(WebDataSource* data_source) { |
| 136 base::AutoLock auto_lock(data_sources_lock_); |
| 137 data_sources_.push_back(make_scoped_refptr(data_source)); |
| 138 } |
| 139 |
| 140 void WebMediaPlayerProxy::RepaintTask() { |
| 141 DCHECK(MessageLoop::current() == render_loop_); |
| 142 { |
| 143 base::AutoLock auto_lock(lock_); |
| 144 --outstanding_repaints_; |
| 145 DCHECK_GE(outstanding_repaints_, 0); |
| 146 } |
| 147 if (webmediaplayer_) { |
| 148 webmediaplayer_->Repaint(); |
| 149 } |
| 150 } |
| 151 |
| 152 void WebMediaPlayerProxy::PipelineInitializationTask(PipelineStatus status) { |
| 153 DCHECK(MessageLoop::current() == render_loop_); |
| 154 if (webmediaplayer_) { |
| 155 webmediaplayer_->OnPipelineInitialize(status); |
| 156 } |
| 157 } |
| 158 |
| 159 void WebMediaPlayerProxy::PipelineSeekTask(PipelineStatus status) { |
| 160 DCHECK(MessageLoop::current() == render_loop_); |
| 161 if (webmediaplayer_) { |
| 162 webmediaplayer_->OnPipelineSeek(status); |
| 163 } |
| 164 } |
| 165 |
| 166 void WebMediaPlayerProxy::PipelineEndedTask(PipelineStatus status) { |
| 167 DCHECK(MessageLoop::current() == render_loop_); |
| 168 if (webmediaplayer_) { |
| 169 webmediaplayer_->OnPipelineEnded(status); |
| 170 } |
| 171 } |
| 172 |
| 173 void WebMediaPlayerProxy::PipelineErrorTask(PipelineStatus error) { |
| 174 DCHECK(MessageLoop::current() == render_loop_); |
| 175 if (webmediaplayer_) { |
| 176 webmediaplayer_->OnPipelineError(error); |
| 177 } |
| 178 } |
| 179 |
| 180 void WebMediaPlayerProxy::NetworkEventTask(PipelineStatus status) { |
| 181 DCHECK(MessageLoop::current() == render_loop_); |
| 182 if (webmediaplayer_) { |
| 183 webmediaplayer_->OnNetworkEvent(status); |
| 184 } |
| 185 } |
| 186 |
| 187 void WebMediaPlayerProxy::GetCurrentFrame( |
| 188 scoped_refptr<media::VideoFrame>* frame_out) { |
| 189 if (video_renderer_) |
| 190 video_renderer_->GetCurrentFrame(frame_out); |
| 191 } |
| 192 |
| 193 void WebMediaPlayerProxy::PutCurrentFrame( |
| 194 scoped_refptr<media::VideoFrame> frame) { |
| 195 if (video_renderer_) |
| 196 video_renderer_->PutCurrentFrame(frame); |
| 197 } |
| 198 |
| 199 void WebMediaPlayerProxy::DemuxerOpened(media::ChunkDemuxer* demuxer) { |
| 200 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 201 this, &WebMediaPlayerProxy::DemuxerOpenedTask, |
| 202 scoped_refptr<media::ChunkDemuxer>(demuxer))); |
| 203 } |
| 204 |
| 205 void WebMediaPlayerProxy::DemuxerClosed() { |
| 206 render_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
| 207 this, &WebMediaPlayerProxy::DemuxerClosedTask)); |
| 208 } |
| 209 |
| 210 void WebMediaPlayerProxy::DemuxerFlush() { |
| 211 if (chunk_demuxer_.get()) |
| 212 chunk_demuxer_->FlushData(); |
| 213 } |
| 214 |
| 215 bool WebMediaPlayerProxy::DemuxerAppend(const uint8* data, size_t length) { |
| 216 if (chunk_demuxer_.get()) |
| 217 return chunk_demuxer_->AppendData(data, length); |
| 218 return false; |
| 219 } |
| 220 |
| 221 void WebMediaPlayerProxy::DemuxerEndOfStream(media::PipelineStatus status) { |
| 222 if (chunk_demuxer_.get()) |
| 223 chunk_demuxer_->EndOfStream(status); |
| 224 } |
| 225 |
| 226 void WebMediaPlayerProxy::DemuxerShutdown() { |
| 227 if (chunk_demuxer_.get()) |
| 228 chunk_demuxer_->Shutdown(); |
| 229 } |
| 230 |
| 231 void WebMediaPlayerProxy::DemuxerOpenedTask( |
| 232 const scoped_refptr<media::ChunkDemuxer>& demuxer) { |
| 233 DCHECK(MessageLoop::current() == render_loop_); |
| 234 chunk_demuxer_ = demuxer; |
| 235 if (webmediaplayer_) |
| 236 webmediaplayer_->OnDemuxerOpened(); |
| 237 } |
| 238 |
| 239 void WebMediaPlayerProxy::DemuxerClosedTask() { |
| 240 chunk_demuxer_ = NULL; |
| 241 } |
| 242 |
| 243 } // namespace webkit_glue |
OLD | NEW |