Index: webkit/media/android/webmediaplayer_android.cc |
diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc |
index da417184437aea4c37dca5202d1f635245c606ff..f8081a6b3c029e3759df518d89a8503a81bf40bc 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; |
@@ -67,7 +69,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); |
@@ -77,6 +80,9 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
stream_id_ = stream_texture_factory_->CreateStreamTexture(&texture_id_); |
ReallocateVideoFrame(); |
} |
+#if defined(GOOGLE_TV) |
+ demuxer_ = NULL; |
+#endif |
} |
WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
@@ -94,6 +100,11 @@ WebMediaPlayerAndroid::~WebMediaPlayerAndroid() { |
if (main_loop_) |
main_loop_->RemoveDestructionObserver(this); |
+#if defined(GOOGLE_TV) |
+ if (demuxer_ && !destroy_demuxer_cb_.is_null()) { |
+ destroy_demuxer_cb_.Run(); |
+ } |
+#endif |
} |
void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { |
@@ -106,24 +117,44 @@ void WebMediaPlayerAndroid::load(const WebURL& url, |
if (cors_mode != CORSModeUnspecified) |
NOTIMPLEMENTED() << "No CORS support"; |
- scoped_ptr<WebKit::WebMediaSource> scoped_media_source(media_source); |
+ MediaPlayerAndroid::MediaSourceType media_source_type = |
+ MediaPlayerAndroid::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 = MediaPlayerAndroid::MEDIA_SOURCE_MSE; |
+ } else if (media_stream_client_) { |
+ media_source_type = MediaPlayerAndroid::MEDIA_SOURCE_STREAM; |
+ } |
+ |
+ if (media_source_type != MediaPlayerAndroid::MEDIA_SOURCE_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 (media_source_type == MediaPlayerAndroid::MEDIA_SOURCE_MSE) { |
+ media_source_delegate_->InitializeMediaSource( |
+ frame_, client_, media_source, media_log_); |
+ } else if (media_source_type == MediaPlayerAndroid::MEDIA_SOURCE_STREAM) { |
+ media_source_delegate_->InitializeMediaStream(demuxer_); |
+ } |
} |
+#else |
+ if (media_source) |
+ media_source_type = MediaPlayerAndroid::MEDIA_SOURCE_MSE; |
#endif |
+ InitializeMediaPlayer(url, media_source_type); |
+} |
+ |
+void WebMediaPlayerAndroid::InitializeMediaPlayer( |
+ const WebURL& url, |
+ MediaPlayerAndroid::MediaSourceType media_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, media_source_type, first_party_url); |
if (manager_->IsInFullscreen(frame_)) |
proxy_->EnterFullscreen(player_id_); |
} |
@@ -139,7 +170,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_); |
} |
@@ -464,7 +494,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 +683,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 +723,16 @@ void WebMediaPlayerAndroid::OnReadFromDemuxer( |
else |
NOTIMPLEMENTED(); |
} |
+ |
+bool WebMediaPlayerAndroid::InjectMediaStream( |
+ MediaStreamClient* media_stream_client, |
+ media::Demuxer* demuxer, |
+ const base::Closure& destroy_demuxer_cb) { |
+ media_stream_client_ = media_stream_client; |
+ demuxer_ = demuxer; |
+ destroy_demuxer_cb_ = destroy_demuxer_cb; |
+ return true; |
+} |
#endif |
void WebMediaPlayerAndroid::enterFullscreen() { |