| Index: webkit/media/android/webmediaplayer_android.cc
|
| diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc
|
| index 2eeb3b38f1d77174e10416012b8d5a54a2f0644e..e3fa42618a51f1aae2a7840c05eb41e3f85601be 100644
|
| --- a/webkit/media/android/webmediaplayer_android.cc
|
| +++ b/webkit/media/android/webmediaplayer_android.cc
|
| @@ -28,6 +28,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;
|
| @@ -68,7 +70,8 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
|
| video_frame_provider_client_(NULL),
|
| proxy_(proxy),
|
| current_time_(0),
|
| - media_log_(media_log) {
|
| + media_log_(media_log),
|
| + media_stream_client_(NULL) {
|
| main_loop_->AddDestructionObserver(this);
|
| if (manager_)
|
| player_id_ = manager_->RegisterMediaPlayer(this);
|
| @@ -78,6 +81,9 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
|
| stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_);
|
| ReallocateVideoFrame();
|
| }
|
| +#if defined(GOOGLE_TV)
|
| + demuxer_ = NULL;
|
| +#endif
|
| }
|
|
|
| WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
|
| @@ -95,6 +101,12 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() {
|
|
|
| if (main_loop_)
|
| main_loop_->RemoveDestructionObserver(this);
|
| +#if defined(GOOGLE_TV)
|
| + if (demuxer_ && !destroy_demuxer_cb_.is_null()) {
|
| + media_source_delegate_.reset();
|
| + destroy_demuxer_cb_.Run();
|
| + }
|
| +#endif
|
| }
|
|
|
| void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) {
|
| @@ -107,24 +119,43 @@ void WebMediaPlayerAndroid::load(const WebURL& url,
|
| if (cors_mode != CORSModeUnspecified)
|
| NOTIMPLEMENTED() << "No CORS support";
|
|
|
| - scoped_ptr<WebKit::WebMediaSource> scoped_media_source(media_source);
|
| + MediaPlayerAndroid::SourceType source_type =
|
| + MediaPlayerAndroid::SOURCE_TYPE_URL;
|
| +
|
| + if (media_source)
|
| + source_type = MediaPlayerAndroid::SOURCE_TYPE_MSE;
|
| #if defined(GOOGLE_TV)
|
| - if (media_source) {
|
| - media_source_delegate_.reset(
|
| - new MediaSourceDelegate(
|
| - frame_, client_, proxy_, player_id_, media_log_));
|
| + if (media_stream_client_) {
|
| + DCHECK(!media_source);
|
| + source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM;
|
| + }
|
| +
|
| + if (source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) {
|
| // |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))));
|
| + if (source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) {
|
| + media_source_delegate_->InitializeMediaSource(
|
| + frame_, client_, media_source, media_log_);
|
| + } else if (source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) {
|
| + media_source_delegate_->InitializeMediaStream(demuxer_);
|
| + }
|
| }
|
| #endif
|
|
|
| + InitializeMediaPlayer(url, source_type);
|
| +}
|
| +
|
| +void WebMediaPlayerAndroid::InitializeMediaPlayer(
|
| + const WebURL& url,
|
| + MediaPlayerAndroid::SourceType source_type) {
|
| 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, source_type, first_party_url);
|
| if (manager_->IsInFullscreen(frame_))
|
| proxy_->EnterFullscreen(player_id_);
|
| }
|
| @@ -140,7 +171,6 @@ 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_, last_computed_rect_);
|
| }
|
| @@ -467,7 +497,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_) {
|
| @@ -657,10 +686,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);
|
| @@ -697,6 +726,17 @@ void WebMediaPlayerAndroid::OnReadFromDemuxer(
|
| else
|
| NOTIMPLEMENTED();
|
| }
|
| +
|
| +bool WebMediaPlayerAndroid::InjectMediaStream(
|
| + MediaStreamClient* media_stream_client,
|
| + media::Demuxer* demuxer,
|
| + const base::Closure& destroy_demuxer_cb) {
|
| + DCHECK(!demuxer);
|
| + media_stream_client_ = media_stream_client;
|
| + demuxer_ = demuxer;
|
| + destroy_demuxer_cb_ = destroy_demuxer_cb;
|
| + return true;
|
| +}
|
| #endif
|
|
|
| void WebMediaPlayerAndroid::enterFullscreen() {
|
|
|