OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 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/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, | |
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 MediaPlayerBridge::MediaType media_type = | |
142 MediaPlayerBridge::MEDIA_TYPE_DEFAULT; | |
143 if (media_source) { | |
144 media_source_delegate_.reset(new MediaSourceDelegate( | |
145 proxy(), player_id(), | |
146 base::Bind(&WebMediaPlayerTv::UpdateNetworkState, | |
147 base::Unretained(this)))); | |
148 // |media_source_delegate_| is owned, so Unretained() is safe here. | |
ycheo (away)
2013/05/02 02:45:21
Move this comment in front of L146.
wonsik
2013/05/02 15:22:00
Done.
| |
149 media_source_delegate_->InitializeMediaSource( | |
150 frame(), client(), media_source, media_log_); | |
151 media_type = MediaPlayerBridge::MEDIA_TYPE_MEDIA_SOURCE_EXTENSIONS; | |
ycheo (away)
2013/05/02 02:45:21
How about move this line at the beginning of the b
wonsik
2013/05/02 15:22:00
Done.
| |
152 } else if (media_stream_client_) { | |
153 media_source_delegate_.reset(new MediaSourceDelegate( | |
154 proxy(), player_id(), | |
155 base::Bind(&WebMediaPlayerTv::UpdateNetworkState, | |
156 base::Unretained(this)))); | |
157 media_source_delegate_->InitializeMediaStream(demuxer_); | |
158 | |
159 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); | |
160 if (audio_renderer_) | |
161 audio_renderer_->Start(); | |
162 media_type = MediaPlayerBridge::MEDIA_TYPE_MEDIA_STREAMS; | |
ycheo (away)
2013/05/02 02:45:21
Ditto.
wonsik
2013/05/02 15:22:00
Done.
| |
163 } | |
164 | |
165 InitializeMediaPlayer(url, media_type); | |
166 } | |
167 | |
168 void WebMediaPlayerTv::play() { | |
169 if (hasVideo() && NeedsExternalSurface()) { | |
170 if (proxy()) | |
171 proxy()->RequestExternalSurface(player_id()); | |
172 } | |
173 if (audio_renderer_ && paused()) | |
174 audio_renderer_->Play(); | |
175 WebMediaPlayerAndroid::play(); | |
176 } | |
177 | |
178 void WebMediaPlayerTv::pause() { | |
179 if (audio_renderer_ && !paused()) | |
180 audio_renderer_->Pause(); | |
181 WebMediaPlayerAndroid::pause(); | |
182 } | |
183 | |
184 void WebMediaPlayerTv::seek(double seconds) { | |
185 base::TimeDelta seek_time = ConvertSecondsToTimestamp(seconds); | |
186 if (media_source_delegate_) | |
187 media_source_delegate_->Seek(seek_time); | |
188 WebMediaPlayerAndroid::seek(seconds); | |
189 } | |
190 | |
191 void WebMediaPlayerTv::OnVideoSizeChanged(int width, int height) { | |
192 static bool has_switch = CommandLine::ForCurrentProcess()->HasSwitch( | |
193 switches::kUseExternalVideoSurfaceThresholdInPixels); | |
194 static int threshold = 0; | |
195 static bool parsed_arg = | |
196 has_switch && | |
197 base::StringToInt( | |
198 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
199 switches::kUseExternalVideoSurfaceThresholdInPixels), | |
200 &threshold); | |
201 if ((parsed_arg && threshold <= width * height) || | |
202 // Use H/W surface for MSE as the content is protected. | |
203 media_source_delegate_) { | |
204 SetNeedsExternalSurface(true); | |
205 SetNeedsEstablishPeer(false); | |
206 if (!paused() && proxy()) | |
207 proxy()->RequestExternalSurface(player_id()); | |
208 } | |
209 | |
210 WebMediaPlayerAndroid::OnVideoSizeChanged(width, height); | |
211 } | |
212 | |
213 } // namespace webkit_media | |
OLD | NEW |