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() { |