Index: webkit/renderer/media/android/webmediaplayer_android.cc |
diff --git a/webkit/renderer/media/android/webmediaplayer_android.cc b/webkit/renderer/media/android/webmediaplayer_android.cc |
index 5670b5898de5789ca07656831b2290764b72486d..a8ae5a38c7ed0de9249c997c4e5fa7bb5898d87e 100644 |
--- a/webkit/renderer/media/android/webmediaplayer_android.cc |
+++ b/webkit/renderer/media/android/webmediaplayer_android.cc |
@@ -29,6 +29,11 @@ |
#include "webkit/renderer/media/crypto/key_systems.h" |
#include "webkit/renderer/media/webmediaplayer_util.h" |
+#if defined(GOOGLE_TV) |
+#include "webkit/renderer/media/media_stream_audio_renderer.h" |
+#include "webkit/renderer/media/media_stream_client.h" |
+#endif |
+ |
static const uint32 kGLTextureExternalOES = 0x8D65; |
using WebKit::WebMediaPlayer; |
@@ -73,7 +78,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); |
@@ -96,6 +102,8 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid( |
base::Unretained(this)), |
base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)))); |
} |
+ |
+ demuxer_ = NULL; |
#endif // defined(GOOGLE_TV) |
} |
@@ -114,6 +122,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) { |
@@ -126,21 +140,49 @@ void WebMediaPlayerAndroid::load(const WebURL& url, |
if (cors_mode != CORSModeUnspecified) |
NOTIMPLEMENTED() << "No CORS support"; |
- if (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_stream_client_) { |
+ DCHECK(!media_source); |
+ source_type = MediaPlayerAndroid::SOURCE_TYPE_STREAM; |
+ } |
+#endif |
+ |
+ if (source_type != MediaPlayerAndroid::SOURCE_TYPE_URL) { |
media_source_delegate_.reset( |
new MediaSourceDelegate(proxy_, player_id_, media_log_)); |
// |media_source_delegate_| is owned, so Unretained() is safe here. |
- media_source_delegate_->Initialize( |
- media_source, |
- base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), |
- base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
- base::Unretained(this))); |
+ if (source_type == MediaPlayerAndroid::SOURCE_TYPE_MSE) { |
+ media_source_delegate_->InitializeMediaSource( |
+ media_source, |
+ base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), |
+ base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
+ base::Unretained(this))); |
+ } |
+#if defined(GOOGLE_TV) |
+ if (source_type == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { |
+ media_source_delegate_->InitializeMediaStream( |
+ demuxer_, |
+ base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, |
+ base::Unretained(this))); |
+ } |
+#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_); |
} |
@@ -919,6 +961,17 @@ void WebMediaPlayerAndroid::OnKeyMessage(const std::string& key_system, |
message.size(), |
default_url_gurl); |
} |
+ |
+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 // defined(GOOGLE_TV) |
void WebMediaPlayerAndroid::OnNeedKey(const std::string& key_system, |