Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
|
qinmin
2013/04/29 17:31:49
2013
wonsik
2013/05/01 14:15:38
Done.
| |
| 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/media/android/webmediaplayer_tv.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/command_line.h" | |
| 9 #include "base/logging.h" | |
| 10 #include "base/strings/string_number_conversions.h" | |
| 11 #include "media/base/android/media_player_bridge.h" | |
| 12 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" | |
| 13 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | |
| 14 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" | |
| 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | |
| 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h" | |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | |
| 18 #include "webkit/media/android/media_source_delegate.h" | |
| 19 #include "webkit/media/android/stream_texture_factory_android.h" | |
| 20 #include "webkit/media/android/webmediaplayer_manager_android.h" | |
| 21 #include "webkit/media/android/webmediaplayer_proxy_android.h" | |
| 22 #include "webkit/media/media_stream_audio_renderer.h" | |
| 23 #include "webkit/media/media_stream_client.h" | |
| 24 #include "webkit/media/media_switches.h" | |
| 25 #include "webkit/media/webmediaplayer_util.h" | |
| 26 | |
| 27 using media::MediaPlayerBridge; | |
| 28 using WebKit::WebMediaPlayerClient; | |
| 29 using WebKit::WebMediaPlayer; | |
| 30 using WebKit::WebMediaSource; | |
| 31 using WebKit::WebString; | |
| 32 using WebKit::WebURL; | |
| 33 | |
| 34 namespace webkit_media { | |
| 35 | |
| 36 WebMediaPlayerTv::WebMediaPlayerTv( | |
| 37 WebKit::WebFrame* frame, | |
| 38 WebMediaPlayerClient* client, | |
| 39 WebMediaPlayerManagerAndroid* manager, | |
| 40 WebMediaPlayerProxyAndroid* proxy, | |
| 41 StreamTextureFactory* factory, | |
| 42 media::MediaLog* media_log, | |
| 43 MediaStreamClient* media_stream_client, | |
| 44 media::Demuxer* demuxer) | |
| 45 : WebMediaPlayerAndroid(frame, client, manager, proxy, factory), | |
| 46 media_log_(media_log), | |
| 47 media_stream_client_(media_stream_client), | |
| 48 demuxer_(demuxer) {} | |
| 49 | |
| 50 WebMediaPlayerTv::~WebMediaPlayerTv() { | |
| 51 if (audio_renderer_) { | |
| 52 if (audio_renderer_->IsLocalRenderer()) { | |
| 53 audio_renderer_->Stop(); | |
| 54 } else if (!paused()) { | |
| 55 // The |audio_renderer_| can be shared by multiple remote streams, and | |
| 56 // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply | |
| 57 // pause the |audio_renderer_| here to avoid re-creating the | |
| 58 // |audio_renderer_|. | |
| 59 audio_renderer_->Pause(); | |
| 60 } | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 const WebKit::WebTimeRanges& WebMediaPlayerTv::buffered() { | |
| 65 if (media_source_delegate_) | |
| 66 return media_source_delegate_->Buffered(); | |
| 67 return WebMediaPlayerAndroid::buffered(); | |
| 68 } | |
| 69 | |
| 70 unsigned WebMediaPlayerTv::decodedFrameCount() const { | |
| 71 if (media_source_delegate_) | |
| 72 return media_source_delegate_->DecodedFrameCount(); | |
| 73 return WebMediaPlayerAndroid::decodedFrameCount(); | |
| 74 } | |
| 75 | |
| 76 unsigned WebMediaPlayerTv::droppedFrameCount() const { | |
| 77 if (media_source_delegate_) | |
| 78 return media_source_delegate_->DroppedFrameCount(); | |
| 79 return WebMediaPlayerAndroid::droppedFrameCount(); | |
| 80 } | |
| 81 | |
| 82 unsigned WebMediaPlayerTv::audioDecodedByteCount() const { | |
| 83 if (media_source_delegate_) | |
| 84 return media_source_delegate_->AudioDecodedByteCount(); | |
| 85 return WebMediaPlayerAndroid::audioDecodedByteCount(); | |
| 86 } | |
| 87 | |
| 88 unsigned WebMediaPlayerTv::videoDecodedByteCount() const { | |
| 89 if (media_source_delegate_) | |
| 90 return media_source_delegate_->VideoDecodedByteCount(); | |
| 91 return WebMediaPlayerAndroid::videoDecodedByteCount(); | |
| 92 } | |
| 93 | |
| 94 WebMediaPlayer::MediaKeyException WebMediaPlayerTv::generateKeyRequest( | |
| 95 const WebString& key_system, | |
| 96 const unsigned char* init_data, | |
| 97 unsigned init_data_length) { | |
| 98 if (media_source_delegate_) { | |
| 99 return media_source_delegate_->GenerateKeyRequest( | |
| 100 key_system, init_data, init_data_length); | |
| 101 } | |
| 102 return MediaKeyExceptionKeySystemNotSupported; | |
| 103 } | |
| 104 | |
| 105 WebMediaPlayer::MediaKeyException WebMediaPlayerTv::addKey( | |
| 106 const WebString& key_system, | |
| 107 const unsigned char* key, | |
| 108 unsigned key_length, | |
| 109 const unsigned char* init_data, | |
| 110 unsigned init_data_length, | |
|
palmer
2013/04/29 18:58:44
Can any of these unsigned variables be changed to
wonsik
2013/05/01 14:15:38
Well these method signatures come all the way from
| |
| 111 const WebString& session_id) { | |
| 112 if (media_source_delegate_) { | |
| 113 return media_source_delegate_->AddKey( | |
| 114 key_system, key, key_length, init_data, init_data_length, session_id); | |
| 115 } | |
| 116 return MediaKeyExceptionKeySystemNotSupported; | |
| 117 } | |
| 118 | |
| 119 WebMediaPlayer::MediaKeyException WebMediaPlayerTv::cancelKeyRequest( | |
| 120 const WebString& key_system, | |
| 121 const WebString& session_id) { | |
| 122 if (media_source_delegate_) | |
| 123 return media_source_delegate_->CancelKeyRequest(key_system, session_id); | |
| 124 return MediaKeyExceptionKeySystemNotSupported; | |
| 125 } | |
| 126 | |
| 127 void WebMediaPlayerTv::OnReadFromDemuxer( | |
| 128 media::DemuxerStream::Type type, bool seek_done) { | |
| 129 if (media_source_delegate_) | |
| 130 media_source_delegate_->OnReadFromDemuxer(type, seek_done); | |
| 131 else | |
| 132 NOTIMPLEMENTED(); | |
| 133 } | |
| 134 | |
| 135 void WebMediaPlayerTv::load(const WebURL& url, | |
| 136 WebMediaSource* media_source, | |
| 137 CORSMode cors_mode) { | |
| 138 if (cors_mode != CORSModeUnspecified) | |
| 139 NOTIMPLEMENTED() << "No CORS support"; | |
| 140 | |
| 141 int flags = 0; | |
| 142 if (media_source) { | |
| 143 media_source_delegate_.reset(new MediaSourceDelegate( | |
| 144 proxy(), player_id(), | |
| 145 base::Bind(&WebMediaPlayerTv::UpdateNetworkState, | |
| 146 base::Unretained(this)))); | |
| 147 // |media_source_delegate_| is owned, so Unretained() is safe here. | |
| 148 media_source_delegate_->InitializeMediaSource( | |
| 149 frame(), client(), media_source, media_log_); | |
| 150 flags = MediaPlayerBridge::FLAG_MEDIA_SOURCE; | |
| 151 } else if (media_stream_client_) { | |
| 152 media_source_delegate_.reset(new MediaSourceDelegate( | |
| 153 proxy(), player_id(), | |
| 154 base::Bind(&WebMediaPlayerTv::UpdateNetworkState, | |
| 155 base::Unretained(this)))); | |
| 156 media_source_delegate_->InitializeMediaStream(demuxer_); | |
| 157 | |
| 158 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); | |
| 159 if (audio_renderer_) { | |
|
qinmin
2013/04/29 17:31:49
no { }
wonsik
2013/05/01 14:15:38
Done.
| |
| 160 audio_renderer_->Start(); | |
| 161 } | |
| 162 flags = (MediaPlayerBridge::FLAG_MEDIA_SOURCE | | |
| 163 MediaPlayerBridge::FLAG_LOW_LATENCY); | |
| 164 } | |
| 165 | |
| 166 InitializeMediaPlayer(url, flags); | |
| 167 } | |
| 168 | |
| 169 void WebMediaPlayerTv::play() { | |
| 170 if (hasVideo() && NeedsExternalSurface()) { | |
| 171 if (proxy()) | |
| 172 proxy()->RequestExternalSurface(player_id()); | |
| 173 } | |
| 174 if (audio_renderer_ && paused()) | |
| 175 audio_renderer_->Play(); | |
| 176 WebMediaPlayerAndroid::play(); | |
| 177 } | |
| 178 | |
| 179 void WebMediaPlayerTv::pause() { | |
| 180 if (audio_renderer_ && !paused()) | |
| 181 audio_renderer_->Pause(); | |
| 182 WebMediaPlayerAndroid::pause(); | |
| 183 } | |
| 184 | |
| 185 void WebMediaPlayerTv::seek(double seconds) { | |
| 186 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | |
| 187 if (media_source_delegate_) | |
| 188 media_source_delegate_->Seek(seek_time); | |
| 189 WebMediaPlayerAndroid::seek(seconds); | |
| 190 } | |
| 191 | |
| 192 void WebMediaPlayerTv::OnVideoSizeChanged(int width, int height) { | |
| 193 static bool has_switch = CommandLine::ForCurrentProcess()->HasSwitch( | |
| 194 switches::kUseExternalVideoSurfaceThresholdInPixels); | |
| 195 static int threshold = 0; | |
| 196 static bool parsed_arg = | |
| 197 has_switch && | |
| 198 base::StringToInt( | |
| 199 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
| 200 switches::kUseExternalVideoSurfaceThresholdInPixels), | |
| 201 &threshold); | |
| 202 if ((parsed_arg && threshold <= width * height) || | |
| 203 // Use H/W surface for MSE as the content is protected. | |
| 204 media_source_delegate_) { | |
| 205 SetNeedsExternalSurface(true); | |
| 206 SetNeedsEstablishPeer(false); | |
| 207 if (!paused() && proxy()) | |
| 208 proxy()->RequestExternalSurface(player_id()); | |
| 209 } | |
| 210 | |
| 211 WebMediaPlayerAndroid::OnVideoSizeChanged(width, height); | |
| 212 } | |
| 213 | |
| 214 } // namespace webkit_media | |
| OLD | NEW |