| 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
|
| + // 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))));
|
| + 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())
|
| + 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() {
|
|
|