Chromium Code Reviews| Index: webkit/media/android/webmediaplayer_android.cc |
| diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc |
| index 7907512455e0e5b6df6a52541cd88f92d6843774..3333d1685611fd4c31ff50105cd56e1c98cb8509 100644 |
| --- a/webkit/media/android/webmediaplayer_android.cc |
| +++ b/webkit/media/android/webmediaplayer_android.cc |
| @@ -27,6 +27,8 @@ |
| #if defined(GOOGLE_TV) |
| #include "webkit/media/android/media_source_delegate.h" |
| +#include "webkit/media/media_stream_audio_renderer.h" |
| +#include "webkit/media/media_stream_client.h" |
| #endif |
| static const uint32 kGLTextureExternalOES = 0x8D65; |
| @@ -48,7 +50,9 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
| WebMediaPlayerManagerAndroid* manager, |
| WebMediaPlayerProxyAndroid* proxy, |
| StreamTextureFactory* factory, |
| - media::MediaLog* media_log) |
| + media::MediaLog* media_log, |
| + MediaStreamClient* media_stream_client, |
| + media::Demuxer* demuxer) |
| : frame_(frame), |
| client_(client), |
| buffered_(1u), |
| @@ -67,7 +71,9 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
| video_frame_provider_client_(NULL), |
| proxy_(proxy), |
| current_time_(0), |
| - media_log_(media_log) { |
| + media_log_(media_log), |
| + media_stream_client_(media_stream_client), |
| + demuxer_(demuxer) { |
| main_loop_->AddDestructionObserver(this); |
| if (manager_) |
| player_id_ = manager_->RegisterMediaPlayer(this); |
| @@ -94,6 +100,19 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
| if (main_loop_) |
| main_loop_->RemoveDestructionObserver(this); |
| +#if defined(GOOGLE_TV) |
| + if (audio_renderer_) { |
| + if (audio_renderer_->IsLocalRenderer()) { |
| + audio_renderer_->Stop(); |
| + } else if (!paused()) { |
| + // The |audio_renderer_| can be shared by multiple remote streams, and |
|
Ami GONE FROM CHROMIUM
2013/05/08 20:26:44
Does this not also apply to multiple local streams
wonsik
2013/05/13 14:03:48
applied s/multipe remote streams/multiple streams/
|
| + // it will be stopped when WebRtcAudioDeviceImpl goes away. So we simply |
| + // pause the |audio_renderer_| here to avoid re-creating the |
| + // |audio_renderer_|. |
| + audio_renderer_->Pause(); |
| + } |
| + } |
| +#endif |
| } |
| void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
| @@ -106,24 +125,48 @@ void WebMediaPlayerAndroid::load(const WebURL& url, |
| if (cors_mode != CORSModeUnspecified) |
| NOTIMPLEMENTED() << "No CORS support"; |
| - scoped_ptr<WebKit::WebMediaSource> scoped_media_source(media_source); |
| + MediaPlayerBridge::MediaSource media_source_type = |
| + MediaPlayerBridge::MEDIA_SOURCE_URL; |
| #if defined(GOOGLE_TV) |
| if (media_source) { |
| - media_source_delegate_.reset( |
| - new MediaSourceDelegate( |
| - frame_, client_, proxy_, player_id_, media_log_)); |
| + media_source_type = MediaPlayerBridge::MEDIA_SOURCE_MSE; |
| + |
| // |media_source_delegate_| is owned, so Unretained() is safe here. |
| - media_source_delegate_->Initialize( |
| - scoped_media_source.Pass(), |
| + media_source_delegate_.reset(new MediaSourceDelegate( |
| + proxy_, player_id_, |
| base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| - base::Unretained(this))); |
| + base::Unretained(this)))); |
| + media_source_delegate_->InitializeMediaSource( |
| + frame_, client_, media_source, media_log_); |
| + } else if (media_stream_client_) { |
| + media_source_type = MediaPlayerBridge::MEDIA_SOURCE_STREAM; |
| + |
| + media_source_delegate_.reset(new MediaSourceDelegate( |
| + proxy_, player_id_, |
| + base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
| + base::Unretained(this)))); |
|
Ami GONE FROM CHROMIUM
2013/05/08 20:26:44
Comment about Unretained() from above applies here
wonsik
2013/05/13 14:03:48
Done.
|
| + media_source_delegate_->InitializeMediaStream( |
| + demuxer_, destroy_demuxer_cb_); |
| + |
| + audio_renderer_ = media_stream_client_->GetAudioRenderer(url); |
| + if (audio_renderer_) |
| + audio_renderer_->Start(); |
| } |
| +#else |
| + if (media_source) |
| + media_source_type = MediaPlayerBridge::MEDIA_SOURCE_MSE; |
| #endif |
| + InitializeMediaPlayer(url, media_source_type); |
| +} |
| + |
| +void WebMediaPlayerAndroid::InitializeMediaPlayer( |
| + const WebURL& url, |
| + MediaPlayerBridge::MediaSource media_source) { |
| url_ = url; |
| GURL first_party_url = frame_->document().firstPartyForCookies(); |
| if (proxy_) { |
| - proxy_->Initialize(player_id_, url_, media_source != NULL, first_party_url); |
| + proxy_->Initialize(player_id_, url, media_source, first_party_url); |
| if (manager_->IsInFullscreen(frame_)) |
| proxy_->EnterFullscreen(player_id_); |
| } |
| @@ -139,10 +182,11 @@ void WebMediaPlayerAndroid::cancelLoad() { |
| void WebMediaPlayerAndroid::play() { |
| #if defined(GOOGLE_TV) |
| if (hasVideo() && needs_external_surface_) { |
| - DCHECK(!needs_establish_peer_); |
| if (proxy_) |
| proxy_->RequestExternalSurface(player_id_); |
| } |
| + if (audio_renderer_ && paused()) |
|
Ami GONE FROM CHROMIUM
2013/05/08 20:26:44
Can these changes to the audio_renderer_'s play/pa
wonsik
2013/05/13 14:03:48
Done.
|
| + audio_renderer_->Play(); |
| #endif |
| if (hasVideo() && needs_establish_peer_) |
| EstablishSurfaceTexturePeer(); |
| @@ -153,6 +197,10 @@ void WebMediaPlayerAndroid::play() { |
| } |
| void WebMediaPlayerAndroid::pause() { |
| +#if defined(GOOGLE_TV) |
| + if (audio_renderer_ && !paused()) |
| + audio_renderer_->Pause(); |
| +#endif |
| if (proxy_) |
| proxy_->Pause(player_id_); |
| is_playing_ = false; |
| @@ -464,7 +512,6 @@ void WebMediaPlayerAndroid::OnVideoSizeChanged(int width, int height) { |
| CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| switches::kUseExternalVideoSurfaceThresholdInPixels), |
| &threshold); |
| - |
| if ((parsed_arg && threshold <= width * height) || |
| // Use H/W surface for MSE as the content is protected. |
| media_source_delegate_) { |
| @@ -654,10 +701,10 @@ bool WebMediaPlayerAndroid::RetrieveGeometryChange(gfx::RectF* rect) { |
| return true; |
| } |
| -WebMediaPlayer::MediaKeyException |
| -WebMediaPlayerAndroid::generateKeyRequest(const WebString& key_system, |
| - const unsigned char* init_data, |
| - unsigned init_data_length) { |
| +WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::generateKeyRequest( |
| + const WebString& key_system, |
| + const unsigned char* init_data, |
| + unsigned init_data_length) { |
| if (media_source_delegate_) { |
| return media_source_delegate_->GenerateKeyRequest( |
| key_system, init_data, init_data_length); |
| @@ -694,6 +741,11 @@ void WebMediaPlayerAndroid::OnReadFromDemuxer( |
| else |
| NOTIMPLEMENTED(); |
| } |
| + |
| +void WebMediaPlayerAndroid::SetDestroyDemuxerCB( |
| + const MediaSourceDelegate::DestroyDemuxerCB& destroy_demuxer_cb) { |
| + destroy_demuxer_cb_ = destroy_demuxer_cb; |
| +} |
| #endif |
| void WebMediaPlayerAndroid::enterFullscreen() { |